[Lars源代码](https://github.com/aceld/Lars)
https://github.com/aceld/Lars
# **Lars**
(**L**oad balance **A**nd **R**emote service schedule **S**ystem)
# 系统开发环境:
`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 版本及以上
# 第1章-概述
Lars是一个简单、易用、高性能的服务间远程调用管理、调度、负载均衡系统。
## 1) 优势
1. **性能强悍**
集群支持千万并发链接,满足用户的海量业务访问需求。
2. **高可用**
采用集群化部署,支持多可用区的容灾,无缝实时切换。
3. **灵活扩展**
自动分发,与弹性伸缩无缝集成,灵活扩展用户用于的对外服务能力。
4. **简单易用**
快速部署、实时生效,支持多种协议,多种调度算法,用户可以高效的管理和调整服务分发策略等。
## 2) 应用场景
### (1)、大型门户网站
针对大型门户网站访问量高的特点,通过弹性负载均衡将用户的访问流量均匀的分发到多个后端云服务器上,确保业务快速平稳的运行
#### 优势
- 灵活扩展
可根据实际的用户访问量,自动扩展负载分发能力
- 高性能
集群支持高并发连接,满足海量访问量诉求
![](https://img.kancloud.cn/66/73/667380163be0e1bd1e73523aa7204fa2_731x671.png)
### (2)、跨可用区同城容灾
弹性负载均衡可将流量跨可用区进行分发,建立实时的同城容灾机制,满足银行贸易等企业对系统的高可用性要求。
#### 优势
- 灵活扩展
可根据实际的用户访问量,自动扩展负载分发能力
- 同城容灾
支持跨可用区的双活容灾,实现无缝实时切换
![](https://img.kancloud.cn/32/8a/328a0b33bc530e9d1514ef944dab4a37_1092x711.png)
### (3)、电商抢购
电商业务呈现出较强的潮汐效应。Lars通过和弹性伸缩等服务的无缝集成,自动创建后端云服务器,将流量自动分发到新的云服务器,缓解了促销高峰时期的系统压力。
#### 优势
- 弹性伸缩
根据业务流量实时创建或移除云服务器
- 高可用
通过健康检查快速屏蔽异常云服务器,确保业务高可用
- 高性能
集群支持高并发连接,满足海量访问量诉求
![](https://img.kancloud.cn/5a/b8/5ab84077f370141ee37e00bb2ebd6d7c_1071x721.png)
## 3) Lars系统总体架构
对于一个部门的后台,为增强灵活性,一个服务可以被抽象为命令字:`modid+cmdid`的组合,称为**一个模块**,而这个服务往往有多个服务节点,其所有服务节点的地址集合被称为这个模块下的**路由**,节点地址简称为节点
- `modid`:标识业务的大类,如:“直播列表相关”
- `cmdid`:标识具体服务内容,如:“批量获取直播列表”
业务代码利用modid,cmdid,就可以调用对应的远程服务一个Lars系统包含一个DNSService,一个Report Service,以及部署于每个服务器的LoadBalance Agent,业务代码通过API与ELB系统进行交互
**API** :根据自身需要的`modid,cmdid`,向ELB系统获取节点、汇报节点调用结果;提供`C++`、`Java`、`Python`接口
**LoadBalance Agent**:运行于每个服务器上,负责为此服务器上的业务提供节点获取、节点状态汇报、路由管理、负载调度等核心功能
**DNSService** : 运行于一台服务器上(也可以用LVS部署多实例防单点),负责`modid,cmdid`到节点路由的转换
**Report Service** : 运行于DNSService同机服务器上,负责收集各`modid,cmdid`下各节点调用状况,可用于观察、报警
`modid,cmdid`数据由`Mysql`管理,具体SQL脚本在`common/sql`路径下
至于`modid,cmdid`的注册、删除可以利用Web端操作MySQL。
![](https://img.kancloud.cn/1a/47/1a47522873f562dccbe08f45e60c131a_1211x880.png)
如图,每个服务器(虚线)部署了一台LoadBalance Agent,以及多个业务服务
1. 开发者在Web端注册、删除、修改`modid,cmdid`的路由信息,信息被写入到MySQL数据库;
2. 服务器上每个业务biz都把持着自己需要通信的远程服务标识`modid+cmdid`,每个biz都向本机LoadBalance Agent获取远程节点,进而可以和远程目标服务通信,此外业务模块会汇报本次的节点调用结果给LoadBalance Agent;
3. LoadBalance Agent负责路由管理、负载均衡等核心任务,并周期性向DNSService获取最新的路由信息,周期性把各`modid,cmdid`的各节点一段时间内的调用结果传给Report Service
4. DNSService监控MySQL,周期性将最新路由信息加载出来;
5. Report Service将各`modid,cmdid`的各节点一段时间内的调用结果写回到MySQL,方便Web端查看、报警。
---
### 关于作者:
作者:`Aceld(刘丹冰)`
mail: [danbing.at@gmail.com](mailto:danbing.at@gmail.com)
github: [https://github.com/aceld](https://github.com/aceld)
原创书籍: [https://www.kancloud.cn/@aceld](https://www.kancloud.cn/@aceld)
![](https://img.kancloud.cn/b0/d1/b0d11a21ba62e96aef1c11d5bfff2cf8_227x227.jpg)
>**原创声明:未经作者允许请勿转载, 如果转载请注明出处**
- 一、Lars系统概述
- 第1章-概述
- 第2章-项目目录构建
- 二、Reactor模型服务器框架
- 第1章-项目结构与V0.1雏形
- 第2章-内存管理与Buffer封装
- 第3章-事件触发EventLoop
- 第4章-链接与消息封装
- 第5章-Client客户端模型
- 第6章-连接管理及限制
- 第7章-消息业务路由分发机制
- 第8章-链接创建/销毁Hook机制
- 第9章-消息任务队列与线程池
- 第10章-配置文件读写功能
- 第11章-udp服务与客户端
- 第12章-数据传输协议protocol buffer
- 第13章-QPS性能测试
- 第14章-异步消息任务机制
- 第15章-链接属性设置功能
- 三、Lars系统之DNSService
- 第1章-Lars-dns简介
- 第2章-数据库创建
- 第3章-项目目录结构及环境构建
- 第4章-Route结构的定义
- 第5章-获取Route信息
- 第6章-Route订阅模式
- 第7章-Backend Thread实时监控
- 四、Lars系统之Report Service
- 第1章-项目概述-数据表及proto3协议定义
- 第2章-获取report上报数据
- 第3章-存储线程池及消息队列
- 五、Lars系统之LoadBalance Agent
- 第1章-项目概述及构建
- 第2章-主模块业务结构搭建
- 第3章-Report与Dns Client设计与实现
- 第4章-负载均衡模块基础设计
- 第5章-负载均衡获取Host主机信息API
- 第6章-负载均衡上报Host主机信息API
- 第7章-过期窗口清理与过载超时(V0.5)
- 第8章-定期拉取最新路由信息(V0.6)
- 第9章-负载均衡获取Route信息API(0.7)
- 第10章-API初始化接口(V0.8)
- 第11章-Lars Agent性能测试工具
- 第12章- Lars启动工具脚本