V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sanbenweiyang
V2EX  ›  程序员

Lars-基于 C++负载均衡远程服务器调度系统(含详细开发教程)

  •  
  •   sanbenweiyang · 2019-12-12 09:49:58 +08:00 · 1269 次点击
    这是一个创建于 1590 天前的主题,其中的信息可能已经有所发展或是发生改变。

    (Load balance And Remote service schedule System)

    License Gitter ![Lars 详细教程]( https://img.shields.io/badge/Lars 详细教程-简书-red.svg)

    开发者


    Github

    Git: https://github.com/aceld/Lars

    码云(Gitee)

    Git: https://gitee.com/Aceld/Lars


    一、系统开发环境:

    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 版本及以上

    二、开发技术文档及教程

    ![Lars 详细教程]( https://img.shields.io/badge/Lars 详细教程-简书-red.svg)

    PC 端文档

    《 Lars-基于 C++负载均衡远程服务器调度系统教程》

    移动端文档

    gongzhonghao

    三、概述:

    Lars 是一个简单、易用、高性能的服务间远程调用管理、调度、负载均衡系统。

    1) 优势

    1. 性能强悍

      集群支持千万并发链接,满足用户的海量业务访问需求。

    2. 高可用

      采用集群化部署,支持多可用区的容灾,无缝实时切换。

    3. 灵活扩展

      自动分发,与弹性伸缩无缝集成,灵活扩展用户用于的对外服务能力。

    4. 简单易用

      快速部署、实时生效,支持多种协议,多种调度算法,用户可以高效的管理和调整服务分发策略等。

    2) 应用场景

    (1)、大型门户网站

    ​ 针对大型门户网站访问量高的特点,通过弹性负载均衡将用户的访问流量均匀的分发到多个后端云服务器上,确保业务快速平稳的运行

    优势

    • 灵活扩展

      可根据实际的用户访问量,自动扩展负载分发能力

    • 高性能

      集群支持高并发连接,满足海量访问量诉求

    Lars-1.png

    (2)、跨可用区同城容灾

    ​ 弹性负载均衡可将流量跨可用区进行分发,建立实时的同城容灾机制,满足银行贸易等企业对系统的高可用性要求。

    优势

    • 灵活扩展

      可根据实际的用户访问量,自动扩展负载分发能力

    • 同城容灾

      支持跨可用区的双活容灾,实现无缝实时切换

    Lars-场景 2.png

    (3)、电商抢购

    ​ 电商业务呈现出较强的潮汐效应。Lars 通过和弹性伸缩等服务的无缝集成,自动创建后端云服务器,将流量自动分发到新的云服务器,缓解了促销高峰时期的系统压力。

    优势

    • 弹性伸缩

      根据业务流量实时创建或移除云服务器

    • 高可用

      通过健康检查快速屏蔽异常云服务器,确保业务高可用

    • 高性能

      集群支持高并发连接,满足海量访问量诉求

    Lars-场景 3.png

    3) Lars 系统总体架构

    ​ 对于一个部门的后台,为增强灵活性,一个服务可以被抽象为命令字:modid+cmdid的组合,称为一个模块,而这个服务往往有多个服务节点,其所有服务节点的地址集合被称为这个模块下的路由,节点地址简称为节点

    • modid:标识业务的大类,如:“直播列表相关”

    • cmdid:标识具体服务内容,如:“批量获取直播列表”

      ​ 业务代码利用 modid,cmdid,就可以调用对应的远程服务一个 Lars 系统包含一个 DNSService,一个 Report Service,以及部署于每个服务器的 LoadBalance Agent,业务代码通过 API 与 Lars 系统进行交互

    API :根据自身需要的modid,cmdid,向 Lars 系统获取节点、汇报节点调用结果;提供C++Golang(开发中...)、Python(开发中...)接口

    LoadBalance Agent:运行于每个服务器上,负责为此服务器上的业务提供节点获取、节点状态汇报、路由管理、负载调度等核心功能

    DNSService : 运行于一台服务器上(也可以用 LVS 部署多实例防单点),负责modid,cmdid到节点路由的转换

    Report Service : 运行于 DNSService 同机服务器上,负责收集各modid,cmdid下各节点调用状况,可用于观察、报警

    modid,cmdid数据由Mysql管理,具体 SQL 脚本在common/sql路径下 至于modid,cmdid的注册、删除可以利用 Web 端操作 MySQL。

    1-Lars-总体架构设计.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 端查看、报警。

    四、快速开始

    (1) 编译及安装

    代码下载

        git clone https://github.com/aceld/Lars.git
    

    编译

        cd ./Lars
        make
    

    (2) 数据库配置

    创建表

        cd ./Lars/base/sql
    
    进入`mysql`,导入表`lars_dns.sql`文件
    
        mysql -u root -p
        #输入密码
    
    mysql> source ./lars_dns.sql
    

    (3) 各子系统配置文档

    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
    

    (5) Web 管理端操作

    打开浏览器,输入 web 服务的 ip 地址+端口号 lars_web_login.png

    配置主机 lars_web_add_host.png

    查看所有主机配置 lars_web_all_hosts.png

    (6) 模拟效果测试

    启动模拟器测试

        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
    
    

    (7)Web 查看主机调用状态

    lars_web_status.png

    五、Lars QPS 性能测试

    主机 1

    CPU 个数:2 个 , 内存: 2GB , 系统:Ubuntu18.04 虚拟机

    | 线程数 | QPS | | ------ | ------ | | 1 | 0.5w/s | | 2 | 2.2w/s | | 10 | 5.5w/s | | 100 | 5.3w/s |

    主机 2

    CPU 个数: 24 个 , 内存:128GB, 系统: 云主机

    | 线程数 | QPS | | ------ | ------ | | 1 | 8.36w/s| | 3 | 28.06w/s| | 5 | 55.18w/s| | 8 | 56.74w/s|

    Lars 技术讨论社区

    微信公众号

    gongzhonghao

    QQ 资源分享

    qqqun

    微信群

    weixin

    欢迎大家加入,获取更多相关学习资料

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5111 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 09:32 · PVG 17:32 · LAX 02:32 · JFK 05:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.