docker 下载pxc
拉取:
docker pull percona/percona-xtradb-cluster
重命名:
docker tag percona/percona-xtradb-cluster:latest pxc
删除原来的镜像:
docker rmi docker.io/percona/percona-xtradb-cluster
创建docker子网
创建子网:
docker network create --subnet=192.168.0.0/16 net1
查看网段:
docker network inspect net1
删除子网:
docker network rm net1
创建数据卷
docker只跑程序,数据存在容器外
pxc不支持直接映射外部文件,所以使用数据卷
创建数据卷:
docker volume create --name v1
查看数据卷:
docker inspect v1
删除数据卷:
docker volume rm v1
需要创建五个数据卷:
创建容器
创建第一个容器:
docker run -d -p 3316:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -v v1:/var/lib/mysql -v backup:/data -v conf01:/etc/mysql --privileged=true --name=node1 --net=net1 --ip 192.168.0.2 pxc
修改/var/lib/docker/volumes/conf01/_data/node.cnf
关闭SSL通信:加一行配置
pxc-encrypt-cluster-traffic=OFF
重启node1:
docker restart node1
第一个容器跑起来之后
创建第二个容器:
docker run -d -p 3317:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=node1 -v v2:/var/lib/mysql -v backup:/data -v conf02:/etc/mysql --privileged --name=node2 --net=net1 --ip 192.168.0.3 pxc
第三个:
docker run -d -p 3318:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=node1 -v v3:/var/lib/mysql -v backup:/data -v conf03:/etc/mysql --privileged --name=node3 --net=net1 --ip 192.168.0.4 pxc
第四个:
docker run -d -p 3319:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=node1 -v v4:/var/lib/mysql -v backup:/data -v conf04:/etc/mysql --privileged --name=node4 --net=net1 --ip 192.168.0.5 pxc
第五个:
docker run -d -p 3320:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=node1 -v v5:/var/lib/mysql -v backup:/data -v conf05:/etc/mysql --privileged --name=node5 --net=net1 --ip 192.168.0.6 pxc
然后每个容器会自动停止
到每个配置文件中关闭SSL
然后重启每个容器
测试集群
如果出现错误:ERROR 1047 (08S01): WSREP has not yet prepared node for application use
登录数据库执行:
SET GLOBAL wsrep_provider_options='pc.bootstrap=YES';
选一个新的主节点
安装haproxy 实现高可用
拉取镜像:
sudo docker pull haproxy
创建文件夹:
mkdir ~/docker/haproxy
编辑配置文件:
vim ~/docker/haproxy/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:admin
#数据库负载均衡
listen proxy-mysql
#访问的IP和端口
bind 0.0.0.0:3306
#网络协议
mode tcp
#负载均衡算法(轮询算法)
#轮询算法:roundrobin
#权重算法:static-rr
#最少连接算法:leastconn
#请求源IP算法:source
balance roundrobin
#日志格式
option tcplog
option mysql-check user haproxy
server MySQL_1 192.168.0.2:3306 check weight 1 maxconn 2000
server MySQL_2 192.168.0.3:3306 check weight 1 maxconn 2000
server MySQL_3 192.168.0.4:3306 check weight 1 maxconn 2000
server MySQL_4 192.168.0.5:3306 check weight 1 maxconn 2000
server MySQL_5 192.168.0.6:3306 check weight 1 maxconn 2000
#使用keepalive检测死链
option tcpka
mysql中创建用户:
create user 'haproxy'@'%' identified by '';
启动:
docker run -it -d -p 8888:8888 -p 8889:3306 -v /root/docker/haproxy:/usr/local/etc/haproxy --name h1 --net=net1 --ip 192.168.0.10 --privileged haproxy
进入容器:
docker exec -it h1 bash
配置:
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
访问8888端口的dbs
用户名admin,密码admin
可以看到五个数据库全部为up状态
haproxy做集群的负载,
使用集群就通过 haproxy的 8889端口连接使用,账号密码为数据库集群的密码。
重启集群
如果一半或者以上的节点掉了,集群就无法工作了。
无法重启集群解决办法:
重启一个节点你会发现它又掉了,通过docker logs 查看日志:
- 日志说这个节点不是最后一个关闭的节点,所以这个节点的数据可能不是集群最后的数据状态,也就是说他的数据可能不是最新的。
办法
查看数据卷地址:
docker volume inspect v1
到数据卷目录下:
cd /var/lib/docker/volumes/v1/_data/
编辑grastate.dat文件:
vim grastate.dat
修改safe_to_bootstrap 为1
保存,启动节点就行了。