mysql 主从配置及原理解析

本贴最后更新于 1921 天前,其中的信息可能已经斗转星移

背景

在高并发的场景下,一般情况下,单库的 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

也可以关注我的公众号:程序之声
关注公众号,回复:下载
获取百度下载神器:
imagepng

  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1083 引用 • 3461 回帖 • 287 关注
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    675 引用 • 535 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
chaigx
欢迎关注我的公众号:程序之声。有些文章没办法同步过来,访问个人博客:http://www.chaiguanxin.com 杭州