主从同步结构
- 一主一从
- 一主多从
- 链式复制(主<–从<–从)
- 互为主从
一主多从
在一主一从的基础上直接新增slave服务器即可.
链式复制
这里为配置新服务器,不是新服务器需要同步数据:
[root@master ~] mysqldump -uroot -pPASSWORD --master-data 数据库名 > /allbak.sql #--master-data记录当前备份数据对应的日志信息
[root@master ~] scp /allbak.sql root@'从服务器':
[root@slave ~] mysql -uroot -pPASSWORD 数据库名 < /allbak.sql
[root@slave ~] grep binlog日志文件名 /allbak.sql
CHANGE MASTER TO MASTER_LOG_FILE='master51.000001', MASTER_LOG_POS=441; #指定主服务器需要的信息:binlog日志名和偏移量
1.配置master服务器
[root@master] vim /etc/my.cnf
[mysqld]
server_id=53
log_bin=master53
[root@master] systemctl restart mysqld
[root@master] mysql -uroot -pPASSWORD
mysql> grant replication slave on *.* to USER@'%' identified by 'PASSWORD'; #为slave1授权一个用户
2.配置slave1(同时作为另一台slave的master)
[root@slave1] vim /etc/my.cnf
[mysqld]
server_id=54 #注意不能与别的服务器相同
log_bin=master54 #设置binlog日志文件名
log_slave_updates #启用级联复制
[root@slave1] system restart mysqld
[root@salve1] 同步数据操作 #选做
[root@slave1] mysql -uroot -pPASSWORD
mysql> grant replication slave on *.* to USER@'%' identified by 'PASSWORD'; #为salve2授权一个用户
mysql> change master to
-> master_host="IP", #master的ip地址
-> master_user="USER", #master授权用户
-> master_password="PASSWORD", #master授权用户密码
-> master_log_file="MASTER_LOG_FILE", #master正在使用的binlog日志
-> master_log_pos=MASTER_LOG_POS; #master的binlog日志偏移量
mysql> start slave;
mysql> show slave status\G;
3.配置slave2
[root@slave2] vim /etc/my.cnf
[mysqld]
server_id=55
[root@slave2] systemctl restart mysqld
[root@salve2] 同步数据操作 #选做
[root@slave2] mysql -uroot -pPASSWORD
mysql> change master to
-> master_host="IP", #slave1的ip地址
-> master_user="USER", #slave1授权用户
-> master_password="PASSWORD", #slave1授权用户密码
-> master_log_file="MASTER_LOG_FILE", #slave1正在使用的binlog日志
-> master_log_pos=MASTER_LOG_POS; #slave1的binlog日志偏移量
mysql> start slave;
mysql> show slave status\G;
互为主从
一主一从反着来一遍
复制模式
- 异步复制(默认)
- 主服务器执行完一次事务后,立即将结果返回到客户端,不关心从服务器是否已经同步数据
- 全同步复制
- 当主服务器执行完一次事务后,且所有从服务器都同步完数据后才将结果返回给客户端
- 半同步复制
- 介于异步复制和全同步复制之间
- 主服务器在执行完一次事务后,等待至少一台从服务器同步完成,才将结果返回给客户端
配置半同步模式
1)配置master
- 加载模块
- 查看模块是否加载
- 启用模块
- 查看模块是否启用
- 写入配置文件
mysql> show variables like 'have_dynamic_loading'; #查看是否支持动态加载模块,默认为YES.
mysql> install plugin rpl_semi_sync_master SONAME 'semisync_master.so'; #加载模块,SONAME必须大写
mysql> select plugin_name,plugin_status from information_schema.plugins where plugin_name like '%semi%'; #查看模块是否加载
mysql> set global rpl_semi_sync_master_enabled=1; #启用模块
mysql> show variables like 'rpl_semi_sync_%_enabled'; #查看模块是否启用
[root@master] vim /etc/my.cnf #写入配置文件
[mysqld]
plugin-load=rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled=1
2)配置slave
- 加载模块
- 查看模块是否加载
- 启用模块
- 查看模块是否启用
- 写入配置文件
mysql> show variables like 'have_dynamic_loading'; #查看是否支持动态加载模块,默认为YES.
mysql> install plugin rpl_semi_sync_slave SONAME 'semisync_slave.so'; #加载模块,SONAME必须大写
mysql> select plugin_name,plugin_status from information_schema.plugins where plugin_name like '%semi%'; #查看模块是否加载
mysql> set global rpl_semi_sync_slave_enabled=1; #启用模块
mysql> show variables like 'rpl_semi_sync_%_enabled'; #查看模块是否启用
[root@slave] vim /etc/my.cnf #写入配置文件
[mysqld]
plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=1
附:一台服务器同时担任主从时
以上主从模块都加载启用
[root@host] vim /etc/my.cnf
[mysqld]
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