MySQL 高可用实战:PXC + HAProxy + Keepalived 完整版笔记
一、PXC 基础讲解1. 什么是 PXCPXCPercona XtraDB Cluster是基于Galera 库实现的MySQL 多主同步高可用集群。核心特点强一致性、实时同步、任意节点可写、事务全局原子提交。官方文档https://docs.percona.com/percona-xtradb-cluster/8.4/https://docs.percona.com/percona-xtradb-cluster/8.4/https://docs.percona.com/percona-xtradb-cluster/8.4/yum.htmlhttps://docs.percona.com/percona-xtradb-cluster/8.4/yum.html2. PXC 特点完全兼容 MySQL同步复制事务要么所有节点提交要么全部不提交多主架构任意节点都可写入并行复制真正实时同步自动节点克隆、自动补数据故障切换简单3. PXC 优点服务高可用数据几乎无延迟同步多节点同时读写可扩展写自动部署新节点数据强一致适合电商完全兼容 MySQL4. PXC 缺点只支持InnoDB写入效率取决于最慢节点所有表必须有主键不支持 LOCK TABLE锁冲突、死锁更多节点越多同步越慢5. PXC 常用端口3306MySQL 服务4444SST 全量同步4567集群通信4568IST 增量同步二、环境规划角色主机名IP 地址PXC 节点 1pxc1192.168.24.140PXC 节点 2pxc2192.168.24.141PXC 节点 3pxc3192.168.24.142HAProxy 主keepalivedlb01192.168.24.143HAProxy 备keepalivedlb02192.168.24.144浮动 VIP—192.168.24.145三、3 节点 PXC 集群搭建1. 所有节点配置 hosts 解析不然配置一台dnscat /etc/hosts EOF 192.168.24.140 pxc1 192.168.24.141 pxc2 192.168.24.142 pxc3 192.168.24.143 lb01 192.168.24.144 lb02 EOF解释cat 向文件末尾追加内容/etc/hosts系统主机名映射文件作用让所有机器用主机名互相访问无需依赖 DNS2. 所有节点卸载 mariadb避免冲突作为失败参考点yum -y remove mari*解释系统自带 mariadb 与 PXC 冲突卸载干净3. 安装 PXC所有节点离线安装上传 rpm 包后执行yum localinstall *.rpm -y解释localinstall本地安装 RPM 包-y自动确认所有交互官方下载地址http://repo.percona.com/pxc-84-lts/yum/release/10/RPMS/x86_64/http://repo.percona.com/pxc-84-lts/yum/release/10/RPMS/x86_64/正常下载下载仓库后启动源下载 yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm percona-release setup pxc-84-lts yum install percona-xtradb-cluster4. 启动 MySQL 并获取临时密码systemctl start mysqld解释启动 MySQL 服务tmp_pass$(awk /temporary password/ {print $NF} /var/log/mysqld.log) 也可以 [rootpxc1 ~]# cat /var/log/mysqld.log | grep -i temporary password 2026-04-13T09:44:10.472868Z 6 [Note] [MY-010454] [Server] A temporary password is generated for rootlocalhost: n2;5tFah3cg解释从 MySQL 日志提取临时 root 密码$NF表示取每行最后一列mysql -uroot -p${tmp_pass}解释用临时密码登录数据库5. 修改密码并创建远程账号MySQL 内执行3台都要这个时候还没有同步ALTER USER rootlocalhost IDENTIFIED BY MySQL123;解释修改本地 root 密码一般第一次以临时密码登录都必须改一次密码CREATE USER admin% IDENTIFIED WITH caching_sha2_password BY Abc_123456; GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, DROP, INDEX ON *.* TO admin%; FLUSH PRIVILEGES;解释创建远程账号admin%允许任意 IP 连接授予相对应权限供集群与 HAProxy 使用6. 停止 MySQL准备配置集群systemctl stop mysqld7. 生成并分发 SSL 证书pxc1 执行没有openssl要先下载dnf install -y opensslopenssl req -newkey rsa:2048 -nodes -keyout /etc/server-key.pem -x509 -days 365 -out /etc/server-cert.pem 1. openssl 作用开源安全工具包用于生成证书、加密、解密 必须先安装dnf install -y openssl 2. req 作用请求证书request 表示我们要生成一个证书请求 / 自签名证书 3. -newkey rsa:2048 -newkey生成新的密钥对 rsa:2048使用 RSA 2048 位 加密算法目前最安全、最通用 4. -nodes 作用私钥不加密不需要密码 如果不加启动 PXC 时每次都要输证书密码集群无法自动启动 5. -keyout /etc/server-key.pem -keyout把私钥输出到哪个文件 /etc/server-key.pem私钥保存路径 6. -x509 作用生成自签名证书不需要第三方 CA 认证 我们自己给自己签发证书内网 / 测试 / 生产都能用 7. -days 365 作用证书有效期 365 天 过期后需要重新生成 8. -out /etc/server-cert.pem -out把公钥证书输出到哪个文件 /etc/server-cert.pem证书保存路径 执行后会出现什么 执行命令后会让你输入 Country Name (2 letter code) [XX]: State or Province Name (full name) []: Locality Name (eg, city) [Default City]: Organization Name (eg, company) [Default Company Ltd]: Organizational Unit Name (eg, section) []: Common Name (eg, your name or your servers hostname) []: Email Address []: ✔ 正确做法一路回车即可 这些信息不影响 PXC 使用不需要认真填写。解释生成 PXC 集群加密通信证书scp /etc/server-* pxc2:/etc/ scp /etc/server-* pxc3:/etc/解释把证书分发到所有节点保证加密一致8. 配置 /etc/my.cnf所有节点pxc1 完整配置# Template my.cnf for PXC # Edit to your requirements. [client] socket/var/lib/mysql/mysql.sock [mysqld] server-id140 #这里id不要一样的就行我是按照ip改的 datadir/var/lib/mysql socket/var/lib/mysql/mysql.sock log-error/var/log/mysqld.log pid-file/var/run/mysqld/mysqld.pid # Binary log expiration period is 604800 seconds, which equals 7 days binlog_expire_logs_seconds604800 ######## wsrep ############### # Path to Galera library wsrep_provider/usr/lib64/galera4/libgalera_smm.so # Cluster connection URL contains IPs of nodes #If no IP is found, this implies that a new cluster needs to be created, #in order to do that you need to bootstrap this node wsrep_cluster_addressgcomm:// # 【已修改】替换为下方集群IP列表本行保留注释 # In order for Galera to work correctly binlog format should be ROW binlog_formatROW # Slave thread to use wsrep_slave_threads8 wsrep_log_conflicts # This changes how InnoDB autoincrement locks are managed and is a requirement for Galera innodb_autoinc_lock_mode2 # Node IP address #wsrep_node_address192.168.70.63 # Cluster name wsrep_cluster_namepxc-cluster #If wsrep_node_name is not specified, then system hostname will be used wsrep_node_namepxc-cluster-node-1 #pxc_strict_mode allowed values: DISABLED,PERMISSIVE,ENFORCING,MASTER pxc_strict_modeENFORCING # SST method wsrep_sst_methodxtrabackup-v2 # 以下为【新增/修改】内容 # 集群所有节点IP必须写3个节点 wsrep_cluster_addressgcomm://192.168.24.140,192.168.24.141,192.168.24.142 # 【新增】集群地址 wsrep_node_namepxc1 # 【新增】当前节点名称覆盖原有 wsrep_node_address192.168.24.140 # 【新增】当前节点IP wsrep_applier_threads8 # 【新增】同步线程数 # 【新增】SSL 加密通信集群节点安全认证 wsrep_provider_optionssocket.ssl_key/etc/server-key.pem;socket.ssl_cert/etc/server-cert.pem # 【SST 全量同步加密】 [sst] encrypt4 # 【新增】开启SSL加密传输 ssl-key/etc/server-key.pem # 【新增】私钥 ssl-cert/etc/server-cert.pem # 【新增】证书逐行解释server-idMySQL 唯一 ID不能重复wsrep_cluster_name集群名称所有节点必须相同wsrep_cluster_address集群所有节点地址wsrep_node_name本节点主机名wsrep_node_address本节点 IPpxc_strict_modeENFORCINGPXC 严格模式innodb_autoinc_lock_mode2集群强制要求wsrep_sst_methodxtrabackup-v2全量同步方式pxc2 修改或添加server-id141 wsrep_node_namepxc2 wsrep_node_address192.168.24.141 wsrep_cluster_addressgcomm://192.168.24.140 wsrep_provider_optionssocket.ssl_key/etc/server-key.pem;socket.ssl_cert/etc/server-cert.pem [sst] encrypt4 ssl-key/etc/server-key.pem ssl-cert/etc/server-cert.pempxc3修改或者添加server-id142 wsrep_node_namepxc3 wsrep_node_address192.168.24.142 wsrep_cluster_addressgcomm://192.168.24.140 wsrep_provider_optionssocket.ssl_key/etc/server-key.pem;socket.ssl_cert/etc/server-cert.pem [sst] encrypt4 ssl-key/etc/server-key.pem ssl-cert/etc/server-cert.pem9. 启动 PXC 集群顺序绝对不能错pxc1 引导启动第一个节点systemctl start mysqlbootstrap.service mysqlbootstrap.service 这是 PXC 专属的特殊服务单元不是普通 MySQL mysqlPXC 数据库服务名 systemd 模板服务标记 bootstrap引导模式 / 集群初始化模式 .service服务文件后缀 这条命令到底做了什么 以 “集群初始化模式” 启动 MySQL 创建全新的 PXC 集群 生成集群 UUID 打开节点接收其他机器加入 不依赖任何其他节点自己成为集群第一个节点其他节点不能用解释以引导模式启动初始化集群出现启动失败[rootpxc1 ~]# systemctl start mysqlbootstrap.service Job for mysqlbootstrap.service failed because the control process exited with error code. See systemctl status mysqlbootstrap.service and journalctl -xeu mysqlbootstrap.service for details. 解决方法 systemctl stop mysqld systemctl stop mysqlbootstrap.service pkill -9 mysqld rm -rf /var/lib/mysql/grastate.dat rm -rf /var/lib/mysql/gvwstate.datPXC 规定一个节点一旦加入过集群就不允许再创建集群 里面记录了 我属于哪个集群 我的 seqno同步位置 最重要safe_to_bootstrap是否允许重新创建集群 rm -rf /var/lib/mysql/*.pid rm -rf /var/lib/mysql/*.lock 作用清理残留标记避免启动报错。pxc2、pxc3 正常启动systemctl start mysql systemctl enable mysql10. PXC 集群完整验证验证 1查看集群节点数mysql -uroot -pMySQL123 -e show status like wsrep_cluster_size;预期结果wsrep_cluster_size 3验证 2查看关键状态汇总mysql -uroot -pMySQL123 -e show status where Variable_name in (wsrep_cluster_size,wsrep_cluster_status,wsrep_connected,wsrep_ready);预期全部为 ON / Primary验证 3查看节点同步视图select * from performance_schema.pxc_cluster_view;预期所有节点 STATUS 为 SYNCED验证 4跨节点数据同步测试文档标准验证pxc2 创建库CREATE DATABASE percona;pxc3 创建表CREATE TABLE percona.example (node_id INT PRIMARY KEY, node_name VARCHAR(30));pxc1 插入数据INSERT INTO percona.example VALUES (1,percona1);pxc2 查询SELECT * FROM percona.example;预期能查到数据证明同步正常四、HAProxy 负载均衡搭建官方文档https://docs.percona.com/percona-xtradb-cluster/8.4/haproxy.htmlhttps://docs.percona.com/percona-xtradb-cluster/8.4/haproxy.html1. 安装 HAProxylb01、lb02 都执行dnf install haproxy -y2. 配置 /etc/haproxy/haproxy.cfg#--------------------------------------------------------------------- # Example configuration for a possible web application. See the # full configuration options online. # # https://www.haproxy.org/download/1.8/doc/configuration.txt # #--------------------------------------------------------------------- #--------------------------------------------------------------------- # Global settings #--------------------------------------------------------------------- global # 日志配置输出到本地syslog log 127.0.0.1 local2 # 运行路径、进程ID chroot /var/lib/haproxy pidfile /var/run/haproxy.pid # 最大连接数调高支持更高并发 maxconn 4096 # 运行用户和用户组 user haproxy group haproxy # 后台守护进程模式运行 daemon # 统计socket用于管理 stats socket /var/lib/haproxy/stats # 系统加密策略 ssl-default-bind-ciphers PROFILESYSTEM ssl-default-server-ciphers PROFILESYSTEM #--------------------------------------------------------------------- # common defaults that all the listen and backend sections will # use if not designated in their block #--------------------------------------------------------------------- defaults # 日志继承全局配置 log global # 【重要】MySQL 必须使用 TCP 模式不能用HTTP mode tcp # 记录TCP日志 option tcplog # 不记录空连接日志 option dontlognull # 连接失败重试3次 retries 3 # 各种超时时间保证MySQL长连接稳定 timeout http-request 10s timeout queue 1m timeout connect 5000 timeout client 50000 timeout server 50000 timeout http-keep-alive 10s timeout check 10s # 单进程最大连接数 maxconn 3000 #--------------------------------------------------------------------- # HAProxy 监控页面网页查看状态 # 访问http://LB_IP:8088/haproxy/stats # 账号admin 密码admin #--------------------------------------------------------------------- frontend stats-front bind *:8088 mode http default_backend stats-back backend stats-back mode http # 监控页面URL stats uri /haproxy/stats # 监控页面账号密码 stats auth admin:admin #--------------------------------------------------------------------- # MySQL-PXC 负载均衡入口 # 监听 3306 端口应用通过此端口连接数据库 #--------------------------------------------------------------------- frontend pxc-front bind *:3306 mode tcp default_backend pxc-cluster #--------------------------------------------------------------------- # PXC 集群后端节点配置 # 负载策略leastconn优先给连接少的节点分发 # 健康检查使用 9200 端口PXC 集群状态检查端口 #--------------------------------------------------------------------- backend pxc-cluster mode tcp balance leastconn # PXC 节点1 健康检查端口9200 server pxc1 192.168.24.140:3306 check port 9200 inter 12000 rise 3 fall 3 # PXC 节点2 server pxc2 192.168.24.141:3306 check port 9200 inter 12000 rise 3 fall 3 # PXC 节点3 server pxc3 192.168.24.142:3306 check port 9200 inter 12000 rise 3 fall 3 #--------------------------------------------------------------------- # 原来的 Web 配置已保留不影响PXC #--------------------------------------------------------------------- # main frontend which proxys to the backends frontend main bind *:5000 acl url_static path_beg -i /static /images /javascript /stylesheets acl url_static path_end -i .jpg .gif .png .css .js use_backend static if url_static default_backend app # static backend for serving up images, stylesheets and such backend static balance roundrobin server static 127.0.0.1:4331 check # round robin balancing between the various backends backend app balance roundrobin server app1 127.0.0.1:5001 check server app2 127.0.0.1:5002 check server app3 127.0.0.1:5003 check server app4 127.0.0.1:5004 check 检查语法 haproxy -c -f /etc/haproxy/hapro.cfg -c check -f file关键解释mode tcpMySQL 必须用 TCP 模式balance leastconn最少连接调度数据库最稳定check port 9200健康检查端口8088HAProxy 监控页面3. 配置 PXC 健康检查所有 PXC 节点xinted注意rhel10、rocky10没办法用xinetdecho mysqlchk 9200/tcp /etc/services dnf install -y xinetd systemctl enable --now xinetd 给 9200 端口起一个服务名字叫 mysqlchk写入系统端口配置文件 /etc/services 作用 让系统认识 9200 端口 MySQL 集群健康检查 HAProxy 就是靠 9200 端口 检查 PXC 节点是否正常 不配置这行HAProxy 不知道检查什么端口 安装 xinetd 超级服务一个用来管理其他小服务的监听服务 作用 PXC 的 9200 健康检查服务 必须依靠 xinetd 才能启动 xinetd 会监听 9200 端口用来回答 HAProxy 的检查请求 没有 xinetd9200 端口不会开启理解9200 只是个健康检查脚本不是独立服务靠 xinetd 帮它监听端口。第二种方法3.所有 PXC 节点都要执行pxc1、pxc2、pxc3systemd1. 创建健康检查脚本真正检查 PXC 状态# 创建脚本文件并将以下内容写入 /usr/local/bin/pxc_check.sh cat /usr/local/bin/pxc_check.sh EOF #!/bin/bash # 检查1MySQL 进程是否存在 # pgrep mysqld 查找系统中是否有 mysqld 进程 # if ! ... 如果找不到进程条件不成立执行下面内容 if ! pgrep mysqld /dev/null; then # 返回 HTTP 503 状态码表示服务不可用 echo HTTP/1.1 503 Service Unavailable\r\n # 退出脚本返回错误码 1异常 exit 1 fi # 检查2PXC 集群是否准备就绪 # 执行 MySQL 命令查看 wsrep_ready 状态只返回值不要表头 #-N 去掉表头列名 STATUS$(mysql -N -e SHOW STATUS LIKE wsrep_ready; | awk {print $2}) # 如果状态不是 ON说明 PXC 集群未准备好不能提供服务 if [ $STATUS ! ON ]; then echo HTTP/1.1 503 Service Unavailable\r\n exit 1 fi # 检查3PXC 集群是否处于正常主状态 # 查看集群状态确保没有脑裂、没有分区 CLUSTER_STATUS$(mysql -N -e SHOW STATUS LIKE wsrep_cluster_status; | awk {print $2}) # 如果不是 Primary表示集群异常可能脑裂/分区 if [ $CLUSTER_STATUS ! Primary ]; then echo HTTP/1.1 503 Service Unavailable\r\n exit 1 fi # 所有检查都通过 # 返回 HTTP 200表示节点健康 echo HTTP/1.1 200 OK\r\n # 退出脚本返回 0正常 exit 0 EOF只有 Primary 状态PXC 节点才能正常读写。不是 Primary → 节点已经脱离集群、脑裂、不可用 → 必须踢出业务流量2. 给执行权限chmod x /usr/local/bin/pxc_check.sh chown mysql:mysql /usr/local/bin/pxc_check.sh3. 创建 systemd 监听服务替代 xinetd# 创建 systemd socket 配置文件作用监听 9200 端口 cat /etc/systemd/system/pxc_check.socket EOF [Unit] # 描述信息随便写方便自己看懂 DescriptionPXC Health Check Socket [Socket] # 核心配置监听 9200 端口TCP # 相当于 xinetd 里的 port 9200 ListenStream9200 # 允许外部连接进来必须写 yes # 有人访问 9200 就触发脚本 Acceptyes [Install] # 开机启动相关让这个端口监听跟着系统启动 WantedBysockets.target EOF# 创建 systemd 服务配置文件 代表由 socket 触发启动 cat /etc/systemd/system/pxc_check.service EOF [Unit] # 服务描述给人看的随便写 DescriptionPXC Health Check Service [Service] # 核心启动脚本 # 有人访问 9200 端口时执行这个健康检查脚本 ExecStart/usr/local/bin/pxc_check.sh # 必须项和 socket 对接 # 告诉 systemd这个服务的输入来自 socket端口连接 StandardInputsocket # 安全项以什么用户运行 # 使用 mysql 用户启动脚本最小权限更安全 Usermysql # 使用 mysql 组 Groupmysql EOF4. 启动监听9200 端口systemctl daemon-reload systemctl enable --now pxc_check.socket5. 防火墙放行 9200firewall-cmd --permanent --add-port9200/tcp firewall-cmd --reloadMySQL 内创建检查用户pxc1pxc2pxc3执行如果pxc架构还在只需pxc1执行就行CREATE USER clustercheckuserlocalhost IDENTIFIED BY clustercheckpassword!; GRANT PROCESS ON *.* TO clustercheckuserlocalhost; FLUSH PRIVILEGES;4. 启动 HAProxysystemctl start haproxy systemctl enable haproxy 启动不了 1.防火墙或者selinux [rootlb02 yum.repos.d]# setsebool -P haproxy_connect_any 1 处理selinux 2.访问端口被占用 3.配置文件错误5. HAProxy 验证curl -I 192.168.24.140:9200 [rootlb01 ~]# curl -I 192.168.24.140:9200 HTTP/1.1 200 OK\r\n curl: (56) Recv failure: Connection reset by peer 第二行不影响说明脚本正常退出 主要是因为\r\n的问题 脚本echo加-e参数就行 [rootlb01 ~]# curl -I 192.168.24.140:9200 HTTP/1.1 200 OK [rootlb01 ~]# 不通经常是防火墙原因 pxc1,2,3执行 1. 放行 3306MySQL和 9200健康检查 firewall-cmd --permanent --add-port3306/tcp firewall-cmd --permanent --add-port9200/tcp firewall-cmd --reload 2. 确认放行成功 firewall-cmd --list-ports 应该看到 3306/tcp 9200/tcp 3. 再确保健康检查服务在运行lb执行 systemctl daemon-reload systemctl enable --now pxc_check.socket systemctl status pxc_check.socket 4. 回到 lb01 测试连通性 curl -I 192.168.24.140:9200 curl -I 192.168.24.141:9200 curl -I 192.168.24.142:9200 能返回 200 或 503 就说明通了HAProxy 马上变 UP。预期HTTP/1.1 200 OK浏览器访问监控http://192.168.24.143:8088/haproxy/stats账号admin密码admin访问网页不通就是8080端口没放行firewall-cmd --permanent --add-port8080/tcp firewall-cmd --reload五、Keepalived 高可用搭建1. 安装 Keepalivedlb01、lb02dnf install keepalived -y2. 主节点 lb01 配置关键点待解决vrrp_strict在生产模式下是要开的但是虚拟环境下可能会出现别的机器无法访问的问题根据官方文档优先级要255的才行priority 255地址所有者当vip在优先级为255的keepalived机器上时才能被ping通。除非 strict_mode即 vrrp_strict被设置相当于这个实例关闭严格模式。举例子 vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 # 不用 255 advert_int 1 strict_mode off # 关键关闭当前实例的严格模式 accept # 关键允许响应 VIPping 能通 virtual_ipaddress { 192.168.1.100/24 } }注意单独写strict_mode off 也不行加accept这样就能够正常被访问了可能会出现脑裂问题 只需要在两台 LB 都执行这一条命令放通 VRRP 协议 firewall-cmd --add-protocolvrrp --permanent firewall-cmd --reload 或者 iptables 模式 iptables -A INPUT -p vrrp -j ACCEPT总体配置! 全局配置区必须保留精简无用邮件功能 global_defs { ! 关闭邮件通知生产环境可自己开启 ! notification_email { ! acassenfirewall.loc ! } ! notification_email_from Alexandre.Cassenfirewall.loc ! smtp_server 192.168.200.1 ! smtp_connect_timeout 30 ! 路由器ID唯一标识随便写不重复即可 router_id HAPROXY_LB ! VRRP 基础参数 vrrp_skip_check_adv_addr vrrp_garp_interval 0 vrrp_gna_interval 0 #vrrp_strict } ! ---------------------- 关键HAProxy 健康检查脚本 ---------------------- ! 作用每隔2秒检查 haproxy 是否存活 ! 如果挂了自动降低优先级让备机抢占VIP vrrp_script chk_haproxy { script /etc/keepalived/check_haproxy.sh ! 检查脚本路径 interval 2 ! 每2秒检查一次 weight -10 ! 检查失败优先级-10 rise 2 fall 2 } ! ---------------------- VRRP 实例核心 ---------------------- vrrp_instance VI_HAPROXY { ! 状态MASTER / BACKUP ! 主LB写 MASTER ! 备LB写 BACKUP state BACKUP ! 网卡名称你用的是 ens160必须正确 interface ens160 ! 虚拟路由ID主备必须一样同一集群唯一 virtual_router_id 51 ! 优先级主100备90数字越大越优先 priority 100 ! 通告间隔1秒心跳 advert_int 1 ! 不抢占模式主挂了恢复后不抢回VIP更稳定 nopreempt ! 认证密码主备必须一样 authentication { auth_type PASS auth_pass 1111 } ! 虚拟IPVIP你的 PXC 对外访问IP virtual_ipaddress { 192.168.24.145 } ! 绑定上面的检查脚本 track_script { chk_haproxy } } ! ---------------------- 以下全部删除你是 HAProxy 不是 LVS---------------------- ! 你原来的 virtual_server 配置是 LVS 用的 ! 我们现在用的是 HAProxy Keepalived 模式 ! 所以下面所有 virtual_server 配置 全部 删掉 ! ---------------------- 已清理 ----------------------3. 备节点 lb02 配置只改两行state BACKUP priority 904. 健康检查脚本vim /etc/keepalived/check_haproxy.sh#!/bin/bash stat$(ps -C haproxy --no-header | wc -l) #-C 按 命令名称command name 筛选 wc word count -l line if [ $stat -eq 0 ]; then systemctl start haproxy sleep 3 if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then systemctl stop keepalived fi fi 以上会重启导致验证时ip不会漂移 #!/bin/bash if pgrep haproxy /dev/null; then exit 0 else exit 1 fichmod x /etc/keepalived/check_haproxy.sh5. 启动 Keepalivedsystemctl start keepalived systemctl enable keepalived六、整套架构最终完整验证1. 使用 VIP 登录 MySQL统一入口mysql -uadmin -pAbc_123456 -h 192.168.24.145 -P 3306 使用用户 admin密码 Abc_123456 连接到 192.168.24.145 这台机器的 3306 端口MySQL 这个账号在一开始的时候创建用来管理业务admin%有%相当与可以远程连接 流程 你 → VIP(145) → HAProxy → PXC 集群2. 查看集群状态show status like wsrep_cluster_size;3. 查看 VIP 所在节点ip a4. 高可用切换测试停掉主 lb01 的 haproxy查看 VIP 是否自动漂移到 lb02业务依然可用七、全套官方网址你文档里全部网址PXC 官方文档https://docs.percona.com/percona-xtradb-cluster/8.4/PXC 安装指南https://docs.percona.com/percona-xtradb-cluster/8.4/yum.htmlPXC 下载地址http://repo.percona.com/pxc-84-lts/yum/release/10/RPMS/x86_64/HAProxy 集成文档https://docs.percona.com/percona-xtradb-cluster/8.4/haproxy.html