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

Mysql 主从复制、读写分离

在企业应用中,成熟的业务通常数据量都比较大 单台MySQL在安全性、 高可用性和高并发方面都无法满足实际的需求 配置多台主从数据库服务器以实现读写分离

一、主从复制原理

1.1 MySQL的复制类型

基于语句的复制(STATEMENT, MySQL默认类型)

基于行的复制(ROW)

混合类型的复制(MIXED)

1.2 MySQL主从复制的工作过程(⭐⭐ 两日志、三线程)

⭐⭐ 两日志、三线程

(1)当主服务器上的事务被提交时,所有的更改(如 INSERTUPDATEDELETE 等)会被记录到二进制日志(Binary Log)中。写入二进制日志完成后,Master 通知存储引擎提交事务。

(2)Slave 将 Master 的数据复制到其中继日志(Relay log)。

首先slave 开启一个 I/O线程,I/O线程在 Master 上打开一个普通的连接,然后开始  dump 线程。dump线程告诉 I/O线程有新的数据,I/O线程 发送数据索取请求到 dump 线程,dump线程 从 Master 的二进制日志中读取事件,如果已经跟上 Master,它会睡眠并等待 Master 产生新的事件,I/O线程将这些事件写入中继日志。

(3)SQL slave thread(SQL从线程)处理该过程的最后一步,SQL线程从中继日志 读取事件,并存放 数据到磁盘中,使其与 Master 中的数据一致,只要该线程与 I/O 线程保持一致,中继日志通常会位于 OS 缓存中,所以中继日志的开销很小。 复制过程有一个很重要的限制,即复制在 Slave 上是串行化的,也就是说 Master 上的并行更新操作不能在 Slave 上并行操作。

1.3 MySQL主从复制延迟

1、master服务器高并发,形成大量事务

2、网络延迟

3、主从硬件设备导致

cpu主频、内存io、硬盘io 4、本来就不是同步复制、而是异步复制 从库优化Mysql参数。比如增大innodb_buffer_pool_size,让更多操作在Mysql内存中完成,减少磁盘 操作。 从库使用高性能主机。包括cpu强悍、内存加大。避免使用虚拟云主机,使用物理主机,这样提升了i/o方面性。 从库使用SSD磁盘 网络优化,避免跨机房实现同步 问题解决方法 半同步复制- 解决数据丢失的问题 并行复制---解决从库复制延迟的问题

   

1.4 MySQL 同步方式(三种)

1、异步复制(Async Replication)

2、同步复制(sync Replication)

3、半同步复制(Async Replication)

4、增强半同步复制(lossless Semi-Sync Replication)、无损复制

①、异步复制

Master数据库接收请求后(增删...),直接将数据返回给客户端,不关心slave(从数据库)是否同步,如果Master挂了,从服务器能顶上,但没有数据

主库将更新写入Binlog日志文件后,不需要等待数据更新是否已经复制到从库中,就可以继续处理更多 的请求。Master将事件写入binlog,但并不知道Slave是否或何时已经接收且已处理。在异步复制的机制 的情况下,如果Master宕机,事务在Master上已提交,但很可能这些事务没有传到任何的Slave上。假 设有Master->Salve故障转移的机制,此时Slave也可能会丢失事务。MySQL复制默认是异步复制,异步 复制提供了最佳性能。

②、同步复制

Master库接收请求后,会等所有slave库(从库)同步后,才会将数据返回给客户端(其他从库会继续进行同步的,不是残缺的数据)

主库将更新写入Binlog日志文件后,需要等待数据更新已经复制到从库中,并且已经在从库执行成功, 然后才能返回继续处理其它的请求。同步复制提供了最佳安全性,保证数据安全,数据不会丢失,但对 性能有一定的影响。

③、半同步复制

Master库接收请求后,等待所有从库中,只要有一个slave库(从库)完成同步,就会将数据返回给客户端

主库提交更新写入二进制日志文件后,等待数据更新写入了从服务器中继日志中,然后才能再继续处理 其它请求。该功能确保至少有1个从库接收完主库传递过来的binlog内容已经写入到自己的relay log里面 了,才会通知主库上面的等待线程,该操作完毕。 半同步复制,是最佳安全性与最佳性能之间的一个折中。

MySQL 5.5版本之后引入了半同步复制功能,主从服务器必须安装半同步复制插件,才能开启该复制功 能。如果等待超时,超过rpl_semi_sync_master_timeout参数设置时间(默认值为10000,表示10秒),则关闭半同步复制,并自动转换为异步复制模式。当master dump线程发送完一个事务的所有事 件之后,如果在rpl_semi_sync_master_timeout内,收到了从库的响应,则主从又重新恢复为增强半同 步复制。

ACK (Acknowledge character)即是确认字符。

④、增强半同步复制(几乎不用)

增强半同步是在MySQL 5.7引入,其实半同步可以看成是一个过渡功能,因为默认的配置就是增强半同 步,所以,大家一般说的半同步复制其实就是增强的半同步复制,也就是无损复制。 增强半同步和半同步不同的是,等待ACK时间不同rpl_semi_sync_master_wait_point = AFTER_SYNC(默认) 半同步的问题是因为等待ACK的点是Commit之后,此时Master已经完成数据变更,用户已经可以看到 最新数据,当Binlog还未同步到Slave时,发生主从切换,那么此时从库是没有这个最新数据的,用户看 到的是老数据。 增强半同步将等待ACK的点放在提交Commit之前,此时数据还未被提交,外界看不到数据变更,此时如 果发送主从切换,新库依然还是老数据,不存在数据不一致的问题。

2.4 Mysql应用场景

mysql 数据库 主要的性能是读和写,一般场景来说读请求更多。 根据主从复制可以演变成读写分离,因为读写分离基于主从复制,使用读写分离从而解决高并发的问 题。

mysql架构演变的方向:

1、单台mysql有单点故障

2、集群---》 主从复制

3、主从复制渡河写的压力不均衡

4、读写分离

5、读写分离的基础是主从复制

6、mysql的高可用架构MHA(master HA高可用) MGR MMM  

二、主从复制实验

整个实验的环境 以及服务器信息 环境部署 cetos7.6

虚拟机服务环境

Master服务器:192.168.190.50 mysql5.7

slave1服务器:192.168.190.60 mysql5.7

Slave2服务器:192.168.190.70 mysql5.7

Amoeba服务器:192.168.190.10 (预备机器) jdk1.6

客户端服务器:192.168.10.13 测试

2.1、主从服务器时间同步

2.1.1 master服务器配置

① 安装ntp、修改配置文件

[root@master ~]# yum install ntp -y

[root@master ~]# yum -y install ntpdate ntp           #安装ntp软件

[root@master ~]# ntpdate ntp.aliyun.com       #时间同步

[root@master ~]# vim /etc/ntp.conf                    #编辑配置文件

fudge 127.127.1.0 stratum 10            #设置本机的时间层级为10级,0级表示时间层级为0级,是向其他服务器提供时间同步源的意思,不要设置为0级

server 127.127.1.0            #设置本机为时间同步源

② 开启NTP服务、关闭防火墙和增强性安全功能

[root@master ~]# systemctl start ntpd

[root@master ~]# systemctl stop firewalld.service

[root@master ~]# setenforce 0

3.1.2 两台SLAVE服务器配置

① 安装ntp、ntpdate服务

[root@localhost ~]# yum install ntp ntpdate -y

② 开启ntp服务,关闭防火墙、增强性安全功能

③ 时间同步master服务器

[root@localhost ~]# ntpdate 192.168.190.50

④ 两台slave服务器配置相同

#master服务器同步阿里云时钟服务器

ntpdate ntp.aliyun.com

ntpdate 192.168.190.50

crontable -e

*/10 * * * * /usr/sbin/ntpdate 192.168.190.50

3.2、MySQL手工编译安装(这里忽略)

........省略部分内容

详情参考mysql编译安装

三台MySQL同时手工编译安装

2.3 配置主从同步

①配置主服务器 Master (192.168.190.50)

[root@master ~]# vi /etc/my.cnf          #在 [mysqld] 模块下修改一下内容

server_id = 1

#开启二进制日志文件(之后生成的日志名为master-bin)

log_bin=master-bin              #开启从服务器日志同步

log_slave-updates=true       #主服务器id为1(不可重复) 

binlog_format=MIXED

重启服务

[root@master ~]# systemctl restart mysqld

配置规则

[root@master ~]# mysql -uroot -p

Enter password:                 #登录mysql

mysql> grant replication slave on *.* to 'myslave'@'192.168.190.%' identified by '123456';

#给从服务器提权,允许使用slave的身份复制master的所有数据库的所有表,并指定密码为123456

mysql> flush privileges;          #刷新权限表

     

mysql> show master status;          #查看master数据库状态

+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 |      604 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+

#以上可见产生了master-bin.000001日志文件,定位为604

#从服务器需要定位到此处进行复制

② 从服务器配置(slave1、slave2)192.168.190.60、192.168.190.70

[root@slave1 ~]# vi /etc/my.cnf      #开启二进制日志文件

server_id = 2                              #设置slave1 id为2,slave2 id为3(server_id = 3)

log-bin=master-bin                     #从主服务器上同步日志文件记录到本地

relay-log=relay-log-bin               #开启中继日志,从主服务器上同步日志文件记录到本地

relay-log-index=slave-relay-bin.index        #定义中继日志文件的位置和名称

relay_log_recovery = 1              #选配项
#当 slave 从库宕机后,假如 relay-log 损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的 relay-log,并且重新从 master 上获取日志,这样就保证了relay-log 的完整性。默认情况下该功能是关闭的,将 relay_log_recovery 的值设置为 1 时, 可在 slave 从库上开启该功能,建议开启。

[root@slave1 ~]# systemctl restart mysqld.service 

server_id = 2                                        # slave2:       server_id = 3

log_bin=master-bin

relay-log=relay-log-bin

relay-log-index=slave-relay-bin.index

relay_log_recovery = 1

 

 开启从服务器功能(slave1、slave2)192.168.190.60、192.168.190.70

[root@slave1 ~]# mysql -uroot -p123456

mysql> change master to master_host='192.168.190.50',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=604;

mysql> start slave;

mysql> show slave status\G;       #查看从服务器状态

同理、开启另一台从服务器同步

3.4、测试数据同步

在主服务器上创建一个数据库

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【网络安全】Exif 数据储存型XSS
  • JS排序算法--快排、归并、冒泡、选择、插入
  • 谈谈ES搜索引擎
  • 云原生 | 在 Kubernetes 中使用 Cilium 替代 Calico 网络插件实践指南!
  • 线性代数|机器学习-P36在图中找聚类
  • 计算机网络-VRRP切换与回切过程
  • muduo 网络库学习项目引入 Boost 依赖
  • “设计模式双剑合璧:工厂模式与策略模式在支付系统中的完美结合”
  • JLabel设置字体大小颜色背景色
  • 数据结构与算法03 顺序表+链表
  • 数字化转型专家讲师培训师唐兴通中欧国际工商学院数字化转型战略与实现路径AIGC人工智能数字化战略数字商业模式创新
  • Docker 详解及详细配置讲解
  • Linux安装Jenkins详细步骤分解
  • 前向渲染路径
  • js 查找数组对象中id相同的元素,把他们放到新数组对象中
  • [译]Python中的类属性与实例属性的区别
  • 《剑指offer》分解让复杂问题更简单
  • docker容器内的网络抓包
  • E-HPC支持多队列管理和自动伸缩
  • JavaScript对象详解
  • java中具有继承关系的类及其对象初始化顺序
  • js操作时间(持续更新)
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • overflow: hidden IE7无效
  • react 代码优化(一) ——事件处理
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • Terraform入门 - 3. 变更基础设施
  • 解析 Webpack中import、require、按需加载的执行过程
  • 来,膜拜下android roadmap,强大的执行力
  • 聊聊hikari连接池的leakDetectionThreshold
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 什么软件可以提取视频中的音频制作成手机铃声
  • No resource identifier found for attribute,RxJava之zip操作符
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • ​520就是要宠粉,你的心头书我买单
  • ​虚拟化系列介绍(十)
  • #define用法
  • #pragam once 和 #ifndef 预编译头
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • ${factoryList }后面有空格不影响
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (bean配置类的注解开发)学习Spring的第十三天
  • (第30天)二叉树阶段总结
  • (附源码)php新闻发布平台 毕业设计 141646
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • (五)IO流之ByteArrayInput/OutputStream
  • (一)插入排序
  • (自用)网络编程
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .NET BackgroundWorker
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET编程C#线程之旅:十种开启线程的方式以及各自使用场景和优缺点