Mycat實現(xiàn)MySQL主從復制和讀寫分離
1 機器準備
| 機器名 | ip | 角色 |
| wyl01 | 192.168.52.128 | master1 ,mycat |
| wyl02 | 192.168.52.129 | slave1 |
| wyl03 | 192.168.52.130 | master2 |
| wyl04 | 192.168.52.131 | slave2 |
設(shè)計思路:部署4個數(shù)據(jù)庫服務,其中master1 和master2 互為主從,slave1是master1的從,slave2是master2的從,這里數(shù)據(jù)庫采用的mysql-5.7.20版本,mycat采用的是mycat-1.6版本。

2 mysql雙主雙從安裝
2.1 mysql的安裝
這里mysql的雙主雙從可以參考前面的mysql雙主集群部署的文章。
注意: 上述方法搭建后的雙主雙從,有一個小問題,就是在M1上寫一條數(shù)據(jù),在S2上并沒有同步,所以需要加一個log-slave-updates=1(在主上加即可)配置。
2.2 驗證
在M1上創(chuàng)建一個t1的數(shù)據(jù)庫,如果S1、M1、S2上都有t1數(shù)據(jù)庫
在M2上創(chuàng)建一個t2的數(shù)據(jù)庫,如果S2、M1、S1上都有t2數(shù)據(jù)庫 ,則表示mysql的雙主雙從部署成功
3 mycat的安裝
mycat的安裝可以參考前面的博客的部署文檔。
3.1 mycat的配置文件
server.xml配置文件內(nèi)容
<user name="root">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">false</property>
</user>
schema.xml配置文件內(nèi)容<?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="test01" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>show slave status</heartbeat>
<writeHost host="hostM1" url="192.168.52.128:3306" user="root" password="123456">
<readHost host="slave1" url="192.168.52.129:3306" user="root" password="123456" />
</writeHost>
<writeHost host="hostM2" url="192.168.52.130:3306" user="root" password="123456">
<readHost host="slave2" url="192.168.52.131:3306" user="root" password="123456" />
</writeHost>
</dataHost>
</mycat:schema>
3.2 驗證服務
當服務進程在,并查看日志沒有報錯,則表示啟動成功

4 驗證讀寫分離
4.1 驗證寫操作
# 在wyl01 mycat服務器登陸,創(chuàng)建一個表
[root@wyl01 mycat]# mysql -uroot -P8066 -p123456 -h127.0.0.1
MySQL [(none)]> use TESTDB;
Database changed
MySQL [TESTDB]> create table hello (id int not null primary key,hostname varchar(100),date DATE);
Query OK, 0 rows affected (0.02 sec)
MySQL [TESTDB]> insert into hello(id,hostname,date) values(1,@@hostname,20190801);
Query OK, 1 row affected (0.01 sec)
MySQL [TESTDB]> insert into hello(id,hostname,date) values(2,@@hostname,20190802);
Query OK, 1 row affected (0.01 sec)
MySQL [TESTDB]> insert into hello(id,hostname,date) values(3,@@hostname,20190803);
Query OK, 1 row affected (0.01 sec)
MySQL [TESTDB]> insert into hello(id,hostname,date) values(4,@@hostname,20190804);
Query OK, 1 row affected (0.01 sec)
# 檢查一下實際的4臺數(shù)據(jù)庫服務中是否有hello的這個表,以及表里是否有數(shù)據(jù),在操作正確的情況下,數(shù)據(jù)都是有的。
我們查看一下數(shù)據(jù)是從哪個數(shù)據(jù)庫服務進行的寫操作,下表可以看出是從wyl03這個主節(jié)點進行的寫操作。
# 在wyl01 mycat服務器登陸,創(chuàng)建一個表
[root@wyl01 mycat]# mysql -uroot -P8066 -p123456 -h127.0.0.1
MySQL [(none)]> use TESTDB;
MySQL [TESTDB]> select * from hello;
+----+----------+------------+
| id | hostname | date |
+----+----------+------------+
| 1 | wyl03 | 2019-08-01 |
| 2 | wyl03 | 2019-08-02 |
| 3 | wyl03 | 2019-08-03 |
| 4 | wyl03 | 2019-08-04 |
+----+----------+------------+
4 rows in set (0.01 sec)
MySQL [TESTDB]>
4.2 驗證讀操作
我們到wyl02和wyl04上進行修改一個值,然后再進行select操作,修改內(nèi)容如下:

進行多次查詢,觀察查詢的結(jié)果如下所示,可以看到是讀寫分離的,也可以在日志中進行查看。查詢并不是輪詢的只是負載均衡。

5 主從切換
5.1 故障演示
我們再插入一條數(shù)據(jù),顯示目前的寫操作仍然是在wyl03上,那我們開始停止wyl03上的服務

我們停掉wyl03上的mysql的服務,發(fā)現(xiàn)依然是可以做查詢操作的。

當我們把wyl03上的master服務給停止后,在wyl01上再次寫入數(shù)據(jù),此時由下圖可以看到是數(shù)據(jù)從wyl01節(jié)點寫進去的,并且讀取的時候依然是可以讀到數(shù)據(jù)的。

總結(jié):在wyl01上執(zhí)行多次發(fā)現(xiàn)結(jié)果一樣,說明在一臺master端掛掉的情況下,其連接的slave端也被剔除,并沒有新的數(shù)據(jù)寫入,因此數(shù)據(jù)完整性可以保證完整性。
5.2 恢復master節(jié)點
當恢復wyl03master節(jié)點,我們可以看到數(shù)據(jù)又保持了一致。

總結(jié):當我們恢復mysql集群時,數(shù)據(jù)并沒有出現(xiàn)丟失,保證了集群的高可用性。
版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。
本文鏈接:
https://blog.csdn.net/wyl9527/article/details/98752020
感謝點贊支持下哈 
