Architecture.pngserver_list.png

1、搭建简单的 1主2从 mysql集群(单点写、多点读)

  1. ### 创建mysql-master实例并启动
  2. mkdir -p /data/mysql/master/log && mkdir -p /data/mysql/master/data && mkdir -p /data/mysql/master/conf
  3. docker run -p 3306:3306 --name mysql-master -v /data/mysql/master/log:/var/log/mysql -v /data/mysql/master/conf:/etc/mysql/mysql.conf.d -v /data/mysql/master/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=Pwd@123 -d mysql:5.7
  4. #添加配置文件到/data/mysql/master/conf下,重启容器
  5. #配置文件:https://github.com/xlvchao/spartacus/tree/main/docs/mysql/%E6%90%AD%E5%BB%BAmysql%E4%B8%BB%E4%BB%8E%E9%9B%86%E7%BE%A4/mysqld.cnf.m
  6. mysqld.cnf
  7. #进入容器,授权root用户远程访问
  8. docker exec -it --user root mysql-master /bin/bash
  9. #登录
  10. mysql -uroot -pPwd@123
  11. #设置root可以远程访问权限
  12. grant all privileges on *.* to 'root'@'%' identified by 'Pwd@123' with grant option;
  13. #刷新权限生效
  14. flush privileges;
  15. # 查看是否开启binlog
  16. show variables like '%log_bin%';
  17. #添加用于同步的账号backup(此时可通过远程登录主库执行以下脚本)
  18. GRANT REPLICATION SLAVE ON *.* to 'backup'@'%' identified by 'YYY';
  19. #刷新权限生效
  20. flush privileges;
  21. #查看用户是否创建成功
  22. select user,host from mysql.user;
  23. #设置最大连接数(此时可通过远程登录主库执行以下脚本)
  24. show variables like '%connect%';
  25. set global max_connections=1000;
  26. set global max_user_connections=500;
  27. FLUSH PRIVILEGES;
  28. ### 创建mysql-slave1实例并启动
  29. mkdir -p /data/mysql/slave1/log && mkdir -p /data/mysql/slave1/data && mkdir -p /data/mysql/slave1/conf
  30. docker run -p 3307:3306 --name mysql-slave1 -v /data/mysql/slave1/log:/var/log/mysql -v /data/mysql/slave1/conf:/etc/mysql/mysql.conf.d -v /data/mysql/slave1/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=Pwd@123 -d mysql:5.7
  31. #添加配置文件到/data/mysql/slave1/conf下,重启容器
  32. #配置文件:https://github.com/xlvchao/spartacus/tree/main/docs/mysql/%E6%90%AD%E5%BB%BAmysql%E4%B8%BB%E4%BB%8E%E9%9B%86%E7%BE%A4/mysqld.cnf.s1
  33. mysqld.cnf
  34. #进入容器,授权root用户远程访问
  35. docker exec -it --user root mysql-slave1 /bin/bash
  36. #登录
  37. mysql -uroot -pPwd@123
  38. #设置root可以远程访问权限
  39. grant all privileges on *.* to 'root'@'%' identified by 'Pwd@123' with grant option;
  40. #刷新权限生效
  41. flush privileges;
  42. # 查看是否开启binlog
  43. show variables like '%log_bin%';
  44. #开启slave1同步master的数据
  45. #docker inspect container_id 查看容器IP,如果master与当前slave不在同一局域网内,则master_host最好换成公网地址
  46. change master to
  47. master_host='10.0.0.5',
  48. master_port=3306,
  49. master_user='backup',
  50. master_password='YYY',
  51. master_log_file='mysql-bin.000001',
  52. master_log_pos=0;
  53. #开启同步
  54. start slave; #停止同步 stop slave;
  55. #查看从服务状态
  56. show slave status;
  57. #设置最大连接数(此时可通过远程登录主库执行以下脚本)
  58. show variables like '%connect%';
  59. set global max_connections=1000;
  60. set global max_user_connections=500;
  61. FLUSH PRIVILEGES;
  62. ### 创建mysql-slave2实例并启动
  63. mkdir -p /data/mysql/slave2/log && mkdir -p /data/mysql/slave2/data && mkdir -p /data/mysql/slave2/conf
  64. docker run -p 3308:3306 --name mysql-slave2 -v /data/mysql/slave2/log:/var/log/mysql -v /data/mysql/slave2/conf:/etc/mysql/mysql.conf.d -v /data/mysql/slave2/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=Pwd@123 -d mysql:5.7
  65. #添加配置文件到/data/mysql/slave2/conf下,重启容器
  66. #配置文件:https://github.com/xlvchao/spartacus/tree/main/docs/mysql/%E6%90%AD%E5%BB%BAmysql%E4%B8%BB%E4%BB%8E%E9%9B%86%E7%BE%A4/mysqld.cnf.s2
  67. mysqld.cnf
  68. #进入容器,授权root用户远程访问
  69. docker exec -it --user root mysql-slave2 /bin/bash
  70. #登录
  71. mysql -uroot -pPwd@123
  72. #设置root可以远程访问权限
  73. grant all privileges on *.* to 'root'@'%' identified by 'Pwd@123' with grant option;
  74. #刷新权限生效
  75. flush privileges;
  76. # 查看是否开启binlog
  77. show variables like '%log_bin%';
  78. #开启slave2同步master的数据
  79. #docker inspect container_id 查看容器IP,如果master与当前slave不在同一局域网内,则master_host最好换成公网地址
  80. change master to
  81. master_host='10.0.0.5',
  82. master_port=3306,
  83. master_user='backup',
  84. master_password='YYY',
  85. master_log_file='mysql-bin.000001',
  86. master_log_pos=0;
  87. #开启同步
  88. start slave; #停止同步 stop slave;
  89. #查看从服务状态
  90. show slave status;
  91. #设置最大连接数(此时可通过远程登录主库执行以下脚本)
  92. show variables like '%connect%';
  93. set global max_connections=1000;
  94. set global max_user_connections=500;
  95. FLUSH PRIVILEGES;
  96. 以上解决了数据库主从备份问题,但是没有解决单库单表数据量较大带来的性能问题,要解决这个问题我们需要引入数据分片概念,即见同一库和同一表的数据分拆到若干子库子表中存储。目前市面上有很多数据分片中间件工具,如mycatshardingsphere等,后续有空再折腾吧!

2、搭建基于PXC的高可用集群(可选)

如果觉得单点写多点读的集群架构无法满足你们的需求,也可以参考本吊研究的基于PXC多点读写的集群架构部署方案,请参考这个里面的搭建mysql高可用集群(vip+keepalived+haproxy+pxc).md文件:
https://github.com/xlvchao/spartacus/tree/main/docs/mysql

不过有言在先,PXC容易出问题,且学习成本、维护成本都比较大!

3、云服务安全组

以上部署完成之后,可临时开放云主机的3306、3307、3308端口,然后测试一下,看看能否链接成功!
image.png

如果搞不定,请加群讨论,扫码关注,发送“加群”
mp_qrcode.jpg