我在MySQL组复制设置之前有一个DO负载平衡器设置。我需要做的是通过http请求为负载均衡器创建运行状况检查。
到目前为止,我想出的是创建一个bash脚本(下面的代码),该脚本基本上检查MySQL是否已启动并正在运行,然后通过xinetd在端口9201上运行它。
但是,当我从另一台服务器卷曲到http://ip:port时,它永远不会从bash文件中读取任何输出,而只会被对等方重置连接(在连接和超时后)。
我对这一切都是新手,所以我不确定我所做的一切是否正确。
service mysqlchk
{
flags = REUSE
socket_type = stream
protocol = tcp
port = 9201
wait = no
user = root
server = /opt/mysqlchk.sh
disable = no
log_type = FILE /var/log/xinetd.log
log_on_success = DURATION EXIT HOST PID USERID
log_on_failure = ATTEMPT HOST USERID
only_from = 0.0.0.0/0
}
重击(在线找到)
MYSQL_HOST="ip"
MYSQL_PORT="3306"
MYSQL_USERNAME="user"
MYSQL_PASSWORD="=password"
#
# We perform a simple query that should return a few results :-p
ERROR_MSG=`/usr/bin/mysql --host=$MYSQL_HOST --port=$MYSQL_PORT --
user=$MYSQL_USERNAME --password=$MYSQL_PASSWORD -e "show databases;"
2>/dev/null`
#
# Check the output. If it is not empty then everything is fine and we
return
# something. Else, we just do not return anything.
#
if [ "$ERROR_MSG" != "" ]
then
# mysql is fine, return http 200
/bin/echo -e "HTTP/1.1 200 OK\r\n"
/bin/echo -e "Content-Type: Content-Type: text/plain\r\n"
/bin/echo -e "\r\n"
/bin/echo -e "MySQL is running.\r\n"
/bin/echo -e "\r\n"
else
# mysql is not fine, return http 503
/bin/echo -e "HTTP/1.1 503 Service Unavailable\r\n"
/bin/echo -e "Content-Type: Content-Type: text/plain\r\n"
/bin/echo -e "\r\n"
/bin/echo -e "MySQL is *down*.\r\n"
/bin/echo -e "\r\n"
fi
卷曲时返回什么:
curl -v http://ip:9201/
* Trying ip...
* TCP_NODELAY set
* Connected to ip (ip) port 9201 (#0)
> GET / HTTP/1.1
> Host: ip:9201
> User-Agent: curl/7.58.0
> Accept: */*
>
* Recv failure: Connection reset by peer
* stopped the pause stream!
* Closing connection 0
curl: (56) Recv failure: Connection reset by peer
我不确定是否是因为我对请求的响应不正确还是?
编辑:手动运行bash脚本会根据是否可以连接返回正确的输出。我认为bash本身并不存在语法错误,只是它可能响应http请求的方式。
答案 0 :(得分:0)
xinetd
侦听网络上的传入请求,并为该请求启动适当的服务。使用端口号作为标识符发出请求,xinetd通常会启动另一个守护程序来处理请求。
在这种情况下,您正在启动脚本。确保其可执行文件,具有正确的权限并添加相应的shebang
#! /bin/bash
然后尝试
telnet ip 9201
答案 1 :(得分:0)
如果在输出中得到太多的LF字符,则将echo -e
的出现更改为echo -ne
(或从每一行的末尾删除\n
)。
您可能还需要在输出中添加正确的Content-Length:
标头。
还要确保脚本可以在不依赖任何环境变量的情况下运行,例如$PATH
。
我使用这些函数在脚本中返回OK或FAIL响应:
return_ok()
{
echo -ne "HTTP/1.1 200 OK\r\n"
echo -ne "Content-Type: text/html\r\n"
echo -ne "Content-Length: 47\r\n"
echo -ne "\r\n"
echo -ne "<html><body>MySQL is running.</body></html>\r\n"
echo -ne "\r\n"
exit 0
}
return_fail()
{
echo -ne "HTTP/1.1 503 Service Unavailable\r\n"
echo -ne "Content-Type: text/html\r\n"
echo -ne "Content-Length: 46\r\n"
echo -ne "\r\n"
echo -ne "<html><body>MySQL is *down*.</body></html>\r\n"
echo -ne "\r\n"
exit 1
}