服务器批量修改代码,利用Redis实现多服务器批量操作
工作中遇到一個(gè)項(xiàng)目需要在多個(gè)平臺(tái)編譯打包,每次都需要登錄到不同的服務(wù)器同步代碼,編譯,打包,上傳,非常麻煩,于是想為何不能一次操作,多臺(tái)服務(wù)器自動(dòng)執(zhí)行呢。
網(wǎng)上找了下,有很多解決方案,但是都比較麻煩,最后想到了用redis的消息訂閱實(shí)現(xiàn)該功能, 方法很簡(jiǎn)單,只需要一個(gè)redis提供服務(wù)就可以,如果希望將功能web化,可以再加一個(gè)nginx服務(wù),
實(shí)現(xiàn)方法如下:
1. 假設(shè)有三臺(tái)服務(wù)器A,B,C,需要執(zhí)行相同的指令,可以在A機(jī)器上安裝一個(gè)redis-server, 一個(gè)nginx(帶redis2-nginx-module模塊), nginx訪問redis方法很簡(jiǎn)單只需要參考官方教程就可以了。
2. 修改redis源碼文件redis-cli.c 在main函數(shù)任意位置添加該語(yǔ)句 `setvbuf(stdout, (char *)NULL, _IOLBF, 0);` 設(shè)置緩存區(qū)區(qū)為行緩存,這個(gè)很有必要,然后分別在A,B,C三臺(tái)服務(wù)器編譯一個(gè)redis-cli,用作redis客戶端.
3. 編寫腳本:
3.1 start.sh
#!/usr/bin/bash
while true;do
./redis-cli ?-h $A UBSCRIBE ?command_channel | xargs -i -exec sh command.sh {} ;
done
3.2 command.sh
#!/usr/bin/bash
input=($1)
case ${input[0]} in;
update)
update $@ | ./redis-cli -x ?set command_result_$IP
;;
*)
;;
esac
4. 運(yùn)行腳本
在A,B,C三臺(tái)服務(wù)器建立一個(gè)目錄,將start.sh command.sh redis-cli放在同一個(gè)目錄下,
nohup sh start.sh &分別執(zhí)行該命令啟動(dòng)腳本
5. 發(fā)布命令
在任意服務(wù)器上執(zhí)行 `./redis-cli -h $A publish?command_channel update` 發(fā)布一個(gè)任務(wù),將分發(fā)到A,B,C三臺(tái)服務(wù)器上, 三臺(tái)服務(wù)器
6. 題外話
我在實(shí)際環(huán)境上是利用nginx 提供的http服務(wù),發(fā)送命令給redis, 寫了個(gè)簡(jiǎn)單的web頁(yè)面,實(shí)現(xiàn)任務(wù)分發(fā), 并將處理結(jié)果保存到redis, ?前端通過nginx 從redis中獲取command_result_$IP中的值,作為處理結(jié)果,其中$IP為當(dāng)前機(jī)器IP,或者其他唯一識(shí)別該機(jī)器的編號(hào).
后面還實(shí)現(xiàn)升級(jí)功能,將command.sh 放在web服務(wù)器上供A,B,C下載,并在command.sh中實(shí)現(xiàn)update功能(1.重命名本地command.sh, 2.在nginx上下載新的command.sh, 下一次命令就會(huì)執(zhí)行新的command.sh), 以這種方式,在不遠(yuǎn)程連接服務(wù)器的情況下,實(shí)現(xiàn)對(duì)多臺(tái)服務(wù)器的同時(shí)操作的功能, 后面只需要修改command.sh 就可以添加各種命令,實(shí)現(xiàn)各種操作
總結(jié)
以上是生活随笔為你收集整理的服务器批量修改代码,利用Redis实现多服务器批量操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 吃不上四个菜是啥意思?
- 下一篇: mysql数据存储到指定位置_Mysql