1. 程式人生 > >Linux shell實現HTTP服務

Linux shell實現HTTP服務

需求場景

使用代理伺服器 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/bash

echo `uptime | egrep -o ‘up ([0-9]+) days’ | awk ‘{print $2}’`

這個指令碼用來輸出當前伺服器的線上天數

用 chmod +x 給指令碼新增可執行許可權

(2)編寫 xinetd 服務

例如服務名為 helloworld,檔名 /etc/xinetd.d/helloworld,內容為

service helloworld

{

disable = no

port    = 9200

socket_type     = stream

protocol        = tcp

wait            = no

user            = root

server          = /root/test.sh

server_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 兩個命令測試一下

nc localhost 9200

Linux shell

telnet localhost 9200

HTTP服務

可以正確輸出指令碼執行內容,完成示例

github 分享了自己是如何使用 HAProxy 感知 Mysql 的,有興趣的朋友可以仔細看一下,文章地址

http://githubengineering.com/context-aware-mysql-pools-via-haproxy/?utm_source=dbweekly&utm_medium=email

文:杜亦舒

文章出處:效能與架構(公眾號ID:yogoup)