美文网首页MySQL数据/数据库
MySQL集群和高并发---读写分离

MySQL集群和高并发---读写分离

作者: Felix_ | 来源:发表于2019-06-09 17:32 被阅读44次

    随着业务的增长,单台数据库服务器已经不足以满足我们的需求,建立数据库集群对于解决数据库造成的瓶颈是很有效的方法。接下来,我们开始一步一步搭建数据库集群。

    阅读本文之前,你首先要先理解并掌握我的其他两篇文章

    服务器快速部署--使用Docker部署MySQL

    服务器快速部署--使用Docker部署MySQL主从复制

    此次读写分离,我们借助中间件Mycat来进行,我的环境如下:

    Mycat配置

    操作系统: CentOS 7
    IP地址: 172.16.102.20
    JDK版本:1.8
    Mycat版本: 1.66

    主数据库Master配置(Docker配置)

    操作系统: CentOS 7
    IP地址: 172.16.102.30
    MySQL版本: MySQL 5.7
    容器名称: master

    从数据库Slave配置(Docker配置)

    操作系统: CentOS 7
    IP地址: 172.16.102.31
    MySQL版本: MySQL 5.7
    容器名称: slave

    准备好上面的环境之后,我们简单的修改Mycat的配置文件,来简单的搭建读写分离并进行验证。
    修改rule.xml中的count3,因为我们计划将逻辑数据库分为3个实体数据库

        <function name="murmur"
            class="io.mycat.route.function.PartitionByMurmurHash">
            <property name="seed">0</property>
            <property name="count">3</property>
            <property name="virtualBucketTimes">160</property>
        </function>
    

    修改schema.xml内容如下,这里我们使用虚拟数据库TESTDB,数据库中有一个表t_userTESTDB对应3个数据节点dn1dn2dn3,后面会在每个数据库(db1db2、``db3````)中创建一个t_user表,用来存放数据,分别存放于3个数据库,也就是常说的分库

    <?xml version="1.0"?>
    <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    <mycat:schema xmlns:mycat="http://io.mycat/">
    
        <schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100">
            <table name="t_user" dataNode="dn1,dn2,dn3" rule="crc32slot" />
        </schema>
        <dataNode name="dn1" dataHost="localhost1" database="db1" />
        <dataNode name="dn2" dataHost="localhost1" database="db2" />
        <dataNode name="dn3" dataHost="localhost1" database="db3" />
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
                  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
            <heartbeat>select user()</heartbeat>
            <writeHost host="hostM1" url="172.16.102.30:3306" user="root"
                       password="123456">
                <readHost host="hostS1" url="172.16.102.31:3306" user="root" password="123456" />
            </writeHost>
        </dataHost>
    </mycat:schema>
    

    注意,这里我们配置了<writeHost host="hostM1" url="172.16.102.30:3306" user="root" password="123456"></writeHost>mycat写操作,在其内部配置了<readHost host="hostS1" url="172.16.102.31:3306" user="root" password="123456" />mycat读操作,用来实现读写分离,开启读写分离的话需要设置balance为1。

    1. balance=”0”, 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。
    2. balance=”1”,全部的readHost与stand bywriteHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。
    3. balance=”2”,所有读操作都随机的在writeHost、readhost上分发。
    4. balance=”3”,所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力

    至于最后的server.xml我们不做任何设置,采用默认的设置即可,默认设置对外的端口为8066,为root用户提供对TESTDB的操作,默认密码为123456

    由于上面我们配置了三个数据节点,对应了不同的数据库,而mycat不能为我们自动创建数据库,所以,需要手动创建数据库。在master中分别创建三个数据库

    create database db1;
    create database db2;
    create database db3;
    

    masterslave中分别查看,由于做了主从备份,所以两个数据库中的内容都一样

    配置完成之后,我们启动mycat

    ./mycat start
    

    验证mycat是否成功运行

    ./mycat status
    

    如图代表mycat运行正常


    现在,连接到mycat
    mysql -uroot -p123456 -h172.16.102.20 -P8066
    

    现在连接的是mycat虚拟的一个数据库,我们查看下内部的数据库

    这里,我们在schema.xml中配置的虚拟数据库TESTDB正确的显示了出来,现在在TESTDB中创建表t_user
    create table t_user(id int,name varchar(25));
    

    查看t_user的表结构,发现多出了一列_slot,这里我们在配置schema.xmlTESTDBt_user的时候,采用了crc32slot分片规则,此列是mycat计算出来的哈希值存放的字段,我们不需要干预。

    现在,我们向表内插入数据(连接到mycat

    insert into t_user(id,name) values(1,'felix');
    insert into t_user(id,name) values(2,'felix');
    insert into t_user(id,name) values(3,'felix');
    insert into t_user(id,name) values(4,'felix');
    insert into t_user(id,name) values(5,'felix');
    insert into t_user(id,name) values(6,'felix');
    insert into t_user(id,name) values(7,'felix');
    insert into t_user(id,name) values(8,'felix');
    insert into t_user(id,name) values(9,'felix');
    insert into t_user(id,name) values(10,'felix');
    

    然后查看数据库中的数据


    现在这些数据表面上看实在一个数据库TESTDB内,而对应的物理数据库中是什么样子的呢?我们进入master查看

    在实体数据中,其实数据是分别存在了3个数据库中,达到了分库的目的。那本节所说的读写分离呢,貌似根本没有提到啊,现在就来揭秘。

    我们在mycat中的写入操作都直接到了master中,并且同步到了slave中,数据确实是一样的,那么现在我们手动创建不一样,我们在slave中手动插入一条数据

    insert into db1.t_user(id,name,_slot) values(11,'felix',47740);
    

    然后查询slavedb1的数据


    再看下masterdb1的数据

    数据已经不一样了,那么猜想一下

    假如在mycat中查询所有数据,如果没有11,felix,47740,那么也就是说读写分离根本没有发挥作用,但是如果每次查询都有11,felix,47740,就可以肯定我们已经实现了读写分离,现在来验证一下,登录到mycat,查询所有数据(注意这里数据库已经是虚拟数据库TESTDB)

    可见,针对Mysql的读写分离已经成功。下篇文章,我们将使用HAProxy实现MySQL的负载均衡,请持续关注。

    以上内容转载请注明出处,同时也请大家不吝你的关注和下面的赞赏
    ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

    相关文章

      网友评论

        本文标题:MySQL集群和高并发---读写分离

        本文链接:https://www.haomeiwen.com/subject/idlnxctx.html