环境相关:
OS:CentOS release 6.9
主MySQL IP:192.168.1.10
备MySQL IP:192.168.1.11
CPU:4核
MEM:2G
DISK:50G
1. 简单说明
公司某小项目做等保之类的检查,要求MySQL库至少要有主备同步的灾备防护,
因此对生产上使用的MariaDB-10.1.X进行简单主备改造。
这里需要注意,MariaDB和Oracle版的MySQL搭建有很多区别,
本文档不能直接用于Oracle版的MySQL。
2. 环境准备
参照《编译安装MariaDB-10.1.30》,编译一台MariaDB作为主MySQL主机,
使用虚拟机克隆,克隆出备MySQL主机,修改备机的IP和主机名,其他保持不变。
3. 搭建部署
主备库的server_id是不可以相同的,因此需要修改备库的配置文件:
# 备库主机操作
SERVERID=$RANDOM
# 调用bash变量RANDOM,随机生成一个0~32767之间的整数
sed -i "s/server_id=.*/server_id=$SERVERID/g" /etc/my.cnf
# 修改备库的server_id
主备库的配置文件还需要在 #####replication######标签下添加配置:
# 主备库主机均操作
sed -i "/^#*replication#*$/a\report-host=$(hostname)" /etc/my.cnf
sed -i "/^#*replication#*$/a\binlog-rows-query-log_events=1" /etc/my.cnf
sed -i "/^#*replication#*$/a\slave-sql-verify-checksum=1" /etc/my.cnf
sed -i "/^#*replication#*$/a\master-verify-checksum=1" /etc/my.cnf
sed -i "/^#*replication#*$/a\binlog-checksum=CRC32" /etc/my.cnf
sed -i "/^#*replication#*$/a\slave-parallel-threads=2" /etc/my.cnf
sed -i "/^#*replication#*$/a\sync-master-info=1" /etc/my.cnf
sed -i "/^#*replication#*$/a\relay-log-info-repository=TABLE" /etc/my.cnf
sed -i "/^#*replication#*$/a\master-info-repository=TABLE" /etc/my.cnf
# 即在主备库的配置文件中的replication标签下添加如下参数
# master-info-repository=TABLE
# relay-log-info-repository=TABLE
# sync-master-info=1
# slave-parallel-threads=2
# binlog-checksum=CRC32
# master-verify-checksum=1
# slave-sql-verify-checksum=1
# binlog-rows-query-log_events=1
# report-host=ecpssdb
# 最后一行是各自的主机名
主库添加用于实现同步操作的数据库用户,
备库需要使用该账号登录主库:
# 主库操作
mysql -uroot -pvincent
GRANT REPLICATION SLAVE,REPLICATION CLIENT
ON *.* TO 'repluser'@'192.168.1.%' IDENTIFIED BY 'replpass';
flush privileges;
exit
# 备库处于192.168.1.0 网段,因此该账号授权备库所在网段的登录权限
# 也可以限制只能备库的IP使用该账号登录
模拟生产,主库创建业务库,插入数据,模拟生产,
可以写一个脚本做实时的插入操作,更为真实的模拟生产:
# 主库操作
mysql -uroot -pvincent
create vincent;
create table vincent.test(
id bigint(20) NOT NULL,
changetime timestamp DEFAULT CURRENT_TIMESTAMP NOT NULL);
exit;
mysql -uroot -pvincent
create vincent;
create table vincent.test(
id bigint(20) NOT NULL,
changetime timestamp DEFAULT CURRENT_TIMESTAMP NOT NULL);
exit;
while true
do
echo 'insert into vincent.test(id) select count(*) from vincent.test;'| mysql -uroot -pvincent
sleep 1
done
主库操作,备份全库,并且查询出备份开始时的binlog日志和对应的POS号
将备份复制到备库
# 主库操作
mysqldump -uroot -pvincent \
--single-transaction \
--master-data=2 -A >/tmp/fulldb.sql
head -30 /tmp/fulldb.sql|grep '^-- CHANGE MASTER TO MASTER_LOG_FILE'
# -- CHANGE MASTER TO MASTER_LOG_FILE='binlog.000257', MASTER_LOG_POS=92212605;
scp /tmp/fulldb.sql 192.168.1.11:/tmp/
备库使用备份恢复,根据主库的binlog进行数据同步
mysql -uroot -pvincent </tmp/fulldb.sql
mysql -uroot -pvincent
CHANGE MASTER TO MASTER_HOST='192.168.1.10',
MASTER_USER='repluser',MASTER_PASSWORD='replpass',
MASTER_LOG_FILE='binlog.000257',MASTER_LOG_POS=92212605;
-- 指定主库IP和用户数据同步的主库的账号以及主库对应的binlog相关信息
START SLAVE;
show slave status\G
show variables like '%gtid%';
-- 启动同步
-- 查看备库状态,是否有报错
-- 查看gtid,是否在实时跳变
STOP SLAVE;
CHANGE MASTER TO MASTER_USE_GTID=slave_pos;
START SLAVE;
show slave status\G
show variables like '%gtid%'
-- 一般使用slave_pos方式进行同步
-- 停掉同步,修改参数,再次启动,验证
4. 收尾
本文档只是一个简单的主备搭建过程,生产实施时需要在业务低峰时,
后续的主备状态监控,以及告警和主备故障切换,备库同步失败后的恢复等等,
需要自行再去研究…
[TOC]