前言:mysql
在MySQL中,主从架构应该是最基础、最经常使用的一种架构了。后续的读写分离、多活高可用架构等大多都依赖于主从复制。主从复制也是咱们学习MySQL过程当中必不可少的一部分,关于主从复制的文章有不少,笔者也来凑凑热闹,写写这方面的内容吧,同时分享下本身的经验和方法。git
主从复制(也称 AB 复制)是指一台服务器充当主数据库服务器,另外一台或多台服务器充当从数据库服务器,主服务器中的数据自动复制到从服务器之中。对于多级复制,数据库服务器既可充当主机,也可充当从机。MySQL默认采用异步复制方式。sql
主从复制的过程及原理能够总结以下:数据库
基于二进制文件位置的主从复制又能够称为传统复制,即从服务器依赖于主服务器的binlog文件位置,当主库发生数据变动时,binlog pos位点会增加,从库会感应到变化来完成同步。vim
配置主从复制,咱们首先要准备至少两台MySQL实例,一台充当主服务器、一台充当从服务器。因为主从复制依赖于binlog,因此主库必须开启binlog,且主从要配置不一样的server_id,下面具体展现下配置过程:安全
2.1 确认主从库配置参数服务器
MySQL主从服务器建议有以下配置,能够先确认下,若是未配置,则须要修改配置文件而后重启。架构
# 主库参数配置 要有如下参数 vim /etc/my.cnf [mysqld] log-bin = binlog //启用二进制日志 server-id = 137 //服务器惟一ID,默认值是1,通常设置为IP地址的最后一段数字 binlog_format = row //bilog设置为row模式 防止复制出错 # 从库建议配置如下参数 vim /etc/my.cnf [mysqld] relay-log = relay-bin server-id = 138
2.2 肯定主库二进制位置,建立同步帐号异步
若主从库都是刚刚初始化完成,且主库无操做时,从库可不用同步主库的数据,直接肯定主库的binlog位置便可。ide
# 查看主库binlog文件位置 show master status; # 主库建立同步帐号 create user 'repl'@'%' identified by '123456'; grant replication slave on *.* to 'repl'@'%';
若主库已经运行了一段时间,有业务数据在,而从库刚刚初始化完成,此时则须要备份主库的数据,而后导入从库,使得主从数据一致。
# 主库建立同步帐号 create user 'repl'@'%' identified by '123456'; grant replication slave on *.* to 'repl'@'%'; # 全备主库数据 mysqldump -uroot -pxxxx -A -R -E --single-transaction --master-data=2 > all_db.sql # 从库端恢复 mysql -uroot -pxxxx < all_db.sql # 从备份文件中能够找到主库的binlog位置
2.3 进入从库,开启主从复制
找到主库二进制文件位置且完成主从数据一致后,咱们就能够正式开启主从复制了。
# 进入从库MySQL命令行 执行change master语句链接主库 # 二进制文件名及pos位置由上面步骤得到 CHANGE MASTER TO MASTER_HOST='MySQL主服务器IP地址', MASTER_PORT=3306, MASTER_USER='repl', MASTER_PASSWORD='123456', MASTER_LOG_FILE='binlog.000002', MASTER_LOG_POS=154; # 开启主从复制 并坚持状态 start slave; show slave status \G //查看slave状态 确保Slave_IO_Running: Yes Slave_SQL_Running: Yes
GTID是MySQL 5.6的新特性,其全称是Global Transaction Identifier,可简化MySQL的主从切换以及Failover。GTID用于在binlog中惟一标识一个事务。当事务提交时,MySQL Server在写binlog的时候,会先写一个特殊的Binlog Event,类型为GTID_Event,指定下一个事务的GTID,而后再写事务的Binlog。
在基于GTID的复制中,首先从服务器会告诉主服务器已经在从服务器执行完了哪些事务的GTID值,而后主库会有把全部没有在从库上执行的事务,发送到从库上进行执行,而且使用GTID的复制能够保证同一个事务只在指定的从库上执行一次,这样能够避免因为偏移量的问题形成数据不一致。也就是说,不管是级联状况,仍是一主多从的状况,均可以经过GTID自动找位置,而无需像以前那样经过File_name和File_position找主库binlog位置了。
基于GTID的主从复制与上面基于二进制文件位置的主从复制搭建步骤相似,一样简单展现下搭建过程:
3.1 确认主从库配置,开启GTID
# 主库参数配置 要有如下参数 vim /etc/my.cnf [mysqld] server-id = 137 log-bin = binlog binlog_format = row gtid-mode = ON //开启gtid模式 enforce-gtid-consistency = ON //强制gtid一致性,用于保证启动gitd后事务的安全 # 从库建议配置如下参数 vim /etc/my.cnf [mysqld] server-id = 138 log-bin = binlog binlog_format = row gtid-mode = ON enforce-gtid-consistency = ON relay-log = relay-bin
3.2 建立同步帐号,保持主从库数据一致
若主库刚初始化完成或者主库端保留有所有二进制文件,则从库无需手动同步数据。不然须要手动同步数据使得主从一致。
# 主库建立同步帐号 create user 'repl'@'%' identified by '123456'; grant replication slave on *.* to 'repl'@'%'; # 若主库刚初始化或保留有完整二进制文件 则无需执行下面步骤 # 全备主库数据 mysqldump -uroot -pxxxx -A -R -E --single-transaction > all_db.sql # 从库端恢复 mysql -uroot -pxxxx < all_db.sql
3.3 进入从库,开启主从复制
# 进入从库MySQL命令行 执行change master语句链接主库 CHANGE MASTER TO MASTER_HOST='MySQL主服务器IP地址', MASTER_PORT=3306, MASTER_USER='repl', MASTER_PASSWORD='123456', MASTER_AUTO_POSITION = 1; # 开启主从复制 并坚持状态 start slave; show slave status \G
在平常学习及工做过程当中,主从复制方面也积累了一些经验,下面简单分享几点,但愿各位少踩坑。
总结:
本文介绍了主从复制的原理及搭建过程,其实关于主从复制的内容还有不少,须要不断的学习。这里推荐你们使用GTID模式来搭建主从复制,关于后面分享的几点经验,也是本身平常积累的,但愿对你有所帮助。写做不易,以为还不错的话,请顺手转发分享下哦。