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 |
设计思路: 部署 4 个数据库服务, 其中 master1 和 master2 互为主从, slave1 是 master1 的从, slave2 是 master2 的从, 这里数据库采用的 MySQL-5.7.20 版本, mycat 采用的是 mycat-1.6 版本
2 MySQL 双主双从安装
2.1 MySQL 的安装
这里 MySQL 的双主双从可以参考前面的 MySQL 双主集群部署的文章.
注意: 上述方法搭建后的双主双从, 有一个小问题, 就是在 M1 上写一条数据, 在 S2 上并没有同步, 所以需要加一个 log-slave-updates=1(在主上加即可) 配置.
2.2 验证
在 M1 上创建一个 t1 的数据库, 如果 S1,M1,S2 上都有 t1 数据库
在 M2 上创建一个 t2 的数据库, 如果 S2,M1,S1 上都有 t2 数据库 , 则表示 MySQL 的双主双从部署成功
3 mycat 的安装
mycat 的安装可以参考前面的博客的部署文档.
3.1 mycat 的配置文件
server.xml 配置文件内容
- <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 配置文件内容
<?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 服务器登陆, 创建一个表
- [[email protected] 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 台数据库服务中是否有 hello 的这个表, 以及表里是否有数据, 在操作正确的情况下, 数据都是有的.
我们查看一下数据是从哪个数据库服务进行的写操作, 下表可以看出是从 wyl03 这个主节点进行的写操作.
- # 在 wyl01 mycat 服务器登陆, 创建一个表
- [[email protected] 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 操作, 修改内容如下:
进行多次查询, 观察查询的结果如下所示, 可以看到是读写分离的, 也可以在日志中进行查看. 查询并不是轮询的只是负载均衡.
5 主从切换
5.1 故障演示
我们再插入一条数据, 显示目前的写操作仍然是在 wyl03 上, 那我们开始停止 wyl03 上的服务
我们停掉 wyl03 上的 MySQL 的服务, 发现依然是可以做查询操作的.
当我们把 wyl03 上的 master 服务给停止后, 在 wyl01 上再次写入数据, 此时由下图可以看到是数据从 wyl01 节点写进去的, 并且读取的时候依然是可以读到数据的.
总结: 在 wyl01 上执行多次发现结果一样, 说明在一台 master 端挂掉的情况下, 其连接的 slave 端也被剔除, 并没有新的数据写入, 因此数据完整性可以保证完整性.
5.2 恢复 master 节点
当恢复 wyl03master 节点, 我们可以看到数据又保持了一致.
总结: 当我们恢复 MySQL 集群时, 数据并没有出现丢失, 保证了集群的高可用性.
来源: http://www.bubuko.com/infodetail-3771455.html