随着业务的增长,单台数据库服务器已经不足以满足我们的需求,建立数据库集群对于解决数据库造成的瓶颈是很有效的方法。接下来,我们开始一步一步搭建数据库集群。
阅读本文之前,你首先要先理解并掌握我的其他两篇文章
此次读写分离,我们借助中间件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
中的count
为3
,因为我们计划将逻辑数据库分为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_user
,TESTDB
对应3个数据节点dn1
、dn2
、dn3
,后面会在每个数据库(db1
、db2
、``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。
- balance=”0”, 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。
- balance=”1”,全部的readHost与stand bywriteHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。
- balance=”2”,所有读操作都随机的在writeHost、readhost上分发。
- balance=”3”,所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力
至于最后的server.xml
我们不做任何设置,采用默认的设置即可,默认设置对外的端口为8066
,为root
用户提供对TESTDB
的操作,默认密码为123456
。
由于上面我们配置了三个数据节点,对应了不同的数据库,而mycat
不能为我们自动创建数据库,所以,需要手动创建数据库。在master
中分别创建三个数据库
create database db1;
create database db2;
create database db3;
在master
、slave
中分别查看,由于做了主从备份,所以两个数据库中的内容都一样
配置完成之后,我们启动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.xml
的TESTDB
的t_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);
然后查询slave
中db1
的数据
再看下
master
中db1
的数据数据已经不一样了,那么猜想一下
假如在
mycat
中查询所有数据,如果没有11,felix,47740
,那么也就是说读写分离根本没有发挥作用,但是如果每次查询都有11,felix,47740
,就可以肯定我们已经实现了读写分离,现在来验证一下,登录到mycat
,查询所有数据(注意这里数据库已经是虚拟数据库TESTDB
)
可见,针对Mysql的读写分离已经成功。下篇文章,我们将使用HAProxy
实现MySQL
的负载均衡,请持续关注。
以上内容转载请注明出处,同时也请大家不吝你的关注和下面的赞赏
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
网友评论