前提:我做的实验,是使用阿里云来做主库,本机做从库的。
一,什么是主从复制?
mysql从3.23版本提供复制的功能。复制是指将主数据库的DDL和DML操作通过二进制日志传到复制服务器上(也叫从库),然后在从库上对这些日志重新执行(重做),从而使得主从数据库的数据一致。注意,mysql实现的是异步复制,所以主从库之间的数据会有一些差异的。一般都是把实时性较高的数据从主库中获取,实时性不高的数据就在从库中获取。
二,优缺点
优点:
如果主库出现问题,可以快速切换到从库提供服务
在从库上可以执行查询操作,减轻主库的压力
在从库上执行备份,避免备份期间影响主库的服务
缺点:
下边主要针对三种架构来说。
三,大概流程
首先,主库在提交事务的时候会把数据变更作为时间记录在二进制日志文件binlog中,然后推送二进制日志文件binlog中的时间到从库的中继日志RelayLog中,之后从库根据中继日志文件来重做变更操作,通过逻辑复制来达到数据库的一致性。
mysql通过三个线程来完成主从库之间的数据复制:BinlogDump线程,I/O线程,SQL线程。BinlogDump线程是运行在主库上的,I/O线程和SQL线程是 运行在从库上。当启动主从复制的时候,从库首先创建I/O线程连接主库,然后主库会创建BinlogDump线程读取数据库时间并发送给I/O线程,I/O线程获取时间后就更新到从库的中继日志RelayLog中,之后从库的sql线程就读取中继日志中的时间,更新数据并应用。
为了保证从库在重启之后还应该知道从哪里开始复制,从库上默认会创建两个文件:master.info 和relay-log.info来保存复制的进度,这两个文件分别记录了从库的I/O线程读取主库的二进制文件的进度和SQL线程读取中继日志的进度。
四,二进制文件和中继日志文件
1.由此可见,二进制日志文件和中继日志日志文件是非常重要的。二进制日志文件记录了所有数据操作(Create,Drop,Insert,Update...)等操作(不包括select,因为select不改变数据)。二进制日志文件有三种格式:statement,row,mixed。
statement:基于sql语句级别的Binlog,每条修改数据的sql都会保存到binlog里。
row:基于行级别,记录每一行数据的变化,也就是将每行数据的变化都会记录大奥binlog里边,但是不会记录原始sql,因为记录的信息详细,所以记录量比statement要大得多。
mixed:这个是混合statement和row模式。默认情况下采用statement模式,某些情况下会切换成row:sql中包含时间,用户相关的函数等。
这三种格式也对应着复制的三种模式,可以通过这条指令查看当前的复制模式:show variables like '%binlog%format';
可以通过这个指令来修改值:set binlog_format = 'Row';
2.中继日志文件和二进制日志文件一样,只不过从库上的sql线程在执行完中继日志文件之后会自动删除中继日志文件,避免中继日志文件占用过多的磁盘空间。
五,主从复制常见的三种架构
1.一主多从:可以通过此配置实现读写分离,在主库出现问题的时候,把一个从库切换成主库继续提供服务。
2.多级复制:考虑到主库是推送binlog日志到从库的,所以当从库多了的时候,主库上的IO压力和网络压力也会很大(因为每一个从库都会在主库上有一个线程),多级复制架构就解决了这个问题,前边的master用来处理写请求,然后把二进制日志给后边的master,后边的master就专门用来推送二进制日志文件。这个情况下,由于又经过了一个数据库的中转,所以这个架构缺点是延时比其他架构要大。
3.双主复制:主库master1和master2互为主从,这种架构方式,可以避免了重复搭建从库,维护等问题。
六,实战
master:阿里云centos slave:本机
1.修改master机上的配置文件 vim /etc/my.cnf
添加一下内容:
bind-address = 0.0.0.0
server-id = 105
这个server-id可以随便填,只是后边要作为一个从库找到主库的一个参数,bind-address是远程登录mysql的ip限制,此处的0.0.0.0是表示所有ip地址都可以远程登录mysql
2.创建用于slave机器获取master机器上binlog文件的账号
grant replication slave on *.* to 'zhu'@'%' identified by 'xxxx';(这个的密码按个人来设置,用于后边从库链接的验证)
zhu是一个 用户名,用于后边链接主机用到。
@'%' 这里是使用了通配的主机地址,也可以写成master机的ip地址
*.* 表示所有的库和表,也可以自己制定,比如:aa.bb 就表示这个账号只允许访问aa库的bb表
3. flush privileges; #刷新数据库
4.show master status; #查看master状态,并记录下binlog日志文件名以及position
5.配置slave机上的数据库配置文件,加上bind-address和server-id
bind-address = 0.0.0.0
server-id = 106
6.在slave机上登录数据库,输入这个指令:
change master to master_host='主机ip地址', master_port=3306, master_user='zhu', master_password='密码', master_log_file=' mysql-bin.000003', master_log_pos=902;
master_host就是你主机的ip地址,master_user就是上边你刚刚创建的用户名,master_password就是上边创建用户的密码
7.开启从库
在slave机上输入 start slave;
8.查看slave状态