zoukankan      html  css  js  c++  java
  • MySQL主从复制集群添加slave节点

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

    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:-复制主库
    复制主库要步骤:

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

    方案2:复制从库
    停止从库slave01:mysql> stop slave;
    看当前从库的状态,mysql> show slave status;记下 Relay_Master_Log_file 和 Exec_Master_Log_Pos;
    备份从库数据
    将备份传送到slave02,在slave2上同步数据;
    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开始同步数据,等于是将旧库完整的同步到新库中。

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

  • 相关阅读:
    Linux下wget下载软件小技巧以及安装jdk、tomcat与ftp服务器
    C++计算二叉树的节点数和高度
    转:POST 400 Bad Request The request sent by the client was syntactically incorrect
    SSM项目spring配置文件详细步骤(分门别类、灵巧记忆)
    IntelliJ IDEA里找不到javax.servlet的jar包
    51nod 1533 && CF538F
    51nod 1189
    51nod 1225
    51nod 1040
    51nod 1610
  • 原文地址:https://www.cnblogs.com/dreammer/p/15766198.html
Copyright © 2011-2022 走看看