背景
在高并发的场景下,一般情况下,单库的 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(中继日志)中。
可以查看 IO 线程是否开启。
SQL 线程:主要负责读 relay log 文件,执行文件里面的事件。
如果一个 master 有多个 slave,在 master 里面,dump 线程只有一个。每个 slave 中的 IO 线程和 SQL 线程都是独立的。
slave 中存在两个线程,是为了让读数据和执行数据进行分离,这样他们不会相互影响。
可以看这个图,更加直观的看到整个流程。
优点:性能高
缺点:数据不一致,但是会最终一致
半同步原理
全同步是异步的,从库的数据会比主库晚一点。如果主库宕机了,还没有同步过来的数据就会丢失。
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 都需要安装插件,在没有安装插件之前这几个配置项是不生效的。
虚线部分表示半同步
优点:保证了数据一致性
缺点:性能会差
读写分离方案
1、基于中间件方案
2、基于 client
也可以关注我的公众号:程序之声
关注公众号,回复:下载
获取百度下载神器:
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于