鑒于杰克公司部分系統偶爾宕機,造成一定的生產影響,做了這套雙機系統,完整代碼有空再更,不足之處歡迎指出
可視化頁面路由管理頁面,支持多臺軟體服務器
支持實時添加軟體服務器,修改和洗掉操作,包含服務器掉線短信提醒功能
效果圖,技術原理圖


目錄
采取keepalived+openresty+redis節點同時部署在一臺服務器的策略,路由服務原子性+動態代理的高效性
1.雙機容災(雙機熱備基于keepalived)的實作
1.keepalived的yum安裝和基礎指令
yum install -y curl gcc openssl-devel libnl3-devel net-snmp-devel
yum install -y keepalived
systemctl enable keepalived自啟
systemctl start keepalived啟動
systemctl stop keepalived關閉
systemctl restart keepalived重啟
2.keepalived基礎配置詳解
***
! Configuration File for keepalived
global_defs {
notification_email { #可自行配置郵箱提醒,
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id nginx01 # router_id 唯一識別符號
vrrp_skip_check_adv_addr
vrrp_stricti #使用yum安裝的話,這里需要注釋掉,不然無法訪問
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script check_nginx {
script "/etc/keepalived/nginx_check.sh" #nginx服務檢查腳本
interval 1 #檢測間隔要大于sh腳本中的sleep時間
weight -2
}
vrrp_instance VI_1 {
state MASTER #從機設定為BACKUP
interface enp0s3 #網卡
virtual_router_id 52 #默認為51 配置完發現主備切換有問題 更改為52 發現好了 原因未知
priority 200 #主備的優先級priority
advert_int 1 #檢查時間1秒
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
check_nginx
}
virtual_ipaddress {
192.168.56.201/24 #vip地址
}
}
}
***
3.監測腳本nginx_check.sh
***
#檢測nginx服務是否正常
if [ $(netstat -tlnp|grep nginx|wc -l) -ne 1 ]
then
#嘗試重啟nginx
systemctl start nginx
sleep 2
#再次檢測
if [ $(netstat -tlnp|grep nginx|wc -l) -ne 1 ]
then
#nginx啟動失敗-->停止當前keepalived,自動切換到另一臺路由服務器
systemctl stop keepalived
fi
fi
#檢測redis和哨兵是否運行
if [ $(netstat -tlnp|grep redis|wc -l) -ne 2 ]
then
#嘗試啟動redis和哨兵
systemctl start redis
systemctl start redis-sentinel
sleep 2
if [ $(netstat -tlnp|grep redis|wc -l) -ne 2 ]
then
#啟動失敗-->關停當前keepalived
systemctl stop keepalived
fi
fi
***
2.動態代理的實作(openresty的使用)
動態代理由nginx+lua+redis實作,java監測模塊進行監測
基于openresty平臺,暫不做openresty基礎介紹,后續開篇博客介紹,
1.nginx.conf引入lua.conf
include lua/lua.conf;
2.lua.conf配置
server {
listen 80;
server_name _;
location / {
proxy_set_header Host $host;
lua_code_cache off;
resolver 8.8.8.8;
set $backend '';
set $errurl '';
rewrite_by_lua_file conf/lua/redis_url.lua;
proxy_pass http://$backend;
}
}
3.redis_url.lua配置
--關閉redis
local function close_redis(red)
if not red then
return
end
local ok, err = red:close()
if not ok then
ngx.say("close redis error : ", err)
end
end
--開始redis
local redis = require("resty.redis")
--創建實體
local red = redis:new()
--設定超時(毫秒)
red:set_timeout(1000)
--建立連接
local ip = "192.168.0.185" --ip
local port = 6379 --埠號
local ok, err = red:connect(ip, port)
--redis密碼驗證,沒有的話,可以不寫
local a,b=red:auth("密碼") --redis密碼
if not ok then
ngx.say("connect to redis error : ", res)
return close_redis(red)
end
local res, err = red
if not res then
ngx.say("failed to authenticate: ", err)
return
end
--呼叫API獲取資料
local resp, err = red:get("自定義key") --自定義key
if not resp then
ngx.say("get msg error : ", err)
return close_redis(red)
end
--得到的資料為空處理
if resp == ngx.null then
resp = '' --比如默認值
end
ngx.var.backend=resp
--最后呼叫關閉redis
close_redis(red)
4.java檢測服務并寫入redis,前臺可視化添加服務器
后端 https://github.com/zhengbo199317/RouteManager
前端 https://gitee.com/super_bo/routing-control-system-front
3.基于動態代理,實作負載均衡
暫不公開,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/233990.html
標籤:其他
上一篇:Flutter 常用功能合集
