Soft Load Balancer at ctrip.com
SLB是携程的软负载系统,主要用于提供HTTP协议的路由负载功能,日处理请求量峰值达千亿。
核心功能包括:
- 路由转发
- 负载均衡
- 缩容扩容
- 服务器拉入拉出
- 独立健康检测
- HTTPS证书管理
- 请求实时监控
- 流量灰度迁移
- URL Rewrite
- 反爬虫拦截策略
- 操作日志
- 权限管理
我们提供了丰富的API与发布系统和运维系统无缝接合,提供便捷的可视化操作界面 SLB Portal。
- 首先需要准备一台装有Centos操作系统机器,本文档使用的版本号7.6.1810
- 安装jdk 1.8
- 安装MySQL Community Server 5.6.21 及以上版本,参照https://dev.mysql.com/doc/mysql-installation-excerpt/5.7/en/linux-installation.html
- 安装Apache Maven 3.3.9 及以上版本
- 开通root账号权限
- 机器能够联通Github并下载Github项目
通过执行SLB Admin、HealthChecker的两个shell脚本,用户可以方便的安装整个系统。
-
代码下载,【这里需要提供github的地址】
-
数据库创建,通过MySQL WorkBench创建SLB数据库,如 slb
-
快速安装:
- 代码根目录下找到setup.sh 文件,修改setup.sh的编码以及执行权限, 即:
dos2unix setup.sh chmod +x setup.sh
- 执行./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账号、系统需要的默认证书等。 请参照以下步骤初始化
- 浏览器访问 SLB Admin 如: http://127.0.0.1:8099/api/slbs 系统会检测到数据库尚未初始化,用户会被redirect到 http://127.0.0.1:8099/portal/env 初识化页面。
- 初始化包括:
- SLB Admin Api的地址。 默认为以上安装步骤中使用的虚拟机如: http://127.0.0.1:8099 。 此时可以使用默认值,后续可以修改。
- 数据库的创建、初始数据的填充都是自动的。无需人为干预
- 初始化页面点击 设置。 设置成功后会自动跳转到系统首页
-
代码下载,【这里需要提供github的地址】
-
快速安装:
- 代码根目录下找到setup.sh 文件,修改setup.sh的编码以及执行权限, 即:
dos2unix setup.sh chmod +x setup.sh
- 执行./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 Community Server 5.6.21
- 安装方法参照: https://dev.mysql.com/doc/mysql-installation-excerpt/5.7/en/linux-installation.html
- 安装完成后创建空的数据库,数据库名称: open
-
下载最新的SLB Admin代码。
-
Nginx 安装包在项目根目录,如:[Root]/startup/slb-nginx-1.14.1-3.el7.x86_64.rpm
-
将以上rmp包copy到虚拟机如 /opt/。
-
Root账号下Yum安装Nginx依赖的第三方组件。
- pcre-devel >= 7.6
- jemalloc >= 3.4
- jemalloc-devel >= 3.4
yum install jemalloc-devel yum install jemalloc yum install pcre-devel yum install dos2unix
-
Root账号下下运行:
rpm -i slb-nginx-1.14.1-3.el7.x86_64.rpm
-
安装过程入遇到以下报错, 可以查看系统日志:
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.
-
如第5步报错,请参照本步骤。如没有错误,请忽略本步骤。
- root账号启动Nginx, 执行命令
/opt/app/ngxin/sbin/nginx
- root账号启动Nginx, 执行命令
-
验证Nginx启动成功: ps aux | grep nginx 验证nginx进程已经启动
-
下载最新的SLB Admin代码。
-
建议使用IDEA编辑器打开项目源码。
-
编辑数据库连接串: 打开根目录下property 文件。 如:[Root]/slb/conf/open-source/db.properties 修改DB连接串。
- url: 数据库连接串,本文采用的是本地安装所以配置了: 127.0.0.1; 可以设置远程机器。 端口号本文使用的是3306.
- username: 连接数据库的用户名
- 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
-
设置环境变量:打开 [Root]/slb/scripts/startup-open-source.sh 文件修改以下两个参数
- JAVA_PATH: 虚拟机上java的安装目录。
- 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"
-
编译:根目录下执行
mvn clean package
-
编译成功
-
将target目录下生成的zip包如:[Root]\slb\target\slb-1.0.1.zip 发送到虚拟机
-
虚拟机上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
-
安装成功会有提示:
Starting SlbAdmin SlbAdmin started: 30199 # 进程ID
-
如果失败可以执行以下命令查看错误日志以及操作日志等
vi ../logs/err.txt vi ../logs/zeus.log
-
验证: 访问 http://127.0.0.1:8099/api/slbs 如果可以访问,证明启动成功,可以继续以下步骤
-
下载最新的HealthChecker代码
-
启动脚本配置:
- 配置[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"
-
根目录 如:[Root]\healthchecker下执行以下命令执行编译
mvn clean package
-
编译成功后将根目录target文件夹内的zip包(如: [Root]\HealthChecker\target\health-checker-1.zip) Copy到与SLB Admin相同的一台虚拟机上。
-
登陆虚拟机,解压缩并启动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模型表示一组部署了携程的软负载均衡器(soft load balancer, SLB)进程的服务器,表示一个slb部署实例。
- 主要对外提供请求转发以及负载均衡的作用,其他的额外功能包括对应用服务器的扩容缩容,拉入拉出以及健康检测等。
- 底层使用nginx实现路由转发和负载均衡。
- 对外使用虚拟IP(virtual IP, VIP)表示该slb集群,一个slb集群可以有多个VIP。
-
代表了一组提供相同服务的域名,是携程自定义的域名管理单元。
-
其定义了一组域名和一个端口,表示可以接收来自这组域名的这个端口的流量。如一个vs的定义如下:
vs: { "domains":[ "abc.com", "def.com" ], "port": 80 }
则表示这个vs可以处理域名为abc.com以及def.com的端口号为80(即HTTP请求)的请求。
-
表示一组运行相同代码的能够对外提供相同服务的进程
-
是SLB系统管理的基本单元,大多数的运维操作是针对Group的
-
其定义了一组应用服务器(server ips),以及与之相关联的一组vs。对于关联的每个vs,定义了如下属性:
// 表示group接收请求的统一路径前缀 private String path; // 表示group在该vs下的优先级。当对于某个URL在同一个vs下存在多个group的path与之匹配时,优先将请求转发给优先级较高的group private Integer priority;
- 表示一个流量分配策略。
- 作为一个在vs和group中间流量分配的组件,其向上关联了一组vs,并制定了接受请求的路径前缀以及相应的优先级(路径和优先级的定义可参照group);向下关联了一组group,可以指定不同group之间的流量比重。
- SLB在数据库中保存一本SSL证书的私钥文件和公钥文件,以及其他额外信息,如证书的颁发时间,过期时间域名等。
- SLB在内部将一本证书与任意多个vs相关联,即关联的vs下的所有域名的请求都会被证书保护。
- SLB会将公钥文件和私钥文件安装在和vs相关联的每一台SLB服务器上。
- 从slb列表页点击新建按钮进入新建slb页面
- 自上而下填入必要信息
- 名称:slb集群名称
- vip列表:该slb集群相关联的VIP列表
- Slb Servers列表:该slb集群中的服务器的IP列表
- 点击提交完成
- 如下图进入vs列表页,点击新建进入vs新建页。
- 依次填写以下信息
- Name:VS名称
- IsSSL:若勾选上表示该VS接收HTTPS请求,否则表示该VS接收HTTP请求
- SLB列表:与该VS相关联的SLB列表
- Domain列表:该VS中包含的域名列表
- 点击提交完成
- 如下图进入group列表页,点击新建按钮进入group新建页。
- 依次填写如下信息:
- Name:group名称
- IsSSL:默认状态为不勾选状态,无法更改。
- GroupVirtualServers:表示与group相关联的VS信息,点击左侧“+”号按钮新增一个groupvirutalserver,依次填写group接收请求的路径前缀,其他信息可不填,点击提交保存。
- Healthcheck URL:用于检测检测的URL地址,用于测试服务是否正常。
- Healthcheck Policy,依次填入以下信息
- Timeout:表示一次健康检测的超时时间,即一旦超过该时间应用服务器仍未返回结果,即认为此次健康检测失败。
- Intervals:每次健康监测间隔时长。
- Fails:最大健康检测失败次数,超过该次数即认为应用服务器健康监测失败
- Passes:失败后检测成功次数阈值。假设该值为3,即连续三次检测检测成功才认为应用恢复正常。
- LBMethod:负载均衡方法,表示SLB在向后端服务器转发请求时,在不同的应用服务器之间的调度算法。目前SLB只支持权重轮询调度算法(Weight Round-Robin Scheduling)。
- Group Servers:表示该group包含的一组应用服务器
进入group详情页,如下图所示。点击Members表格右上方的扳手按钮。有四个状态位可以调节,分别是:
- Server Status:服务器拉入状态位,用以控制该台服务器上的所有的group成员的拉入状态(慎用)
- Member Status:group成员拉入状态位,用以控制该group成员的拉入状态(推荐使用),用户可通过该状态位控制group成员的拉入拉出状态。
- Pull Status:group成员的发布拉入状态,由发布系统控制
- Health Status:group成员的健康检测拉入状态位,由健康检测系统控制。
在用户创建了slb集群,VS以及group之后,用户可以通过发送请求的方式检验SLB的转发功能。
假设在本地创建了一台slb服务器,并创建了一个vs,其中包含一个域名,yourdomain.com,并绑定了端口80。除此之外,用户在本地部署了应用,可以yourdomain.com/someres的请求。
现用户只需将yourdomain.com绑定到本地(通过编辑hosts文件),并向域名发送请求/someres,用户可以发现,请求已经到达了本地部署的应用之中。
参照: SLB 设计文档
参照: SLB 用户手册
参照: SLB API文档
参照: SLB Q&A