介绍
读写分离,简单地说是把对数据库的读和写操作分开,以对应不同的数据库服务器。主数据库提供写操作,从数据库提供读操作,这样能有效的减轻单台数据库的压力。
通过mycat即可轻易实现上述功能,不仅可以支持mysql,也可以支持orcle和sql server
一主一从读写分离
逻辑库:可以不指定表(读取数据节点关联数据库中的所有表)
xml
<schema name="itcast" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="dn1">
</schema>
数据节点
xml
<dataNode name="dn1" dataHost="dhost1" database="shopping" />
数据主机
xml
<dataHost name="dhost7" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="master" url="jdbc:mysql://192.168.160.153:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root"
password="1234">
<readHost host="slave" url="jdbc:mysql://192.168.160.139:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root"
password="1234">
</readHost>
</writeHost>
</dataHost>
balance(负载均衡策略,目前取值有4种)
| 参数值 | 含义 |
|---|---|
| 0 | 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上 |
| 1 | 全部的readHost与备份用的writeHost都参与select语句的负载均衡(主要针对于双主双从模式) |
| 2 | 所有的读写操作都随机在writeHost和readHost上分发 |
| 3 | 所有的读请求随机分发到writeHost对应的readHost上执行,writeHost不负担读压力 |
双主双从
一个主机master1用于处理所有写操作,他的从机slave1和另一台主机master2还有它的从机slave2负责所有读请求。当master1主机宕机后,master2主机负责写请求,master1、master2互为备用机
主库配置
1、修改配置文件(/etc/my.cnf)
xml
#mysql服务id
server-id=1
#指定同步的数据库
binlog-do-db=db01
binlog-do-db=db02
binlog-do-db=db03
#在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates
2、重启服务
shell
systemctl restart mysqld
3、创建用户、授予权限
sql
create user 'itcast'@'%' identified with mysql_native_password by 'Root@123456';
grant replication slave on *.* to 'itcast'@'%';
从库配置
1、修改配置文件
shell
server-id=2
2、重启Mysql服务器
java
systemctl restart mysqld
配置从库管理的主库
sql
change replication source to source_host='xxx.xxx'
,source_user='xxx'
,source_password='xxx'
,source_log_file='xxx'
,source_log_pos=xxx;
开启
xml
show replica status;#8.0.22之后
双主双从读写分离
schema.xml
xml
<schema name="itcast_rw" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn7">
</schema>
<dataNode name="dn7" dataHost="dhost7" database="itcast" />
<dataHost name="dhost7" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="master" url="jdbc:mysql://192.168.160.153:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root"
password="1234">
<readHost host="slave" url="jdbc:mysql://192.168.160.139:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root"
password="1234">
</readHost>
</writeHost>
<writeHost host="master" url="jdbc:mysql://192.168.160.154:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root"
password="1234">
<readHost host="slave" url="jdbc:mysql://192.168.160.138:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root"
password="1234">
</readHost>
</writeHost>
</dataHost>
dataHost参数配置
- banlance=1
代表全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->s1,M2->s2,并且M1,M2互为主备),正常情况下,M2,s2,s1都参与select语句的负载均衡 - writeType
- 0:写操作都转发到第一台writeHost,writeHost1挂了,会切换到writeHost2上;
- 1:所有的写操作都随机的发送到配置的writeHost上
- switchType
- -1:不自动切换
- 1:自动切换