docker-compose实现自动化部署haproxy+pxc集群

本文使用docker-compose + shell 实现 MySQL集群负载均衡 自动化部署

实现效果: 执行 sh install.sh  可以部署一个haproxy节点分发器+5个PXC mysql数据库节点,实现数据库负载均衡

 

总流程

(1)启动 pxc 容器集群
(2)启动 haproxy 容器
(3)向 pxc容器中添加 haproxy用户

总入口:/home/2.DockerProjs/2.haproxy+pxc/install.sh
目录说明:
config                  # 放置配置文件
docker-compose.yml      # docker-compose 的yml文件
install_scripts         # 放置启动相关脚本
install.sh              # 总的启动脚本


1.编写启动脚本


1.1入口脚本install.sh

#!/bin/bash

# 1.清理现有容器
echo "\n******* 1.clear all containers start***************\n"
sh ./install_scripts/clear_all.sh
echo "\n******* 1.clear all containers finished***************\n"

# 2.docker-compose 全量部署
echo "\n******* 2.docker-compose start***************\n"
docker-compose up -d
echo "\n******* 2.docker-compose finished***************\n"

# 3.进入pxc节点创建haproxy用户(docker exec container_name 命令 可以在容器外执行命令)
echo "\n******* 3.add user haproxy to pxc start***************\n"
docker cp ./install_scripts/add_user_haproxy_to_pxc.sh  node2:/home
docker exec node2 sh /home/add_user_haproxy_to_pxc.sh
echo "\n******* 3.add user haproxy to pxc finished***************\n"


1.2 清理现有容器脚本:clear_all.sh


cd /home/2.DockerProjs/2.haproxy+pxc/install_scripts
vi clear_all.sh

#!/bin/bash
echo 'clear all containers start'
docker rm -f node1 node2 node3 node4 node5 h1
docker volume rm v1 v2 v3 v4 v5
docker network rm net1
echo 'clear all containers over'


1.3 向 pxc容器中添加 haproxy用户脚本:add_user_haproxy_to_pxc.sh

cd /home/2.DockerProjs/2.haproxy+pxc/install_scripts
vi add_user_haproxy_to_pxc.sh

#!/bin/bash

echo "start create user haproxy  ...please wait 60s"
sleep 60

mysql -u root -pabc123456 <<EOF
    CREATE USER "haproxy"@"%" IDENTIFIED BY "";
EOF

while [ $? -ne 0 ]; do
    echo "create user haproxy failed ...please wait"
    sleep 5
    mysql -u root -pabc123456 <<EOF
     CREATE USER "haproxy"@"%" IDENTIFIED BY "";
EOF
done

echo "create user haproxy success!"
exit


2.编写配置文件

进入路径: cd /home/2.DockerProjs/2.haproxy+pxc


(1)haproxy.cfg
cd  /home/2.DockerProjs/2.haproxy+pxc/config/haproxy1
vi haproxy.cfg

global
    #工作目录
    chroot /usr/local/etc/haproxy
    #日志文件,使用rsyslog服务中local5日志设备(/var/log/local5),等级info
    log 127.0.0.1 local5 info
    #守护进程运行
    daemon

defaults
    log    global
    mode    http
    #日志格式
    option    httplog
    #日志中不记录负载均衡的心跳检测记录
    option    dontlognull
    #连接超时(毫秒)
    timeout connect 5000
    #客户端超时(毫秒)
    timeout client  50000
    #服务器超时(毫秒)
    timeout server  50000

#监控界面    
listen  admin_stats
    #监控界面的访问的IP和端口
    bind  0.0.0.0:8888
    #访问协议
    mode        http
    #URI相对地址
    stats uri   /dbs
    #统计报告格式
    stats realm     Global\ statistics
    #登陆帐户信息
    stats auth  admin:abc123456
    
#数据库负载均衡
listen  proxy-mysql
    #访问的IP和端口
    bind  0.0.0.0:3306  
    #网络协议
    mode  tcp
    #负载均衡算法(使用轮询算法)
    #轮询算法:roundrobin
    #权重算法:static-rr
    #最少连接算法:leastconn
    #请求源IP算法:source
    balance  roundrobin
    #日志格式
    option  tcplog
    #在MySQL中创建一个没有权限的haproxy用户,密码为空。Haproxy使用这个账户对MySQL数据库心跳检测
    option  mysql-check user haproxy
    # 配置负载均衡的数据库节点: 自定义节点名字,容器ip,容器端口,心跳检测,权重为1,最大连接数2000
    server  MySQL_1 172.20.0.2:3306 check weight 1 maxconn 2000  
    server  MySQL_2 172.20.0.3:3306 check weight 1 maxconn 2000  
    server  MySQL_3 172.20.0.4:3306 check weight 1 maxconn 2000
    server  MySQL_4 172.20.0.5:3306 check weight 1 maxconn 2000
    server  MySQL_5 172.20.0.6:3306 check weight 1 maxconn 2000
    #使用keepalive检测死链
    option  tcpka  

 


3.编写docker-compose.yml

cd /home/2.DockerProjs/2.haproxy+pxc


version: '3.5'

services:
  pxc1:
    image: percona/percona-xtradb-cluster:5.7.21      # 使用的镜像
    container_name: node1
    ports:                               # 表示宿主机33061映射到容器3306端口
      - 33061:3306/tcp
    volumes:                             # 表示宿主机v1 映射到容器目录
      - v1:/var/lib/mysql
    networks:
      net1:                              # 使用内部网段net1
        ipv4_address: 172.20.0.2         # 内部网段的ip地址
    environment:
      - MYSQL_ROOT_PASSWORD=abc123456    # MySQL root用户的密码
      - CLUSTER_NAME=PXC                 # 集群名
      - XTRABACKUP_PASSWORD=abc123456    # 数据库同步密码

  pxc2:
    image: percona/percona-xtradb-cluster:5.7.21      # 使用的镜像
    container_name: node2
    ports:
      - 33062:3306/tcp
    volumes:
      - v2:/var/lib/mysql
    networks:
      net1:
        ipv4_address: 172.20.0.3
    environment:
      - MYSQL_ROOT_PASSWORD=abc123456    # MySQL root用户的密码
      - CLUSTER_NAME=PXC                 # 集群名
      - XTRABACKUP_PASSWORD=abc123456    # 数据库同步密码
      - CLUSTER_JOIN=node1               # 加入node1集群
    depends_on:
      - pxc1
    

  pxc3:
    image: percona/percona-xtradb-cluster:5.7.21
    container_name: node3
    ports:
      - 33063:3306/tcp
    volumes:
      - v3:/var/lib/mysql
    networks:
      net1:
        ipv4_address: 172.20.0.4
    environment:
      - MYSQL_ROOT_PASSWORD=abc123456    # MySQL root用户的密码
      - CLUSTER_NAME=PXC                 # 集群名
      - XTRABACKUP_PASSWORD=abc123456    # 数据库同步密码
      - CLUSTER_JOIN=node1               # 加入node1集群
    depends_on:
      - pxc1

  pxc4:
    image: percona/percona-xtradb-cluster:5.7.21
    container_name: node4
    ports:
      - 33064:3306/tcp
    volumes:
      - v4:/var/lib/mysql
    networks:
      net1:
        ipv4_address: 172.20.0.5
    environment:
      - MYSQL_ROOT_PASSWORD=abc123456    # MySQL root用户的密码
      - CLUSTER_NAME=PXC                 # 集群名
      - XTRABACKUP_PASSWORD=abc123456    # 数据库同步密码
      - CLUSTER_JOIN=node1               # 加入node1集群
    depends_on:
      - pxc1

  pxc5:
    image: percona/percona-xtradb-cluster:5.7.21
    container_name: node5
    ports:
      - 33065:3306/tcp
    volumes:
      - v5:/var/lib/mysql
    networks:
      net1:
        ipv4_address: 172.20.0.6
    environment:
      - MYSQL_ROOT_PASSWORD=abc123456    # MySQL root用户的密码
      - CLUSTER_NAME=PXC                 # 集群名
      - XTRABACKUP_PASSWORD=abc123456    # 数据库同步密码
      - CLUSTER_JOIN=node1               # 加入node1集群
    depends_on:
      - pxc1

  haproxy1:                                        # haproxy1节点分发器
    image: haproxy:latest                           # 镜像名
    container_name: h1                              # 容器名
    ports:
      - 4001:8888                                   # 宿主机4001端口映射 Haproxy的监控画面端口
      - 4002:3306                                   # 宿主机4002端口映射 Haproxy的数据库访问端口
    volumes:
      - ./config/haproxy1:/usr/local/etc/haproxy    # haproxy的配置文件路径,存放haproxy.cfg
    networks:
      net1:
        ipv4_address: 172.20.0.11                   # 为Haproxy自定义网段
    privileged: true        
    command: haproxy -f /usr/local/etc/haproxy/haproxy.cfg   # h1容器运行时启动脚本,启动Haproxy服务
    depends_on:                                              # Haproxy容器依赖于pxc容器启动
      - pxc1
      - pxc2
      - pxc3
      - pxc4
      - pxc5

    
networks:
  net1:
    external: false
    name: net1
    ipam:
      config:
      - subnet: 172.20.0.0/24

volumes:
  v1:
    name: v1
  v2:
    name: v2
  v3:
    name: v3
  v4:
    name: v4
  v5:
    name: v5


4.执行 sh install.sh,检查启动项

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三尾鱼网络科技

如果对您有帮助,赠人玫瑰手留余

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值