1. 说明
本文是基于mysql的主从复制模下继续开发💯,请点击😄我来查看Mycat官网Mycat的github
在搭建完成了读写分离的MySQL后,你可能会有疑问,既然我们的数据库现在变成了三个。一主
两从模式,那么难不成我们需要读取三个数据库吗。这个显然是不科学的。那么我们解决的办法是使用了
Mycat
来充当数据库分库分表的中间件。小声逼逼,后面我会使用Apache ShardingSphere
来进行取代。
2. 架构图
3. 拉取需要创建docker版的mycat资源
# 创建mycat01文件夹
mkdir /usr/local/docker/mysql/mycat01 -p
# 进入文件夹
cd /usr/local/docker/mysql/mycat01
# 下载对应的资源
git clone https://github.com/ruanjiayu/docker.mycat
# 进入docker.mycat
cd /usr/local/docker/mysql/mycat01/docker.mycat
# 构建镜像
docker-compose build
4. 修改配置
4.1 server.xml修改mycat的登录用户名,密码以及逻辑数据库
vim config/mycat/server.xml
<!-- 设置用户名以及虚拟逻辑数据库 -->
<user name="mycat" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">db_order</property>
</user>
4.2 schema.xml配置你需要进行分片的数据库
vim config/mycat/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- 配置数据表 -->
<schema name="db_order" checkSQLschema="false" sqlMaxLimit="100">
<table name="tb_order" dataNode="dn1" rule="mod-long"/>
</schema>
<!-- 配置分片 -->
<dataNode name="dn1" dataHost="cluster1" database="db_order" />
<!-- 配置连接信息 -->
<dataHost name="cluster1" maxCon="1000" minCon="10" balance="3"
writeType="1" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="w1" url="master01:3306" user="root" password="123456">
<readHost host="w1r1" url="slave01:3306" user="root" password="123456" />
<readHost host="w1r2" url="slave02:3306" user="root" password="123456" />
</writeHost>
</dataHost>
</mycat:schema>
balance
属性说明:
负载均衡类型,目前的取值为三种
-
balance="0
,不开启读写分离操作,所有读操作全部发往writeHost
上。 -
balance="1"
,全部的readHost
和stand by readHost
参与select
语句的负载均衡。简单来说,当使用双主模式下(M1->S1,M2->S2)下,正常情况下,M2,S1,S2
都参与了select
语句的负载均衡。 -
balance="2"
,所有读操作在writeHost
,readHost
上分发。 -
balance="3"
,所有读操作请求随机发送到writerHost
对应的readHost
上执行,writeHost
不负担读取压力。
4.3 rule.xml配置master的数据节点
vim config/mycat/rule.xml
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes 需要分片的节点有几个就填写几个 -->
<property name="count">1</property>
</function>
4.4 配置docker-compose.yml
vim /usr/local/docker/mysql/mycat01/docker.mycat/docker-compose.yml
version: '3'
services:
mycat:
build: .
container_name: mycat
volumes:
- ./config/mycat/:/mycat/conf/:ro
- ./log/mycat-logs/:/mycat/logs/:rw
#- /etc/localtime:/etc/localtime:ro
- ./config/hosts:/etc/hosts:ro
ports:
- "8066:8066"
- "9066:9066"
ulimits:
nproc: 65535
hostname: mycat
# mem_limit: 1024m
restart: always
networks:
default:
external:
name: mysql_network
5. 启动mycat分库分表中间件
docker-compose up -d
注意: 事先一定要在
master节点
创建对应的数据库db_order
,不然连接mycat会出现异常。
6. 通过Mycat对db_order.tb_order表进行操作
需要注意,因为分片的原因。在插入数据的时候,我们主键一定需要填写。
7.注意
7.1 在Mycat分库分表中间件中,我们不能创建新的表
7.2 在Mycat分库分表中间件中,我们不能创建新的库
8. 改善读写分离数据库
聪明的你可能会意识到,虽然我完成了上述的操作,但是我的写入数据库还是只有一个,还是会遇到数据库性能问题以及数据量太大不能导入等情况,那么下一章,让我们来改进一下吧😄