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 的二进制日志中读取事件。没有事务的情况下,dump线程会睡眠并等待 Master 产生新的事件,I/O线程将这些事件写入中继日志。

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

有经验的说法:主数据同步到从,从进程通过(2日志、3线程)进行一个数据备份

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、测试数据同步

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

  • 20
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值