Mysql双机热备(主从异步) MySQL 5.6

注:本文mysql使用编译安装,目录位置可能不同
环境准备及要求:

  1. 关闭防火墙和selinux
  2. hosts文件中两台服务器主机名和ip地址一一对应起来
  3. 系统时间需要同步
  4. master和slave的数据库版本保持一致
  5. master:10.1.1.2 slave:10.1.1.1
    架构:Mster——>slave
    具体步骤:
  6. 修改配置文件(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 导入数据

  1. master端创建授权用户
    mysql> grant replication slave on*.* to 'slave'@'10.1.1.%' identified by '123';
    mysql> flush privileges;
  2. 查看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 | | |
    +------------------+----------+--------------+------------------+二进制文件名 正在写入的位置
  3. 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;
  4. 启动复制线程,开始同步
    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)
  5. 测试验证master写——>slave可以看到 slave写——>master看不到
    在上述架构下实现故障迁移和恢复故障迁移:
  6. 模拟master出现故障直接找到master的数据库,把相应的进程kill掉,模拟故障
  7. 查看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; <---停止
  8. 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;
    故障修复
  9. 修复master

service mysql start

Starting MySQL[ OK ]
2. 让master上线如果这个时候直接启动slave,那么这将会导致主从数据不一致,可以肯定的是,在这个架构下,master要上线,肯定只有一个选择,就是作为原有slave的从,重新上线:
主 从 slave ---> master情况下: 假设数据已经损害了、丢失了,那么最简单的方法就是重装master数据库,把master作为slave的从,原来的slave就变成新架构的主,具体步骤:
原来master:

  1. 把原有的数据目录下的内容清空、删除
  2. 重新初始化成一个新的数据库
  3. 和之前搭建主从的是一样的:确保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里

    评论
    1 评论
    yjc
    2020-09-15 11:48 回复»

    ? ?️ ?️

avatar

取消