MySQL 主从复制与读写分离

 概念

主从复制与读写分离的意义

       企业中的业务通常数据量都比较大,而单台数据库在数据存储、安全性和高并发方面都无法满足实际的需求,所以需要配置多台主从数据服务器,以实现主从复制,增加数据可靠性,读写分离,也减少数据库压力和存储引擎带来的表锁定和行锁定问题。

mysql支持的复制类型

(1) STATEMENT:基于语句的复制。在服务器上执行sql语句,在从服务器上执行同样的语句,mysql默认采用基于语句的复制(5.7版本之前),执行效率高。高并发的情况可能会出现执行顺序的误差,事务的死锁。

(2)ROW:基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一 遍。精确,但效率低,保存的文件会更大。

(3)MIXED:混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。更智能,所以大部分情况下使用MIXED。

主从复制的工作过程

Master节点需要开启二进制日志,Slave节点需要开启中继日志。

(1)Master 节点将数据的改变记录成二进制日志 ,当Master上的数据发生改变时(增删改),则将其改变写入二进制日志中。

(2)Slave节点会在一定时间间隔内对Master的二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/O线程请求Master的二进制事件。(请求二进制数据)

(3)同时Master 节点为每个I/O线程启动一个dump线程,用于通知和向其发送二进制事件,I/O线程接收到bin-log内容后,将内容保存至slave节点本地的中继日志中,Slave节点将启动SQL线程从中继日志中读取二进制事件,在本地重放,即解析成sql 语句逐一执行,使得其数据和Master节点的保持一致。最后I/O线程和SQL线程将进入睡眠状态,等待下一次被唤醒。

MySQL主从复制的几个同步模式

1、异步复制(Asynchronous replication)

MySQL默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主如果crash掉了,此时主上已经提交的事务可能并没有传到从上,如果此时,强行将从提升为主,可能导致新主上的数据不完整。

2、全同步复制(Fully synchronous replication)

指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。

3、半同步复制(Semisynchronous replication)

介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。

主从复制案例

每台服务器关闭防火墙和selinux 

 systemctl disable --now firewalldsetenforce 0

 1)主服务器使用本地时钟源。

#安装时间同步工具(本地设置时钟源)
[root@localhost ~]# yum install -y ntp#修改ntp配置文件,在末尾加入 
[root@localhost ~]# vim /etc/ntp.conf 
server 127.127.20.0              #设置本地时钟源,注意修改网段(72是网段)  
fudge 127.127.20.0 stratum 8     #设置时间层级为8(限制在15以内)  ​  
#开启ntpd 
[root@localhost ~]# systemctl start ntpd

 2)两台从服务器同步主服务器的时间。

#安装时间同步工具yum install -y ntp#开启ntpdsystemctl start ntpd​#和主服务器进行时间同步/usr/sbin/ntpdate 192.168.161.153​#设置定时任务,每30分钟同步一次crontab -e  */30 * * * * /usr/sbin/ntpdate 192.168.161.153

 主服务器的mysql配置

修改配置文件,创建一个同步账号授权给从数据库使用。

[root@localhost ~]# vim /etc/my.cnf[mysqld]......server-id = 1               #指定服务ID号,master和两台slave都要不同log-bin=mysql-bin           #添加,主服务器开启二进制日志binlog_format = MIXED       #指定二进制日志(binlog)的记录格式为MIXEDlog-slave-updates=true      #添加,允许slave从master复制数据时可以写入到自己的二进制日志expire_logs_days = 7        #设置二进制日志文件过期时间,默认值为0,表示logs不过期max_binlog_size = 500M      #设置二进制日志限制大小,如果超出给定值,日志就会发生滚动,默认值是1GB​#重启服务[root@localhost ~]# systemctl restart mysqld​[root@localhost ~]# mysql -u root -p#给从服务器授权grant replication slave on *.* to 'myslave'@'192.168.161.%' identified by '123123';  flush privileges;               #刷新权限​show master status;     #查看主服务器状态//显示如下
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000008 |      604 |              |                  |
+------------------+----------+--------------+------------------+1 row in set (0.00 sec)​#File 列显示日志名,Position 列显示偏移量

从服务器的mysql配置

Slave1 服务器:192.168.161.151,mysql5.7

Slave2 服务器:192.168.161.152,mysql5.7

从服务器的mysql配置
Slave1 服务器:192.168.161.151,mysql5.7
Slave2 服务器:192.168.161.152,mysql5.7
ini复制代码 #修改配置文件[root@localhost ~]# vim /etc/my.cnf[mysqld]......server-id = 2            #修改,注意id与Master的不同,两个Slave的id也要不同relay-log=relay-log-bin  #添加,开启中继日志,从主服务器上同步日志文件记录到本地relay-log-index=slave-relay-bin.index   #添加,定义中继日志索引文件的位置和名称,一般和relay-log在同一目录relay_log_recovery = 1                  #选配项#当 slave 从库宕机后,假如 relay-log 损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的 relay-log,并且重新从 master 上获取日志,这样就保证了 relay-log 的完整性。默认情况下该功能是关闭的,将 relay_log_recovery 的值设置为 1 时, 可在 slave 从库上开启该功能,建议开启。​#重启服务[root@localhost ~]# systemctl restart mysqld     ​#登录数据库,进行同步设置[root@localhost ~]# mysql -u root -pCHANGE master to master_host='192.168.161.153',master_user='myslave',master_password='123123',master_log_file='mysql-bin.000008',master_log_pos=604;     #配置同步,注意 master_log_file 和 master_log_pos 的值要与Master查询的一致​start slave;                #启动同步,如有报错执行 reset slave;​show slave status\G         #查看 Slave 状态##确保 IO 和 SQL 线程都是 Yes,代表同步正常。Slave_IO_Running: Yes               #负责与主机的IO通信Slave_SQL_Running: Yes              #负责自己的slave mysql进程​##一般 "Slave_IO_Running: No" 的可能原因:1. 网络不通 2. my.cnf配置有问题(server-id重复)3. 密码、file文件名、pos偏移量不对 4. 防火墙没有关闭 

 主从复制案例演示(半同步复制)
实验环境:
Master 服务器:192.168.161.153,mysql5.7
Slave1 服务器:192.168.161.151,mysql5.7
Slave2 服务器:192.168.161.152,mysql5.7
实验操作:

1、所有服务器关闭防火墙

 systemctl disable --now firewalldsetenforce 0

2、主数据库配置

 vim /etc/my.cnf             #在 [mysqld] 区域添加下面内容......plugin-load=rpl_semi_sync_master=semisync_master.so     #加载mysql半同步复制的插件rpl_semi_sync_master_enabled=ON         #或者设置为"1",即开启半同步复制功能rpl-semi-sync-master-timeout=1000       #超时时间为1000ms,即1s​systemctl restart mysqld​

3、从数据库配置

 vim /etc/my.cnf ......plugin-load=rpl_semi_sync_slave=semisync_slave.sorpl_semi_sync_slave_enabled=ON​systemctl restart mysqld ​

4、查看半同步是否在运行

 show status like 'Rpl_semi_sync_master_status';    #主数据库执行show variables like 'rpl_semi_sync_master_timeout';​show status like 'Rpl_semi_sync_slave_status';      #从数据库执行(此时可能还是OFF状态,需要在下一步重启IO线程后,从库半同步状态才会为ON)​STOP SLAVE IO_THREAD;       #重启从数据库上的IO线程START SLAVE IO_THREAD;​show status like '%Rpl_semi%';   #在主库查询半同步状态​​参数说明:Rpl_semi_sync_master_clients                    #半同步复制客户端的个数Rpl_semi_sync_master_net_avg_wait_time          #平均等待时间(默认毫秒)Rpl_semi_sync_master_net_wait_time              #总共等待时间Rpl_semi_sync_master_net_waits                  #等待次数Rpl_semi_sync_master_no_times                   #关闭半同步复制的次数Rpl_semi_sync_master_no_tx                      #表示没有成功接收slave提交的次数Rpl_semi_sync_master_status                     #表示当前是异步模式还是半同步模式,on为半同步Rpl_semi_sync_master_timefunc_failures          #调用时间函数失败的次数Rpl_semi_sync_master_tx_avg_wait_time           #事物的平均传输时间Rpl_semi_sync_master_tx_wait_time               #事物的总共传输时间Rpl_semi_sync_master_tx_waits                   #事物等待次数Rpl_semi_sync_master_wait_pos_backtraverse      #可以理解为"后来的先到了,而先来的还没有到的次数"Rpl_semi_sync_master_wait_sessions              #当前有多少个session因为slave的回复而造成等待Rpl_semi_sync_master_yes_tx                     #成功接受到slave事物回复的次数当半同步复制发生超时(由rpl_semi_sync_master_timeout参数控制,默认为10000ms,即10s),会暂时关闭半同步复制,转而使用异步复制,也就是会自动降为异步工作。当 master dump 线程发送完一个事务的所有事件之后,如果在 rpl_semi_sync_master_timeout 内,收到了从库的响应, 则主从又重新恢复为半同步复制。​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/5973.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTTP模式下STM32程序远程升级设计

针对嵌入式终端设备架设分散、数量庞大以及应用程序更新迭代速度快带来的程序升级困难局面,运用STM32微控制器的在应用中编程(IAP)原理,设计了通过以太网远程升级程序的方案。 HTTP协议和LwIP协议的使用,不仅让整个方…

0基础学习VR全景平台篇,第51篇:高级功能-自定义菜单

大家好,欢迎观看蛙色VR官方系列——后台使用课程! 本期为大家带来蛙色VR平台,高级功能-自定义菜单! 功能位置示意 一、本功能将用在哪里? 自定义菜单,是显示在VR漫游作品底部和顶部各种可点击的图标按钮。…

Nginx(7)Nginx实现服务器端集群搭建

Nginx集群搭建 Nginx与Tomcat部署Nginx实现动静分离Nginx实现Tomcat集群搭建 Nginx高可用解决方案KeepalivedKeepalived配置文件keepalived之vrrp_script Nginx制作下载站点Nginx的用户认证模块 Nginx与Tomcat部署 前面课程已经将Nginx的大部分内容进行了讲解,我们…

如何通过用户场景分析挖掘需求痛点?4大角度

在我们日常需求分析过程中,往往忽视对用户场景的深入分析和挖掘,造成伪需求和需求缺失等问题。 而真正的用户需求,只有在对应的应用场景下才会真正呈现出来。因此我们需要重视对用户场景分析,深入挖掘用户需求痛点。而在对用户场景…

解决 An attempt was made to call a method that does not exist. 问题详解

哈喽大家好,我是阿Q。今天在开发代码的过程中,由于手抖,不知道引入了什么包依赖,导致项目启动一直报错,特写本文来记录下解决问题的经过。 文章目录 问题描述报错信息如下报错描述 解决方法总结 有想赚点外块|技术交流…

windows环境下安装zookeeper

安装 下载地址:Apache Downloads 注意:zookeeper的安装路径不要有中文,建议也不要有空格 文件路径如下: 生成并修改zoo.cfg文件 复制zookeeper的conf目录下的zoo_simple.cfg文件,并重命名为zoo.cfg 修改zoo.cfg文件…

Fortinet FortiOS 7.4.0 (FortiGate VM deployment Images) - 混合架构防火墙

Fortinet FortiOS 7.4.0 (FortiGate VM deployment Images) - 混合架构防火墙 下一代防火墙 (NGFW)、虚拟化 NGFW 和云原生防火墙 请访问原文链接:https://sysin.org/blog/fortios-7/,查看最新版。原创作品,转载请保留出处。 作者主页&…

【K8S系列】深入解析K8S存储

序言 做一件事并不难,难的是在于坚持。坚持一下也不难,难的是坚持到底。 文章标记颜色说明: 黄色:重要标题红色:用来标记结论绿色:用来标记一级论点蓝色:用来标记二级论点 Kubernetes (k8s) 是一…

Debian 12 静态IP / 固定IP的设置

环境:Debian 12 amd64-lxde 局域网:PT925E电信光猫 手机APP 网络管家 一般用动态IP就可以了,但如果软件环境比较小众,问题就随之而来。起始问题:路由器无法解析设备名和IP,网络管家也不让设置固定IP&…

REDIS缓存穿透 击穿 雪崩

一、前言 在我们日常的开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一旦涉及大数据量的需求,比如一些商品抢购的情景,或者…

vscode高亮插件——highlight-words(高亮代码、高亮变量、突出显示)

文章目录 官方教程高亮文字使用方法配置 演示变量高亮(Highlight Toggle Current)选择高亮(Highlight Selection with Options)删除高亮(Highlight Remove)侧边栏(Highlight Toggle Sidebar&…

QT——使用QListWidget、QListWidgetItem、QWidget实现自定义管理列表

作者:小 琛 欢迎转载,请标明出处 文章目录 需求场景思路描述Qt模块QListWidgetQListWidgetItem自定义QWidget配合QListWidget 例子:实现一个json文件管理窗口 需求场景 因工作需要,开发一个文件管理窗口,要让使用者可…