Lars負(fù)載均衡遠(yuǎn)程服務(wù)器調(diào)度系統(tǒng)
Lars 是一個簡單、易用、高性能的服務(wù)間遠(yuǎn)程調(diào)用管理、調(diào)度、負(fù)載均衡系統(tǒng)。
(Load balance And Remote service schedule System)
一、系統(tǒng)開發(fā)環(huán)境:
Linux : Ubuntu18.04
protobuf : libprotoc 3.6.1版本及以上
mysql: mysql Ver 14.14 Distrib 5.7.27 版本及以上
g++: (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0 版本及以上
二、開發(fā)技術(shù)文檔及教程
PC端文檔
《Lars-基于C++負(fù)載均衡遠(yuǎn)程服務(wù)器調(diào)度系統(tǒng)教程》
三、概述:
Lars 是一個簡單、易用、高性能的服務(wù)間遠(yuǎn)程調(diào)用管理、調(diào)度、負(fù)載均衡系統(tǒng)。
1) 優(yōu)勢
-
性能強悍
集群支持千萬并發(fā)鏈接,滿足用戶的海量業(yè)務(wù)訪問需求。
-
高可用
采用集群化部署,支持多可用區(qū)的容災(zāi),無縫實時切換。
-
靈活擴(kuò)展
自動分發(fā),與彈性伸縮無縫集成,靈活擴(kuò)展用戶用于的對外服務(wù)能力。
-
簡單易用
快速部署、實時生效,支持多種協(xié)議,多種調(diào)度算法,用戶可以高效的管理和調(diào)整服務(wù)分發(fā)策略等。
2) 應(yīng)用場景
(1)、大型門戶網(wǎng)站
? 針對大型門戶網(wǎng)站訪問量高的特點,通過彈性負(fù)載均衡將用戶的訪問流量均勻的分發(fā)到多個后端云服務(wù)器上,確保業(yè)務(wù)快速平穩(wěn)的運行
優(yōu)勢
-
靈活擴(kuò)展
可根據(jù)實際的用戶訪問量,自動擴(kuò)展負(fù)載分發(fā)能力
-
高性能
集群支持高并發(fā)連接,滿足海量訪問量訴求
(2)、跨可用區(qū)同城容災(zāi)
? 彈性負(fù)載均衡可將流量跨可用區(qū)進(jìn)行分發(fā),建立實時的同城容災(zāi)機(jī)制,滿足銀行貿(mào)易等企業(yè)對系統(tǒng)的高可用性要求。
優(yōu)勢
-
靈活擴(kuò)展
可根據(jù)實際的用戶訪問量,自動擴(kuò)展負(fù)載分發(fā)能力
-
同城容災(zāi)
支持跨可用區(qū)的雙活容災(zāi),實現(xiàn)無縫實時切換
(3)、電商搶購
? 電商業(yè)務(wù)呈現(xiàn)出較強的潮汐效應(yīng)。Lars通過和彈性伸縮等服務(wù)的無縫集成,自動創(chuàng)建后端云服務(wù)器,將流量自動分發(fā)到新的云服務(wù)器,緩解了促銷高峰時期的系統(tǒng)壓力。
優(yōu)勢
-
彈性伸縮
根據(jù)業(yè)務(wù)流量實時創(chuàng)建或移除云服務(wù)器
-
高可用
通過健康檢查快速屏蔽異常云服務(wù)器,確保業(yè)務(wù)高可用
-
高性能
集群支持高并發(fā)連接,滿足海量訪問量訴求
3) Lars系統(tǒng)總體架構(gòu)
? 對于一個部門的后臺,為增強靈活性,一個服務(wù)可以被抽象為命令字:modid+cmdid的組合,稱為一個模塊,而這個服務(wù)往往有多個服務(wù)節(jié)點,其所有服務(wù)節(jié)點的地址集合被稱為這個模塊下的路由,節(jié)點地址簡稱為節(jié)點
-
modid:標(biāo)識業(yè)務(wù)的大類,如:“直播列表相關(guān)” -
cmdid:標(biāo)識具體服務(wù)內(nèi)容,如:“批量獲取直播列表”? 業(yè)務(wù)代碼利用modid,cmdid,就可以調(diào)用對應(yīng)的遠(yuǎn)程服務(wù)一個Lars系統(tǒng)包含一個DNSService,一個Report Service,以及部署于每個服務(wù)器的LoadBalance Agent,業(yè)務(wù)代碼通過API與Lars系統(tǒng)進(jìn)行交互
API :根據(jù)自身需要的modid,cmdid,向Lars系統(tǒng)獲取節(jié)點、匯報節(jié)點調(diào)用結(jié)果;提供C++、Golang(開發(fā)中...)、Python(開發(fā)中...)接口
LoadBalance Agent:運行于每個服務(wù)器上,負(fù)責(zé)為此服務(wù)器上的業(yè)務(wù)提供節(jié)點獲取、節(jié)點狀態(tài)匯報、路由管理、負(fù)載調(diào)度等核心功能
DNSService : 運行于一臺服務(wù)器上(也可以用LVS部署多實例防單點),負(fù)責(zé)modid,cmdid到節(jié)點路由的轉(zhuǎn)換
Report Service : 運行于DNSService同機(jī)服務(wù)器上,負(fù)責(zé)收集各modid,cmdid下各節(jié)點調(diào)用狀況,可用于觀察、報警
modid,cmdid數(shù)據(jù)由Mysql管理,具體SQL腳本在common/sql路徑下 至于modid,cmdid的注冊、刪除可以利用Web端操作MySQL。
如圖,每個服務(wù)器(虛線)部署了一臺LoadBalance Agent,以及多個業(yè)務(wù)服務(wù)
- 開發(fā)者在Web端注冊、刪除、修改
modid,cmdid的路由信息,信息被寫入到MySQL數(shù)據(jù)庫; - 服務(wù)器上每個業(yè)務(wù)biz都把持著自己需要通信的遠(yuǎn)程服務(wù)標(biāo)識
modid+cmdid,每個biz都向本機(jī)LoadBalance Agent獲取遠(yuǎn)程節(jié)點,進(jìn)而可以和遠(yuǎn)程目標(biāo)服務(wù)通信,此外業(yè)務(wù)模塊會匯報本次的節(jié)點調(diào)用結(jié)果給LoadBalance Agent; - LoadBalance Agent負(fù)責(zé)路由管理、負(fù)載均衡等核心任務(wù),并周期性向DNSService獲取最新的路由信息,周期性把各
modid,cmdid的各節(jié)點一段時間內(nèi)的調(diào)用結(jié)果傳給Report Service - DNSService監(jiān)控MySQL,周期性將最新路由信息加載出來;
- Report Service將各
modid,cmdid的各節(jié)點一段時間內(nèi)的調(diào)用結(jié)果寫回到MySQL,方便Web端查看、報警。
四、快速開始
(1) 編譯及安裝
代碼下載
git clone https://github.com/aceld/Lars.git
編譯
cd ./Lars
make
(2) 數(shù)據(jù)庫配置
創(chuàng)建表
cd ./Lars/base/sql
進(jìn)入`mysql`,導(dǎo)入表`lars_dns.sql`文件
mysql -u root -p
#輸入密碼
mysql> source ./lars_dns.sql
(3) 各子系統(tǒng)配置文檔
lars reporter
./Lars/lars_reporter/conf/lars_reporter.conf
[reactor]
maxConn = 1024
threadNum = 5
ip = 127.0.0.1
port = 7779
[mysql]
db_host = 127.0.0.1
db_port = 3306
db_user = root
db_passwd = **Your PassWord**
db_name = lars_dns
[repoter]
db_thread_cnt = 3
lars dns
./Lars/lars_dns/conf/lars_dns.conf
[reactor]
maxConn = 1024
threadNum = 5
ip = 127.0.0.1
port = 7778
[mysql]
db_host = 127.0.0.1
db_port = 3306
db_user = root
db_passwd = **Your PassWord**
db_name = lars_dns
lars LoadBalance Agent
./Lars/lars_loadbalance_agent/conf/lars_lb_agent.conf
[reporter]
ip = 127.0.0.1
port = 7779
[dnsserver]
ip = 127.0.0.1
port = 7778
[loadbalance]
;經(jīng)過若干次獲取請求host節(jié)點后,試探選擇一次overload過載節(jié)點
probe_num=10
;初始化host_info主機(jī)信息訪問成功的個數(shù),防止剛啟動時少量失敗就認(rèn)為過載
init_succ_cnt=180
;當(dāng)idle節(jié)點切換至over_load時的初始化失敗次數(shù),主要為了累計一定成功次數(shù)才能切換會idle
init_err_cnt=5
;當(dāng)idle節(jié)點失敗率高于此值,節(jié)點變overload狀態(tài)
err_rate=0.1
;當(dāng)overload節(jié)點成功率高于此值,節(jié)點變成idle狀態(tài)
succ_rate=0.5
;當(dāng)idle節(jié)點連續(xù)失敗次數(shù)超過此值,節(jié)點變成overload狀態(tài)
contin_err_limit=15
;當(dāng)overload節(jié)點連續(xù)成功次數(shù)超過此值, 節(jié)點變成idle狀態(tài)
contin_succ_limit=15
;整個窗口的真實失敗率閾值
window_err_rate=0.7
;對于某個modid/cmdid下的某個idle狀態(tài)的host,需要清理一次負(fù)載信息的周期
idle_timeout=15
;對于某個modid/cmdid/下的某個overload狀態(tài)的host,在過載隊列等待的最大時間
overload_timeout=15
;對于每個NEW狀態(tài)的modid/cmdid,多久更新一下本地路由,秒
update_timeout=15
(4)啟動
啟動 lars reporter serivce
cd ./Lars
./run_lars reporter
啟動 lars dns service
cd ./Lars
./run_lars dns
啟動 lars lbagent service
cd ./Lars
./run_lars lbagent
啟動 lars web service
cd ./Lars
./run_lars web
(5) Web管理端操作
打開瀏覽器,輸入web 服務(wù)的ip地址+端口號
配置主機(jī)
查看所有主機(jī)配置
(6) 模擬效果測試
啟動模擬器測試
cd ./Lars
./run_lars test simulator 1 1
更多測試工具
cd ./Lars
./run_lars help
=======啟動子系統(tǒng)========== Usage ./run_lars [reporter|dns|lbagent|web|test] =======測試工具============ Usage ./run_lars test gethost ModID CmdID Usage ./run_lars test getroute ModID CmdID Usage ./run_lars test report ModID CmdID IP Port 0|1 --- 0:SUCC, 1:OVERLOAD Usage ./run_lars test simulator ModID CmdID [errRate(0-10)] [queryCnt(0-999999)] Usage ./run_lars test qps ThreadNum Usage ./run_lars test example ModID CmdID
(7)Web查看主機(jī)調(diào)用狀態(tài)
五、Lars QPS性能測試
主機(jī)1
CPU個數(shù):2個 , 內(nèi)存: 2GB , 系統(tǒng):Ubuntu18.04虛擬機(jī)
| 線程數(shù) | QPS |
|---|---|
| 1 | 0.5w/s |
| 2 | 2.2w/s |
| 10 | 5.5w/s |
| 100 | 5.3w/s |
主機(jī)2
CPU個數(shù): 24個 , 內(nèi)存:128GB, 系統(tǒng): 云主機(jī)
| 線程數(shù) | QPS |
|---|---|
| 1 | 8.36w/s |
| 3 | 28.06w/s |
| 5 | 55.18w/s |
| 8 | 56.74w/s |
