主从同步

1、什么是MySQL主从同步?

实现数据自动同步的服务结构,结构中分离2种角色

主服务器:接受客户端访问的数据库服务器

从服务器:自动从主库服务器同步数据到本机的数据库服务器

2、工作原理

主库必须开binlog日志

从库有两个线程:I/O线程(负责从主库binlog读SQL命令,拉取到本机的Relay log文件里)

SQL线程(执行本机Relay log里面的SQL命令,重现主库的数据操作)

3、具体配置

50(client) 51(master) 52(slave)

master配置:

启用binlog日志文件: log-bin=master51  #改名为master51
server_id=51
用户授权:
grant replication slave(复制) on *.* to repluser@"%" identified by 'tarena';
查看binlog日志信息
show slave hosts #查看从主机信息

slave配置:

指定server_id=52(不能与主库一样)
指定主服务器信息:
change master to master_host="192.168.4.51",master_user="repluser",master_password="tarena",
master_log_file="master51.000001",master_log_pos=908
更改从库指定的主服务器信息
stop slave;
change master to master_user="repluser",master_password="tarena" #哪项错误就从新配置哪项
从库相关文件:
/var/lib/mysql/master.info
/var/lib/mysql/主机名-relay-bin.* (只保留最新的两个)
/var/lib/mysql/主机名-relay-bin.index
/var/lib/mysql/relay-log.info (中继日志文件的信息)
取消从服务器:rm -rf 从库相关文件
启动slave进程: start slave;
查看进程信息: show slave status\G #查看从服务器信息

MySQL主从同步模式

1、结构模式:

一主一从:(常用)

一主多从:把53配置成51的从库(常用)

在配置之前要保证从服务器有主服务器上的数据

mysql>source /root/db7.sql #还原数据

主从从:51是52的主,52是54的主

工作过程:52主机从51主机的binlog日志中读取sql命令不会写到自己的binlog日志中,需要开启级联复制功能

把52配置为主库
log_slave_updates #开启级联

2、复制模式:

异步复制:主库执行一次事务后,立即将结果返回给客户端,并不关心从库是否已经接收并处理

全同步复制模式:主库执行一次事务后,且所有从库都执行完该事务后才返回给客户端

半同步复制模式:主库执行一次事务后,等待至少一个从库接收到并写到relay log中才返回给客户端

无损复制:增强版的半同步复制,数据零丢失,性能好,mysql5.7诞生

3、在主从服务器同时启用半同步复制,默认为异步复制模式

在52上配置:

1.查看是否允许动态加载模块: show  variables  like  'have_dynamic_loading'
2.加载模块并查看:
install plugin rpl_semi_sync_master soname 'semisync_master.so';
install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
select plugin_name,plugin_status from information_schema.plugins where plugin_name like "%semi%";
3.启用模块
set global rpl_semi_sync_master_enabled=1;
set global rpl_semi_sync_slave_enabled=1;
4.查看启用信息
show variables like "rpl_semi%enabled"
5.修改配置文件,永久生效
plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl_semi_sync_master_enabled=1
rpl_semi_sync_slave_enabled=1

常用配置选项(/etc/my.cnf)

应用在主服务器

binlog_do_db=数据库名     #只允许同步的库
binlog_ignore_db=数据库名 #不允许同步的库

应用在从服务器

replicate_do_db=数据库     #仅同步什么库
replicate_ignore_db=数据库 #仅不同步什么库
log_slave_updates #允许链式复制
relay_log=dbsvr2-relay-bin #指定中继日志文件名