主从复制的原理-(个人梳理版)
1:当在从库执行 start slave 开启 主从复制之后,然后从库IO线程连接主库来请求在mater-info中记录的日志文件名和position位置点(或者直接最开头的位置开始)以后的日志内容;
2:主库接受到来自从库的io请求后,通过binlog dump 线程 根据从库的请求信息 返回日志给从库。返回的信息 除了 日志所包含的信息之外 还包含本次返回信息的 最新file 和 最新position;
3:从库的IO 线程 接收到主库发来的日志内容、最新日志文件名、最新position位置点后,将日志内容 更新到 relay-log(中继日志)的最后;
将二进制日志最新文件名和最新position位置点保存在 master-info文件中 ---------(以便 下一次读取的时候能够清除的告诉主库,我要哪个文件的哪个位置开始往后的日志文件)
4;从库的SQL线程检测到 relay-log中新增加了内容之后 会将relay-log日志中relay-log.info记录的文件名和位置点以后的内容解析成sql语句并顺序执行,实现数据落盘,达到更新数据的目的。同时,还会在 relay-log.info中记录当前执行的中继日志的文件名和位置点
主从监控:
1:主库
show processlist; show slave hosts;
2:从库:(监控主要在从库)
show slave status \G 以下信息:
故障:
IO线程: 正常状态:slave_to_running: yes 非正常状态: slave_to_running: NO slave_to_running: Conncting 故障原因: 连接主库: 1,网络防火墙端口问题。 2,用户密码问题。用户权限必须时replication slave权限 3,主库的连接数达到上限。 4,版本不统一的情况。
sql线程故障: 主要工作:回放relay-log中的日志,可以理解为relay-log 执行sql 故障本质: sql线程执行不了sql语句。 原因整理: 创建的对象已经存在。 需要操作的对象不存在。 约束冲突 以上问题,大几率出现在从库写入或者双主结构中容易出现
主从中的线程管理:
start slave 启动所有线程
【对于主库已有数据的主从搭建】
【个人理解】
就是 先 利用 备份 把主库的数据手动同步到从库 使主从库数据一样
然后 在从库 配置 主从机制
搭建步骤:
一:备份主库中已经存在的数据到从库
1)在主库上加锁,使只有只读权限。
mysql > flush table with read lock;
2)查看备份的节点。(file 和 position 的值)
mysql > show master status;
3)备份数据。
root@bogon ~]# mysqldump -uroot -p --all-databases|gzip > dump.sql.gz
4)解锁库(备份完成之后执行此步骤)
mysql> unlock tables;
5)在从库中执行备份的sql文件恢复数据
mysql> source /home/admin/dump.sql;
由于数据量非常大,所以这步执行非常耗时。
二:主从机制搭建
1):主从服务器都要安装mysql 数据库(最高是一个版本)
2):在主机 授权一个用于主从同步的账号
grant replication slave on *.* to 'name'@'192.168.22.xx ' identified by 'password';
3):主机配置文件 my.cnf
1---开启二进制日志功能 (binary log)
2----设置sever_id= xx 注意每台主机的server_id不能一样
server-id=59
设置了log-bin的值之后就开启了二进制日志功能 后面的值就是日志的前缀
log-bin=mysql-bin
日志保留天数
expire_logs_days= 7
binlog每个日志文件大小
max_binlog_size= 100m
binlog缓存大小
binlog_cache_size= 4m
最大binlog缓存大小
max_binlog_cache_size= 512m
不写这句意思是默认同步所有数据库
binlog-do-db=401_itoo
4):从库的配置文件
也是 server_id 和 二进制日志开启
5):在主库 查看 二进制日志的位置
show master status;
记住 file 文件名 和 position 的值
6):在从库 配置从机制
mysql 》 CHANGE MASTER TO MASTER_HOST='主机的IP地址', MASTER_USER='主机授权的同步用户名', MASTER_PASSWORD='主机授权的同步用户的密码', MASTER_LOG_FILE='mysql-bin.具体数字 就是上一步查看的 file', MASTER_LOG_POS=具体值 就是上一步查看的 position值;
7):在从库 开启从机制
start slave;
8):查看主从状态
show slave status\G
常见错误状态:
(一);
可能错误的原因有:
- 网络不通
- 账户密码错误
- 防火墙
- mysql配置文件问题
- 连接服务器时语法
- 主服务器mysql权限
(二):SQL Yes IO no
可能原因:
1:主从机的 sever_id 一样
在 my.cnf 里设置
2:主从机的 uuid 一样
如果是直接 克隆 主机 那么i主从的UUID就是一样的
只需要 删除 从库 的 数据存放目录下 的 auto_cnf
/data/mysql/auto_cnf
3:主从的 gtid 设置不一致
一个开启了 一个没开启