MySQL系列-Docker搭建Percona XtraDB Cluster(图文)

 2022-10-27    418  

一、部署环境说明

本文中使用本地VM虚机部署测试。

OS:CentOS Linux release 7.6.1810 (Core) 3.10.0-957.el7.x86_64

IP:192.168.168.100

Docker Version:v20.10.6

虚机配置:2核CPU、4G内存

注:①系统为最小化安装,部署前已完成系统初始化、内核及安全优化;

②Docker已安装。

二、Docker部署PXC

Docker镜像仓库地址:

https://hub.docker.com/r/percona/percona-xtradb-cluster

Docker部署官方说明文档:

https://www.percona.com/doc/percona-xtradb-cluster/LATEST/install/docker.html

1.拉取镜像

dockerpullpercona/percona-xtradb-cluster:5.7.33

## 使用 tag 给他打个标签,方便使用

dockertagpercona/percona-xtradb-cluster:5.7.33pxc:5.7.33

## 删除之前的镜像

dockerrmi-fpercona/percona-xtradb-cluster:5.7.33

2.设置网络

## 创建一个网络专门给 pxc 进行使用

dockernetworkcreate--subnet=10.8.0.0/24pxc-net

## 查看创建好的网络信息

dockernetworkls

3.持久化存储

## 创建三个 volume 给容器使用

dockervolumecreate--namedata1
dockervolumecreate--namedata2
dockervolumecreate--namedata3

## 查看已创建的存储卷信息

dockervolumels

## 查看存储卷详情

dockervolumeinspectdata1

4.构建容器并形成集群关系

##node1
dockerrun-d--restartalways-p3301:3306\
-vdata1:/var/lib/mysql\
-eMYSQL_ROOT_PASSWORD=test20210425\
-eCLUSTER_NAME=pxc\
-eXTRABACKUP_PASSWORD=test20210425\
--net=pxc-net--privileged\
--ip10.8.0.2--namenode1pxc:5.7.33
##node2
dockerrun-d--restartalways-p3302:3306\
-vdata2:/var/lib/mysql\
-eMYSQL_ROOT_PASSWORD=test20210425\
-eCLUSTER_NAME=pxc\
-eXTRABACKUP_PASSWORD=test20210425\
-eCLUSTER_JOIN=node1\
--net=pxc-net--privileged\
--ip10.8.0.3--namenode2pxc:5.7.33
##node3
dockerrun-d--restartalways-p3303:3306\
-vdata3:/var/lib/mysql\
-eMYSQL_ROOT_PASSWORD=test20210425\
-eCLUSTER_NAME=pxc\
-eXTRABACKUP_PASSWORD=test20210425\
-eCLUSTER_JOIN=node1\
--net=pxc-net--privileged\
--ip10.8.0.4--namenode3pxc:5.7.33

## 部分参数说明

①CLUSTER_JOIN:形成集群关系
②MYSQL_ROOT_PASSWORD:用户root密码
③CLUSTER_NAME:集群名称
④XTRABACKUP_PASSWORD:数据备份密码
⑤privileged:指定最高优先级。标识容器内的root拥有真正的root权限,否则root只是一个普通用户
⑥net:所处网段,pxc-net为创建网段

## 查看容器

dockerps-a

5.验证

①验证集群是否可用

##访问MySQL客户端(任意节点)

dockerexec-itnode1/usr/bin/mysql-uroot-p
//输入上述设置的root密码登录MySQL

## 查看wsrep状态变量(部分变量截图)

showstatuslike'wsrep%';

+----------------------------------+-------------------------------------------------------+
|Variable_name|Value|
+----------------------------------+-------------------------------------------------------+
|wsrep_local_state_uuid|f9d0df93-a995-11eb-8057-e2d1b05bbeb4|
|wsrep_protocol_version|9|
|wsrep_last_applied|18|
|wsrep_last_committed|18|
|wsrep_replicated|0|
|wsrep_replicated_bytes|0|
|wsrep_repl_keys|0|
|wsrep_repl_keys_bytes|0|
|wsrep_repl_data_bytes|0|
|wsrep_repl_other_bytes|0|
|wsrep_received|16|
|wsrep_received_bytes|1876|
|wsrep_local_commits|0|
|wsrep_local_cert_failures|0|
|wsrep_local_replays|0|
|wsrep_local_send_queue|0|
|wsrep_local_send_queue_max|1|
|wsrep_local_send_queue_min|0|
|wsrep_local_send_queue_avg|0.000000|
|wsrep_local_recv_queue|0|
|wsrep_local_recv_queue_max|2|
|wsrep_local_recv_queue_min|0|
|wsrep_local_recv_queue_avg|0.187500|
|wsrep_local_cached_downto|0|
|wsrep_flow_control_paused_ns|0|
|wsrep_flow_control_paused|0.000000|
|wsrep_flow_control_sent|0|
|wsrep_flow_control_recv|0|
|wsrep_flow_control_interval|[173,173]|
|wsrep_flow_control_interval_low|173|
|wsrep_flow_control_interval_high|173|
|wsrep_flow_control_status|OFF|
|wsrep_flow_control_active|false|
|wsrep_flow_control_requested|false|
|wsrep_cert_deps_distance|0.000000|
|wsrep_apply_oooe|0.000000|
|wsrep_apply_oool|0.000000|
|wsrep_apply_window|0.000000|
|wsrep_commit_oooe|0.000000|
|wsrep_commit_oool|0.000000|
|wsrep_commit_window|0.000000|
|wsrep_local_state|4|
|wsrep_local_state_comment|Synced|
|wsrep_cert_index_size|0|
|wsrep_cert_bucket_count|22|
|wsrep_gcache_pool_size|1576|
|wsrep_causal_reads|0|
|wsrep_cert_interval|0.000000|
|wsrep_open_transactions|0|
|wsrep_open_connections|0|
|wsrep_ist_receive_status||
|wsrep_ist_receive_seqno_start|0|
|wsrep_ist_receive_seqno_current|0|
|wsrep_ist_receive_seqno_end|0|
|wsrep_incoming_addresses|1d475a8c4011:3306,c315e1e4f978:3306,883260fe6518:3306|
|wsrep_cluster_weight|3|
|wsrep_desync_count|0|
|wsrep_evs_delayed||
|wsrep_evs_evict_list||
|wsrep_evs_repl_latency|0/0/0/0/0|
|wsrep_evs_state|OPERATIONAL|
|wsrep_gcomm_uuid|04954080-a996-11eb-bbb9-9319a5bdf715|
|wsrep_gmcast_segment|0|
|wsrep_cluster_conf_id|5|
|wsrep_cluster_size|3|
|wsrep_cluster_state_uuid|f9d0df93-a995-11eb-8057-e2d1b05bbeb4|
|wsrep_cluster_status|Primary|
|wsrep_connected|ON|
|wsrep_local_bf_aborts|0|
|wsrep_local_index|0|
|wsrep_provider_name|Galera|
|wsrep_provider_vendor|CodershipOy<info@codership.com>|
|wsrep_provider_version|3.49(r0ef0d79)|
|wsrep_ready|ON|
+----------------------------------+-------------------------------------------------------+

说明:wsrep_ready:状态监控项,可以知道当前节点的状态是不是可以抚慰,正常情况下为ON,如果变为OFF,则可能是发生了脑裂,或者和其他节点之间的网络连不上,又或者是galera集群没有正常启动等;一般可以通过命令set global wsrep_provider_options=’pc.bootstrap=yes’ 来恢复,不过在执行这个命令之后,需要观察整个集群的状态,不然可能会导致这个节点在逻辑上脱离集群。这个命令的作用就是让当前节点变为primary,如果执行了,则说明确定要使用这个节点来提供服务了。

②使用Naticat工具连接进行验证

注:构建容器时映射的端口防火墙默认已放开。

## 在 node1 中创建一个 test 库

## 查看 node2 和 node3

可看到数据进行了同步,至此 pxc 的搭建就完成了。

三、Docker部署HaProxy

搭建好了 pxc 之后,每次访问的是哪个数据库,可以通过 haproxy 进行路由,类似 nginx,如果 node1 资源不是很多了,可以将请求分发到 node2 或者 node3 当中。

Docker镜像仓库地址:

https://hub.docker.com/_/haproxy

1.拉取镜像

dockerpullhaproxy

2.创建配置文件

## 创建haproxy的配置文件,映射到容器中

mkdir-p/data/haproxy
vi/data/haproxy/haproxy.cfg

## 在配置文件中输入以下内容

global
#工作目录,这边要和创建容器指定的目录对应
chroot/usr/local/etc/haproxy
#日志文件
log127.0.0.1local5info
#守护进程运行
daemon

defaults
logglobal
modehttp
#日志格式
optionhttplog
#日志中不记录负载均衡的心跳检测记录
optiondontlognull
#连接超时(毫秒)
timeoutconnect5000
#客户端超时(毫秒)
timeoutclient50000
#服务器超时(毫秒)
timeoutserver50000

#监控界面
listenadmin_stats
#监控界面的访问的IP和端口
bind0.0.0.0:8888
#访问协议
modehttp
#URI相对地址
statsuri/dbs_monitor
#统计报告格式
statsrealmGlobal\statistics
#登陆帐户信息
statsauthadmin:admin123456
#数据库负载均衡
listenproxy-mysql
#访问的IP和端口,haproxy开发的端口为3306
#假如有人访问haproxy的3306端口,则将请求转发给下面的数据库实例
bind0.0.0.0:3306
#网络协议
modetcp
#负载均衡算法(轮询算法)
#轮询算法:roundrobin
#权重算法:static-rr
#最少连接算法:leastconn
#请求源IP算法:source
balanceroundrobin
#日志格式
optiontcplog
#在MySQL中创建一个没有权限的haproxy用户,密码为空。
#Haproxy使用这个账户对MySQL数据库心跳检测
optionmysql-checkuserhaproxy
serverMySQL_110.8.0.2:3306checkweight1maxconn2000
serverMySQL_210.8.0.3:3306checkweight1maxconn2000
serverMySQL_310.8.0.4:3306checkweight1maxconn2000
#使用keepalive检测死链
optiontcpka

3.构建容器

dockerrun-d--restartalways\
-p3306:3306-p8888:8888\
-v/data/haproxy:/usr/local/etc/haproxy\
--namehaproxy01\
--net=pxc-net--privilegedhaproxy

4.查看容器

dockerps-a|grephaproxy

5.验证

①查看监控页面

浏览器访问

http://host:port/dbs_monitor,本文中为http://192.168.168.100:8888/dbs_monitor,账号/密码:admin/admin123456

## 登录之后可以发现 MYSQL 几个节点都是DOWN状态的,这需要在容器内部启动haproxy服务。

②启动haproxy服务

## 进入haproxy容器内启动服务

dockerexec-ithaproxy01/bin/bash
haproxy-f/usr/local/etc/haproxy/haproxy.cfg&

③创建haproxy用户并授权

## 进入任一数据库容器内操作(或在Naticat工具端操作)

dockerexec-itnode1/bin/bash
mysql-uroot-p
//输入密码登录

usemysql;
CREATEUSER'haproxy'@'%'IDENTIFIEDBY'';//空密码
flushprivileges;

④刷新监控页面

## 刷新页面后,3个节点都是 up 状态

## 同时可以使用3306端口在 navicat 进行连接了

## 点击“测试连接”

## 连接成功如下图所示,即可在Navicat工具上进行创建\删除用户、数据库等其他操作,无需进入容器操作。

  •  标签:  
  • MySQL
  •  

原文链接:https://77isp.com/post/10384.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。