1. 程式人生 > 實用技巧 >Mycat02(Mysql主從複製 一主一從) 讀寫分離

Mycat02(Mysql主從複製 一主一從) 讀寫分離

參考:http://47.100.191.44/blog/articles/409
1、通過docker 安裝mysql mysql是Master mysql1是Slave

啟動容器用通過mysql 連線工具測試連線。

配置Master(mysql)

首先進入容器內部:

docker exec -it 容器名(或者id) /bin/bash

切換到/etc/mysql目錄下,使用 vim命令編輯my.cnf檔案,會出現 bash:vim:command not fount ,需要安裝vim工具

docker內部安裝vim

很簡單,依次輸入如下命令即可安裝,時間和網速有關,耐心等待。

apt-get update
apt
-get install vim

也可以通過掛載的方式在宿主機裡面修改。

安裝成功後,編輯my.cnf檔案

[mysqld]
## 同一區域網內注意要唯一
server-id=1
#開啟二進位制日誌功能,可以隨便取(關鍵)
log-bin=mysql-bin
#不需要同步的庫
binlog-ignore-db=mysql
binlog-do-db=資料庫名 
binlog-format=STATEMENT

配置完成後,需要重啟mysql服務使其修改的配置檔案生效,使用如下命令使mysql進行重啟

 service mysql restart

重啟會導致docker容器停止,使用命令重啟容器

docker start 容器名(或者容器id)

建立資料庫同步賬戶
使用docker命令進入Master容器內部:

docker exec -it 容器名(或者容器id)/bin/bash

在Master資料庫建立資料同步使用者,授予使用者 slave REPLICATION SLAVE許可權和REPLICATION CLIENT許可權,用於在主從庫之間同步資料。登入到mysql客戶端:

mysql -uroot -p123

建立使用者並授權:

mysql> CREATE USER 'slave'@'%' IDENTIFIED BY '123456';


mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO '
slave'@'%';

Master 配置完成。

配置Slave(mysql1)

類似於Master ,使用docker命令進入到 slave 容器中,並進入到/etc/mysql路徑,使用vim命令編輯my.cnf 檔案:

[mysqld]
server-id=2
relay-log=mysql-relay

配置完成後也需要重啟mysql服務和docker容器,操作可以參考Master。

開啟Master-Slave主從複製

進入Master庫mysql 客戶端:輸入 **show master status;**檢視Master狀態:

記住File和Position,後面需要用到。此時一定不要操作Master庫,否則將會引起Master狀態的變化,File和Position欄位也將會進行變化。

進入到Slave庫myslq客戶端,執行如下命令:

change master to master_host='172.17.0.4', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000002', master_log_pos=154, master_connect_retry=30;

如果出現錯誤(重新配置主從):

#使用
stop slave;

reset master;

命令說明:

master_host :Master庫的地址,指的是容器的獨立ip,可以通過

docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名稱 | 容器id查詢容器的IP進行查詢:

也可以通過docker的自定義網路配置容器ip

master_port:Master的埠號,指的是容器的埠號
master_user:用於資料同步的使用者
master_password:用於同步的使用者的密碼
master_log_file:指定 Slave 從哪個日誌檔案開始複製資料,即上文中提到的 File 欄位的值
master_log_pos:從哪個 Position 開始讀,即上文中提到的 Position 欄位的值
master_connect_retry:如果連線失敗,重試的時間間隔,單位是秒,預設是60秒

在Slave 中的mysql終端執行 show slave status \G; 用於檢視主從同步狀態:

下面是正常的,中間可能出現的問題:

問題一:這個地方如果是兩個NO

Slave_IO_Running 和 Slave_SQL_Running是檢視主從是否執行的關鍵欄位,預設為NO,表示沒有進行主從複製。

使用 start slave;開啟主從複製過,然後再次查詢主從同步狀態:show slave status \G;

問題二:如果上面一個為Connecting,下面一個為YES.

使用 start slave; 開啟主從複製過程後,如果SlaveIORunning一直是Connecting,則說明主從複製一直處於連線狀態,這種情況一般是下面幾種原因造成的,我們可以根據 Last_IO_Error提示予以排除。

1、網路不通:檢查ip,埠
2、密碼不對:檢查是否建立用於同步的使用者和使用者密碼是否正確
3、pos不對:檢查Master的 Position

正常啟動後如上圖所示。

Slave_IO_RunningSlave_SQL_Running都是 YES,說明覆制已經開始,可以測試資料是否同步成功。

show slave status\G;完整資訊。

mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.17.0.4
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 30
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 154
               Relay_Log_File: mysql-realy.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 154
              Relay_Log_Space: 523
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
                  Master_UUID: d0d6b6db-2345-11eb-a4ad-0242ac110002
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

接下來只需要在Master 中建一個testdb的庫然後建立表,在Slave檢視是否同步。

Mycat讀寫分離

首先修改配置檔案也就是cjh_docker/mycat/conf/schema.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">

        </schema>
        <dataNode name="dn1" dataHost="localhost1" database="testdb" />
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <!-- can have multi write hosts -->// url 是容器埠
                <writeHost host="hostM1" url="172.17.0.4:3306" user="root"
                                   password="123">
                        <!-- can have multi read hosts -->
                        <readHost host="hostS2" url="172.17.0.3:3306" user="root" password="123" />
                </writeHost>
                <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
        </dataHost>
</mycat:schema>

驗證讀寫分離:

#1.在Master裡面插入: insert into mytbl values(1,@@hostname);#@@hostname表示系統變數(這裡是容器id)
#2.在mycat 裡面查詢:select * from mytbl;

發現並未實現讀寫分離。

修改<dataHost>balance屬性,通過這個屬性配置讀寫分離的型別。

#負載均衡型別,目前有4種:

1、balance="0",不開啟讀寫分離機制,所有讀操作都發送到當前可用的writeHost上。

2、balance="1",全部的readHost 與 stand by writeHost 參與 select 語句的負載均衡,簡單的說,當雙主雙從模式(M1->S1,M2->S2,且M1與M2互為主備),正常情況下,M2,S1,S2都參與Select語句的負載均衡。

3、balance="2" ,所有讀操作都隨機的在writeHost、readHost上分發。

4、balance="3", 所有讀請求隨機的分發到readHost執行,writeHost不負擔讀壓力。

為了能看到讀寫分離的效果,把balance設定成3 就行了

  <dataHost name="localhost1" maxCon="1000" minCon="10" balance="3"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">