主从同步原理图
v2-44cb6d90b7b1537ccdae495a2a1daacc_1440w.jpg
主从同步工作流程
- Mysql复制过程的第一部分就是master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。
- 第二部分就是slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。
- SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
此外,在master中也有一个工作线程:和其它MySQL的连接一样,slave在master中打开一个连接也会使得master开始一个线程。复制过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。
mysql复制的模式
- 1--主从复制:主库授权从库远程连接,读取binlog日志并更新到本地数据库的过程;主库写数据后,从库会自动同步过来(从库跟着主库变);
- 2--主主复制:主从相互授权连接,读取对方binlog日志并更新到本地数据库的过程;只要对方数据改变,自己就跟着改变;
具体配置
- 1、主从配置文件(配置文件默认是/etc/my.cnf)
[mysqld]
## 唯一
server-id=100
## 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin
- 2、给权限用于主从同步数据 在主库上创建一个用户,授权远程访问和所有权限。此账号是为了从库读取主库的上了binlog
CREATE USER 'slave'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
- 3、从库配置(配置文件默认是/etc/my.cnf)
[mysqld]
## 唯一(不要与主的重复了)
server-id=101
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
## 指定只同步某个库
replicate-do-db=databaseName
## 如果指定多个库
replicate-do-db=databaseName2
## 指定只同步某个表
replicate-do-table=databaseName.tableName
## 如果指定多个表
replicate-do-table=databaseName.tableName2
- 4、查看主库的状态
image.png
- 5、在从库上执行同步连接命令
change master to master_host='IP', master_user='slave', master_password='password', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 1, master_connect_retry=30;
master_log_file是第四步中File的值
master_log_pos是第四步中Postion的值
master_host :Master的地址
master_port:Master的端口号
master_user:用于数据同步的用户
master_password:用于同步的用户的密码
master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
- 6、从库上开启slave,并查看salve状态
start slave;
show slave status;
image.png
Slave_IO_Running等于yes代表已经连接到主库
Slave_SQL_Running等于yes 可执行主库binlog
image.png
这四个记录了 IO或者SQL连接或者执行出现的错误
-
7、主从同步失败常见问题
v2-842a32e2c557582387c96e8021d11c33_r.png
这种情况是master_log_pos或者master_log_file没有读取到主库最新的
可以执行stop slave; 再去主库查看最新的状态。重新执行change命令。在开启start slave;









网友评论