当前位置: 首页 > 科技观察

MySQL系列-Docker搭建PerconaXtraDBCluster(图文)

时间:2023-03-12 08:48:27 科技观察

一、部署环境说明本文使用本地VM虚拟机进行部署和测试。OS:CentOSLinuxrelease7.6.1810(Core)3.10.0-957.el7.x86_64IP:192.168.168.100Docker版本:v20.10.6虚拟机配置:2核CPU,4G内存注:①系统为最小安装、部署之前已经完成系统初始化、内核和安全优化;②已安装Docker。2、Docker部署PXCDocker镜像仓库地址:https://hub.docker.com/r/percona/percona-xtradb-clusterDocker部署官方文档:https://www.percona.com/doc/percona-xtradb-cluster/最新/install/docker.html1。拉取镜像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.332.Settingupthenetwork##创建一个专用于pxc的网络,使用dockernetworkcreate--subnet=10.8.0.0/24pxc-net##查看创建的Network信息dockernetworkls3。持久化存储##使用dockervolumecreate为容器创建三个卷--namedata1dockervolumecreate--namedata2dockervolumecreate--namedata3##查看创建的存储卷信息dockervolumeels##查看存储卷详情dockervolumeinspectdata14。构建容器并形成集群关系##node1dockerrun-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##node2dockerrun-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##node3dockerrun-d--restartalways-p3303:3306\-vdata3:/var/lib/mysql\-eMYSQL_ROOT_PASSWORD=test20210425\-eCLUSTER_NAME=pxc\-eXTRABACKUP_PASSWORD=test20210425\-eCLUSTER_JOIN=node1\--net=pxc-net--特权\--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-a5。验证①验证集群可用##进入MySQL客户端(任意节点)dockerexec-itnode1/usr/bin/mysql-uroot-p//输入上面设置的root密码登录MySQL##查看wsrep状态variables(部分变量截图)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.00ws0e|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_gcac??he_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|操作||WSREP_GCOMM_UUID|04954080-A996-11EBBBBBBB9-9319A5BDF71511eb-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||07|p(9)||wsrep_ready|ON|+--------------------------------+-----------------------------------------------------+说明:wsrep_ready:状态监控项,可以知道当前节点的状态是否可以安慰,一般情况下是ON,如果变为OFF,可能是脑裂,或者其他节点之间的网络无法连接,或者的galera集群没有正常启动;通常你可以通过命令setglobalwsrep_provider_options='pc.bootstrap=yes'来恢复,但是执行这条命令后,需要观察整个集群的状态,否则可能会导致这个节点逻辑脱离集群。该命令的作用是使当前节点成为primary。如果执行了,则表示确定使用该节点提供服务。②使用Naticat工具连接验证注意:构建容器时映射的端口防火墙已经默认放行。##在node1中创建测试库##查看node2和node3数据是否同步,至此pxc搭建完成。3、Docker部署HaProxypxc搭建好后,每次访问哪个数据库都可以通过haproxy路由,类似于nginx。如果node1资源不多,可以将请求分发到node2或者node3。Docker镜像仓库地址:https://hub.docker.com/_/haproxy1。拉取镜像dockerpullhaproxy2。创建配置文件##创建haproxy配置文件并映射到容器mkdir-p/data/haproxyvi/data/haproxy/haproxy.cfg##在配置文件global#Working目录中输入以下内容,这里应该对应创建容器指定的目录chroot/usr/local/etc/haproxy#日志文件log127.0.0.1local5info#Daemonrunningdaemondefaultslogglobalmodehttp#日志格式选项httplog#日志中不记录负载均衡的心跳检测记录选项dontlognull#连接超时(毫秒)timeoutconnect5000#客户端超时(毫秒)timeoutclient50000#服务器超时(毫秒)timeoutserver50000#监控接口listenadmin_stats#监控接口访问IP和端口bind0.0.0.0:8888#访问协议方式http#URI相对地址statsuri/dbs_monitor#统计报表格式statsrealmGlobal\statistics#登录账号信息statsauthadmin:admin123456#数据库负载均衡listenproxy-mysql#IP和port用于访问,haproxy开发的端口为3306#如果有人访问haproxy的3306端口,请求会被转发到下面的数据库实例bind0.0.0.0:3306#网络协议modetcp#负载均衡算法(轮询算法)#轮询算法:roundrobin#权重算法:static-rr#最少连接算法:leastconn#请求源IP算法:sourcebalancroundrobin#日志格式optiontcplog#在MySQL中创建一个无权限的haproxy用户,密码为空。#HaproxyusesthisaccounttodetecttheheartbeatoftheMySQLdatabaseoptionmysql-checkuserhaproxyserverMySQL_110.8.0.2:3306checkweight1maxconn2000serverMySQL_210.8.0.3:3306checkweight1maxconn2000serverMySQL_310.8.0.4:3306checkweight1maxconn2000#Usekeepalivetodetectdeadlink3run-start0containertdocpka:3306-p8888:8888\-v/data/haproxy:/usr/local/etc/haproxy\--namehaproxy01\--net=pxc-net--privilegedhaproxy4。查看容器dockerps-a|grephaproxy5。验证①查看监控在页面浏览器中访问http://host:port/dbs_monitor,本文中http://192.168.168.100:8888/dbs_monitor,账号/密码:admin/admin123456##登录后可以发现MYSQL的几个节点处于DOWN状态是的,这个需要启动容器内部的haproxy服务。②启动haproxy服务##进入haproxy容器启动服务dockerexec-ithaproxy01/bin/bashhaproxy-f/usr/local/etc/haproxy/haproxy.cfg&③创建haproxy用户并授权##进入任意数据库容器即可运行(或在Naticat工具端运行)dockerexec-itnode1/bin/bashmysql-uroot-p//输入密码登录usemysql;CREATEUSER'haproxy'@'%'IDENTIFIEDBY'';//清空密码flushprivileges;④刷新监控页面##刷新页面后,3个节点都处于up状态##同时可以使用3306端口连接navicat##点击“测试连接”##连接成功后,如如下图所示,可以在Navicat工具上进行创建/删除用户、数据库等其他操作,无需进入容器操作。