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
也可以通過掛載的方式在宿主機裡面修改。
[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_Running和 Slave_SQL_Running都是 YES,說明覆制已經開始,可以測試資料是否同步成功。
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">