一、前言
使用Proxy 伺服器 HAProxy 對 Mysql 做負載平衡是常用方案,為提高可用性,當某個 Mysql 出現問題時,例如伺服器故障了,或者資料複製中斷了,最好可以讓 HAProxy 馬上知道,然後停止向其轉寄請求
HAProxy 如何知道 Mysql 是否有問題呢?
二、解決思路
(1)編寫一個shell指令碼,檢查 mysql 的狀態,然後輸出結果,例如狀態正常時,返回狀態代碼200及正確資訊,否則返回狀態代碼503及錯誤資訊
(2)實現一個HTTP服務,有請求串連後,調用上面的檢查指令碼,返回檢查結果
(3)HAProxy 訪問這個HTTP服務,根據返回的結果資訊來判斷這個 mysql 是否可用
如何方便快速的實現一個可以調用shell指令碼的HTTP服務呢?
比較通用的方案就是 xinetd
xinetd 是 Linux 的守護進程,全稱為 extended interent daemon,擴充的網路守護進程
xinetd 可以開啟一個連接埠,等待串連,你可以告訴 xinetd 運行哪個指令碼,當有串連進來後,xinetd 便會執行指令碼,然後直接返回指令碼輸出的內容
HAProxy -> xinetd -> mysql-check
指令碼,HAProxy 便取得了mysql的狀態資訊
xinetd 的配置案例
下面實現一個簡單的 xinetd 樣本,開放 9200 連接埠,返回一個測試指令碼的輸出內容
如果機器上還沒有 xinetd,先安裝一下,centos7 下可以使用命令 yum install xinetd
(1)測試指令碼
#!/bin/bashecho `uptime | egrep -o 'up ([0-9]+) days' | awk '{print $2}'`
這個指令碼用來輸出當前伺服器的線上天數
用 chmod +x
給指令碼添加可執行許可權
(2)編寫 xinetd 服務
例如服務名為 helloworld
,檔案名稱 /etc/xinetd.d/helloworld
,內容為
service helloworld{disable = noport = 9200socket_type = streamprotocol = tcpwait = nouser = rootserver = /root/test.shserver_args = test}
port
指定監聽的連接埠
server
指定要執行的指令碼
(3)加入服務列表
修改 /etc/services
找到定義 9200 連接埠的位置,注釋掉原有的,添加 helloworld
服務
helloworld 9200/tcp#wap-wsp 9200/tcp#wap-wsp 9200/udp
(4)重啟 xinetd
centos 下的重啟命令為:
systemctl restart xinetd.service
(5)測試
分別用 nc
和 telnet
兩個命令測試一下
可以正確輸出指令碼執行內容,完成樣本
總結
Linux shell實現HTTP服務的內容到這就基本結束了,希望對大家的工作和學習能有所協助,如果有疑問可以留言討論。