MySQL主从复制与读写分离

MySQL主从复制与读写分离

    • 一、前言:
    • 二、主从复制原理
      • [2.1 MySQL的复制类型](#2.1 MySQL的复制类型)
      • [2.2 MySQL主从复制的工作过程;](#2.2 MySQL主从复制的工作过程;)
        • [2.2.1 MySQL主从复制延迟](#2.2.1 MySQL主从复制延迟)
      • [2.3 MySQL 有几种同步方式: 三种](#2.3 MySQL 有几种同步方式: 三种)
        • [2.3.1、异步复制(Async Replication)](#2.3.1、异步复制(Async Replication))
        • [2.3.2、同步复制(Sync Replication)](#2.3.2、同步复制(Sync Replication))
        • [2.3.3、半同步复制(Semi-Sync Replication)](#2.3.3、半同步复制(Semi-Sync Replication))
        • [2.3.4、增强半同步复制(lossless Semi-Sync Replication、无损复制)](#2.3.4、增强半同步复制(lossless Semi-Sync Replication、无损复制))
      • [2.4 Mysql应用场景](#2.4 Mysql应用场景)
  • 实验

一、前言:

在企业应用中,成熟的业务通常数据量都比较大

单台MySQL在安全性、 高可用性和高并发方面都无法满足实际的需求

配置多台主从数据库服务器以实现读写分离

二、主从复制原理

2.1 MySQL的复制类型

  • 基于语句的复制(STATEMENT, MySQL默认类型)
  • 基于行的复制(ROW)
  • 混合类型的复制(MIXED)

2.2 MySQL主从复制的工作过程;

两日志、三线程

(1)在每个事务更新数据完成之前,Master 在二进制日志(Binary log)记录这些改变。写入二进制日志完成后,Master 通知存储引擎提交事务。

(2)Slave 将 Master 的复制到其中继日志(Relay log)。首先slave 开始一个工作线程(I/O),I/O线程在 Master 上打开一个普通的连接,然后开始 Binlog dump process。Binlog dump process 从 Master 的二进制日志中读取事件,如果已经跟上 Master,它会睡眠并等待 Master 产生新的事件,I/O线程将这些事件写入中继日志。

(3)SQL slave thread(SQL从线程)处理该过程的最后一步,SQL线程从中继日志读取事件,并重放其中的事件而更新 Slave 数据,使其与 Master 中的数据一致,只要该线程与 I/O 线程保持一致,中继日志通常会位于 OS 缓存中,所以中继日志的开销很小。

复制过程有一个很重要的限制,即复制在 Slave 上是串行化的,也就是说 Master 上的并行更新操作不能在 Slave 上并行操作。

2.2.1 MySQL主从复制延迟

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

2、网络延迟

3、主从硬件设备导致

cpu主频、内存io、硬盘io

4、本来就不是同步复制、而是异步复制

从库优化Mysql参数。比如增大innodb_buffer_pool_size,让更多操作在Mysql内存中完成,减少磁盘操作。

从库使用高性能主机。包括cpu强悍、内存加大。避免使用虚拟云主机,使用物理主机,这样提升了i/o方面性。

从库使用SSD磁盘

网络优化,避免跨机房实现同步

问题解决方法

半同步复制- 解决数据丢失的问题

并行复制---解决从库复制延迟的问题

2.3 MySQL 有几种同步方式: 三种

1、异步复制(Async Replication)

2、同步复制(sync Replication)

3、半同步复制(Async Replication)

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

2.3.1、异步复制(Async Replication)

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

2.3.2、同步复制(Sync Replication)

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

2.3.3、半同步复制(Semi-Sync Replication)

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

半同步复制,是最佳安全性与最佳性能之间的一个折中。

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

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

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

增强半同步是在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

实验

master:192.168.109.11

slave1:192.168.109.21

slave2:192.168.109.41

master服务器配置192.168.109.11

安装ntp,修改配置文件

bash 复制代码
yum -y install ntp
bash 复制代码
vim /etc/ntp.conf
server 127.127.109.0
fudge 127.127.109.0 stratum 10

开启ntp服务

bash 复制代码
systemctl start ntpd

两台slave服务器配置

bash 复制代码
yum install ntp ntpdate -y
bash 复制代码
systemctl start ntpd
bash 复制代码
ntpdate 192.168.109.11

配置主从同步

master服务器修改配置文件(192.168.109.11)

bash 复制代码
vim /etc/my.cnf
log_bin=master-bin
log_slave-updates=true


从服务器slave1

bash 复制代码
vim /etc/my.cnf
server-id = 2
relay-log=relay-log-bin
relay-log-index=slqve-relay-bin.index
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES
bash 复制代码
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.109.%' identified by'123456';
bash 复制代码
flush privileges;
show master status;


slave服务器配置

bash 复制代码
vim /etc/my.cnf
log-bin=master-bin
server-id = 2
relay-log=relay-log-bin
relay-log-index=slqve-relay-bin.index

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES
change master to master_host='192.168.109.11',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=614;
Query OK, 0 rows affected, 2 warnings (0.00 sec)
bash 复制代码
start slave
bash 复制代码
show slave status\G
bash 复制代码
create database work;
show databases;



master

slave1,2

相关推荐
天空中的野鸟39 分钟前
Android音频采集
android·音视频
小白也想学C2 小时前
Android 功耗分析(底层篇)
android·功耗
曙曙学编程2 小时前
初级数据结构——树
android·java·数据结构
闲暇部落4 小时前
‌Kotlin中的?.和!!主要区别
android·开发语言·kotlin
诸神黄昏EX6 小时前
Android 分区相关介绍
android
大白要努力!7 小时前
android 使用SQLiteOpenHelper 如何优化数据库的性能
android·数据库·oracle
Estar.Lee7 小时前
时间操作[取当前北京时间]免费API接口教程
android·网络·后端·网络协议·tcp/ip
Winston Wood7 小时前
Perfetto学习大全
android·性能优化·perfetto
Dnelic-10 小时前
【单元测试】【Android】JUnit 4 和 JUnit 5 的差异记录
android·junit·单元测试·android studio·自学笔记
Eastsea.Chen13 小时前
MTK Android12 user版本MtkLogger
android·framework