MySQL主从复制原理:master服务器将数据的改变记录二进制日志,当master上的数据发生改变时,则将其改变写入二进制日志中,salve服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread请求master二进制事件,同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后I/OThread和SQLThread将进入睡眠状态,等待下一次被唤醒。
接下来将会记录一下具体实现
Master设置
开启mysql的bin-log,主备是基于二进制日志的
1
2
3# master
log-bin=/var/lib/mysql/mysql-bin
server-id=1配置里面的server-id 是可以随意设置的,但是要保证在集群中的唯一性,
重启mysql,让设置生效
创建一个备份账号
1
GRANT REPLICATION SLAVE ON *.* to 'username'@'ip' identified by 'password';
导出master的数据,并且记录导出时的bin-log偏移
1
mysqldump -uroot -p --master-data=2 --all-databases > all_databases.sql
1
2
3
4
5
6➜ /data/www/html ✗ more httpserver.sql
--
-- Position to start replication or point-in-time recovery from
--
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=750663;命令中的 –master-data=2 是为了将 CHANGE MASTER TO MASTER_LOG_FILE=’mysql-bin.000001’, MASTER_LOG_POS=750663; 进行注释,这里记录的 log_file和 log_pos 将会在备份服务器的设置上使用
Slave设置
首先设置server-id,在
my.cnf
中加入1
2
3
4# replicate
log-bin=/var/lib/mysql/mysql-bin // 可以不开启
server-id=2 // 这个值不可与master相同
replicate-do-db = db1,db2/// // 选择需要同步的数据库,不写则全部同步重启mysql
导入数据
1
mysql -uroot -p < all_databases.sql
设置master信息
1
mysql root@localhost:(none)> change master to master_host='ip',master_user='user',master_password='password', master_log_file='mysql-bin.000001',master_log_pos=750663;
这天命令中的 master_log_file=’mysql-bin.000001’,master_log_pos=750663; 便是上面sql文件中注释的内容
开启同步
1
mysql root@localhost:(none)> start slave
查看slave状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16mysql root@localhost:(none)> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: ip //主服务器地址
Master_User: user //授权帐户名,尽量避免使用root
Master_Port: 3306 //数据库端口,部分版本没有此行
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 600 //#同步读取二进制日志的位置,大于等于Exec_Master_Log_Pos
Relay_Log_File: ddte-relay-bin.000003
Relay_Log_Pos: 251
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes //此状态必须YES
Slave_SQL_Running: Yes //此状态必须YES