主从复制的原理-(个人梳理版)

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 启动所有线程
stop slave 停止所有线程。
单独起某个线程
start slave sql_thread
start slave io_thread
解除从库身份:
reset slave all;

【对于主库已有数据的主从搭建】

【个人理解】

就是 先 利用 备份 把主库的数据手动同步到从库 使主从库数据一样

然后 在从库 配置 主从机制


搭建步骤:

一:备份主库中已经存在的数据到从库
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



常见错误状态:

(一);

可能错误的原因有:

  1. 网络不通
  2. 账户密码错误
  3. 防火墙
  4. mysql配置文件问题
  5. 连接服务器时语法
  6. 主服务器mysql权限
(二):SQL Yes IO no

可能原因:

1:主从机的 sever_id 一样

在 my.cnf 里设置

2:主从机的 uuid 一样

如果是直接 克隆 主机 那么i主从的UUID就是一样的

只需要 删除 从库 的 数据存放目录下 的 auto_cnf

/data/mysql/auto_cnf

3:主从的 gtid 设置不一致

一个开启了 一个没开启