MySql主从复制
原理:
1、Master节点开启binlog,并将变动记录到binlog中;
2、Slave节点定期探测Master节点的binlog,如有变动,开启I/O线程向Master节点请求二进制事件;
3、Master节点为每一个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至Slave节点的中继日志(Relaylog)中,Slave节点会启动一个sql线程从中继日志中读取二进制日志,在本地重放,即解析成sql语句逐一执行。
mysq支持的复制类型
(1) STATEMENT:
- 基于语句的复制。在服务器上执行sql语句,在从服务器上执行同样的语句,mysql默 认采用基于语句的复制,执行效率高。
(2)ROW:
- 基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍。
(3) MIXED:
- 混合类型的复制。默认采用基于语句的复制,一 旦发现基于语句无法精确复制时,就会采用基于行的复制。
部署注意事项
0、安装mysql(略)
1、时间同步
##主服务器设置##
yum install ntp -y
vim /etc/ntp. conf
--末尾添加--
server 127.127.80.0 #设置本地是时钟源,注意修改网段
fudge 127.127.80.0 stratum 8 #设置时间层级为8 ( 限制在15内)
service ntpd start
##从服务器设置##
yum install ntp ntpdate -Y .
service ntpd start
/usr/sbin/ntpdate 192.168.1.10 #进行时间同步
crontab -e
*/30****/usr/sbin/ntpdate 192.168.1.10
2、配置
2.1 Master节点
修改完配置需要重启mysql
#(必选)配置server-id,保证主从不一致
server-id = 11
#(必选)添加,主服务器开启二进制日志
log-bin=mysql-bin
#(可选)设置复制类型
binlog_ format = MIXED
#(可选)添加,允许slave从master复制数据时可以写入到自己的二进制日志
log-slave -updates=true
#(可选)设置二进制日志文件过期时间,避免占用大量磁盘空间,默认值为0,表示logs不过期
expire_ logs_ days = 7
#(可选)设置二进制日志限制大小,如果超出给定值,日志就会发生切割,默认值是1GB
max_ binlog_ size = 500M
2.2 Slave节点
修改完配置需要重启mysql
#(必选)配置server-id,保证主从不一致
server-id = 22
#(必选)添加,开启中继日志,从主服务器上同步日志文件记录到本地
relay-log=relay-log-bin
#(可选)添加,定义中继日志文件的位置和名称,一般 和relay-log在同一目录
relay-log-index=slave-relay-bin.index
#(可选)当slave从库宕机后,假如relay-log 损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的relay-log, 并且重新从master. 上获取日志,这样就保证了relay-log 的完整性。默认情况下该功能是关闭的,将relay_ 1og_ recovery 的值设置为1时,可在slave从库上开启该功能,建议开启。
relay_1og_recovery = 1
3、设置主从
3.1 Master节点
#创建同步账号并授权
mysql> GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.1.8' IDENTIFIED BY '*****'; #给从服务器授权
mysql> FLUSH PRIVILEGES;
#查看master节点状态,并记录文件名和Position值
mysql> show master status ;
//如显示以下
| File| Position | Binlog_ _Do_ _DB | Binlog_ Ignore_ DB I
----+----------+--------------+------------------+
| mysql-bin.000002 I 339 |
----+----------+--------------+------------------+
3.2 Slave节点
#配置同步,注意master_log_file和master_log_pos的值要与Master查询的一致
mysql> CHANGE master to master_host='192.168.1.10' , master_user= ' myslave' , master_ password=' **** , master_1og_file=' mysql-bin.000002' , master_log_pos=339;
#启动同步,如有报错执行reset slave;
mysql> start slave;
4、验证
#查看Slave状态
mysql> show slave status\G;
#验证: 确保IO和SQL线程都是Yes, 代表同步正常
#负责与主机的io通信
Slave_IO_Running: Yes
#负责自己的slave mysql进程
Slave_SQL_Running: Yes