zoukankan      html  css  js  c++  java
  • Mycat实现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

     设计思路:部署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服务器登陆,创建一个表
    [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台数据库服务中是否有hello的这个表,以及表里是否有数据,在操作正确的情况下,数据都是有的。

    我们查看一下数据是从哪个数据库服务进行的写操作,下表可以看出是从wyl03这个主节点进行的写操作。

    # 在wyl01 mycat服务器登陆,创建一个表
    [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操作,修改内容如下:

    进行多次查询,观察查询的结果如下所示,可以看到是读写分离的,也可以在日志中进行查看。查询并不是轮询的只是负载均衡。

    5 主从切换

    5.1 故障演示

    我们再插入一条数据,显示目前的写操作仍然是在wyl03上,那我们开始停止wyl03上的服务

    我们停掉wyl03上的mysql的服务,发现依然是可以做查询操作的。

    当我们把wyl03上的master服务给停止后,在wyl01上再次写入数据,此时由下图可以看到是数据从wyl01节点写进去的,并且读取的时候依然是可以读到数据的。

    总结:在wyl01上执行多次发现结果一样,说明在一台master端挂掉的情况下,其连接的slave端也被剔除,并没有新的数据写入,因此数据完整性可以保证完整性。

    5.2 恢复master节点

    当恢复wyl03master节点,我们可以看到数据又保持了一致。

    总结:当我们恢复mysql集群时,数据并没有出现丢失,保证了集群的高可用性。

  • 相关阅读:
    .Net程序员之Python基础教程学习----字典的使用 [Third Day]
    .Net程序员之Python基础教程学习----字符串的使用 [Second Day]
    .Net程序员之Python基础教程学习----列表和元组 [First Day]
    SQL--实现分页查询
    .Net程序员Python之道---Python基础
    C#基础----Linq之List<T>篇
    C#基础--基于POP3协议的邮件接收和基于STMP的邮件发送
    C#基础---事件的使用
    C#基础---委托的使用
    各种坑死爹的
  • 原文地址:https://www.cnblogs.com/youqc/p/14802923.html
Copyright © 2011-2022 走看看