Linux使用docker部署MySQL集群
条件:1.部署过docker
一、选择集群方案
1.
二、创建网段
docker network create --subnet=172.18.0.0/16 pxc-network
宿主机防火墙的状态发生了改变,Docker就无法设置容器的IP了
可能会出现的报错
Error response from daemon: Failed to Setup IP tables: Unable to enable SKIP DNAT rule: (iptables failed: iptables --wait -t nat -I DOCKER -i br-21b48e7ddaeb -j RETURN: iptables: No chain/target/match by that name.
(exit status 1))
解决方法:重启docker
service docker restart
三、创建数据卷
防止容器删除后数据丢失
docker volume create --name db_v1
docker volume create --name db_conf1
docker volume create --name db_v2
docker volume create --name db_conf2
四、创建容器
1.拉取集群镜像
#拉取镜像
#低版本percona/percona-xtradb-cluster:5.7.30
#启动第二个容器时不会报错
#同下修改为5.7.30
docker pull percona/percona-xtradb-cluster
#标记镜像
docker tag percona/percona-xtradb-cluster:latest pxc
#删除镜像
docker rmi percona/percona-xtradb-cluster:latest
2.启动容器
# 运行容器
# -d 后台运行
# --restart=always 重启
# -p 指定端口映射
# -v 数据卷挂载
# -e 设置环境变量
# --net 设置容器的网络连接方式
docker run -d --restart=always -p 3301:3306 -v db_v1:/var/lib/mysql -v db_conf1:/etc/mysql/ -v /etc/localtime:/etc/localtime -e MYSQL_ROOT_PASSWORD=password.888 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=password.888 --name=pxc-master --net=pxc-network pxc
#子节点
docker run -d --restart=always -p 3302:3306 -v db_v2:/var/lib/mysql -v db_conf2:/etc/mysql/ -v /etc/localtime:/etc/localtime -e MYSQL_ROOT_PASSWORD=password.888 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=password.888 -e CLUSTER_JOIN=pxc-master --name=pxc-slave --net=pxc-network pxc
注意事项:
1.启动第二个容器报错,原因:pxc镜像版本过高
解决方法:
1.https://blog.csdn.net/fly7632785/article/details/114025288
2.使用旧版本
我用的是:percona/percona-xtradb-cluster:5.7.30
2.先启动主节点,后启动子节点
3.服务器开放对应端口
测试数据库连接是否成功
五、添加负载均衡(Haproxy)
1.拉取镜像,创建目录、文件
docker pull haproxy:2.3.13
mkdir /opt/haproxy
vim /opt/haproxy/haproxy.cfg
haproxy.cfg
#----------------
#Global settings
#----------------
global
log 127.0.0.1 local2
maxconn 4000
daemon
defaults
mode http
log global
option tcplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 500
frontend stats_monitor
bind *:33012
stats enable
stats uri /dbs
stats auth root:xzq.888
stats admin if TRUE
stats refresh 5s
stats realm baison-test-Haproxy
listen proxy-mysql
bind *:33011
mode tcp
balance roundrobin
server mysql-node1 172.18.0.1:3306 check weight 1 maxconn 2000
server mysql-node2 172.18.0.2:3306 check weight 1 maxconn 2000
option tcpka
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:123456
#数据库负载均衡
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
server mysql-node1 172.18.0.1:3306 check weight 1 maxconn 2000
server mysql-node2 172.18.0.2:3306 check weight 1 maxconn 2000
#使用keepalive检测死链
option tcpka
2.进入数据库容器创建haproxy用户,启动容器
docker exec -it pxc-master /bin/bash
mysql -uroot -p****888
create user 'haproxy'@'%' identified by '';
docker run -it -d --name haproxy -p 33012:33012 -p 33011:33011 --restart always --privileged=true -v /opt/haproxy:/usr/local/etc/haproxy --net=pxc-network --ip 172.18.0.4 haproxyd
3.进入haproxy容器,启动haproxy.cfg
docker exec -it haproxy /bin/bash
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
4.通过 IP地址:端口号/dbs 访问页面
参考:
https://blog.csdn.net/easylife206/article/details/122749473