• docker 部署mysql主从复制


    一:环境准备

    1:创建mysql主库镜像

    1. docker run -p 3307:3306 --name mysql_m \
    2. -v /opt/mysql_m/log:/var/log/mysql \
    3. -v /opt/mysql_m/data:/var/lib/mysql \
    4. -v /opt/mysql_m/conf:/etc/mysql \
    5. -e MYSQL_ROOT_PASSWORD=123456 \
    6. -d mysql:5.7

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

    1. cd /opt/mysql_m/conf
    2. vi my.cnf
    3. [mysqld]
    4. #设置 server_id
    5. server_id=1
    6. # 指定不需要同步的数据库名称
    7. binlog-ignore-db=mysql
    8. # 开启二进制日志功能
    9. log-bin=mall-mysql-bin
    10. #设置日志使用内存大小
    11. binlog_cache_size=1M
    12. # 设置使用的日志格式( mixed,statement,row)
    13. # statement:以SQL语句的形式记录更改操作。
    14. # row:以行级别的方式记录更改操作,即记录每个被修改的行的具体内容。
    15. # mixed:将statement和row两种方式结合使用,在某些情况下使用statement,在其他情况下使用row。
    16. binlog_format=mixed
    17. # 二进制日志过期清理时间。默认值为0,表示不自动清理
    18. expire_logs_days=3
    19. # 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断## 如 :1062>错误是指一些主键重复,1032错误是因为主从数据库数据不一致
    20. slave_skip_errors=1062

    3:重启主库

    docker restart mysql_m

    4:创建启动slave容器

    1. docker run -p 3308:3306 --name mysql_s \
    2. -v /opt/mysql_s/log:/var/log/mysql \
    3. -v /opt/mysql_s/data:/var/lib/mysql \
    4. -v /opt/mysql_s/conf:/etc/mysql \
    5. -e MYSQL_ROOT_PASSWORD=123456 \
    6. -d mysql:5.7

    5:在/opt/mysql_s/conf 创建文件 my.cnf,并做如下配置

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

    6:重启从库

    docker restart mysql_s

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

    二:搭建主从复制

    1:主库设置
    进入Master容器内部并登录mysql

    1. [root@localhost conf]# docker exec -it mysql_m /bin/bash
    2. root@bda078cb18de:/# mysql -uroot -p123456

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

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

    3:查询master状态

    1. mysql> show master status;
    2. +-----------------------+----------+--------------+------------------+-------------------+
    3. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    4. +-----------------------+----------+--------------+------------------+-------------------+
    5. | mall-mysql-bin.000003 | 438 | | mysql | |
    6. +-----------------------+----------+--------------+------------------+-------------------+
    7. 1 row in set (0.00 sec)

    其中File 与 Position 的值需要我们暂时记住:
    File:mall-mysql-bin.000003 为当前binlog日志文件名
    Position:438 为当前binlog日志偏移量

    4:进入Slave容器内部并登录mysql

    1. [root@localhost conf]# docker exec -it mysql_s bin/bash
    2. root@e6eaee0b8e9a:/# mysql -uroot -p123456

    5:与Master建立主从关系

    1. CHANGE MASTER TO MASTER_HOST='192.168.1.31',
    2. MASTER_USER='slave',
    3. MASTER_PASSWORD='123456',
    4. MASTER_PORT=3307,
    5. MASTER_LOG_FILE='mall-mysql-bin.000003',
    6. MASTER_LOG_POS=438;

    其中:

    CHANGE MASTER TO MASTER_HOST=’主机的IP地址’,
    MASTER_USER=’slave'(刚刚配置的用户名),
    MASTER_PASSWORD=’123456′(刚刚授权的密码),
    Master_port=3307 (Master主机开放的端口,)
    MASTER_LOG_FILE=’mysql-bin.具体数字’,MASTER_LOG_POS=具体值(之前的Position);

    6:启动从库复制功能

    1. start slave;
    2. 在这里出现错误,可通过以下命令重置。
    3. stop slave;
    4. reset master;

    7:查看从服务器状态

    1. mysql> show slave status\G;
    2. *************************** 1. row ***************************
    3. Slave_IO_State: Waiting for master to send event
    4. Master_Host: 192.168.1.31
    5. Master_User: slave
    6. Master_Port: 3307
    7. Connect_Retry: 60
    8. Master_Log_File: mall-mysql-bin.000003
    9. Read_Master_Log_Pos: 438
    10. Relay_Log_File: mall-mysql-relay-bin.000002
    11. Relay_Log_Pos: 325
    12. Relay_Master_Log_File: mall-mysql-bin.000003
    13. Slave_IO_Running: Yes
    14. Slave_SQL_Running: Yes
    15. Replicate_Do_DB:
    16. Replicate_Ignore_DB:
    17. Replicate_Do_Table:
    18. Replicate_Ignore_Table:
    19. Replicate_Wild_Do_Table:
    20. Replicate_Wild_Ignore_Table:
    21. Last_Errno: 0
    22. Last_Error:
    23. Skip_Counter: 0
    24. Exec_Master_Log_Pos: 438
    25. Relay_Log_Space: 537

    其中:Slave_IO_Running 与 Slave_SQL_Running都是Yes则说明主从配置成功!
    当Slave_IO_Running: No 时,在再看往下查看异常Error信息,也可重复以上的步骤:重置主从配置->获取Master日志名与偏移量-> 重新建立主从配置
    此时,在主库上的DDL及插入、更新都会在从库进行复制。
    至此,MySQL主从复制搭建完成。

    三:检测mysql复制是否生效

    1:在主数据库中创建表测试同步是否生效

    1. create database master;
    2. --创建表
    3. create table test1 (id int, name varchar(100));
    4. --插入数据
    5. insert into test1 values(1,'zhangsan');

    2:查看主库状态

    1. mysql> show master status;
    2. +-----------------------+----------+--------------+------------------+-------------------+
    3. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    4. +-----------------------+----------+--------------+------------------+-------------------+
    5. | mall-mysql-bin.000003 | 1069 | | mysql | |
    6. +-----------------------+----------+--------------+------------------+-------------------+
    7. 1 row in set (0.00 sec)

    3:在从数据库中查看数据是否已同步

    1. mysql> show slave status\G;
    2. *************************** 1. row ***************************
    3. Slave_IO_State: Waiting for master to send event
    4. Master_Host: 192.168.1.31
    5. Master_User: slave
    6. Master_Port: 3307
    7. Connect_Retry: 60
    8. Master_Log_File: mall-mysql-bin.000003
    9. Read_Master_Log_Pos: 1069
    10. Relay_Log_File: mall-mysql-relay-bin.000002
    11. Relay_Log_Pos: 956
    12. Relay_Master_Log_File: mall-mysql-bin.000003
    13. Slave_IO_Running: Yes
    14. Slave_SQL_Running: Yes
    15. Replicate_Do_DB:
    16. Replicate_Ignore_DB:
    17. Replicate_Do_Table:
    18. Replicate_Ignore_Table:
    19. Replicate_Wild_Do_Table:
    20. Replicate_Wild_Ignore_Table:
    21. Last_Errno: 0
    22. Last_Error:
    23. Skip_Counter: 0
    24. Exec_Master_Log_Pos: 1069
    25. mysql> show databases;
    26. +--------------------+
    27. | Database |
    28. +--------------------+
    29. | information_schema |
    30. | mdb1 |
    31. | mysql |
    32. | performance_schema |
    33. | sys |
    34. +--------------------+
    35. 5 rows in set (0.00 sec)
    36. mysql> select * from mdb1.test1;
    37. +------+----------+
    38. | id | name |
    39. +------+----------+
    40. | 1 | zhangsan |
    41. +------+----------+
    42. 1 row in set (0.00 sec)

  • 相关阅读:
    vue学习
    1044 火星数字 (测试点2.4说明)
    【Audio】正弦波生成原理及C++代码
    Pytorch模型转ONNX模型
    i.MX8M Plus核心板、开发板编解码性能测试
    【ES6】Promise
    18.透彻理解死锁
    怎么压缩jpg大小?快来收藏这款jpg压缩工具
    【代码模板】simHash算法文本查重(golang代码实现)
    Golang 动态脚本调研
  • 原文地址:https://blog.csdn.net/zhanglei_16/article/details/134442963