• centos7使用docker-compose一键搭建mysql高可用主从集群


    docker部署

    环境准备

    卸载旧版本

    1. yum remove -y docker \
    2. docker-client \
    3. docker-client-latest \
    4. docker-common \
    5. docker-latest \
    6. docker-latest-logrotate \
    7. docker-logrotate \
    8. docker-selinux \
    9. docker-engine-selinux \
    10. docker-engine

    安装依赖

    yum install -y yum-utils \ device-mapper-persistent-data \ lvm2

    下载阿里云仓库

    1. wget http://mirrors.aliyun.com/repo/Centos-7.repo
    2. wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    3. yum install -y epel-release
    4. mv *.repo /etc/yum.repo.d/

    安装docker

    yum install -y docker-ce

    开启docker

    1. systemctl start docker.service
    2. systemctl enable docker.service
    3. systemctl status docker.service
    4. docker version

    安装docker-compose

    linux安装docker和docker-compose_linux安装docker-compose_yuanzelin8的博客-CSDN博客

    服务器IP:192.168.100.8 

    文件夹和其他文件如图:

    编写docker-compose.yml文件

    1. version: '3'
    2. services:
    3. mysql-slave-lb:
    4. image: nginx:latest
    5. container_name: mysql-slave-lb
    6. ports:
    7. - 3307:3307
    8. volumes:
    9. - /home/docker/mariadb10.7/nginx/nginx.conf:/etc/nginx/nginx.conf
    10. networks:
    11. - mysql
    12. depends_on:
    13. - mysql-master
    14. - mysql-slave1
    15. - mysql-slave2
    16. - mysql-slave3
    17. mysql-master:
    18. image: mariadb:10.7.3
    19. container_name: mysql-master
    20. environment:
    21. MYSQL_ROOT_PASSWORD: "123456"
    22. MASTER_SYNC_USER: "sync_admin" #设置脚本中定义的用于同步的账号
    23. MASTER_SYNC_PASSWORD: "123456" #设置脚本中定义的用于同步的密码
    24. ADMIN_USER: "root" #当前容器用于拥有创建账号功能的数据库账号
    25. ADMIN_PASSWORD: "123456"
    26. ALLOW_HOST: "10.10.%.%" #允许同步账号的host地址
    27. TZ: "Asia/Shanghai" #解决时区问题
    28. ports:
    29. - 3306:3306
    30. networks:
    31. mysql:
    32. ipv4_address: "10.10.10.10" #固定ip,因为从库在连接master的时候,需要设置host
    33. volumes:
    34. - /home/docker/mariadb10.7/master:/docker-entrypoint-initdb.d #挂载master脚本
    35. - /home/docker/mariadb10.7/master/data:/var/lib/mysql
    36. command:
    37. - "--server-id=1"
    38. - "--character-set-server=utf8mb4"
    39. - "--collation-server=utf8mb4_unicode_ci"
    40. - "--log-bin=mysql-bin"
    41. - "--sync_binlog=1"
    42. mysql-slave1:
    43. image: mariadb:10.7.3
    44. container_name: mysql-slave1
    45. environment:
    46. MYSQL_ROOT_PASSWORD: "123456"
    47. SLAVE_SYNC_USER: "sync_admin" #用于同步的账号,由master创建
    48. SLAVE_SYNC_PASSWORD: "123456"
    49. ADMIN_USER: "root"
    50. ADMIN_PASSWORD: "123456"
    51. MASTER_HOST: "10.10.10.10" #master地址,开启主从同步需要连接master
    52. TZ: "Asia/Shanghai" #设置时区
    53. networks:
    54. mysql:
    55. ipv4_address: "10.10.10.20" #固定ip
    56. volumes:
    57. - /home/docker/mariadb10.7/slave1:/docker-entrypoint-initdb.d #挂载slave脚本
    58. - /home/docker/mariadb10.7/slave1/data:/var/lib/mysql
    59. command:
    60. - "--server-id=2"
    61. - "--character-set-server=utf8mb4"
    62. - "--collation-server=utf8mb4_unicode_ci"
    63. mysql-slave2:
    64. image: mariadb:10.7.3
    65. container_name: mysql-slave2
    66. environment:
    67. MYSQL_ROOT_PASSWORD: "123456"
    68. SLAVE_SYNC_USER: "sync_admin"
    69. SLAVE_SYNC_PASSWORD: "123456"
    70. ADMIN_USER: "root"
    71. ADMIN_PASSWORD: "123456"
    72. MASTER_HOST: "10.10.10.10"
    73. TZ: "Asia/Shanghai"
    74. networks:
    75. mysql:
    76. ipv4_address: "10.10.10.30" #固定ip
    77. volumes:
    78. - /home/docker/mariadb10.7/slave2:/docker-entrypoint-initdb.d #挂载slave脚本
    79. - /home/docker/mariadb10.7/slave2/data:/var/lib/mysql
    80. command: #这里需要修改server-id,保证每个mysql容器的server-id都不一样
    81. - "--server-id=3"
    82. - "--character-set-server=utf8mb4"
    83. - "--collation-server=utf8mb4_unicode_ci"
    84. mysql-slave3:
    85. image: mariadb:10.7.3
    86. container_name: mysql-slave3
    87. environment:
    88. MYSQL_ROOT_PASSWORD: "123456"
    89. SLAVE_SYNC_USER: "sync_admin" #用于同步的账号,由master创建
    90. SLAVE_SYNC_PASSWORD: "123456"
    91. ADMIN_USER: "root"
    92. ADMIN_PASSWORD: "123456"
    93. MASTER_HOST: "10.10.10.10" #master地址,开启主从同步需要连接master
    94. TZ: "Asia/Shanghai" #设置时区
    95. networks:
    96. mysql:
    97. ipv4_address: "10.10.10.40" #固定ip
    98. volumes:
    99. - /home/docker/mariadb10.7/slave3:/docker-entrypoint-initdb.d #挂载slave脚本
    100. - /home/docker/mariadb10.7/slave3/data:/var/lib/mysql
    101. command:
    102. - "--server-id=4"
    103. - "--character-set-server=utf8mb4"
    104. - "--collation-server=utf8mb4_unicode_ci"
    105. networks:
    106. mysql:
    107. driver: bridge
    108. ipam:
    109. driver: default
    110. config:
    111. - subnet: "10.10.0.0/16"

    编写master用于创建同步账号的脚本create_sync_user.sh

    1. #!/bin/bash
    2. #定义用于同步的用户名
    3. MASTER_SYNC_USER=${MASTER_SYNC_USER:-sync_admin}
    4. #定义用于同步的用户密码
    5. MASTER_SYNC_PASSWORD=${MASTER_SYNC_PASSWORD:-123456}
    6. #定义用于登录mysql的用户名
    7. ADMIN_USER=${ADMIN_USER:-root}
    8. #定义用于登录mysql的用户密码
    9. ADMIN_PASSWORD=${ADMIN_PASSWORD:-123456}
    10. #定义运行登录的host地址
    11. ALLOW_HOST=${ALLOW_HOST:-%}
    12. #定义创建账号的sql语句
    13. CREATE_USER_SQL="CREATE USER '$MASTER_SYNC_USER'@'$ALLOW_HOST' IDENTIFIED BY '$MASTER_SYNC_PASSWORD';"
    14. #定义赋予同步账号权限的sql,这里设置两个权限,REPLICATION SLAVE,属于从节点副本的权限,REPLICATION CLIENT是副本客户端的权限,可以执行show master status语句
    15. GRANT_PRIVILEGES_SQL="GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO '$MASTER_SYNC_USER'@'$ALLOW_HOST';"
    16. #定义刷新权限的sql
    17. FLUSH_PRIVILEGES_SQL="FLUSH PRIVILEGES;"
    18. #执行sql
    19. mysql -u"$ADMIN_USER" -p"$ADMIN_PASSWORD" -e "$CREATE_USER_SQL $GRANT_PRIVILEGES_SQL $FLUSH_PRIVILEGES_SQL"

    编写slave脚本slave.sh

    1. #定义连接master进行同步的账号
    2. SLAVE_SYNC_USER="${SLAVE_SYNC_USER:-sync_admin}"
    3. #定义连接master进行同步的账号密码
    4. SLAVE_SYNC_PASSWORD="${SLAVE_SYNC_PASSWORD:-123456}"
    5. #定义slave数据库账号
    6. ADMIN_USER="${ADMIN_USER:-root}"
    7. #定义slave数据库密码
    8. ADMIN_PASSWORD="${ADMIN_PASSWORD:-123456}"
    9. #定义连接master数据库host地址
    10. MASTER_HOST="${MASTER_HOST:-%}"
    11. #等待10s,保证master数据库启动成功,不然会连接失败
    12. sleep 10
    13. #连接master数据库,查询二进制数据,并解析出logfile和pos,这里同步用户要开启 REPLICATION CLIENT权限,才能使用SHOW MASTER STATUS;
    14. RESULT=`mysql -u"$SLAVE_SYNC_USER" -h$MASTER_HOST -p"$SLAVE_SYNC_PASSWORD" -e "SHOW MASTER STATUS;" | grep -v grep |tail -n +2| awk '{print $1,$2}'`
    15. #解析出logfile
    16. LOG_FILE_NAME=`echo $RESULT | grep -v grep | awk '{print $1}'`
    17. #解析出pos
    18. LOG_FILE_POS=`echo $RESULT | grep -v grep | awk '{print $2}'`
    19. #设置连接master的同步相关信息
    20. SYNC_SQL="change master to master_host='$MASTER_HOST',master_user='$SLAVE_SYNC_USER',master_password='$SLAVE_SYNC_PASSWORD',master_log_file='$LOG_FILE_NAME',master_log_pos=$LOG_FILE_POS;"
    21. #开启同步
    22. START_SYNC_SQL="start slave;"
    23. #关闭同步
    24. STOP_SYNC_SQL="stop slave;"
    25. #查看同步状态
    26. STATUS_SQL="show slave status\G;"
    27. mysql -u"$ADMIN_USER" -p"$ADMIN_PASSWORD" -e "$STOP_SYNC_SQL $SYNC_SQL $START_SYNC_SQL $STATUS_SQL"

    加入nginx,实现slave的负载均衡

    nginx下创建nginx.conf

    1. user nginx;
    2. worker_processes auto;
    3. error_log /var/log/nginx/error.log warn;
    4. pid /var/run/nginx.pid;
    5. events {
    6. worker_connections 1024;
    7. }
    8. # 添加stream模块,实现tcp反向代理
    9. stream {
    10. proxy_timeout 30m;
    11. upstream mysql-slave-cluster{
    12. #docker-compose.yml里面会配置固定mysql-slave的ip地址,这里就填写固定的ip地址
    13. server 10.10.10.20:3306 weight=1;
    14. server 10.10.10.30:3306 weight=1;
    15. server 10.10.10.40:3306 weight=1 backup; #备用数据库,当上面的数据库挂掉之后,才会使用此数据库,也就是如果上面的数据库没有挂,则所有的流量都很转发到上面的主库
    16. }
    17. server {
    18. listen 0.0.0.0:3307;
    19. proxy_pass mysql-slave-cluster;
    20. }
    21. }

    启动容器docker-compose up -d

    数据库连接测试

    宝塔后台查看docker服务

    发现从库的slave.sh没有执行

     docker ps

    docker exec -it d5be2c90cc93 bash  进从机docker内部运行 

    cd docker-entrypoint-initdb.d/

    ./slave.sh

    查看同步状态

    mysql -uroot -p123456 -e "show slave status\G";

    在宝塔后台配置远程服务器

    创建新数据库测试是否同步

    查看从库中是否存在新创建的库,存在就是主从同步成功 

    docker内部安装vi命令

    apt-get update

    apt-get install vim

  • 相关阅读:
    [LeetCode]剑指 Offer 40. 最小的k个数
    测试部门来了个00后卷王之王,老油条感叹真干不过,但是...
    Weblogic管理控制台未授权远程命令执行漏洞(CVE-2020-14882,CVE-2020-14883)
    操控xls文件的jxl包下载
    class id
    备战数学建模44-聚类模型(攻坚站8)
    springBoot中集成Swagger
    点乘和余弦相似度
    短视频矩阵系统源代码开发,独立saas系统搭建oem源码部署
    非零基础自学Java (老师:韩顺平) 第4章 运算符 4.5 赋值运算符 && 4.6 三元运算符 && 4.7 运算符优先级
  • 原文地址:https://blog.csdn.net/yuanzelin8/article/details/132755017