mysql主从配置及原理解析

star2017 1年前 ⋅ 376 阅读

背景

在高并发的场景下,一般情况下,单库的QPS在2000左右,如果你的系统的QPS超过了单库的QPS,那么第一个想到的方案就是:读写分离。mysql这边可以配置一主多从来实现读写分离。

一主多从配置

注意:文中mysql版本为5.6.42

1、master配置
找到my.cnf,配置以下内容,注意:这些配置需要写到[mysqld]下面。

#binlog 格式
log_bin=mysql-bin

#slave更新时是否记录到日志中
log-slave-updates=true

#需要同步的二进制数据库名
binlog-do-db=ceshi

#不同步的二进制数据库名 避免同步mysql用户配置,以免不必要的麻烦
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
binlog-ignore-db=personalsite

#master服务器ID号,不要和从ID相同 ,可以认为server-id值类似于IP地址:这些ID值能唯一识别复制服务器群集中的每个服务器实例。默认为1,如果设置为0,表示不接受任何从服务连接
server_id=100

配置完需要重启服务

service mysqld restart
#给从服务器用户replication的同步权限
GRANT REPLICATION SLAVE,REPLICATION CLIENT,RELOAD,SUPER ON *.* to 'replication'@'xxxx' IDENTIFIED BY '123456';
#刷新权限,使设置生效
flush privileges;

2、slave配置

server_id=200
log-bin=mysql_bin
replicate-do-db=ceshi
replicate-ignore-db=mysql

slave中需要执行

CHANGE MASTER TO MASTER_HOST='xxx', MASTER_USER='root', MASTER_PASSWORD='123456' ;
#查看master状态
mysql> show master status;

#在主库上查看已连接的slave主机
mysql> show slave hosts;

#查看所有binlog日志
mysql> show binary logs;

#查看binlog日志开启状态
mysql> show variables like 'log_bin';

全同步原理

salve会获取binlog文件,就是说slave会从master上拉数据,而不是master主动推数据给slave。
每个slave在做同步的时候,在本地都会记录一个位置,来标识当前已经同步到哪里了,因为这个是在slave处理的,所以可以配置多个slave来进行数据同步,因而可以实现一主多从的架构。
每个master和slave必须配置唯一的id,使用server_id进行配置。slave必须配置master的地址,日志文件名称,日志文件地址。这些信息可以存储在mysql session中。也可以保存在配置文件中,建议使用后者。
每个slave会根据binlog日志文件里面获取到的事件进行执行,如表创建,表结果修改,数据插入、修改、删除。
在整个复制过程中,一共会有3个线程来完成,包括:master中的Binlog dump线程,Slave中的I/O线程和SQL线程。
Binlog dump线程:是master的一个线程,负责接收slave的IO线程的请求,并把binlog数据返回给IO线程。dump线程在读binlog的时候,会对每个执行事件进行加锁。如果事件被读或者已经发送给了slave,那么锁就会被释放。

IO线程:如果master和slave建立了连接,那么slave中会创建一个IO线程,他负责连接master,并要求master发送最新的binlog文件内容。slave会记录一个位置(location),表示当前slave已经复制到哪个位置了,下次同步的时候,会把当前的位置传给master,接着往下复制。IO线程获取到需要更新的内容之后,把他们先复制到relay log(中继日志)中。
imagepng
可以查看IO线程是否开启。

SQL线程:主要负责读relay log文件,执行文件里面的事件。

如果一个master有多个slave,在master里面,dump线程只有一个。每个slave中的IO线程和SQL线程都是独立的。
slave中存在两个线程,是为了让读数据和执行数据进行分离,这样他们不会相互影响。

imagepng
可以看这个图,更加直观的看到整个流程。

优点:性能高
缺点:数据不一致,但是会最终一致

半同步原理

全同步是异步的,从库的数据会比主库晚一点。如果主库宕机了,还没有同步过来的数据就会丢失。
mysql这边也提供了semisynchronous Replication,后面简称semi-sync。

1、slave会检查master是否开启了半同步。
2、master在执行一个操作之后,如果有一个slave回复了,那么master会提交这个数据;如果没有一个slave回复,那么这条数据就会被执行失败。
3、slave把数据写到relay log中并刷新到磁盘后,才会回复master,说已经接收到了。
4、slave和master都必须要开启半同步设置。

master中配置

rpl_semi_sync_master_enabled=ON
rpl_semi_sync_master_timeout=1000 # 1 second

slave中配置

rpl_semi_sync_slave_enabled=ON

master和slave都需要安装插件,在没有安装插件之前这几个配置项是不生效的。

imagepng
虚线部分表示半同步

优点:保证了数据一致性
缺点:性能会差

读写分离方案

1、基于中间件方案
imagepng

2、基于client
imagepng

本文为博主原创文章,未经博主允许不得转载。
更多内容请访问:IT源点

相关文章推荐

全部评论: 0

    我有话说: