Mysql主从同步
原理图:
- 从属服务器自动同步主服务器数据
- Master服务器启用binlog日志
- Slave
- Slave_IO:复制master主机binlog日志文件里的SQL命令到本机的relay-log文件里
- Slave_SQL:执行本机relay-log文件里的SQl语句,实现master数据一致
过程
一,配置主服务器
启用binog日志,授权用户,查看binlog日志信息
二,配置从属服务器
—设置server_id
—确保与主服务器数据一致
—指定主服务器信息
—启动slave程序
—查看状态信息
一主多从
拓扑结构
模式一主多从,每个从服务器配置相同
配置主服务器
vim /etc/my.cnf
[mysqld]
log_bin=日志名 //启用binlog日志
server_id=50 //指定服务器ID号
...
systemctl restart mysqld
mysql>grant replication slave on *.* to repluser@'%' identified by "123qqq...A";
//replication slave 连接主库进行复制的权限
//replication client 不可用于建立复制,只是可以使用"show slave status","show master status"等命令
mysql>show master status\G; //显示当前日志信息 \G纵向显示
配置从服务器
vim /etc/my.cnf
[mysqld]
server_id=60
systemctl restart mysqld
***注意事项
确保从服务器与主服务器数据一致
主库备份数据,--master-data 记录当前备份数据对应的日志信息
mysqldump -uroot -p密码 --master-data 数据库名 > /allbak.sql
scp /allbak.sql root@192.168.4.52:/root/ //拷贝给从服务器
从服务器恢复数据
mysql -uroot -p密码 数据库名 < /root/allbak.sql
cat /root/allbak.sql | grep -i master //查看日志名及偏移量
*************************************************************
配置从服务器
指定从服务器信息
mysql> change master to
master_host='192.168.4.51', //指定主服务器地址
master_user="repluser", //授权用户
master_password="密码", //授权用户密码
master_log_file="主库日志名",
master_log_pos=344; //日志偏移量
mysql>start slave; 启动slave进程
**注意事项
Master信息自动保存到/var/lib/mysql/master.info文件中
更改主库信息是,需先执行stop slave,修改后在执行start slave
*************
mysql> show slave status; //查看slave状态
Slave_IO_Running: Yes //IO线程yes状态
Slave_SQL_Running: Yes //SQL线程yes状态
相关文件
ls /var/lib/mysql/
master.info //主库信息
relay-log.info //中继日志信息
主机名-relay-bin.xxxxx //中继日志
主机名-relay-bin.index // 索引文件
主从从
拓扑结构
主服务器配置同上
从服务器配置如下
vim /etc/my.cnf
[mysqld]
log-bin=master70 //从服务器开启bin-log日志
server_id=70
log_slave_updates //允许级联复制
systemctl restart mysqld //重启服务
mysql> grant replication slave on *.* to repluser@"%" identified by "123qqq...A";
//给用户授权,允许主从复制
mysql> change master to
master_host="192.168.4.50",
master_user="用户名",
master_password='密码',
master_log_file="binlog日志名",
master_log_pos=偏移量;
start slave; //开启进程
show slave status\G; 检查状态
*************************************************************
配置从从服务器
vim /etc/my.cnf
[mysqld]
server_id=70
systemctl restart mysqld
mysql>change master to master_host="192.168.4.60",
master_user="repluser",
master_password="123qqq...A",
master_log_file="binlog日志名",
master_log_pos=偏移量;
start slave;
show slave status\G;
**************************************************
复制模式介绍
- 异步复制
主库执行一次事物后,立即将结果返回给客户端,并不关系从库是否已接收并处理 - 全同步复制
当主库执行完一次事物,且所有从库都执行了该事物后才将结果返回给客户端 - 半同步复制
主库执行完一次事物后,等待至少一个从库接收到并写到realy log中才将结果返回给客户端
模式配置
默认复制模式为异步复制模式
mysql > show variables like "have_dynamic_loading" //查看动态加载模块
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| have_dynamic_loading | YES |
+----------------------+-------+
mysql> install plugin rpl_semi_sync_master SONAME "semisync_master.so";
//主服务器上执行,安装master插件
mysql> install plugin rpl_semi_sync_slave SONAME "semisync_slave.so";
//从服务器上执行,安装slave插件
mysql> select plugin_name,plugin_status from
information_schema.plugins where plugin_name like "%semi%";
//查看
+----------------------+---------------+
| plugin_name | plugin_status |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE |
+----------------------+---------------+
启用半同步复制
mysql>set global rpl_semi_sync_master_enabled=1; //启用主服务器半同步复制
mysql>set global rpl_semi_sync_slave_enabled=1; //启用slave半同步复制
mysql>show variables like "rpl_semi_sync_%_enabled"; //查看
永久启用半同步复制 --修改主配置文件/etc/my.cnf
在[mysqld]下方添加
//主服务器
plugin-load=rpl_semi_sync_master=semisync_master.so
rpl_semi_sync_master_enabled=1
//从服务器
plugin-load=rpl_sync_slave=semisync_salve.so
rpl_semi_sync_slave_enabled=1
服务器角色是master和slave两种角色需同时启用master和slave两个模块
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