MySQL的读写分离

场景

当网站或者APP用户达到一定数量,后端服务的请求越来越多;当出现高并发请求时,为了提升API请求访问时长,一般会将数据库做读写分离(一般的网站和APP,都是读操作 远大于 写操作),一个主数据库挂着多个从数据库,主数据库只用作写操作;读操作放在多个从数据库中执行。


常遇问题

如何实现数据库的读写分离?
MySQL主从复制的原理是什么?
如何解决MySQL主从复制的延时问题?


数据库配置

主从数据库,分为主数据库(master)和从数据库(slave)分别安装在不同服务器中。(此处示例为mysql5.7)

master数据库配置

#修改数据库配置文件 my.cnf
[root@localhost mysql]# vim /etc/my.cnf
 
#在[mysqld]中添加:
server-id=1
log_bin=master-bin
log_bin_index=master-bin.index
binlog_do_db=test

#备注:
#server-id 服务器唯一标识,若有多个数据库,则id不能相同。
#log_bin 启动MySQL二进制日志,即数据同步语句,从数据库会一条一条的执行这些语句(值 mysql-bin 是日志的基本名或前缀名)。
#log_bin_index .   二进制索引文件名(/var/log/mysql/mysql-bin.index)

#binlog_do_db 指定记录二进制日志的数据库,即需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可。
#binlog_ignore_db 指定不记录二进制日志的数据库,即不需要复制的数据库名,如果有多个数据库,重复设置这个选项即可。
#其中需要注意的是,binlog_do_db和binlog_ignore_db为互斥选项,一般只需要一个即可。

msater数据库配置slave数据访问权限
#创建从数据库的masterbackup用户和权限
mysql> grant replication slave on *.* to masterbackup@'192.168.17.%' identified by '123456';

#备注
#192.168.17.%通配符,表示0-255的IP都可访问主服务器,正式环境请配置指定从服务器IP
#若将 192.168.17.% 改为 %,则任何ip均可作为其从数据库来访问主服务器

master数据库重启
service mysql restart
进入master数据库查看状态
mysql> show master status;

在这里插入图片描述


slave数据库配置

#修改数据库配置文件 my.cnf
[root@localhost mysql]# vim /etc/my.cnf
 
#在[mysqld]中添加:
server-id=2
relay-log=slave-relay-bin
relay-log-index=slave-relay-bin.index
#replicate-do-db=test


#备注:
#server-id 服务器唯一标识,如果有多个从服务器,每个服务器的server-id不能重复,跟IP一样是唯一标识,如果你没设置server-id或者设置为0,则从服务器不会连接到主服务器。
#relay-log 启动MySQL二进制日志,可以用来做数据备份和崩溃恢复,或主服务器挂掉了,将此从服务器作为其他从服务器的主服务器。
#replicate-do-db 指定同步的数据库,如果复制多个数据库,重复设置这个选项即可。若在master端不指定binlog-do-db,则在slave端可用replication-do-db来过滤。
#replicate-ignore-db 不需要同步的数据库,如果有多个数据库,重复设置这个选项即可。
#其中需要注意的是,replicate-do-db和replicate-ignore-db为互斥选项,一般只需要一个即可。
slave数据库连接master数据库
#连接master主服务器
mysql> change master to master_host='192.168.17.130',master_port=3306,master_user='masterbackup',master_password='123456',master_log_file='master-bin.000001',master_log_pos=154;
#备注:
#master_host对应主服务器的IP地址。
#master_port对应主服务器的端口。
#master_log_file对应show master status显示的File列:master-bin.000001。
#master_log_pos对应show master status显示的Position列:154。

#启动数据库同步 #关闭同步命令 stop slave
mysql> start slave;

#查看同步信息
mysql> show slave status;

#若Slave_IO_Running和Slave_SQL_Running都为yes,则表示同步成功。
主从数据库实现原理

主数据master在执行完操作后,会将操作日志保存在binlog日志文件中;从数据库slave会有一个IO线程串行地将master数据库中的binlog日志复制到本地的relay日志文件中;然后slave数据库会有一个独立的SQL线程读取relay的日志,然后执行操作。
在这里插入图片描述

主从复制的时延问题

时延产生的核心点在于:从数据库slave同步主数据库的过程是串行的;而当主数据在高并发的情况下增加数据(并行),而从数据库的数据则会比主数据的数据增加地要慢一点,这就是时延。
另外还有一种情况,就是主数据库保存完数据的那一刻就突然宕机了,恰好没有同步至从数据库中,这时从数据则会产品数据丢失的问题。

解决方案
  • 半同步复制
    半同步复制,也叫 semi-sync 复制,指的就是主库写入 binlog 日志之后,就会将强制此时立即将数据同步到从库,从库将日志写入自己本地的 relay log 之后,接着会返回一个 ack 给主库,主库接收到至少一个从库的 ack 之后才会认为写操作完成了。

  • 并行复制
    并行复制,指的是从库开启多个线程,并行读取 relay log 中不同库的日志,然后并行重放不同库的日志,这是库级别的并行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值