12-验证测试
本文档提供完整的验证测试命令,用于验证部署是否成功。
容器状态验证
查看所有容器
# 在每个节点执行
docker ps -a
Node1预期输出:
CONTAINER ID IMAGE STATUS
xxxxxxxxxxxx ednxzu/keepalived:2.3.4 Up X minutes
xxxxxxxxxxxx nginx:alpine Up X minutes
xxxxxxxxxxxx nginx:alpine Up X minutes
xxxxxxxxxxxx php:8.2-fpm-alpine Up X minutes
xxxxxxxxxxxx redis:7-alpine Up X minutes
xxxxxxxxxxxx redis:7-alpine Up X minutes
xxxxxxxxxxxx mysql:8.0 Up X minutes
Node1预期容器列表:
- mysql-01, redis-master, sentinel-01, nginx-lb, keepalived, php, php-fpm(7个容器)
Node2预期容器列表:
- mysql-02, redis-slave, sentinel-02, nginx-lb, keepalived, php, php-fpm(7个容器)
Node3预期容器列表:
- mysql-03, redis-slave, sentinel-03, nginx-lb, keepalived, php, php-fpm, backup-server(8个容器)
查看容器详情
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
检查容器健康状态
# 检查所有健康检查
docker ps --filter "health=healthy"
VIP验证
查看VIP绑定
# 查看VIP是否绑定到MASTER节点
docker exec keepalived ip addr show eth0 | grep "172.20.1.100"
# 预期输出:inet 172.20.1.100/24 scope global secondary eth0
测试VIP连通性
# 从任意节点测试
ping -c 3 172.20.1.100
# 从外部测试(物理机)
ping -c 3 172.20.1.100
查看Keepalived状态
docker exec keepalived cat /var/log/keepalived-notify.log
# 或查看VRRP状态
docker exec keepalived ip addr show
Nginx-LB验证
健康检查测试
# 测试每个Nginx-LB
curl http://172.20.1.11/health
curl http://172.20.1.12/health
curl http://172.20.1.13/health
# 预期输出:healthy
通过VIP测试
curl http://172.20.1.100/health
PHP服务验证
健康检查测试
# 测试每个PHP服务
curl http://172.20.2.11/health
curl http://172.20.2.12/health
curl http://172.20.2.13/health
# 预期输出:php-healthy
创建测试页面
部署一个用户登录注册界面,用于验证PHP+MySQL+Redis全链路:
# 将index.php复制到共享卷
docker run --rm -v web-data:/data -v /opt/cluster-deploy/config/php/index.php:/index.php alpine cp /index.php /data/
说明 :index.php已包含在
config/php/index.php中,是一个完整的登录注册系统, 连接MySQL MGR(172.20.4.11)进行用户认证,支持注册和登录功能。
PHP测试
# 直接访问PHP服务(返回登录页面HTML)
curl -L http://172.20.2.11/index.php | head -20
curl -L http://172.20.2.12/index.php | head -20
curl -L http://172.20.2.13/index.php | head -20
# 通过Nginx-LB访问
curl -L http://172.20.1.11/index.php | head -20
curl -L http://172.20.1.100/index.php | head -20
Redis集群验证
健康检查测试
# 测试Redis Master
docker exec redis-master redis-cli -a 'YourStr0ng!Pass' ping
# 测试Redis Slave
docker exec redis-slave redis-cli -a 'YourStr0ng!Pass' ping
查看复制状态
# 查看主从复制状态
docker exec redis-master redis-cli -a 'YourStr0ng!Pass' info replication
# 预期输出:
# role:master
# connected_slaves:2
# slave0:ip=172.20.3.12,port=6379,state=online
# slave1:ip=172.20.3.13,port=6379,state=online
测试数据同步
# 在Master写入
docker exec redis-master redis-cli -a 'YourStr0ng!Pass' SET test_key "Hello from Master"
# 在Slave读取
docker exec redis-slave redis-cli -a 'YourStr0ng!Pass' -h 172.20.3.11 GET test_key
Sentinel验证
健康检查测试
# 测试每个Sentinel
docker exec sentinel-01 redis-cli -p 26379 ping
docker exec sentinel-02 redis-cli -p 26379 ping
docker exec sentinel-03 redis-cli -p 26379 ping
查看Sentinel主节点信息
# 查看Sentinel认为的主节点
docker exec sentinel-01 redis-cli -p 26379 SENTINEL get-master-addr-by-name mymaster
# 预期输出:172.20.3.11 6379
查看所有Sentinel
docker exec sentinel-01 redis-cli -p 26379 SENTINEL sentinels mymaster
查看从节点
docker exec sentinel-01 redis-cli -p 26379 SENTINEL slaves mymaster
MySQL MGR验证
健康检查测试
# 测试每个MySQL
docker exec mysql-01 mysqladmin -uroot -p'YourStr0ng!Pass' ping -h127.0.0.1
docker exec mysql-02 mysqladmin -uroot -p'YourStr0ng!Pass' ping -h127.0.0.1
docker exec mysql-03 mysqladmin -uroot -p'YourStr0ng!Pass' ping -h127.0.0.1
查看MGR成员状态
docker exec mysql-01 mysql -uroot -p'YourStr0ng!Pass' -h127.0.0.1 -e "
SELECT
member_id,
member_host,
member_port,
member_role,
member_state
FROM performance_schema.replication_group_members
WHERE channel_name = 'group_replication_applier';
"
预期输出:三个节点都是ONLINE
查看主节点
docker exec mysql-01 mysql -uroot -p'YourStr0ng!Pass' -h127.0.0.1 -e "
SELECT member_id, member_host, member_role
FROM performance_schema.replication_group_members
WHERE member_role = 'PRIMARY';
"
数据复制测试
# 在Primary写入
docker exec mysql-01 mysql -uroot -p'YourStr0ng!Pass' -h127.0.0.1 -e "
USE app_db;
INSERT INTO test_mgr (content) VALUES ('Test at $(date)');
SELECT * FROM test_mgr;
"
# 在Secondary验证
docker exec mysql-02 mysql -uroot -p'YourStr0ng!Pass' -h127.0.0.1 -e "
USE app_db;
SELECT * FROM test_mgr;
"
docker exec mysql-03 mysql -uroot -p'YourStr0ng!Pass' -h127.0.0.1 -e "
USE app_db;
SELECT * FROM test_mgr;
"
全链路测试
通过VIP访问PHP服务
# 测试1:基本请求
curl -I http://172.20.1.100/
# 测试2:PHP请求
curl http://172.20.1.100/index.php | grep -i "php"
# 测试3:健康检查
curl http://172.20.1.100/health
测试负载均衡
# 多次请求,观察upstream切换
for i in {1..10}; do
curl -s http://172.20.1.100/health
echo ""
done
测试故障转移
# 模拟Node1故障
docker stop mysql-01
# 观察VIP是否漂移到Node2
sleep 5
docker exec keepalived ip addr show eth0
# 查看MGR状态
docker exec mysql-02 mysql -uroot -p'YourStr0ng!Pass' -h127.0.0.1 -e "
SELECT member_role FROM performance_schema.replication_group_members WHERE member_role='PRIMARY';
"
# 恢复Node1
docker start mysql-01
一键验证脚本
#!/bin/bash
# 完整验证脚本
echo "============================================"
echo " Docker容器化集群验证脚本"
echo "============================================"
# 获取当前节点hostname
NODE_NAME=$(hostname)
echo ""
echo "【1. 容器状态检查】"
echo "----------------------------------------"
# 根据节点名称设置对应的容器前缀
case "$NODE_NAME" in
*"node1"*|*"Node1"*|*"NODE1"*)
MYSQL_CONTAINER="mysql-01"
REDIS_CONTAINER="redis-master"
;;
*"node2"*|*"Node2"*|*"NODE2"*)
MYSQL_CONTAINER="mysql-02"
REDIS_CONTAINER="redis-slave"
;;
*"node3"*|*"Node3"*|*"NODE3"*)
MYSQL_CONTAINER="mysql-03"
REDIS_CONTAINER="redis-slave"
;;
*)
MYSQL_CONTAINER="mysql-01"
REDIS_CONTAINER="redis-master"
;;
esac
for container in nginx-lb keepalived php php-fpm $REDIS_CONTAINER sentinel-01 $MYSQL_CONTAINER; do
status=$(docker ps --filter "name=$container" --format "{{.Status}}" 2>/dev/null)
if [ -n "$status" ]; then
echo "✓ $container: $status"
else
echo "✗ $container: 未运行"
fi
done
echo ""
echo "【2. VIP检查】"
echo "----------------------------------------"
vip=$(docker exec keepalived ip addr show eth0 2>/dev/null | grep "172.20.1.100")
if [ -n "$vip" ]; then
echo "✓ VIP 172.20.1.100 已绑定"
else
echo "✗ VIP未绑定"
fi
echo ""
echo "【3. 健康检查】"
echo "----------------------------------------"
echo "Nginx-LB:"
curl -s http://172.20.1.11/health && echo ""
curl -s http://172.20.1.12/health && echo ""
curl -s http://172.20.1.13/health && echo ""
echo "PHP服务:"
curl -s http://172.20.2.11/health && echo ""
curl -s http://172.20.2.12/health && echo ""
curl -s http://172.20.2.13/health && echo ""
echo "Redis:"
docker exec $REDIS_CONTAINER redis-cli -a 'YourStr0ng!Pass' ping 2>/dev/null
echo "Sentinel:"
docker exec sentinel-01 redis-cli -p 26379 ping 2>/dev/null
echo "MySQL:"
docker exec $MYSQL_CONTAINER mysqladmin -uroot -p'YourStr0ng!Pass' ping -h127.0.0.1 2>/dev/null
echo ""
echo "【4. MGR状态检查】"
echo "----------------------------------------"
docker exec $MYSQL_CONTAINER mysql -uroot -p'YourStr0ng!Pass' -h127.0.0.1 -e "
SELECT member_host, member_role, member_state
FROM performance_schema.replication_group_members
WHERE channel_name = 'group_replication_applier';
" 2>/dev/null
echo ""
echo "【5. Redis复制状态】"
echo "----------------------------------------"
docker exec $REDIS_CONTAINER redis-cli -a 'YourStr0ng!Pass' info replication 2>/dev/null | grep -E "role:|connected_slaves:"
echo ""
echo "============================================"
echo " 验证完成"
echo "============================================"
常见问题排查
问题1:容器启动失败
# 查看容器日志
docker logs <container_name>
# 查看Docker日志
journalctl -u docker -f
问题2:网络不通
# 检查网络是否存在
docker network ls | grep -E "frontend|backend|cache|database"
# 检查网络详情
docker network inspect frontend-net
问题3:VIP无法绑定
# 检查网卡状态
ip link show ens33
# 检查Keepalived日志
docker logs keepalived
下一步
-
13-快速部署.md - 完整部署脚本
-
14-运维手册.md - 日常运维指南