主从同步原理
master,记录数据更改操作
启动binlog 日志
设置binlog 日志格式
设置server_id
中继日志 (relay-log)
slave 运行两个线程
slave_io : 复制master主机 binlog 日志文件里的sql 到本机的relay-log 文件
slave_sql :执行本机relay-log 文件里的 sql 语句 ,重现master的数据操作
一主一从 (单项复制时,建议将从库设为只读)
构建主从同步
思路
确保数据相同
从库必须要有主库上的数据
配置主服务器
启动binlog 日志 授权用户 查看当前正在使用的日志
配置从服务器
设置server_id 指定主库信息
测试配置
客户端连接主库写入数据 在从库上也能查询到
确保数据一致
master 服务器
应包括希望同步的所有库
对采用myisam 的库,可离线备份
mysqldump -uroot -p密码 -B 库名列表 > mytest.sql (完全备份数据)
确保数据一致
slave 服务器
离线导入由master 提供的备份
清空同名库 (若有的)
scp dbsvr1:/root/mytest.sql ./ 直接scp 远程拷贝
mysql -uroot -p < mytest.sql (验证口令)
配置主服务器
调整运行参数
启动binlog及允许同步
在主库配置
vim /etc/my.cnf
[mysqld]
server_id=51 启动服务器idhao
log-bin=master51 启动binlog日志
binlog_format=mixed 指定日志格式
grant replication slave on . to repluser@"%" identified by “654321”; (给从库授权)
show master status; (查看binlog)
±----------------±---------±-------------±-----------------±------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
±----------------±---------±-------------±-----------------±------------------+
| master51.000001 | 983 | | | |
±----------------±---------±-------------±-----------------±------------------+
show slave status;(查看是否为从服务器)
在从库操作
vim /etc/mycnf
server_id=52 (加这一条 注,与主库id不能一样)
change master to master_host=“192.168.4.51” ,
master_user=“repluser”, (用户要一致) 主库授权用户名
master_password=“654321”, 授权用户密码
master_log_file=“master51.000001”, 日志文件
master-log_pos= 983(偏移量); 偏移位置
(注,host 为主库ip 密码为主库654321 log 的值和pos 值 要查看主库 『show master status』)
start slave; (q启动主程序)
show slave status\G
Slave_IO_Running: Yes (如果io connecting) IO线程以运行
Slave_SQL_Running: Yes SQL线程已运行
排错方式
stop slave
hange master to master_user=repluser (选项=“值”) ------这是用户错了(改) 『哪项错改哪』
start slave
验证 (在主库创库,创表)
从库查看
主库授权 访问用户: grant select ,update, insert on db6.* to webuser@"%" identified by “654321” (授权用户 webuser 用所有host主机 登入 。在库db6下有 select update insert 权限)
用别的主机登入测试
mysql -h192.168.4.51 -uwebuser -p654321
rm -rf /var/lib/mysql/master.info relay-log.info rm -rf relay-bin.*
(删除文件恢复到独立数据库)
systemctl restart mysqld
主从同步常用配置选项
适用master(主库)
vim /etc/my.cnf
binlog_do_db=库名 设置master 对那些库同步(记日志) (注如果不能限制同步需要 注释 #binlog_format=mixed)
binlog_ignore_db=库名 设置master 不对那些库同步(不记日志)
适用 slave (从库)
vim /etc/my.cnf
log_slave_updates ####记录从库更新,允许链式复制
relay_log=中继日志文件名 ####指定中继日志文件名
replicate_do_db=mysql ####仅复制指定库,可指定多条(省略则复制所有)
replicate_ignore_db=test ####不复制哪些库,其他库将被忽略
mysql主从同步结构
一主一从 ***********
一主多从 ***********
主从从 (给主做从,给从(中间即做从也做主)在设置给从)
主主结构 (互为主从)
配置主从从结构
配置主库 (1.用户授权 2.启用binlog日志 3.重启服务)
- grant replication slave on . to 用户名@“从库ip地址” identified by “密码”;
- log_bin=日志名
server_id=id号
binlog_format=“mixed”
3.systemctl restart mysqld
配置第一台从库 (也做主库)
修改配置文件
server_id=id
log_bin=master…
binlog_fromat=‘mixed’
log_slave_updates ####记录从库更新,允许链式复制
用户授权
grant replication slave on . to 用户名@“第二台从库ip” identified by “密码”
指定主库信息
change master to master_host=“主库ip” ,master_user=“用户名”,master_password=“密码”,master_log_file=“日志文件”,master_log_pos=偏移量;
启动slave 从库进程
start slave
show slave status\G; (查看状态)
配置第二台从库
修改配置文件
server_id=id
指定主库信息
change master to master_host=“第一台从库ip” ,master_user=“用户名”,master_password=“密码”,master_log_file=“日志文件”,master_log_pos=偏移量;
启动slave 从库进程
start slave
show slave status\G; (查看状态)
mysql主从复制模式
异步复制
主库执行完一次事务后,立即将结果返回给客户端,并不关心从库是否已经接受并处理
全同步复制
当主库执行完一次事务,且所有从库都执行了该事务后才返回给客户端
半同步复制
介于异步复制何全同步复制之间
主库在执行完一次事务后,等待至少一个从库接受到并写入到relay log 中才返回给客户端
模式配置
查看是否允许动态加载模块
show variables like “have_dynamic_loading”; (如果是NO ,则只能写到配置文件)
±---------------------±------+
| Variable_name | Value |
±---------------------±------+
| have_dynamic_loading | YES |
±---------------------±------+
命令行加载插件
用户需要super 权限
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%’ (查看)
启动半同步复制
vim /etc/my.cnf
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 (从库)
show variables like ‘rpl_semi_sync_%_enabled’; (查看状态)
±-----------------------------±------+
| Variable_name | Value |
±-----------------------------±------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_slave_enabled | ON |
±-----------------------------±------+