主从复制的原理
MySQL主从复制原理可以总结为一句话:主对外工作,从对内备份。
我们使用MySQL–01、Centos7下安装MySQL中配置好的机器作为主服务器(192.168.10.171);然后按照文章Linux–04、虚拟机的克隆与配置再克隆一台主机安装好MySQL作为从服务器(192.168.10.172)
在做主从复制之前首先要关闭主从机器的防火墙,执行以下命令:
systemctl stop iptables(需要安装iptables服务)
systemctl stop firewalld(默认)
systemctl disable firewalld.service(设置开启不启动)
如下图所示:
如果执行第一条命令提示Failed to start ipatbles.service: Unit not found.
则原因是centos从7开始默认用的是firewalld,这个是基于iptables的,虽然有iptables的核心,但是iptables的服务是没安装的。那么安装这个服务然后开启:
#安装
yum install iptables-services
#开启iptables
systemctl enable iptables
systemctl enable ip6tables
#启动服务
systemctl start iptables
systemctl start ip6tables
主服务器配置
- 输入命令
vim /etc/my.cnf
打开MySQL配置文件,在[mysqld]
段下添加如下代码:
#启用二进制日志
log-bin=mysql-bin
#服务器唯一ID,一般取IP最后一段
server-id=171
#指定复制的数据库(可选)
binlog-do-db=christy
#binlog-ignore-db=christy
#指定不复制的数据库(可选,mysql5.7开始)
#replicate-ignore-db=kkb
#指定忽略的表(可选,mysql5.7)
#replicate-ignore-table = t_user
- 重启MySQL服务
systemctl restart mysqld
- 登录MySQL,输入以下命令(主机给从机授备份权限)
GRANT REPLICATION SLAVE ON *.* TO 'root'@'%' identified by '123456';
- 刷新权限
FLUSH PRIVILEGES;
- 输入以下命令查询master的状态,结果如下图:
show master status;
这个要记住,后面配置丛机要用到。
从服务器配置
- 输入命令
vim /etc/my.cnf
打开MySQL配置文件,在[mysqld]
段下添加如下代码:
[mysqld]
#一般是服务器的ip
server-id=135 - 重启并登录到从服务器配置MySQL
#重启MySQL
systemctl restart mysqld
#登录MySQL
mysql -uroot -p123456
- 查看丛机状态,如下图:可以看到我们的机器第一次作为丛机是没有指定过主机的。
show slave status \G;
4. 先关闭 stop slave
,输入以下命令同步初始化 master_log_file 、 master_log_pos以主机状态为主,如果忘记了在主机输入show master status;
可以查看主机状态。
mysql>change master to
master_host='192.168.10.171',
master_port=3306,
master_user='root',
master_password='123456',
master_log_file='mysql-bin.000002',
master_log_pos=397;
红色区域都是主机的配置信息
5. 启动从服务器复制功能
mysql>start slave;
- 输入以下命令检查从服务器复制功能状态
show slave status \G;
……………………(省略部分)
Slave_IO_Running: Yes //此状态必须YES
Slave_SQL_Running: Yes //此状态必须YES
……………………(省略部分)
上述成功之后插入一条数据看是否成功;
注: 如果出现复制不成功,可以在丛机输入以下命令:
set global sql_slave_skip_counter =1; # 忽略一个错误
start slave
主从延时
1、因为SQLThread和IOThread是默认单线程,当主机的tps(每秒事务处理数)高于从机的Thread所能
承受范围,则会出现从机复制延时
解决方案: 将thread改成多线程模式 MySQL5.6改表,MySQL5.7改GTID
2、网络延时
解决方案: 主和从在一个网内
3、IO延时
slave server硬件升级
判断延时:
show slave status中Seconds_Behind_Master=0则不延时
建表加时间戳(timestamp),看时间差
解决方案: 利用分库分表中间件 Mycat、 sharding JDBC
强制读取主库