MySQL数据/数据库

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

2019-06-09  本文已影响44人  Felix_

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

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

服务器快速部署--使用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的负载均衡,请持续关注。

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

上一篇下一篇

猜你喜欢

热点阅读