All Projects → ctripcorp → zeus

ctripcorp / zeus

Licence: Apache-2.0 license
Soft Load Balancer at ctrip.com

Programming Languages

javascript
184084 projects - #8 most used programming language
java
68154 projects - #9 most used programming language
HTML
75241 projects
CSS
56736 projects

简介

Soft Load Balancer at ctrip.com

SLB是携程的软负载系统,主要用于提供HTTP协议的路由负载功能,日处理请求量峰值达千亿。

核心功能包括:

  1. 路由转发
  2. 负载均衡
  3. 缩容扩容
  4. 服务器拉入拉出
  5. 独立健康检测
  6. HTTPS证书管理
  7. 请求实时监控
  8. 流量灰度迁移
  9. URL Rewrite
  10. 反爬虫拦截策略
  11. 操作日志
  12. 权限管理

我们提供了丰富的API与发布系统和运维系统无缝接合,提供便捷的可视化操作界面 SLB Portal。

快速入门(Quick Start)

环境准备

  1. 首先需要准备一台装有Centos操作系统机器,本文档使用的版本号7.6.1810
    1. 安装jdk 1.8
    2. 安装MySQL Community Server 5.6.21 及以上版本,参照https://dev.mysql.com/doc/mysql-installation-excerpt/5.7/en/linux-installation.html
    3. 安装Apache Maven 3.3.9 及以上版本
    4. 开通root账号权限
  2. 机器能够联通Github并下载Github项目

快速启动

通过执行SLB Admin、HealthChecker的两个shell脚本,用户可以方便的安装整个系统。

快速安装SLB Admin

  1. 代码下载,【这里需要提供github的地址】

  2. 数据库创建,通过MySQL WorkBench创建SLB数据库,如 slb

  3. 快速安装:

    1. 代码根目录下找到setup.sh 文件,修改setup.sh的编码以及执行权限, 即:
    dos2unix setup.sh
    chmod +x setup.sh
    
    1. 执行./setup.sh
    [root@UAT14970 ygshen]# ./setup.sh
    Java check passed # 检查Java版本,需要Java1.8
    Jps check passed # 检查JPS是否安装
    Nginx check passed # Nginx安装、版本check
    Success to start nginx # 启动Nginx 进程
    Where is your DB Server?mysql.server.path #询问数据库服务器的地址,可以是IP、FQDN名称。
    DB Server Port?3306 #数据库的连接端口,默认3306
    DB Name?slb #SLB使用的数据库名称。即第二步创建的数据库
    DB User Name?root #数据库的连接用户
    DB password?123456 #数据库用户密码
    Successfully Install SLB Admin #启动成功
    

初始化

经过以上步骤,SLB Admin已经成功启动。 但是SLB Admin需要的数据库还是空的,尚未创建表以及填充启动数据。 如:系统Admin账号、系统需要的默认证书等。 请参照以下步骤初始化

  1. 浏览器访问 SLB Admin 如: http://127.0.0.1:8099/api/slbs 系统会检测到数据库尚未初始化,用户会被redirect到 http://127.0.0.1:8099/portal/env 初识化页面。
  2. 初始化包括:
    1. SLB Admin Api的地址。 默认为以上安装步骤中使用的虚拟机如: http://127.0.0.1:8099 。 此时可以使用默认值,后续可以修改。
    2. 数据库的创建、初始数据的填充都是自动的。无需人为干预
  3. 初始化页面点击 设置。 设置成功后会自动跳转到系统首页

快速安装Health Checker

  1. 代码下载,【这里需要提供github的地址】

  2. 快速安装:

    1. 代码根目录下找到setup.sh 文件,修改setup.sh的编码以及执行权限, 即:
    dos2unix setup.sh
    chmod +x setup.sh
    
    1. 执行./setup.sh
    [root@]# ./setup.sh
    Java check passed # 检查Java版本,需要Java1.8
    Jps check passed # 检查JPS是否安装
    Nginx check passed # Nginx安装、版本check
    Success to start nginx # 启动Nginx 进程
    Where is your DB Server?mysql.server.path #询问数据库服务器的地址,可以是IP、FQDN名称。
    DB Server Port?3306 #数据库的连接端口,默认3306
    DB Name?slb #SLB使用的数据库名称。即第二步创建的数据库
    DB User Name?root #数据库的连接用户
    DB password?123456 #数据库用户密码
    Successfully Install SLB Admin #启动成功
    

手动配置

以上快速启动,通过脚本一键安装SLB、Nginx、Healthchecker。如需了解安装过程中涉及的详细步骤请参照以下部分

Mysql安装

  1. 版本: MySQL Community Server 5.6.21
  2. 安装方法参照: https://dev.mysql.com/doc/mysql-installation-excerpt/5.7/en/linux-installation.html
  3. 安装完成后创建空的数据库,数据库名称: open

Nginx安装

  1. 下载最新的SLB Admin代码。

  2. Nginx 安装包在项目根目录,如:[Root]/startup/slb-nginx-1.14.1-3.el7.x86_64.rpm

  3. 将以上rmp包copy到虚拟机如 /opt/。

  4. Root账号下Yum安装Nginx依赖的第三方组件。

    1. pcre-devel >= 7.6
    2. jemalloc >= 3.4
    3. jemalloc-devel >= 3.4
    yum install jemalloc-devel
    yum install jemalloc
    yum install pcre-devel
    yum install dos2unix
    
  5. Root账号下下运行:

    rpm -i slb-nginx-1.14.1-3.el7.x86_64.rpm
    
  6. 安装过程入遇到以下报错, 可以查看系统日志:

    journalctl -xe
    

    如有以下错误,可以先跳过在第7步解决。 如无报错请参照第8步验证Nginx已经启动

    nginx: the configuration file /opt/app/nginx/conf/nginx.conf syntax is ok
    nginx: [emerg] open() "/opt/logs/nginx/error.log" failed (2: No such file or directory)
    nginx: configuration file /opt/app/nginx/conf/nginx.conf test failed
    nginx.service: control process exited, code=exited status=1
    Failed to start nginx - high performance web server.
    
  7. 如第5步报错,请参照本步骤。如没有错误,请忽略本步骤。

    1. root账号启动Nginx, 执行命令
      /opt/app/ngxin/sbin/nginx 
      
  8. 验证Nginx启动成功: ps aux | grep nginx 验证nginx进程已经启动

SLB Admin安装

  1. 下载最新的SLB Admin代码。

  2. 建议使用IDEA编辑器打开项目源码。

  3. 编辑数据库连接串: 打开根目录下property 文件。 如:[Root]/slb/conf/open-source/db.properties 修改DB连接串。

    1. url: 数据库连接串,本文采用的是本地安装所以配置了: 127.0.0.1; 可以设置远程机器。 端口号本文使用的是3306.
    2. username: 连接数据库的用户名
    3. password:连接数据库的密码
    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql://127.0.0.1:3306/open?autoReconnect=true&useSSL=false&allowMultiQueries=true
    username=root
    password=123456
    initialSize=0
    connectionProperties=useUnicode=true;characterEncoding=UTF-8;autoReconnect=true;useSSL=false
    maxActive=300
    maxIdle=10
    minIdle=1
    
    
  4. 设置环境变量:打开 [Root]/slb/scripts/startup-open-source.sh 文件修改以下两个参数

    1. JAVA_PATH: 虚拟机上java的安装目录。
    2. API_BASE_URL: SLB Admin API 地址。 当前API机器为第一步准备的机器host ip
    export JAVA_PATH="/usr/java/jdk1.8/bin/java"
    export API_BASE_URL="http://[hostip]:8099"
    
  5. 编译:根目录下执行

    mvn clean package
    
  6. 编译成功

  7. 将target目录下生成的zip包如:[Root]\slb\target\slb-1.0.1.zip 发送到虚拟机

  8. 虚拟机上root执行一下命令

    
    sudo -i
    
    cd /opt/
    mv your-path-to-slb-1.0.1.zip .
    
    unzip slb-1.0.1.zip -d /opt/slb
    cd slb/scripts/
    dos2unix *
    
    ./startup-open-source.sh
    
    
  9. 安装成功会有提示:

    Starting SlbAdmin
    SlbAdmin started: 30199 # 进程ID
    
  10. 如果失败可以执行以下命令查看错误日志以及操作日志等

    vi ../logs/err.txt 
    vi ../logs/zeus.log 
    
  11. 验证: 访问 http://127.0.0.1:8099/api/slbs 如果可以访问,证明启动成功,可以继续以下步骤

Health Checker 安装

  1. 下载最新的HealthChecker代码

  2. 启动脚本配置:

    1. 配置[Root]\HealthChecker\scripts\env-opensource.sh启动脚本. "SLB_CONFIG_URL"代表slb admin的api地址,此API用于获取healthchecker自身的配置。 如
    export SLB_CONFIG_URL="http://127.0.0.1:8099/api/hc/properties"
    
  3. 根目录 如:[Root]\healthchecker下执行以下命令执行编译

    mvn clean package
    
  4. 编译成功后将根目录target文件夹内的zip包(如: [Root]\HealthChecker\target\health-checker-1.zip) Copy到与SLB Admin相同的一台虚拟机上。

  5. 登陆虚拟机,解压缩并启动HealthChecker。执行以下脚本

    sudo -i
    cd /opt/
    mv your-path-to-health-checker-1.zip .
    unzip health-checker-1.zip -d healthchecker
    cd /opt/healthchecker/scripts
    dos2unix *
    ./startup-opensource.sh
    

    启动成功标示:

    Starting HealthChecker
    HealthChecker started: 3964 # 进程ID
    

进阶教程

模型介绍

SLB模型

  1. slb模型表示一组部署了携程的软负载均衡器(soft load balancer, SLB)进程的服务器,表示一个slb部署实例。
  2. 主要对外提供请求转发以及负载均衡的作用,其他的额外功能包括对应用服务器的扩容缩容,拉入拉出以及健康检测等。
  3. 底层使用nginx实现路由转发和负载均衡。
  4. 对外使用虚拟IP(virtual IP, VIP)表示该slb集群,一个slb集群可以有多个VIP。

VS模型

  1. 代表了一组提供相同服务的域名,是携程自定义的域名管理单元。

  2. 其定义了一组域名和一个端口,表示可以接收来自这组域名的这个端口的流量。如一个vs的定义如下:

    vs: {
        "domains":[
            "abc.com",
            "def.com"
        ],
        "port": 80
    }

    则表示这个vs可以处理域名为abc.com以及def.com的端口号为80(即HTTP请求)的请求。

Group模型

  1. 表示一组运行相同代码的能够对外提供相同服务的进程

  2. 是SLB系统管理的基本单元,大多数的运维操作是针对Group的

  3. 其定义了一组应用服务器(server ips),以及与之相关联的一组vs。对于关联的每个vs,定义了如下属性:

    // 表示group接收请求的统一路径前缀
    private String path;
    // 表示group在该vs下的优先级。当对于某个URL在同一个vs下存在多个group的path与之匹配时,优先将请求转发给优先级较高的group
    private Integer priority;

TrafficPolicy模型

  1. 表示一个流量分配策略。
  2. 作为一个在vs和group中间流量分配的组件,其向上关联了一组vs,并制定了接受请求的路径前缀以及相应的优先级(路径和优先级的定义可参照group);向下关联了一组group,可以指定不同group之间的流量比重。

证书模型

  1. SLB在数据库中保存一本SSL证书的私钥文件和公钥文件,以及其他额外信息,如证书的颁发时间,过期时间域名等。
  2. SLB在内部将一本证书与任意多个vs相关联,即关联的vs下的所有域名的请求都会被证书保护。
  3. SLB会将公钥文件和私钥文件安装在和vs相关联的每一台SLB服务器上。

简单上手

创建SLB

  1. 从slb列表页点击新建按钮进入新建slb页面
  2. 自上而下填入必要信息
    1. 名称:slb集群名称
    2. vip列表:该slb集群相关联的VIP列表
    3. Slb Servers列表:该slb集群中的服务器的IP列表
  3. 点击提交完成

创建VS

  1. 如下图进入vs列表页,点击新建进入vs新建页。
  2. 依次填写以下信息
    1. Name:VS名称
    2. IsSSL:若勾选上表示该VS接收HTTPS请求,否则表示该VS接收HTTP请求
    3. SLB列表:与该VS相关联的SLB列表
    4. Domain列表:该VS中包含的域名列表
  3. 点击提交完成

创建Group

  1. 如下图进入group列表页,点击新建按钮进入group新建页。
  2. 依次填写如下信息:
    1. Name:group名称
    2. IsSSL:默认状态为不勾选状态,无法更改。
    3. GroupVirtualServers:表示与group相关联的VS信息,点击左侧“+”号按钮新增一个groupvirutalserver,依次填写group接收请求的路径前缀,其他信息可不填,点击提交保存。
    4. Healthcheck URL:用于检测检测的URL地址,用于测试服务是否正常。
    5. Healthcheck Policy,依次填入以下信息
      1. Timeout:表示一次健康检测的超时时间,即一旦超过该时间应用服务器仍未返回结果,即认为此次健康检测失败。
      2. Intervals:每次健康监测间隔时长。
      3. Fails:最大健康检测失败次数,超过该次数即认为应用服务器健康监测失败
      4. Passes:失败后检测成功次数阈值。假设该值为3,即连续三次检测检测成功才认为应用恢复正常。
    6. LBMethod:负载均衡方法,表示SLB在向后端服务器转发请求时,在不同的应用服务器之间的调度算法。目前SLB只支持权重轮询调度算法(Weight Round-Robin Scheduling)。
    7. Group Servers:表示该group包含的一组应用服务器

拉入拉出

进入group详情页,如下图所示。点击Members表格右上方的扳手按钮。有四个状态位可以调节,分别是:

  1. Server Status:服务器拉入状态位,用以控制该台服务器上的所有的group成员的拉入状态(慎用)
  2. Member Status:group成员拉入状态位,用以控制该group成员的拉入状态(推荐使用),用户可通过该状态位控制group成员的拉入拉出状态。
  3. Pull Status:group成员的发布拉入状态,由发布系统控制
  4. Health Status:group成员的健康检测拉入状态位,由健康检测系统控制。

请求验证

在用户创建了slb集群,VS以及group之后,用户可以通过发送请求的方式检验SLB的转发功能。

假设在本地创建了一台slb服务器,并创建了一个vs,其中包含一个域名,yourdomain.com,并绑定了端口80。除此之外,用户在本地部署了应用,可以yourdomain.com/someres的请求。

现用户只需将yourdomain.com绑定到本地(通过编辑hosts文件),并向域名发送请求/someres,用户可以发现,请求已经到达了本地部署的应用之中。

设计文档

参照: SLB 设计文档

用户手册

参照: SLB 用户手册

API文档

参照: SLB API文档

Q&A

参照: SLB Q&A

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].