( L oad balance A nd R emote service schedule S ystem)
Linux : Ubuntu18.04
Linux
protobuf : libprotoc 3.6.1版本及以上
protobuf
mysql: mysql Ver 14.14 Distrib 5.7.27 版本及以上
mysql
g++: (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0 版本及以上
g++
Lars 是一个简单、易用、高性能的服务间远程调用管理、调度、负载均衡系统。
集群支持千万并发链接,满足用户的海量业务访问需求。
采用集群化部署,支持多可用区的容灾,无缝实时切换。
自动分发,与弹性伸缩无缝集成,灵活扩展用户用于的对外服务能力。
快速部署、实时生效,支持多种协议,多种调度算法,用户可以高效的管理和调整服务分发策略等。
针对大型门户网站访问量高的特点,通过弹性负载均衡将用户的访问流量均匀的分发到多个后端云服务器上,确保业务快速平稳的运行
可根据实际的用户访问量,自动扩展负载分发能力
集群支持高并发连接,满足海量访问量诉求
弹性负载均衡可将流量跨可用区进行分发,建立实时的同城容灾机制,满足银行贸易等企业对系统的高可用性要求。
支持跨可用区的双活容灾,实现无缝实时切换
电商业务呈现出较强的潮汐效应。Lars通过和弹性伸缩等服务的无缝集成,自动创建后端云服务器,将流量自动分发到新的云服务器,缓解了促销高峰时期的系统压力。
根据业务流量实时创建或移除云服务器
通过健康检查快速屏蔽异常云服务器,确保业务高可用
对于一个部门的后台,为增强灵活性,一个服务可以被抽象为命令字:modid+cmdid的组合,称为 一个模块 ,而这个服务往往有多个服务节点,其所有服务节点的地址集合被称为这个模块下的 路由 ,节点地址简称为节点
modid+cmdid
modid:标识业务的大类,如:“直播列表相关”
modid
cmdid:标识具体服务内容,如:“批量获取直播列表”
cmdid
业务代码利用modid,cmdid,就可以调用对应的远程服务一个Lars系统包含一个DNSService,一个Report Service,以及部署于每个服务器的LoadBalance Agent,业务代码通过API与Lars系统进行交互
API :根据自身需要的modid,cmdid,向Lars系统获取节点、汇报节点调用结果;提供C++、Golang(开发中…)、Python(开发中…)接口
modid,cmdid
C++
Golang
Python
LoadBalance Agent :运行于每个服务器上,负责为此服务器上的业务提供节点获取、节点状态汇报、路由管理、负载调度等核心功能
DNSService : 运行于一台服务器上(也可以用LVS部署多实例防单点),负责modid,cmdid到节点路由的转换
Report Service : 运行于DNSService同机服务器上,负责收集各modid,cmdid下各节点调用状况,可用于观察、报警
modid,cmdid数据由Mysql管理,具体SQL脚本在common/sql路径下 至于modid,cmdid的注册、删除可以利用Web端操作MySQL。
Mysql
common/sql
如图,每个服务器(虚线)部署了一台LoadBalance Agent,以及多个业务服务
代码下载
git clone https://github.com/aceld/Lars.git
编译
cd ./Lars make
创建表
cd ./Lars/base/sql 进入`mysql`,导入表`lars_dns.sql`文件 mysql -u root -p #输入密码 mysql> source ./lars_dns.sql
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] ;经过若干次获取请求host节点后,试探选择一次overload过载节点 probe_num=10 ;初始化host_info主机信息访问成功的个数,防止刚启动时少量失败就认为过载 init_succ_cnt=180 ;当idle节点切换至over_load时的初始化失败次数,主要为了累计一定成功次数才能切换会idle init_err_cnt=5 ;当idle节点失败率高于此值,节点变overload状态 err_rate=0.1 ;当overload节点成功率高于此值,节点变成idle状态 succ_rate=0.5 ;当idle节点连续失败次数超过此值,节点变成overload状态 contin_err_limit=15 ;当overload节点连续成功次数超过此值, 节点变成idle状态 contin_succ_limit=15 ;整个窗口的真实失败率阈值 window_err_rate=0.7 ;对于某个modid/cmdid下的某个idle状态的host,需要清理一次负载信息的周期 idle_timeout=15 ;对于某个modid/cmdid/下的某个overload状态的host,在过载队列等待的最大时间 overload_timeout=15 ;对于每个NEW状态的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
打开浏览器,输入web 服务的ip地址+端口号
配置主机
查看所有主机配置
启动模拟器测试
cd ./Lars ./run_lars test simulator 1 1
更多测试工具
cd ./Lars ./run_lars help =======启动子系统========== 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
主机1
CPU个数:2个 , 内存: 2GB , 系统:Ubuntu18.04虚拟机
主机2
CPU个数: 24个 , 内存:128GB, 系统: 云主机