Mysql双机热备(主从异步) MySQL 5.6
注:本文mysql使用编译安装,目录位置可能不同
环境准备及要求:
- 关闭防火墙和selinux
- hosts文件中两台服务器主机名和ip地址一一对应起来
- 系统时间需要同步
- master和slave的数据库版本保持一致
- master:10.1.1.2 slave:10.1.1.1
架构:Mster——>slave
具体步骤: - 修改配置文件(master和slave)
master:
vim /etc/my.cnf
[mysqld]
port=3306
datadir=/var/lib/mysql
pid-file=/var/lib/mysql/mysql.pid
socket=/var/lib/mysql/mysql.sock
log-error=/var/lib/mysql/mysql-err.log
user=mysql
log-bin=/var/lib/mysql/mysqld-bin #master必须开启二进制日志
server-id=1 #mysql数据库的编号,master和slave必须不一样
slave:
vim /usr/local/mysql/etc/my.cnf
[mysqld]
port=3307
datadir=/mysql56
pid-file=/mysql56/mysql56.pid
socket=/mysql56/mysql56.sock
log-error=/mysql56/mysql56-err.log
user=mysql
log-bin=/mysql56/mysqld-bin #slave上的二进制日志可以开启也可以不开启,看具体情况
server-id=2 #mysql数据库的编号
relay-log=/mysql56/relay-log #主从复制日志需要开启
修改完配置文件重启两边的mysql服务:
servivce mysql restart
service mysql.server restart
2. 初始化数据,使两边数据一致。
(以master为主)master端全库备份:#
mysqldump --lock-all-tables --all-databases > /mnt/hgfs/soft/mysqlbak.sql -p
slave端全库恢复:
service mysql.server stop
rm -rf /mysql56/*
/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql 初始化数据库
service mysql.server start
mysql -p -S /mysql56/mysql56.sock < /mnt/hgfs/soft/mysqlbak.sql 导入数据
- master端创建授权用户
mysql> grant replication slave on*.* to 'slave'@'10.1.1.%' identified by '123';
mysql> flush privileges; - 查看master的正在写的二进制文件名和位置
mysql> flush tables with read lock; 先加锁,防止两边数据不一致;如果业务还未上线,这个就没有必要了
Query OK, 0 rows affected (0.00 sec)
mysql> show master status; 只有打开二进制日志,这句命令才有结果,表示当前数据库的二进制日志写到什么位置
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 331 | | |
+------------------+----------+--------------+------------------+二进制文件名 正在写入的位置 - slave端设定复制信息
mysql> change master to master_host='10.1.1.20',master_user='slave',master_password='123',master_port=3306,master_log_file='mysqld-bin.000001',master_log_pos=331; - 启动复制线程,开始同步
mysql> start slave;
mysql> show slave status /G;
Slave_IO_Running: Yes 代表成功连接到master并且下载日志
Slave_SQL_Running: Yes 代表成功执行日志中的SQL语句
回到master端解锁:mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec) - 测试验证master写——>slave可以看到 slave写——>master看不到
在上述架构下实现故障迁移和恢复故障迁移: - 模拟master出现故障直接找到master的数据库,把相应的进程kill掉,模拟故障
- 查看slave同步状态并停止向master同步数据
slave > show slave status /G;
Slave_IO_Running: Connecting
Slave_SQL_Running: Yes
Last_IO_Error: error
reconnecting to master ' aliyunzixun@xxx.com10.1.1.2:3307' - retry-time: 60 retries: 1
mysql> stop slave; <---停止 - master故障之后,前端的应用应该把读写请求都调度给slave r/w X | master slave直接用客户端登录slave,对数据进行修改,模拟写操作
mysql> use db2;
mysql> insert into t1 set id=2;
mysql> insert into t1 set id=3;
mysql> use db1;
mysql> update t1 set name='test' where id=3;
故障修复 - 修复master
service mysql start
Starting MySQL[ OK ]
2. 让master上线如果这个时候直接启动slave,那么这将会导致主从数据不一致,可以肯定的是,在这个架构下,master要上线,肯定只有一个选择,就是作为原有slave的从,重新上线:
主 从 slave ---> master情况下: 假设数据已经损害了、丢失了,那么最简单的方法就是重装master数据库,把master作为slave的从,原来的slave就变成新架构的主,具体步骤:
原来master:
- 把原有的数据目录下的内容清空、删除
- 重新初始化成一个新的数据库
- 和之前搭建主从的是一样的:确保slave要可以成为新架构中主,它应该: 打开了二进制 server-id,要和重新上线master不一样还需要在slave上授权复制吗?得看实际情况,如果有相关帐号就不需要授权了
mysql> grant replication slave on*.* to 'slave'@'10.1.1.%' identified by '123';
mysql> flush privileges;
备份slave的数据 slave.sql
#mysqldump -S /mysql56/mysql56.sock --lock-all-tables --all-databases -p > /mnt/hgfs/soft/slave.sql
在master使用slave.sql恢复,然后设定复制信息(change master to ...)
mysql -p -S /var/lib/mysql/mysql.sock < /mnt/hgfs/soft/slave.sql
mysql> change master to -> master_host='10.1.1.10',master_port=3307,master_user='slave',master_password='123',master_log_file='mysqld-bin.000004',master_log_pos=2008;
mysql> start slave;
确保新的架构复制成功之后,回到slave服务器,把数据目录下的master.info文件删除,否则的化,下次如果slave重启数据库服务,会自动连接masterslave
rm -rf /data2/master.info
IO线程把master端的bin log内容依次写到slave端relay bin log里,并把master端的bin-log文件名和位置记录到master.info里
? ?️ ?️