Docker搭建MySQL主从复制

得意时要看淡,失意时要看开。不论得意失意,切莫大意;不论成功失败,切莫止步。志得意满时,需要的是淡然,给自己留一条退路;失意落魄时,需要的是泰然,给自己觅一条出路Docker搭建MySQL主从复制,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

前言:

  企业中的业务通常数据量都比较大,而单台数据库在数据存储、安全性和高并发方面都无法满足实际的需求,所以需要配置多台主从数据服务器,以实现主从复制,增加数据可靠性,读写分离,也减少数据库压力和存储引擎带来的表锁定和行锁定问题。

一.准备阶段

我这里使用的是两台服务器使用Docker分别创建一个Mysql实例,搭建一主一从,读写分离的架构。

1.1 Master相关准备

  1. 启动Master 节点

docker run -p 3310:3306 --name mysql-master \
-v /mydata/mysql-master/log:/var/log/mysql \
-v /mydata/mysql-master/data:/var/lib/mysql \
-v /mydata/mysql-master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7.34
  1. 在/mydata/mysql-master/conf 创建文件 my.cnf,并做如下配置

[mysqld]
\##设置server_id , 同一局域网中需要唯一
server_id=101
\##指定不需要同步的数据库名称
binlog-ignore-db=mysql
\##开启二进制日志功能
log-bin=mall-mysql-bin
\##设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
\##设置使用二进制日志格式(mixed,statement,row)
binlog_format=mixed
\##而简直日志过期清理时间,默认值为0,表示不自动清理
expire_logs_days=7
\##跳过主从复制中遇到的所有错我或指定类型的错误,避免slave端复制中断
\##如:1062错误指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
  1. 重启主库

docker restart mysql-master

1.2 Slave相关准备

1.启动slave节点

docker run -p 3310:3306 --name mysql-slave \
-v /mydata/mysql-slave/log:/var/log/mysql \
-v /mydata/mysql-slave/data:/var/lib/mysql \
-v /mydata/mysql-slave/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7.34

2.在/mydata/mysql-slave/conf 创建文件 my.cnf,并做如下配置

[mysqld]
\##设置server_id , 同一局域网中需要唯一
server_id=102
\##指定不需要同步的数据库名称
binlog-ignore-db=mysql
\## 开启二进制日志功能,以备slave作为其他数据库实例的master时使用
log-bin=mall-mysql-slave1-bin
\##设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
\##设置使用二进制日志格式(mixed,statement,row)
binlog_format=mixed
\##而简直日志过期清理时间,默认值为0,表示不自动清理
expire_logs_days=7
\##跳过主从复制中遇到的所有错我或指定类型的错误,避免slave端复制中断
\##如:1062错误指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
\## relay_log 配置中继日志
relay_log=mall-mysql-relay-bin
\## log_slave_updates 表示 slave 将复制时间写进自己的二进制日志
log_slave_updates=1
\## slave设置为只读 (具有super权限的用户除外)
read_only=1

3.重启从库

docker restart mysql-slave

1.3查看容器是否正常运行

docker ps -- 查看运行中的容器
docker ps -a -- 查看所有未被删除的容器
docker logs -f 容器ID -- 查看该容器的运行日志

如果容器未被成功启动,通过查看该容器的日志排查问题,报错某临时文件夹不存在的话,可尝试更换一个稳定的mysql版本。

二.搭建主从复制

2.1主库设置

  1. 进入Master容器内部并登录mysql

[root@VM-12-8-centos ~]# docker exec -it mysql-master bin/bash
root@5242e0x86fx6:/# mysql -uroot -p123456

2.在Master上建立帐户并授权 Slave

GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456';

3.查询master状态

mysql> show master status;
Docker搭建MySQL主从复制

其中File 与 Position 的值需要我们暂时记住

File:mysql-bin.000001 为当前binlog日志文件名

Position:472775 为当前binlog日志偏移量

注意:此步骤后不要再操作主库,防止主库binlog状态值变化

2.2从库设置

1.进入Slave容器内部并登录mysql

[root@VM-12-10-centos ~]# docker exec -it master-slave bin/bash
root@1e2a0354c906:/# mysql -uroot -p123456

2.与Master建立主从关系

CHANGE MASTER TO MASTER_HOST='主机的ip地址',
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_PORT=3310, 
MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=438;

其中:

CHANGE MASTER TO MASTER_HOST=’主机的IP地址’,

MASTER_USER=’slave'(刚刚配置的用户名),

MASTER_PASSWORD=’123456′(刚刚授权的密码),

Master_port=3310 (Master主机开放的端口,)

MASTER_LOG_FILE=’mysql-bin.具体数字’,MASTER_LOG_POS=具体值(之前的Position);

3.启动从库复制功能

start slave;

在这里出现错误,可通过以下命令重置。

stop slave;
reset master;

4.查看从服务器状态

show slave status\G;
mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 101.33.199.5
                  Master_User: slave
                  Master_Port: 3310
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 472775
               Relay_Log_File: mysql-relay.000002
                Relay_Log_Pos: 471386
        Relay_Master_Log_File: mysql-bin.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: 472775
              Relay_Log_Space: 471589
              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: d7dcc566-bfd8-11ed-800d-0242ac110007
             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)

ERROR: 
No query specified

其中:Slave_IO_Running 与 Slave_SQL_Running都是Yes则说明主从配置成功!

当Slave_IO_Running: No 时,在再看往下查看异常Error信息,也可重复以上的步骤:重置主从配置->获取Master日志名与偏移量-> 重新建立主从配置

此时,在主库上的DDL及插入、更新都会在从库进行复制。

至此,MySQL主从复制搭建完成。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/154443.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!