MySQL主从复制-基于binlog日志

简介:MySQL主从复制实现分布式数据库

一:什么是主从复制

Mysql主从复制就是数据写入数据库(主库)后,同时还会额外写入另外的数据库(从库)。MySQL主从复制有基于BinLog日志基于事务两种方式来实现,接下来我就针对这两种方式来说说他们的实现原理和实操方法。

二:基于Binlog日志主从复制原理

MySQL主从复制是一个异步的复制过程,主库发生更新事件到从库,从库读取更新记录并执行更新记录,使得从库的内容与主库保持一致。其执行流程如下所示:

  1. 主库将所有变更事件记录到binlog日志中
  2. 从库发起请求,连接主库
  3. 主库的binlog dump备份线程将binlog日志传给从库
  4. 从库的I/O线程将binlog日志解析成自己的relay log日志
  5. 从库的SQL线程根据relay log来执行具体的SQL

binlog:主库中保存所有更新事件日志的二进制文件。主库中所有更新事件都会被记录在binlog中

binlog dump:每当有从库连接主库的时候,主库都会创建一个线程,然后发送binlog内容到从库。

从库I/O线程:当start slave语句在从库开始执行之后,从库创建一个I/O线程,该线程连接到主库并请求主库发送binlog日志里面的更新记录到从库。从库获取到主库返回的binlog后将数据更新到本地文件,包括relay log文件

从库SQL线程:这个线程读取从库I/O线程写到relay log的更新事件并执行

Binlog日志存储有如下三种格式:

  • Statement:Binlog日志存储SQL语句,存储日志量最下
  • Row:存储event数据,存储日志量大,但是不能直接的读取(更新100条数据时,记录这100条数据更新的结果)
  • Mixed:介于Row和Statement之间,对于不确定的操作使用Row记录。如果每天数据操作量很大,产生的日志较多可以考虑使用Mixed格式

到此我们已经知道了MySQL基于日志实现的主从复制原理及流程,接下来我们再来看看具体操作和实现吧。

1.在主库端建立MySQL复制用户

# 创建MySQL复制用户(如果有同步的用户可以忽略这一步)
create user '用户名'@'允许登陆的ip地址' identified by 'MySQL登陆密码';

#如果忘记了密码,可以使用下方命令修改
set password for ‘用户名’@‘允许连接的IP’ = password('新密码'); 

#如果你从服务器更换了,需要修改同步用户授权IP可以使用下方命令:
update mysql.user set Host='允许访问的IP' where Host='原来允许访问的IP' and user='同步用户的账号';

#如果想要允许所有IP均可访问,将Host改为%即可:
update mysql.user set Host='%' where Host='原来允许访问的IP' and user='同步用户的账号';

# 授权给从服务器
grant replication slave on *.*  to 'MySQL用户名'@'从服务器ip地址';

#刷新权限
flush privileges; 

注意:创建完用于复制的用户之后记得进入从服务器使用MySQL测试一下是否能正常连接

允许某个IP段可以访问:

update mysql.user set Host='192.168.8.%' where Host='原来允许访问的IP' and user='同步用户的账号';

2.备份主服务器端的数据,并在从服务器端恢复

关于数据库备份相关知识大家可以查看我的上一遍文章【Mysql定时备份及数据导入恢复

3.启动主库从库MySQL日志功能

找到MySQL配置文件(一般为:/etc/my.cnf),修改如下选项

# 启动日志
log_bin=mysql-bin

# 日志存储格式(默认为mixed,可以根据自己下情况进行修改)
binlog_format=mixed

# 设置server_id(注意主库和从库的server_id不能相同而且必须唯一)
server_id=1

# 指定同步的数据库,如果不写或者注释掉,默认是同步所有数据库
binlog-do-db = 数据库

# 指定不同步的数据库(如果没有直接注释掉就可以)
binlog-ignore-db=数据库

# binlog日志的保留时间(这里以7天为例)
expire_logs_days=7

4.进入从库,使用Change master命令配置复制

  • 查看防火墙是否有限制MySQL连接
  • 配置主从同步
change master to master_host='主服务器ip',

master_user='主服务器用户复制的mysql用户',

master_password='主服务器MySQL的密码',

master_log_file='主服务器MySQL记录日志文件',

master_log_pos=日志点;

参数master_log_filemaster_log_pos值可以登录主库执行:show master status; 获取

注意:master_log_pos的值是一个整数不是字符串

  • 启动slave:
start  slave;
  • 查看slave状态
show slave stauts \G

结果如下所示:

  • 停止slave
stop slave;

如有如下错误:

The slave I/O thread stops because master and slave have equal MySQL server ids;

查看主从服务器MySQL中server_id值是否相同,将从库配置文件下的server_id的值改成不同然后重启MySQL即可

好了,MySQL基于binlog日志的主从复制就结束了。

有遗漏或者不对的可以在我的公众号留言哦

编程经验共享公众号二维码

编程经验共享公众号二维码
更多内容关注公众号
Copyright © 2021 编程经验共享 赣ICP备2021010401号-1