Mysql讀寫分離(Mycat版)

Mysql讀寫分離(Mycat版)
(1).讀寫分離概述html

1)工做原理java

  讀寫分離是讓主數據庫處理事務性增刪改操做(insert、delete、update),讓從數據庫處理查詢查詢操做(select)。mysql

2)做用linux

  1.分擔負載sql

  2.主從只負責各自的寫和讀,極大的緩解X鎖和S鎖爭用mongodb

  3.從庫可配置MyISAM引擎,提高查詢性能以及節約系統開銷shell

  4.增長冗餘,提升可用性數據庫

3)實現方法vim

1、應用程序和網站程序的實現。指的是在應用程序內部及鏈接器中實現讀寫分離。後端

  優勢:1.應用程序內部實現讀寫分離,安裝就可使用;2. 減小必定部署難度;3.訪問壓力在必定級別如下,性能很好。

  缺點:1.架構一旦調整,代碼要跟着變;2.難以實現高級應用,如自動分庫,分表;3.沒法適用大型應用場景。

2、中間件實現。指的是在外部中間件程序實現讀寫分離。

  優勢:1.架構設計更靈活;2.能夠在程序上實現一些高級控制,如:透明化水平拆分,failover,監控;3.能夠依靠些技術手段提升mysql性能;4.對業務代碼的影響小,同時也安全

  缺點:須要必定的開發運維團隊的支持。

4)常見的Mysql中間鍵

  Cobar、MyCAT、OneProxy、Vitess、Kingshard、Atlas、MaxScale與MySQL Route。

  使用mycat緣由是這是一款開源的免費的Mysql中間件,基於Cobar基礎上二次開發,其功能也是至關完善。並且目前Mycat社區很活躍,支持度比較高,維護短時間內應該不會中斷。

(2).實驗環境

youxi1  192.168.5.101  CentOS7.5  Mysql5.7.16  Mysql端口3306  Mycat中間件

youxi2  192.168.5.102  CentOS7.5  Mysql5.7.16  Mysql端口3306  Master

youxi3  192.168.5.103  CentOS7.5  Mysql5.7.16  Mysql端口3306  Slave

(3).Mycat服務的安裝與配置

  使用mycat中間件搭建讀寫分離,那麼應訪問的是mycat中間件,再由mycat訪問主從服務器。

  Mycat的官網是http://www.mycat.io,我下載的版本是Mycat-server-1.6.7.1-release-20190213150257-linux.tar.gz,而後上傳到youxi1服務器上。

  Mycat須要安裝JDK1.7或以上版本,我下載的是jdk-8u191-linux-x64.tar.gz,而後上傳到youxi1服務器上。

  而後解壓到/usr/local/目錄下

[root@youxi1 ~]# tar zxf Mycat-server-1.6.7.1-release-20190213150257-linux.tar.gz -C /usr/local/
[root@youxi1 ~]# ls /usr/local/
bin etc games include lib lib64 libexec mycat sbin share src
[root@youxi1 logs]# ls /usr/local/mycat/
bin catlet conf lib version.txt
[root@youxi1 logs]# mkdir /usr/local/mycat/logs  //少一個logs目錄就建立一個

[root@youxi1 ~]# useradd mycat
[root@youxi1 ~]# echo "mycat:123456" | chpasswd
[root@youxi1 ~]# chown -R mycat:mycat /usr/local/mycat/
[root@youxi1 ~]# ll /usr/local/mycat/
總用量 12
drwxr-xr-x 2 mycat mycat 190 6月 18 15:30 bin
drwxrwxrwx 2 mycat mycat 6 2月 13 14:46 catlet
drwxrwxrwx 4 mycat mycat 4096 6月 18 15:30 conf
drwxr-xr-x 2 mycat mycat 4096 6月 18 15:30 lib
drwxr-xr-x 2 mycat mycat 6 6月 20 15:09 logs
-rwxrwxrwx 1 mycat mycat 185 2月 13 15:02 version.txt
說明:bin 程序目錄,存放了封裝成服務的版本,還存放了nowrap的shell腳本命令,方便你們選擇和修改。mycat支持的命令有{ console | start | stop | restart | status | dump }

   conf目錄下存放了配置文件,其中server.xml是Mycat服務器參數調整和用戶受權的配置文件,schema.xml是邏輯庫、表和分片定義的配置文件,rule.xml是分片規則的配置文件。另外分片規則的一些具體參數信息單獨做爲一個文件,也是存放在這個目錄下。配置文件修改後,須要重啓Mycat或者經過9066端口reload。

   lib目錄下主要存放mycat依賴的一些jar文件。

   另外mycat啓動後還會生成${sys:MYCAT_HOME}/logs/mycat.log,日誌會存放在其中(默認250M上限,時間上限爲1天,超出會建立新的日誌文件,而且會自動備份),能夠在conf/log4j.xml中配置日誌文件,默認輸出級別爲info,能夠調整爲debug,輸出更多信息方便排錯。

  注意:Linux下部署安裝MySQL,默認不忽略表名大小寫,須要手動到/etc/my.cnf下配置lower_case_table_names=1,使Linux環境下MySQL忽略表名大小寫,不然使用MyCAT的時候會提示找不到表的錯誤!

  解壓JDK,添加jdk的環境變量文件,而後加載環境變量

[root@youxi1 ~]# mkdir /usr/local/java/
[root@youxi1 ~]# tar xf jdk-8u191-linux-x64.tar.gz -C /usr/local/java/
[root@youxi1 ~]# ls /usr/local/java/
jdk1.8.0_191
[root@youxi1 ~]# vim /etc/profile.d/java.sh  //配置環境變量
JAVA_HOME=/usr/local/java/jdk1.8.0_191
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export PATH JAVA_HOME CLASSPATH
[root@youxi1 ~]# source /etc/profile.d/java.sh  //加載環境變量
[root@youxi1 ~]# java -version  //查看是否生效
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
(4).Mycat啓動

  添加mycat的環境變量文件,而後加載環境變量

[root@youxi1 ~]# vim /etc/profile.d/mycat.sh
MYCAT_HOME=/usr/local/mycat
PATH=$MYCAT_HOME/bin:$PATH
[root@youxi1 ~]# source /etc/profile.d/mycat.sh
  注意:JDK的環境變量和Mycat的環境變量也能夠一次性添加到/etc/profile文件中,而後從新加載。不過沒有分開編輯好管理。

  配置mycat自己的用戶信息server.xml文件

[root@youxi1 ~]# vim /usr/local/mycat/conf/server.xml
//直接拉到最後修改<user>部分,設置訪問mycat的用戶信息,以及其可以訪問的邏輯庫
<user name="root">  //設置用戶名。若是存在defaultAccount="true",則表示在不指定用戶的狀況下,默認以該用戶訪問mycat。
  <property name="password">123456</property>  //設置當前用戶的密碼
  <property name="schemas">TESTDB</property>  //可以訪問的邏輯庫(虛擬庫),邏輯庫須要在同目錄下的schema.xml定義
//沒有設置任何權限,則默認具備全部權限
  <!-- 表級 DML 權限設置 -->
  <!--
  <privileges check="false">
    <schema name="TESTDB" dml="0110" >
      <table name="tb01" dml="0000"></table>
      <table name="tb02" dml="1111"></table>
    </schema>
  </privileges>
  -->
</user>

<user name="user">  //設置用戶名
  <property name="password">123456</property>  //設置當前用戶的密碼
  <property name="schemas">TESTDB</property>  //可以訪問的邏輯庫(虛擬庫)
  <property name="readOnly">true</property>  //設置只讀權限
</user>
  配置schema.xml文件,定義邏輯庫信息

[root@youxi1 ~]# cp /usr/local/mycat/conf/schema.xml /usr/local/mycat/conf/schema.xml.bak  //提供的是分庫分表,用法比較高級了
[root@youxi1 ~]# vim /usr/local/mycat/conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">;  //框定服務配置範圍

/schema標籤用於定義mycat中的邏輯庫。
name是邏輯庫名;
checkSQLschema默認爲false,含義爲是否去掉表名前的邏輯庫名,只能去除當前定義的邏輯庫名;
sqlMaxLimit是隱式limit,若是查詢沒有定義limit,則自動加上limit;
dataNode指定所屬的數據節點,也就是常說的數據分片。/
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode='dn1'/>

//dataNote標籤用於定義數據節點。name是數據節點名稱;dataHost指定所屬數據庫實例;database指定數據庫實例上的實際數據庫名(要和真實數據庫同樣的名字)。
<dataNode name="dn1" dataHost="dthost" database="ha"/>

/dataHost標籤用於定義數據庫實例。
name數據庫實例名稱;
maxCon指定每一個讀寫實例鏈接池的最大鏈接;
minCon指定每一個讀寫實例鏈接池的最小鏈接,初始化鏈接池的大小
balance和writeType請看下方說明;
dbType指定後端鏈接的數據庫類型,支持二進制的mysql協議,以及其餘使用JDBC鏈接的數據庫,例如mongodb、oracle、spark等;
dbDriver指定後端數據庫使用的驅動,可選值JDBC和native,其中native對應二進制的mysql協議,即mysql和maridb,其他都使用JDBC;
switchType請看下發說明
slaveThreshold slave服務器讀的安全邊界,若是Seconds_Behind_Master大於這個值,這臺slave服務器會被臨時剔除,以避免被讀。/
<dataHost name="dthost" maxCon="500" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100">

//heartbeat標籤用於定義心跳語句,用語句執行成功與否來判斷數據庫的可用性
<heartbeat>select user()</heartbeat>

/writeHost和readHost標籤都指定數據庫的相關配置,用於實例化後端鏈接池。writeHost定義寫實例,readHost定義讀實例。
host是writeHost或readHost的名稱,也是惟一標識;
usrl指定後端實例鏈接地址;
user指定後端存儲實例須要的用戶名(數據庫的用戶名);
password指定後端存儲實例須要的密碼(數據庫用戶的密碼);
weight權重,是配置在readHost中做爲讀節點的權重*/
<writeHost host="youxi2" url="192.168.5.102:3306" user="mycat" password="123456" />
<writeHost host="youxi3" url="192.168.5.103:3306" user="mycat" password="123456" />
</dataHost>
</mycat:schema>
  注意:若是使用readHost標籤,請使用writeHost標籤將readHost標籤包裹。

說明:

  balance負載均衡類型。0表示不開啓讀寫分離,全部讀操做(select查詢)都發送到當前writeHost上。1表示所有的readHost和備用writeHost都參與讀操做(select查詢)的負載均衡。2表示讀操做隨機在writeHost和readHost上發佈。3表示全部讀操做隨機分發到當前writeHost對應的readHost上執行,writeHost不用執行。

  writeType負載均衡類型。0表示全部寫操做發送到配置的第一個writeHost,掛了後切換到還生存的第二個writeHost,從新啓動後以切換後的爲準,切換記錄在配置文件dnindex.properties中。1表示全部寫操做都隨機發送到配置的writeHost,mycat1.5之後已經廢棄。

  switchType切換類型。-1表示不自動切換。1表示自動切換,默認值。2表示基於Mysql主從同步狀態決定是否切換,心跳語句爲show slave status。3表示基於MySQL galary cluster的切換機制(適合集羣),心跳語句爲show status like 'wsrep%'。

  啓動測試Mycat,並設置開機自啓

[root@youxi1 conf]# mycat start  //由於已經配置環境變量,因此能夠不寫絕對路徑
Starting Mycat-server...
[root@youxi1 conf]# tail /usr/local/mycat/logs/wrapper.log
STATUS | wrapper | 2019/06/20 15:26:47 | --> Wrapper Started as Daemon
STATUS | wrapper | 2019/06/20 15:26:47 | Launching a JVM...
INFO | jvm 1 | 2019/06/20 15:26:47 | Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=64M; support was removed in 8.0
INFO | jvm 1 | 2019/06/20 15:26:48 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
INFO | jvm 1 | 2019/06/20 15:26:48 | Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved.
INFO | jvm 1 | 2019/06/20 15:26:48 |
INFO | jvm 1 | 2019/06/20 15:26:57 | MyCAT Server startup successfully. see logs in logs/mycat.log  //成功啓動
[root@youxi1 conf]# echo "/usr/local/mycat/bin/mycat start" >> /etc/rc.local
[root@youxi1 conf]# chmod +x /etc/rc.d/rc.local
[root@youxi1 conf]# vim /usr/local/mycat/conf/wrapper.conf
wrapper.java.command=/usr/local/java/jdk1.8.0_191/bin/java  //第5行,指向java
  注意:若是防火牆是打開的,記得添加mysql的端口號。

[root@youxi1 ~]# firewall-cmd --permanent --zone=public --add-port=8066/tcp
success
[root@youxi2 ~]# firewall-cmd --reload
success
[root@youxi2 ~]# firewall-cmd --zone=public --list-ports
8066/tcp
(5).配置主從複製

1)youxi2上操做

  建立mycat中schema.xml文件設置的用戶名和密碼,以及指定的數據庫。建立複製用的用戶

mysql> grant all privileges on . to 'mycat'@'192.168.5.%' identified by '123456';  //mycat指定的用戶
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> grant replication slave on . to 'slave'@'192.168.5.%' identified by '123456';  //複製用的用戶
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> flush privileges;  //刷新權限表
Query OK, 0 rows affected (0.00 sec)

mysql> create database ha;  //mycat指定的數據庫
Query OK, 1 row affected (0.00 sec)
  修改配置文件,並重啓

[root@youxi2 ~]# vim /etc/my.cnf
server-id=1
log-bin=mysql-bin-master
binlog-do-db=ha
[root@youxi2 ~]# systemctl restart mysqld
  查看master狀態

mysql> show master status\G
1. row
File: mysql-bin-master.000001
Position: 154
Binlog_Do_DB: ha
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
  注意:若是防火牆是打開的,記得添加mysql的端口號。

[root@youxi2 ~]# firewall-cmd --permanent --zone=public --add-port=3306/tcp
success
[root@youxi2 ~]# firewall-cmd --reload
success
[root@youxi2 ~]# firewall-cmd --zone=public --list-ports
3306/tcp
2)youxi3上操做

  建立mycat中schema.xml文件設置的用戶名和密碼,以及指定的數據庫。

mysql> grant all privileges on . to 'mycat'@'192.168.5.%' identified by '123456';  //mycat指定的用戶
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> flush privileges;  //刷新權限表
Query OK, 0 rows affected (0.00 sec)

mysql> create database ha;  //mycat指定的數據庫
Query OK, 1 row affected (0.01 sec)
  修改配置文件

[root@youxi3 ~]# vim /etc/my.cnf
server-id=2
[root@youxi3 ~]# systemctl restart mysqld
  配置master信息

mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)

mysql> change master to master_host='192.168.5.102',master_user='slave',master_password='123456',master_log_file='mysql-bin-master.000001',master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
  查看slave狀態

mysql> show slave status\G
1. row
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.5.102
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin-master.000001
Read_Master_Log_Pos: 154
Relay_Log_File: youxi3-relay-bin.000003
Relay_Log_Pos: 327
Relay_Master_Log_File: mysql-bin-master.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
  注意:若是防火牆是打開的,記得添加mysql的端口號。

[root@youxi3 ~]# firewall-cmd --permanent --zone=public --add-port=3306/tcp
success
[root@youxi3 ~]# firewall-cmd --reload
success
[root@youxi3 ~]# firewall-cmd --zone=public --list-ports
3306/tcp
(6).測試

  在youxi1上鍊接mycat,固然也可使用軟件客戶端遠程鏈接mycat。並建立測試數據

[root@youxi1 ~]# mysql -uroot -p123456 -h192.168.5.101 -P8066  //這邊的用戶名和密碼必須是mycat配置文件server.xml中定義的用戶
mysql> show databases;  //注意這裏顯示的是mycat定義的邏輯庫TESTDB
+----------+
| DATABASE |
+----------+
| TESTDB |
+----------+
1 row in set (0.00 sec)

mysql> use TESTDB;
Database changed
mysql> show tables;
Empty set (0.00 sec)

mysql> create table user_tb(user int,name varchar(20));
Query OK, 0 rows affected (0.03 sec)

mysql> insert into user_tb values(1,'zhangsan');
Query OK, 1 row affected (0.05 sec)
  再到youxi2和yousi3上查看

[root@youxi2 ~]# mysql -uroot -p123456
mysql> select * from ha.user_tb;  //查詢時須要查詢實際存在的數據庫
+------+----------+
| user | name |
+------+----------+
| 1 | zhangsan |
+------+----------+
1 row in set (0.00 sec)

[root@youxi3 ~]# mysql -uroot -p123456
mysql> select * from ha.user_tb;
+------+----------+
| user | name |
+------+----------+
| 1 | zhangsan |
+------+----------+
1 row in set (0.01 sec)
  再試一下只讀用戶user

[root@youxi1 ~]# mysql -uuser -p123456 -h192.168.5.101 -P8066
mysql> use TESTDB;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> insert into user_tb values(2,'lisi');
ERROR 1495 (HY000): User readonly
  若是master服務器youxi2宕機,那麼mycat將只能讀不能寫。

//youxi2上中止mysqld,模擬宕機
[root@youxi2 ~]# systemctl stop mysqld

//此時的再進行測試
[root@youxi1 logs]# mysql -uroot -p123456 -h192.168.5.101 -P8066
mysql> use TESTDB;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from user_tb;
+------+----------+
| user | name |
+------+----------+
| 1 | zhangsan |
+------+----------+
1 row in set (0.03 sec)

mysql> insert into user_tb values(2,'lisi');
ERROR 1184 (HY000): java.net.ConnectException: 拒絕鏈接
  注意:再次啓動mysqld,可以恢復正常

參考:http://www.javashuo.com/article/p-gafxuwgk-k.html

相關文章
相關標籤/搜索