原理
温馨提示:理论虽有点枯燥,但是对于案例搭建很有帮助。
- 更新数据之前,主服务器在二进制日志(Binary log)记录这些改变,存储引擎提交事务。
- 存储引擎提交事务给从服务器的I/O线程,将从主服务器的二进制日志(Binary log)中读取事件,并写入中继日志(Relay log)
- SQL从线程处理最后一步,将从中继日志读取事件,并重放其中的事件(例如,插入名称是张三的数据,SQL语言结构是,insert语法结构的类型,将SQL语言转换成具体的汉字张三),这样从服务器和主服务器的数据一致。
复制类型
- 基于语句的复制。在主服务器上执行的sql语句,在从服务器上执行同样的语句,mysql默认采用基于语句的复制类型(上图,就是基于语句的复制原理)
- 基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍
- 混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制
案例
温馨提示:实验环境,关闭防火墙,setenfoce设置为宽容模式,暂不搭建代理服务器,mysql主服务器也是时间同步服务器。
推荐步骤:
(1)主节点上搭建时间同步服务器(centos7默认已安装时间同步服务,只需配置即可)
在/etc/ntp.conf文件中修改下面内容
vim /etc/ntp.conf
重启mysql服务
systemctl restart ntpd
(2) 从节点上进行时间同步
每台节点从服务器都执行命令:ntpdate 192.168.2.2
如下图显示
(3)配置mysql主服务器
① 在my.cnf文件中修改下面内容
vim /etc/my.cnf
②重启mysql服务
systemctl restart mysqld
③ 登录mysql,为从服务器授权
刷新权限
查看主服务器状态
(4)配置mysql从服务器
①在my.cnf文件中修改下面内容
vim /etc/my.cnf
② 重启mysql服务
systemctl restart mysqld
③登录mysql,配置同步
④ 启动同步
⑤ 查看slave状态
(5)验证
①在主、从服务器上登录mysql
mysql -u root -p
②在主服务器上新建数据库名称为对面的美女看过来
mysql> create database 对面的美女看过来;
③在两台从服务器上查看数据库
执行新建数据库,对面的美女看过来命令,显示如下图:
执行查看数据库命令,显示如下图:
证明,从服务器复制了主服务器刚创建的数据,主从复制搭建成功!
常见报错
导致Slave_IO不能运行
分析:
①忘记刷新权限
解决方案:虚拟机环境,只能恢复快照,按照上面步骤做,即便现在刷新,也不行。
②若是克隆的mysql,由于MySQL程序uuid相同,而导致错误状态
解决方案:
- 登录mysql通过命令生成一个uuid复制等会用于修改
- 编辑mysql数据文件目录里面的auto.cnf 文件
vim /usr/local/mysql/data/auto.cnf
[auto]
server-uuid=85dba00a-e0ef-11e9-b341-000c29812345 //粘贴刚才生成的 - 重启mysql
③段偏移量和主服务器不一致
注意:这个值是会自动变化的,只要更改配置,刷新,所以要用最新值。
解决方案:重新登录mysql,用命令stop slave停止之前的slave,做正确配置。
总之,错误千万种,解决的方法也是可以找到的,我们应该避免两种类型的问题,第一种,复合型问题,解决了单一问题,未达到效果就自暴自弃!
第二种,认为恢复快照能解决一切问题,有些时候,服务器的硬件配置不支持,以及虚拟机网卡类型没统一,无论恢复多少次,只是让我们离解决问题越来越远。