【运维篇第四弹】《详解读写分离》什么是读写分离?如何配置一主一从读写分离以及双主双从读写分离?都会在这一篇文章中掌握
文章目录
- 读写分离
- 一、介绍
- 二、一主一从
- 三、一主一从读写分离
- (1)Mycat配置
- (2)负载均衡
- (3)验证是否主从分离
- 四、双主双从
- 五、双主双从读写分离
- 《①双主双从配置》
- (1)主库配置
- (2)从库配置
- (3)主从关联
- (4)两台主库互相复制
- (5)测试
- 《②读写分离配置》
- (1)配置
- (2)读写分离属性作用
读写分离
1.介绍
读写分离是为了降低单台服务器的访问压力,写走主库,读走从库
2.一主一从
MySQL主从复制是基于二进制日志binlog实现的。master、slave
3.一主一从读写分离
< wirteHost>< readHost/>、balance属性
4.双主双从
两台主库,互相复制,互为主备,增强MySQL的可用性
5.双主双从读写分离
< wirteHost>< readHost/>< wirteHost>、balance、writeType、switchType
一、介绍
读写分离,简单地说就是把数据库的读和写操作分开,以对应不同的数据库服务器。主数据库提供写操作,从数据库提供读操作,这样能有效地减轻单台数据库的压力。
通过Mycat即可轻易实现上述功能,不仅可以支持MySQL,也可以支持Oracle和SQL Server
二、一主一从
一主一从的问题就是:主节点master宕机之后,业务系统就只能读,而不能写入数据了
一主一从搭建:
主从复制无需用到Mycat中间件
1.修改主库和从库的配置文件/etc/my.cnf
#---- 主库设置 ----
#mysql服务ID,保证整个集群环境中唯一,取值范围:1-2^32-1,默认为1
server-id=1
#是否只读,1表示只读,0表示读写
read-only=0#---- 从库设置 ----
#mysql服务ID,保证整个集群环境中唯一,取值范围:1-2^32-1,默认为1
server-id=2
#是否只读,1表示只读,0表示读写
read-only=1
2.主库创建远程账号,并授予主从复制权限
#创建itcast用户,并设置密码,该用户可以在任意主机连接该MySQL服务create user 'itcast'@'%' identified with mysql_native_password by '123456';#为'itcast'@'%'用户分配主从覅之权限grant replication slave on *.* to 'itcast'@'%';
3.主库查看二进制日志坐标
show master status;
记录好file、position
4.主从关联
change master to
master_host='192.168.44.128',master_user='itcast',master_password='123456',#主库远程连接的用户
master_log_file='binlog.000016',master_log_pos=663; #刚刚记录的二进制文件和起始位置
5.开启并检查同步状态
start slave; #开启同步操作show slave status; #显示同步状态
验证:
#主库中创表
reate table tb_user(id int(11) not null,ame varchar(50) not null,sex varchar(1),primary key (id)
)engine=innodb default charset=utf8;
#主库中插语句
insert into tb_user(id,name,sex) values(1,'Tom','1'),(2,'Trigger','0'),(3,'Dawn','1');
插入之后我们发现从库中也有了;
三、一主一从读写分离
(1)Mycat配置
Mycat控制后台数据库的读写分离和负载均衡,是有schema.xml文件datahost标签的balance属性控制的。
①在schema.xml文件中:
1.定义逻辑库,及其对应的逻辑节点
2.配置逻辑节点对应的物理主机地址,数据库
3.配置物理地址的负载均衡策略balance,读主机的地址,写主机的地址;
<!-- 逻辑库的配置-->
<schema name="RW_TEST" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn7">
</schema><!-- 逻辑节点的配置-->
<dataNode name="dn7" dataHost="dhost4" database="MStest" /><!-- 物理主机的配置-->
<dataHost name="dhost4" 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.44.128:3306?useSSL=false" user="root" password="123456" ><readHost host="slave" url="jdbc:mysql://192.168.44.129:3306?useSSL=false" user="root" password="123456" /></writeHost>
</dataHost>
以上是实现一个叫做dn7的逻辑节点,他对应的物理主机有两台:
一台是master主机,用来进行写操作;一台是slave从机,用来进行读操作
②在server.xml文件中:
添加对逻辑库RW_TEST的访问权限:
修改完毕之后重启mycat即可
bin/mycat stop
bin/mycat start
(2)负载均衡
参数值 | 含义 |
---|---|
0 | 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上 |
1 | 全部的readHost 与 备用的writeHost都参与select 语句的负载均衡(主要针对双主双从模式) |
2 | 所有的读写操作都随机在writeHost,readHost上分发 |
3 | 所有的读请求随机分发到writeHost对应的readHost上执行,writeHost不负担读压力 |
(3)验证是否主从分离
-
我们可以在从库中修改数据,从库修改不会影响主库;
这样我们再使用查询语句的时候:如果是修改后的数据,就是查询从库;
-
但我们插入一条数据的时候,如果从库也插入了,那么就说明插入语句是主库实行的;
四、双主双从
一个主机M1用于处理所有写请求,他的从机S1和另外一台主机M2 还有他的从机 S2 负责所有读请求。
当M1主机宕机后,M2主机负责写请求,M1、M2互为备机
由架构图不难看出:
一共需要5台服务器,一台装Mycat,充当Mycat中间件服务器;其余四台两两成对。
#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
五、双主双从读写分离
《①双主双从配置》
(1)主库配置
#---- 主库设置 ----
#mysql服务ID,保证整个集群环境中唯一,取值范围:1-2^32-1,默认为1
server-id=1
#指定同步的数据库为db01,db02,db03
binlog-do-db=db01
binlog-do-db=db02
binlog-do-db=db03
#在作为从库数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates
#配置完成之后重启MySQL服务器
systemctl restart mysqld
两个主库的配置文件中:
1.server-id保证不重复即可;主库一个填1一个填3
2.指定同步的数据库**(可不写)**
3.log-slave-updates
作为从数据库的时进行的操作,该配置两台主机需要写
4.read-only
不写默认为0,表示可读写
(2)从库配置
#mysql服务ID,保证整个集群环境中唯一,取值范围:1-2^32-1,默认为1
server-id=2
#是否只读,1表示只读,0表示读写
read-only=1
#配置完成之后重启MySQL服务器
systemctl restart mysqld
两个从库的配置文件中:
1.server-id保证不重复即可;从库一个填2一个填4
2.read-only
可以添加该配置,设置为1表示只读**(建议添加)**
(3)主从关联
1.主库创建用来备份用户
创建用于远程连接的用户并授予主从复制权限
create user 'itcast'@'%' identified with mysql_native_password by '123456';grant replication slave on *.* to 'itcast'@'%';
主库查看二进制日志坐标,记录好file和position
show master status;
2.从库连接并开启复制状态
S1(2号从库)对应M1,S2(4号从库)对应M2
#2号从库配置
change
replication source to source_host='192.168.44.129',source_user='itcast',source_password='123456',
source_log_file='binlog.000016',source_log_pos=156;#4号从库配置
change replication source to
source_host='192.168.44.131',source_user='itcast',source_password='123456',
source_log_file='binlog.000018',source_log_pos=548;
开启复制状态
start slave; #开启主从复制show slave status\G; #查看主从复制状态,\G表示竖型显示
(4)两台主库互相复制
#主机1配置,与3的从库4一样
change replication source to
source_host='192.168.44.131',source_user='itcast',source_password='123456',
source_log_file='binlog.000017',source_log_pos=663;#主机3配置,与1的从库2一样
change replication source to
source_host='192.168.44.129',source_user='itcast',source_password='123456',
source_log_file='binlog.000015',source_log_pos=663;
开启复制状态
start slave; #开启主从复制show slave status\G; #查看主从复制状态,\G表示竖型显示
(5)测试
分别在两台主库M1、M2上执行DDL、DML语句,查看涉及到的数据库服务器的数据同步状态。
create database MStest1create table tb_user(id int(11) not null primary key,name varchar(50) not null,sex varchar(1)
)engine=innodb default charset=utf8mb4;insert into tb_user(id,name,sex) values(1,'Tom','1');
insert into tb_user(id,name,sex) values(2,'Trigger','0');
insert into tb_user(id,name,sex) values(3,'Dawn','1');
insert into tb_user(id,name,sex) values(4,'jack','1');
insert into tb_user(id,name,sex) values(5,'Coco','0');
insert into tb_user(id,name,sex) values(6,'MMM','0');
《②读写分离配置》
(1)配置
Mycat控制后台数据库的读写分离和负载均衡由 schema.xml文件datahost标签的balance属性控制,通过writeType及switchType来完成失败自动切换的
<!-- 1.配置逻辑库 -->
<schema name="D_RW_TEST" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn8">
</schema><!-- 2.配置逻辑节点及其对应的物理数据库 -->
<dataNode name="dn8" dataHost="dhost5" database="MStest1" /><!-- 3.配置物理节点,并设置负载和读写的规则 -->
<dataHost name="dhost5" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100"><heartbeat>select user()</heartbeat><writeHost host="master1" url="jdbc:mysql://192.168.44.129:3306?useSSL=false" user="root" password="123456" ><readHost host="slave1" url="jdbc:mysql://192.168.44.130:3306?useSSL=false" user="root" password="123456" /></writeHost><writeHost host="master2" url="jdbc:mysql://192.168.44.131:3306?useSSL=false" user="root" password="123456" ><readHost host="slave2" url="jdbc:mysql://192.168.44.132:3306?useSSL=false" user="root" password="123456" /></writeHost>
</dataHost>
然后在server.xml中添加逻辑库即可
(2)读写分离属性作用
-- balance="1"代表全部的readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1 , M2->S2,并且M1和M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。-- writeType="0"0:写操作都转发到第1台writeHost,writeHost1挂了,会切换到writeHost2上;1:所有的写操作都随机地发送到配置的writeHost上;-- switchType="1"-1:不自动切换1:自动切换