当前位置: 首页 > news >正文

【运维篇第四弹】《详解读写分离》什么是读写分离?如何配置一主一从读写分离以及双主双从读写分离?都会在这一篇文章中掌握

文章目录

  • 读写分离
  • 一、介绍
  • 二、一主一从
  • 三、一主一从读写分离
    • (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:自动切换
http://www.dtcms.com/a/362132.html

相关文章:

  • The Algorithmic Foundations of Differential Privacy - 1
  • 初识JVM
  • Linux之Docker虚拟化技术(三)
  • STM32项目分享:基于单片机的图书馆座位监测系统
  • docker-nacos-v3
  • 告别发票山,拥抱高效流:一位财务经理的“解放”宣言
  • 第四次工业革命简史:从图灵测试到ChatGPT的AI革命
  • ModelScope 开发环境配置指南
  • leetcode笔记
  • OpenCV轻松入门_面向python(第四章色彩空间类型转换)
  • 从全栈开发到微服务架构:一次真实面试的深度解析
  • Ansible 常用模块归纳总结
  • 【Axure高保真原型】表格增删改查(含下拉列表)
  • Swift 解法详解:LeetCode 368《最大整除子集》
  • SQL Server从入门到项目实践(超值版)读书笔记 25
  • 使用 Google OR-Tools 轻松解决复杂优化问题(如排程优化)
  • HarvardX TinyML小笔记2(番外3:数据工程)
  • Node.js版本管理工具 || 全配置安装
  • Claude AI 因编写勒索软件和开展勒索活动而被滥用
  • Agent落地元年:谁在成为最坚实的土壤?
  • 【前端】跨域
  • 懒加载详细讲解
  • 在Linux系统上第一次创建java项目并运行
  • `[特殊字符]LeetCode每日一题 1792. 最大平均通过率(打卡第一天)`
  • 在 React Native 层禁止 iOS 左滑返回(手势返回/手势退出)
  • Unity 串口通讯2 硬件SDK 开发[数据监听,按键监听]
  • 人工智能——课程考核
  • Python OpenCV图像处理与深度学习:Python OpenCV图像几何变换入门
  • 线程池发生了异常该怎么处理?
  • Groovy 的核心语法