Setting Up Binary Log File Position Based Replication
下面的配置基于CentOS7.2,MysqL5.7
MysqL的安装参考
建立基于日志点的复制
我们看看官方的配置步骤
主要有以下步骤
其中第3步和第4步可以通过一条语句完成,第6步是将配置好的slave作为其他slave环境(主要步骤是复制配置好的slave的数据目录文件夹,我们通过重复的步骤也可以实现)
1 配置master
To configure a master to use binary log file position based replication,you must enable binary logging and establish a unique server ID.
使用基于日志点的复制来配置master,我们必须开启二进制日志并为master分配一个唯一的server ID。
编辑/etc/my.cnf
sudo vim /etc/my.cnf
在[MysqLd]下面添加下面的配置,如果[MysqLd]下面没有配置的话,配置了就根据需求修改或跳过
log-bin=MysqL-bin server-id=1
log-bin开启二进制日志并配置了二进制日志的前缀
server-id配置了server的id
然后重启MysqL
sudo systemctl restart MysqLd.service
2 创建复制用户
CREATE USER '用户名'@'ip地址' IDENTIFIED BY '密码'; GRANT REPLICATION SLAVE ON *.* TO '用户名'@'ip地址';
上面的两条命令主要是创建了复制slave用户
如果出现
ERROR 1396 (HY000): Operation CREATE USER Failed for 'xxx'@'xxx'
执行
FLUSH PRIVILEGES
再执行上面的两条命令
3 获取master日志点并导出数据
MysqLdump -uroot -p --single-transaction --triggers --routines --flush-logs --master-data --all-databases > /tmp/alldb.sql
上面的MysqLdump会导出master上的所有数据到/tem/alldb.sql中,并且记录了master上的日志点(日志文件和日志位置),主要是–master-data的作用,其他参数可以自行搜索。
我们可以看看导出的文件,里面有了MASTER_LOG_FILE和MASTER_LOG_POS,这两个参数在后面会用到,这个也是master上当前show master status看到数据。
将数据导出后master上的配置已经完成了。
4 配置slave并导入master上的数据
下面的操作在slave上
有可能我们很多时候有各种错误,导致我们也不知道slave的当前状态,所以有必要先停掉,不管slave启动没有
STOP SLAVE;
参照第1步为slave配置一个server-id,注意要唯一,不能和master相同,重启slave。
我们把刚才导出的数据导入slave中
5 在slave上执行CHANGE MASTER TO
CHANGE MASTER TO MASTER_HOST='master的ip',MASTER_USER='第2步在master上创建的用户',MASTER_PASSWORD='第2步在master上创建的用户的密码',MASTER_LOG_FILE='第3步MysqLdump出文件记录的MASTER_LOG_FILE',MASTER_LOG_POS=第3步MysqLdump出文件记录的MASTER_LOG_POS;
执行之后就配置好了CHANGE MASTER TO
然后
START SLAVE;
然后通过
SHOW SLAVE STATUS\G;
查看slave的状态
看到Slave_IO_Running和Slave_sql_Running都是Yes就说名slave启动正常了。
这里我是隔了几天截图的,所以Master_Log_Pos是381877,刚刚执行后Master_Log_File应该是刚才第2步看到的154。
如果出现
ERROR 1045 (28000): Access denied for user 'xxx'@'xxx' (using password: YES)
可能是防火墙的问题
查看防火墙
sudo systemctl status firewalld.service
开启防火墙
sudo systemctl start firewalld.service
添加3306
sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent
添加成功后会返回success
重新加载firewall
sudo firewall-cmd --reload
查看3306端口
sudo firewall-cmd --query-port=3306/tcp
查看所有的开放端口
sudo firewall-cmd --zone=public --list-all
防火墙端口开放后
SLAVE STOP; SLAVE START;
到这master和slave都配置完了,在master更新会同步到slave.
以上步骤是可以重现的,我实验了好几次。
如果需要配置多个slave,重复执行slave的步骤即可。
如果需要slave作为其他slave的master(A->B->C)则需要在slave开启二进制日志(即配置log-bin)外,还要配置log_slave_updates=on,即slave同步master的日志后,再写入自己的log-bin,这样slave的slave才能同步到master更新的数据。
参考文献
https://dev.mysql.com/doc/refman/5.7/en/replication-howto.html