tnblog
首页
视频
资源
登录

docker compose mysql 主从搭建

5688人阅读 2023/6/25 9:27 总访问:129018 评论:0 收藏:0 手机
分类: 小技巧

mysql 主从搭建

目录

简介

在当前查多读少的业务下, 我们迫切的需要读写分离, 并且需要数据库支持伸缩。这样我们可以多台数据库分摊请求, 减少单库的访问压力。

优点:

  1. 负载均衡
  2. 异地容灾备份
  3. 高可用
  4. 高扩展性

缺点:

  1. 写入变慢, 因为只有主库可以写入,并且主库同时也要写入日志。
  2. 从库有数据延迟
  3. 成本增加,性能消耗。

主从复制的方式

  1. binlog(基于日志)
  2. gtid (全局事务标识符)

主从复制流程

  1. 主库写入日志到binlog
  2. 从库到主库复制日志到中继日志,这一步由io线程完成
  3. 从库从中继日志读取日志, 并放到sql中, 这一步有sql线程完成

docker 搭建

文件结构

主master

  1. # docker file
  2. FROM mysql:latest
  3. LABEL author="yyt-2860889218@qq.com"
  4. ADD ./master/my.cnf /etc/mysql/my.cnf
  1. [mysqld]
  2. ## 设置server_id,一般设置为IP,注意要唯一
  3. server_id=100
  4. ## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
  5. binlog-ignore-db=mysql
  6. ## 开启二进制日志功能,可以随便取,最好有含义(关键就是这里了)
  7. log-bin=mysql-bin
  8. ## 为每个session分配的内存,在事务过程中用来存储二进制日志的缓存
  9. binlog_cache_size=1M
  10. ## 主从复制的格式(mixed,statement,row,默认格式是statement)
  11. binlog_format=mixed
  12. ## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
  13. expire_logs_days=7
  14. ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
  15. ## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
  16. slave_skip_errors=1062

  1. #docker file
  2. FROM mysql:latest
  3. LABEL author="yyt-2860889218@qq.com"
  4. ADD ./slave/my.cnf /etc/mysql/my.cnf
  1. [mysqld]
  2. ## 设置server_id,一般设置为IP,注意要唯一
  3. server_id=101
  4. ## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
  5. binlog-ignore-db=mysql
  6. ## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
  7. log-bin=mysql-slave1-bin
  8. ## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
  9. binlog_cache_size=1M
  10. ## 主从复制的格式(mixed,statement,row,默认格式是statement)
  11. binlog_format=mixed
  12. ## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
  13. expire_logs_days=7
  14. ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
  15. ## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
  16. slave_skip_errors=1062
  17. ## relay_log配置中继日志
  18. relay_log=mysql-relay-bin
  19. ## log_slave_updates表示slave将复制事件写进自己的二进制日志
  20. log_slave_updates=1
  21. ## 防止改变数据(除了特殊的线程),只读模式, root用户不限制
  22. read_only=1

docker compose

  1. version: '3'
  2. services:
  3. mysql-master:
  4. container_name: mysql_master
  5. build:
  6. context: ./
  7. dockerfile: master/Dockerfile
  8. restart: always
  9. hostname: mysql-master
  10. volumes:
  11. - ./data/master:/var/lib/mysql
  12. environment:
  13. - "MYSQL_ROOT_PASSWORD=123456"
  14. - "MYSQL_DATABASE=test"
  15. networks:
  16. - mysql_master_slave
  17. ports:
  18. - "33065:3306"
  19. mysql-slave:
  20. container_name: mysql_slave
  21. build:
  22. context: ./
  23. dockerfile: slave/Dockerfile
  24. restart: always
  25. hostname: mysql-slave
  26. volumes:
  27. - ./data/slave:/var/lib/mysql
  28. environment:
  29. - "MYSQL_ROOT_PASSWORD=123456"
  30. - "MYSQL_DATABASE=test"
  31. ports:
  32. - "33066:3306"
  33. networks:
  34. - mysql_master_slave
  35. networks:
  36. mysql_master_slave:

sql

  1. # 主库
  2. -- 创建用户
  3. CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
  4. GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
  5. -- 刷新权限
  6. FLUSH PRIVILEGES;
  7. -- 获取相关信息
  8. show master status;
  9. ## 从库
  10. -- 在从上设置主库配置信息
  11. CHANGE MASTER TO
  12. master_host='mysql-master',
  13. master_port=3306,
  14. MASTER_USER='slave',
  15. MASTER_PASSWORD='123456',
  16. MASTER_LOG_FILE='mysql-bin.000003',
  17. MASTER_LOG_POS=1150;
  18. -- 启动从服务器
  19. start slave;
  20. -- 查看配置状态slave_IO_runring,slave_slq_runring
  21. show slave status\G

异常解决

  1. 从数据库异常
    1. 确认是io线程问题
    2. sql线程问题: 根据日志来恢复数据
  2. 主数据库异常
    1. 查看相关从数据库日志时间, 谁近就把谁升级为主库
  1. -- 查看配置状态
  2. show slave status\G
  3. # 查看 Last_SQL_Errno,Last_SQL_Error。
  4. # 查看日志文件
  5. show binlog events;
  6. show binlog events in 'mysql-bin.000003' ;

恢复同步

  1. #从库执行
  2. stop slave;
  3. SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; -- 跳过一个事务,可选
  4. start slave;
评价
无论这个世界对你怎样,都请你一如既往的努力、勇敢、充满希望。
排名
25
文章
22
粉丝
5
评论
7
C# string 和String 的区别
剑轩 : 所以区别主要在哪里呢....
markdown 初步学习
剑轩 : 哇哦,真的喜欢你这个个性签名,很不错
pythoic 写法
剑轩 : 新年快乐啊
python拼接字符串八种
剑轩 : 手动点赞+1
python拼接字符串八种
雨雨雨雨雨辰 : 手动点赞
pythoic 写法
瑾语 : 你好
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术
春赏百花秋望月,夏沐凉风冬听雪。