使用docker进行MYSQL主从复制(一主两从)

目录

概述主从介绍

主从作用

主从作用有:

主从形式有:

 配置步骤

主要配置

1>创建三个进程

2>修改配置文件

3>主机配置

4>从机配置

5>将文件修改后,复制到容器里面

6>进入主机进行配置

6.1>创建用户

6.2>给用户授权

6.3>刷新权限

7>进入从机进行配置

对M1S1

对M2S2

 8>最后开启主从

9>测试


概述主从介绍

MySQL主从又叫Replication、AB复制。简单讲就是A与B两台机器做主从后,在A上写数据,另外一台B 也会跟着写数据,实现数据实时同步。有这样几个关键点:

1)MySQL主从是基于binlog,主上需开启binlog才能进行主从;

2)主从过程大概有3个步骤;

3)主将更改操作记录到binlog里;

4)从将主的binlog事件(SQL语句) 同步本机上并记录在relaylog里;

5)从根据relaylog里面的SQL语句按顺序执行。

主从作用

主从作用有:

实时灾备,用于故障切换;读写分离,提供查询服务;备份,避免影响业务。

主从形式有:

而我们今天的配置是一主两从

 配置步骤

1)确保从数据库与主数据库里的数据一致

2)在主数据库里创建一个同步账户授权给从数据库使用

3)配置主数据库(修改配置文件)

4)配置从数据库(修改配置文件)

5)需求

6)搭建两台MySQL服务器,一台作为主服务器,一台作为从服务器,主服务器进行写操作,从服务器 进行读操作

环境说明(使用docker通过不通端口启用多台mysql进程)

名称IPport
M1       192.168.38.1323307
M1S1192.168.38.1323308
M1S2192.168.38.1323309

主要配置

1>创建三个进程

docker run --name M1 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 --
lower_case_table_names=1
docker run --name M1S1 -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 -
-lower_case_table_names=1
docker run --name M1S2 -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 -
-lower_case_table_names=1

2>修改配置文件

将容器里面的配置文件复制出来,主要修改服务器的配置;在root目录下创建一个mysqlms的目录存放 从Docker容器里面复制过来的配置文件。进入目录:cd /mysqlms

mkdir /mysqlms
cd /mysqlms
docker cp M1:/etc/mysql/conf.d/docker.cnf m1.cnf
docker cp M1S1:/etc/mysql/conf.d/docker.cnf m1s1.cnf
docker cp M1S2:/etc/mysql/conf.d/docker.cnf m1s2.cnf

3>主机配置

[root@localhost mysqlms]# vim m1.cnf

[mysqld]
skip-host-cache
skip-name-resolve
server-id=1
log-bin=master.bin

4>从机配置

[root@localhost mysqlms]# vim m1s1.cnf

[mysqld]
skip-host-cache
skip-name-resolve
server-id=3


[root@localhost mysqlms]# vim m1s2.cnf

[mysqld]
skip-host-cache
skip-name-resolve
server-id=2


然后记着重启三个进程

docker restart M1 M1S1 M1S2

5>将文件修改后,复制到容器里面

docker cp m1.cnf M1:/etc/mysql/conf.d/docker.cnf
docker cp m1s1.cnf M1S1:/etc/mysql/conf.d/docker.cnf
docker cp m1s2.cnf M1S2:/etc/mysql/conf.d/docker.cnf

6>进入主机进行配置

[root@localhost mysqlms]# docker exec -it M1 bash
root@40b67125e6ce:/#
root@40b67125e6ce:/# mysql -uroot -p123456

6.1>创建用户

mysql> create user 'rep'@'%' identified by '123456';
Query OK, 0 rows affected (0.01 sec)

6.2>给用户授权

mysql> grant replication slave on *.* to 'rep'@'%';
Query OK, 0 rows affected (0.01 sec)

6.3>刷新权限

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

此时我们使用M1里面的rep用户登录

root@40b67125e6ce:/# mysql -urep -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.36 MySQL Community Server (GPL)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

7>进入从机进行配置

对M1S1

[root@localhost mysqlms]# docker exec -it M1 bash
root@40b67125e6ce:/# mysql -uroot -p123456
mysql> change master to
    -> master_host="192.168.38.133",master_port=3307,
    -> master_user="rep",
    -> master_password="123456",
    -> master_log_file="master.000001",
    -> master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.03 sec)

对M2S2

[root@localhost ~]# docker exec -it M1S2 bash
root@401c6f11cfc8:/# mysql -uroot -p123456
mysql> change master to
    -> master_host="192.168.38.133",master_port=3307,
    -> master_user="rep",
    -> master_password="123456",
    -> master_log_file="master.000001",
    -> master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

其中,master_log_file:该文件具体叫什么名称,需要从主机里面去看看。进入M1 里面使用root 用户 登录M1,执行下面的SQL:show master status;

 8>最后开启主从

在M1S1和M2S2中都开启

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

最后查看主从状态

M1S1

mysql>  show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.38.133
                  Master_User: rep
                  Master_Port: 3307
                Connect_Retry: 60
              Master_Log_File: master.000001
          Read_Master_Log_Pos: 154
               Relay_Log_File: ffe391517b79-relay-bin.000002
                Relay_Log_Pos: 317
        Relay_Master_Log_File: master.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 154
              Relay_Log_Space: 531
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
                  Master_UUID: 9c13ed93-2971-11ee-8e34-0242ac110003
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

M1S2

mysql>  show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.38.133
                  Master_User: rep
                  Master_Port: 3307
                Connect_Retry: 60
              Master_Log_File: master.000001
          Read_Master_Log_Pos: 154
               Relay_Log_File: 401c6f11cfc8-relay-bin.000002
                Relay_Log_Pos: 317
        Relay_Master_Log_File: master.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 154
              Relay_Log_Space: 531
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
                  Master_UUID: 9c13ed93-2971-11ee-8e34-0242ac110003
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

9>测试

在M1 里面创建数据库,看M1S1 ,M1S2有没有复制过去

 

 

此时我们可以看到有了所以成功

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1. 安装Docker 如果您还没有安装Docker,请按照官方文档的说明安装Docker。 2. 创建Docker网络 为了使主从复制工作,我们需要为Docker容器创建一个网络。在命令行中运行以下命令: ``` sudo docker network create mysql_network ``` 3. 启动主数据库 我们将使用官方的MySQL Docker镜像来启动主数据库。在命令行中运行以下命令: ``` sudo docker run -d --name mysql_master --net mysql_network -e MYSQL_ROOT_PASSWORD=password mysql:latest --server-id=1 --log-bin=mysql-bin --binlog-do-db=mydb ``` 这将启动一个名为mysql_master的Docker容器,并将其连接到我们创建的mysql_network网络中。我们还指定了一个root用户的密码,并为该容器分配了一个server-id,以便在创建从数据库时使用。 我们还使用MySQL选项来启用二进制日志记录和仅记录mydb数据库的事务。 4. 启动从数据库 现在我们需要启动另一个MySQL容器作为从数据库。在命令行中运行以下命令: ``` sudo docker run -d --name mysql_slave --net mysql_network -e MYSQL_ROOT_PASSWORD=password mysql:latest --server-id=2 --log-bin=mysql-bin --binlog-do-db=mydb --relay-log=mysql-relay-bin --log-slave-updates=1 --read-only=1 --slave-skip-errors=all --skip-slave-start ``` 这将启动一个名为mysql_slave的Docker容器,并将其连接到我们创建的mysql_network网络中。我们还指定了一个root用户的密码,并为该容器分配了一个server-id。 我们还使用了一些MySQL选项来启用二进制日志记录和仅记录mydb数据库的事务。我们还启用了中继日志记录和从服务器更新主服务器的日志记录。我们还将容器设置为只读模式,并跳过任何从数据库错误。最后,我们将跳过从服务器的启动。 5. 配置主数据库 现在我们需要登录主数据库并为它创建一个用于从服务器的用户。在命令行中运行以下命令: ``` sudo docker exec -it mysql_master mysql -u root -p ``` 输入我们在启动容器时指定的root密码,这将进入MySQL shell。在MySQL shell中,运行以下命令: ``` GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'password'; FLUSH PRIVILEGES; SHOW MASTER STATUS; ``` 这将创建一个名为slave_user的用户并授予其复制权限。我们还刷新了特权表以确保更改生效。最后,我们显示了主服务器的状态,以便稍后配置从服务器。 请注意,我们在第一行中使用了“%”通配符,以便从任何位置连接到主服务器。在生产环境中,您应该更明确地指定从服务器的IP地址。 6. 配置从数据库 现在我们需要登录从数据库并配置它以连接到主服务器。在命令行中运行以下命令: ``` sudo docker exec -it mysql_slave mysql -u root -p ``` 输入我们在启动容器时指定的root密码,这将进入MySQL shell。在MySQL shell中,运行以下命令: ``` CHANGE MASTER TO MASTER_HOST='mysql_master', MASTER_USER='slave_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=0; START SLAVE; ``` 这将配置从服务器以连接到我们的主数据库,并指定将从哪个二进制日志文件开始复制。我们还启动从服务器以开始复制。 请注意,我们在第一行中使用了主服务器的容器名称(mysql_master)作为主机名。在Docker网络中,容器可以使用其名称进行通信。 7. 测试主从复制 现在,我们已经成功配置了主从复制,我们可以测试它是否正常工作。在MySQL shell中,运行以下命令: ``` USE mydb; CREATE TABLE test (id INT PRIMARY KEY); INSERT INTO test VALUES (1); ``` 这将在主服务器上创建一个名为test的表,并将一行插入其中。我们可以使用以下命令在从服务器上检查是否成功复制: ``` USE mydb; SELECT * FROM test; ``` 如果一切正常,您应该看到与主服务器上插入的相同的行。 现在,我们已经成功地使用Docker部署了MySQL主从复制。请记住,这只是一个简单的示例,用于演示如何设置主从复制。在生产环境中,您应该仔细考虑安全性和高可用性等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值