openstack api 有 nova neutron cinder keystone glance 等
这些服务都依赖 keepalived 和 haproxy,那么如何实现这些 vip 相关的检查呢?
1. 首先看下 keepalived 的检查脚本设计:
bash
# docker/keepalived/check_alive.sh
#!/bin/bash
# This will return 0 when it successfully passes all checks for all daemons
# Failures return 1
declare -A check_results
final_result=0
if [ -d "/checks" ]; then
CHECKS=$(find /checks -type f)
fi
if [ "${CHECKS}" ]; then
# Store results
for check in ${CHECKS}; do
# Run check but do not print stderr
# as single check can be executed manually to see the result
${check} 2>/dev/null
check_results[${check}]=$?
done
# Print results and save the final result
for i in "${!check_results[@]}"; do
if [ "${check_results[$i]}" == "0" ]; then
echo "Keepalived check script ${i} succeeded."
else
final_result=1
echo "Keepalived check script ${i} failed."
fi
done
exit ${final_result}
fi
这段 Bash 脚本的主要目的是执行并检查位于 /checks 目录中的所有检查脚本的运行结果,并根据其执行结果返回成功或失败。
声明一个关联数组 check_results 用于存储每个检查脚本的结果(成功或失败)。
执行每个检查脚本并存储结果:
2. 看下 /checks 目录下的脚本


bash
# ansible/roles/loadbalancer/templates/keepalived/check_alive_proxysql.sh.j2
#!/bin/bash
# This will return 0 when it successfully talks to the ProxySQL daemon via localhost
# Failures return 1
echo "show info" | socat unix-connect:/var/lib/kolla/proxysql/admin.sock stdio > /dev/null
# /root/g/kolla-ansible/ansible/roles/loadbalancer/templates/keepalived/check_alive_proxysql.sh.j2
#!/bin/bash
# This will return 0 when it successfully talks to the ProxySQL daemon via localhost
# Failures return 1
echo "show info" | socat unix-connect:/var/lib/kolla/proxysql/admin.sock stdio > /dev/null
3. keepalived 检查脚本机制总结
目的:
check_alive.sh 用于监测一系列健康检查脚本是否成功,以确保服务的可用性(例如 ProxySQL)。
结果汇总:
每个检查的结果被记录在关联数组中,并在脚本的最后根据个别检查的结果计算最终的成功或失败状态。
可扩展性:
通过将单独的检查脚本放在 /checks 目录中,用户可以很方便地增加或修改检查,而无需改变主脚本的代码逻辑。
错误处理:
通过将标准错误输出重定向到 /dev/null,脚本保证了单个失败的检查不会影响其他检查的输出,从而方便调试和管理。