mysql 主从复制
配置主库
1.修改my.cnf文件,在[mysqld]加入下面的内容:mysql 8.0修改my.cnf.d/mysql-server.cnf 文件
# 服务的唯一编号
server-id = 1
# 开启mysql binlog功能
log-bin = mysql-bin
# binlog记录内容的方式,记录被操作的每一行
binlog_format = ROW
# 减少记录日志的内容,只记录受影响的列
binlog_row_image = minimal
# 指定需要复制的数据库名为dataresourse
binlog-do-db = 数据库名字
2.修改好配置文件,重启mysql服务
service mysqld restart
3.然后进入mysql 终端
mysql -uroot -p
4.创建一个允许从数据库来访问的用户账号(mysql中操作)
#创建账号
create user 'username'@'从机ip' identified by '123456';
#授权
grant all privileges on *.* to 'username'@'从机ip' with grant option;
#刷新
FLUSH PRIVILEGES;
5.mysql 的终端执行:
show master status\G;
记住
file:mysql-bin.000007
Position:54
slave
1.编辑/etc/my.cnf文件,添加如下内容
server-id=2
replicate-do-db = 数据库名
2.重启从服务器
service mysqld restart
3.如果之前有启动过slave,要先关闭,如果是第一次就忽略。
stop slave;
4.执行如下代码(mysql中操作)
change master to master_host=‘主服务器ip’,
master_user=‘刚在主服务器创建的用户名’,
master_password=‘刚在主服务器创建的用户密码’,
master_port=3306,
master_log_file=‘刚查看主服务器下的File值’,
master_log_pos=刚查看主服务器下的Position值
5.执行如下代码(mysql中操作)
start slave; # 启动slave
show slave status; # 查看状态
其中
Slave_IO_Running:Yes
Slave_SQL_Runnig:Yes
表示已经正常运行
从库需要通过 I/O 线程获取主库中 dump 线程读取的 binlog 内容并写入到自己的中继日志 relay log 中,从库的 SQL 线程再读取中继日志,重做中继日志中的日志,相当于再执行一遍 SQL,更新自己的数据库,以达到数据的一致性。
有些部署条件下,从库所在机器的性能要比主库性能差。
从库的压力较大,即从库承受了大量的请求。
执行大事务。因为主库上必须等事务执行完成才会写入 binlog,再传给备库。如果一个主库上语句执行 10 分钟,那么这个事务可能会导致从库延迟 10 分钟。
从库的并行复制能力。
主从延迟的解决方案
解决主从延迟主要有以下方案:
配合 semi-sync 半同步复制;
一主多从,分摊从库压力;
强制走主库方案(强一致性);
sleep 方案:主库更新后,读从库之前先 sleep 一下;
判断主备无延迟方案(例如判断 seconds_behind_master 参数是否已经等于 0、对比位点);
并行复制 — 解决从库复制延迟的问题;
这里主要介绍我在项目中使用的几种方案,分别是半同步复制、实时性操作强制走主库、并行复制。
semi-sync 半同步复制
MySQL 有三种同步模式,分别是:
「异步复制」:MySQL 默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给客户端,并不关心从库是否已经接收并处理。这样就会有一个问题,一旦主库宕机,此时主库上已经提交的事务可能因为网络原因并没有传到从库上,如果此时执行故障转移,强行将从提升为主,可能导致新主上的数据不完整。
「全同步复制」:指当主库执行完一个事务,并且所有的从库都执行了该事务,主库才提交事务并返回结果给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。
「半同步复制」:是介于全同步复制与全异步复制之间的一种,主库只需要等待至少一个从库接收到并写到 Relay Log 文件即可,主库不需要等待所有从库给主库返回 ACK。主库收到这个 ACK 以后,才能给客户端返回 “事务完成” 的确认。
MySQL 默认的复制是异步的,所以主库和从库的数据会有一定的延迟,更重要的是异步复制可能会引起数据的丢失。但是全同步复制又会使得完成一个事务的时间被拉长,带来性能的降低。因此我把目光转向半同步复制。从 MySQL 5.5 开始,MySQL 以插件的形式支持 semi-sync 半同步复制。
相对于异步复制,半同步复制提高了数据的安全性,减少了主从延迟,当然它也还是有一定程度的延迟,这个延迟最少是一个 TCP/IP 往返的时间。所以,半同步复制最好在低延时的网络中使用。
遇见从主mysql8.0,从5.7,字符集不符合,8.0的是utf8mb4, 5.7的是utf8,会报错,还有设置从库的用户密码时候,不知道是从库的