MySQL主从复制集群添加slave节点

本文详细介绍了一种在现有MySQL主从集群中添加新从库(slave2)的方法,包括在新从库上安装MySQL服务、通过从现有从库(slave1)复制数据来初始化新从库,以及调整主从复制配置确保数据同步。通过实际操作,验证了新从库能正确同步主库和现有从库的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先已经有了两台主从复制的节点

192.168.8.133  主

192.168.8.134  从1

再添加一个slave节点

192.168.8.135  从2

mysql主从集群搭建方法参考:MySQL5.7.30主从复制集群搭建及互为主从集群搭建

首先要在135上安装mysql服务,方法见:centos7 MySQL5.7.30安装步骤及问题处理

使用配置文件:/etc/my.cnf

[mysqld]
port=3306
socket=/usr/local/mysql/mysql.sock
#skip-grant-tables
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
server-id=3
log_bin=mysql-bin


[mysqld_safe]
pid-file=/usr/local/mysql/mysql.pid
log-error=/usr/local/mysql/error.log

!includedir /etc/my.cnf.d

启动135上的MySQL服务并修改相关信息

新增一个slave节点,常用的方案有两种:

方案1:-复制主库

复制主库要步骤:

  1. 将内存中的数据同步到表中;
  2. 锁定表,不让出现新数据;
  3. 备份;
  4. 解锁;
  5. 将备份传送到slave02,在slave02上同步数据;
  6. slave2上设置相应的master_log_file和master-log_pos。

 

方案2:复制从库

  1. 停止从库slave01:mysql> stop slave;
  2. 看当前从库的状态,mysql> show slave status;记下 Relay_Master_Log_file 和 Exec_Master_Log_Pos;
  3. 备份从库数据
  4. 将备份传送到slave02,在slave2上同步数据;
  5. slave02上设置相应的master_log_file和master-log_pos。

注意:此方案中master_log_file和master-log_pos也和slave中一样,指向主库。

 方案对比

从主库复制会造成主库Master一定时间段锁表,这段时间会影响主库的使用。直接从从库进行复制,就不会对主库产生影响了。

但是,从从库复制要保证的是复制过程中从库上的数据不会发生变化,所以要先停掉从库。

这里我们主要实验方案2

1,在主库上创建测试数据:

mysql> use test;
Database changed
mysql> create table user02(id int(5),name char(10));
Query OK, 0 rows affected (0.03 sec)

mysql>  insert into user02 values (00002,'lisi');
Query OK, 1 row affected (0.01 sec)

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| user02         |
+----------------+
1 row in set (0.00 sec)

mysql> select * from user02;
+------+------+
| id   | name |
+------+------+
|    2 | lisi |
+------+------+
1 row in set (0.00 sec)


授权slave2

grant replication slave on *.* to rep3@192.168.8.135 identified by '123456';

2,在slave1节点上停止主从复制查看信息

mysql> stop slave;

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| user02         |
+----------------+
1 row in set (0.00 sec)

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.8.133
                  Master_User: rep1
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 923
               Relay_Log_File: localhost-relay-bin.000003
                Relay_Log_Pos: 768
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
.........
这里主要记录下面两项:

Read_Master_Log_Pos: 923

Relay_Master_Log_File: mysql-bin.000001

 

2,备份slave1的数据库并传到slave2

mysqldump -u root -p123456 test > test.sql

scp -rp test.sql 192.168.8.135:/root

3,主库133继续创建测试数据

mysql> create database test4;
Query OK, 1 row affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
| test1              |
| test2              |
| test4              |
+--------------------+
8 rows in set (0.00 sec)
目的是为了检测:slave2在恢复以前的数据后,同样会同步master的新数据

4,slave2恢复备份数据

cp -rp test.sql /tmp/

chown -R mysql.mysql /tmp/

 mysql -u root -p123456

mysql> create database test;
Query OK, 1 row affected (0.00 sec)

mysql> use test;

mysql> source /tmp/test.sql;
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)
.......

5,备库slave2开启主从复制

mysql> change master to master_host='192.168.8.133',master_user='rep3',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=923;
Query OK, 0 rows affected, 2 warnings (0.02 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.8.133
                  Master_User: rep3
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 1376
               Relay_Log_File: localhost-relay-bin.000002
                Relay_Log_Pos: 773
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:

.....
6,开启slave1的主从复制

start slave;

7,查看slave2的同步信息

我们在备份的时候,仅仅备份了slave1的test数据,之后我们在master上新建了一个名为test4的库,如果主从开启正常,此时应该在slave2中也自动同步过来了。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
| test4              |
+--------------------+
6 rows in set (0.00 sec)

mysql> use test
Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| user02         |
+----------------+
1 row in set (0.00 sec)

数据正常同步,表示slave2节点添加成功

这里有一个思考点:

在生产环境中,我们有数据库迁移的问题,由于原始数据库的数据量非常大,且不停的在更新,备份数据耗时太长且无法保证数据完整性,此时备份数据再恢复就不是最佳选择了。

可以把新库的master设置为旧库的slave,从154和mysql-bin.000001开始同步数据,等于是将旧库完整的同步到新库中。

线上切换到新的数据库之后,将新库的主库断开和旧库的主从复制,然后独立运行,此时,数据将完整写入到新库中,不会出现数据遗漏的现象。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值