负载均衡
负载均衡方式
- 用户手动选择
- DNS轮询
- 四/七层负载均衡
四/七层负载均衡是目前最主流的负载均衡方式
所谓四层负载均衡指的是OSI七层模型中的传输层,主要是基于IP+PORT的负载均衡
实现四层负载均衡的方式:
硬件:F5 BIG-IP、Radware等
软件:LVS、Nginx、Hayproxy等
所谓的七层负载均衡指的是在应用层,主要是基于虚拟的URL或主机IP的负载均衡
实现七层负载均衡的方式:
软件:Nginx、Hayproxy等
七层负载均衡
upstream指令
该指令是用来定义一组服务器,它们可以是监听不同端口的服务器,并且也可以是同时监听TCP和Unix socket的服务器。服务器可以指定不同的权重,默认为1。
语法 | upstream name {…} |
---|---|
默认值 | — |
位置 | http |
upstream 变量{
server 192.168.200.146:9091;
server 192.168.200.146:9092;
server 192.168.200.146:9093;
}
server {
listen 8083;
server_name localhost;
location /{
proxy_pass http://变量;
}
}
服务器状态设置
down:将该服务器标记为永久不可用,那么该代理服务器将不参与负载均衡。
backup:将该服务器标记为备份服务器,当主服务器不可用时,将用来传递请求。
max_conns=number:用来设置代理服务器同时活动链接的最大数量,默认为0,表示不限制,使用该配置可以根据后端服务器处理请求的并发量来进行设置,防止后端服务器被压垮。
max_fails=number:设置允许请求代理服务器失败的次数,默认为1。
fail_timeout=time:设置经过max_fails失败后,服务暂停的时间,默认是10秒。
upstream 变量{
server 192.168.200.133:9001 down;
server 192.168.200.133:9002 backup;
server 192.168.200.133:9003 max_fails=3 fail_timeout=15;
}
负载均衡策略
轮询 | 默认方式 |
---|---|
weight | 权重方式 |
ip_hash | 依据ip分配方式 |
least_conn | 依据最少连接方式 |
url_hash | 依据URL分配方式 |
fair | 依据响应时间方式 |
轮询
是upstream模块负载均衡默认的策略。每个请求会按时间顺序逐个分配到不同的后端服务器。轮询不需要额外的配置。
upstream 变量{
server 192.168.200.146:9001 weight=1;
server 192.168.200.146:9002;
server 192.168.200.146:9003;
}
weight加权[加权轮询]
weight=number:用来设置服务器的权重,默认为1,权重数据越大,被分配到请求的几率越大。
upstream 变量{
server 192.168.200.146:9001 weight=10;
server 192.168.200.146:9002 weight=5;
server 192.168.200.146:9003 weight=3;
}
ip_hash
每个Ip只能连接对应的服务器
upstream 变量{
ip_hash;
server 192.168.200.146:9001;
server 192.168.200.146:9002;
server 192.168.200.146:9003;
}
least_conn
最少连接,把请求转发给连接数较少的后端服务器。
upstream 变量{
least_conn;
server 192.168.200.146:9001;
server 192.168.200.146:9002;
server 192.168.200.146:9003;
}
url_hash
每个url只能访问对应的服务器
upstream 变量{
hash &request_uri;
server 192.168.200.146:9001;
server 192.168.200.146:9002;
server 192.168.200.146:9003;
}
fair
fair采用的不是内建负载均衡使用的轮换的均衡算法,而是可以根据页面大小、加载时间长短智能的进行负载均衡。那么如何使用第三方模块的fair负载均衡策略。
upstream 变量{
fair;
server 192.168.200.146:9001;
server 192.168.200.146:9002;
server 192.168.200.146:9003;
}
因为fair属于第三方模块实现的负载均衡。需要添加nginx-upstream-fair
:
- 下载nginx-upstream-fair模块
下载地址为:
https://github.com/gnosek/nginx-upstream-fair
- 将下载的文件上传到服务器并进行解压缩
unzip nginx-upstream-fair-master.zip
- 重命名资源
mv nginx-upstream-fair-master fair
- 使用./configure命令将资源添加到Nginx模块中
./configure --add-module=/root/fair
- 在Nginx的源码中 src/http/ngx_http_upstream.h,找到
ngx_http_upstream_srv_conf_s
,在模块中添加添加default_port属性
in_port_t default_port
- 编译
make
- 将sbin目录下的nginx进行备份
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginxold
- 将安装目录下的objs中的nginx拷贝到sbin目录
cd objs
cp nginx /usr/local/nginx/sbin
- 更新Nginx
cd ../
make upgrade
四层负载均衡
一般主要使用七层负载均衡,四层使用的较少
stream指令
该指令提供在其中指定流服务器指令的配置文件上下文。和http类似,但只能实现跳转和负载均衡。
语法 | stream { … } |
---|---|
默认值 | — |
位置 | main |
stream {
upstream redisbackend {
server 192.168.200.146:6379;
server 192.168.200.146:6378;
}
upstream tomcatbackend {
server 192.168.200.146:8080;
}
server {
listen 81;
proxy_pass redisbackend;
}
server {
listen 82;
proxy_pass tomcatbackend;
}
}
Keepalived
使用Keepalived来解决Nginx集群问题
环境搭建
环境准备
VIP | IP | 主机名 | 主/从 |
---|---|---|---|
192.168.200.133 | keepalived1 | Master | |
192.168.200.222 | |||
192.168.200.122 | keepalived2 | Backup |
keepalived的安装
步骤1:从官方网站下载keepalived,官网地址https://keepalived.org/
步骤2:将下载的资源上传到服务器
keepalived-2.0.20.tar.gz
步骤3:创建keepalived目录,方便管理资源
mkdir keepalived
步骤4:将压缩文件进行解压缩,解压缩到指定的目录
tar -zxf keepalived-2.0.20.tar.gz -C keepalived/
步骤5:对keepalived进行配置,编译和安装
cd keepalived/keepalived-2.0.20
./configure --sysconf=/etc --prefix=/usr/local
make && make install
安装完成后,有两个文件需要我们认识下,一个是 /etc/keepalived/keepalived.conf
(keepalived的系统配置文件,我们主要操作的就是该文件),一个是/usr/local/sbin目录下的keepalived
,是系统配置脚本,用来启动和关闭keepalived
Keepalived配置文件介绍
打开keepalived.conf配置文件
这里面会分三部,第一部分是global全局配置、第二部分是vrrp相关配置、第三部分是LVS相关配置。
本次课程主要是使用keepalived实现高可用部署,没有用到LVS,所以我们重点关注的是前两部分
#global全局部分:
global_defs {
#通知邮件,当keepalived发送切换时需要发email给具体的邮箱地址
notification_email {
tom@itcast.cn
jerry@itcast.cn
}
#设置发件人的邮箱信息
notification_email_from zhaomin@itcast.cn
#指定smpt服务地址
smtp_server 192.168.200.1
#指定smpt服务连接超时时间
smtp_connect_timeout 30
#运行keepalived服务器的一个标识,可以用作发送邮件的主题信息
router_id LVS_DEVEL
#默认是不跳过检查。检查收到的VRRP通告中的所有地址可能会比较耗时,设置此命令的意思是,如果通告与接收的上一个通告来自相同的master路由器,则不执行检查(跳过检查)
vrrp_skip_check_adv_addr
#严格遵守VRRP协议。
vrrp_strict
#在一个接口发送的两个免费ARP之间的延迟。可以精确到毫秒级。默认是0
vrrp_garp_interval 0
#在一个网卡上每组na消息之间的延迟时间,默认为0
vrrp_gna_interval 0
}
#VRRP部分,该部分可以包含以下四个子模块
#1. vrrp_script
#2. vrrp_sync_group
#3. garp_group
#4. vrrp_instance
#我们会用到第一个和第四个,
#设置keepalived实例的相关信息,VI_1为VRRP实例名称
vrrp_instance VI_1 {
state MASTER #有两个值可选MASTER主 BACKUP备
interface ens33 #vrrp实例绑定的接口,用于发送VRRP包[当前服务器使用的网卡名称]
virtual_router_id 51#指定VRRP实例ID,范围是0-255
priority 100 #指定优先级,优先级高的将成为MASTER
advert_int 1 #指定发送VRRP通告的间隔,单位是秒
authentication { #vrrp之间通信的认证信息
auth_type PASS #指定认证方式。PASS简单密码认证(推荐)
auth_pass 1111 #指定认证使用的密码,最多8位
}
virtual_ipaddress { #虚拟IP地址设置虚拟IP地址,供用户访问使用,可设置多个,一行一个
192.168.200.222
}
}
配置内容如下:
服务器1
global_defs {
#发生切换时发送邮箱通知
notification_email {
tom@itcast.cn
jerry@itcast.cn
}
notification_email_from zhaomin@itcast.cn #设置邮箱发送者
smtp_server 192.168.200.1 #指定smpt服务地址
smtp_connect_timeout 30 #定义邮件发送超时时间
router_id keepalived1 #主机身份标识信息
vrrp_skip_check_adv_addr #跳过相邻地址
vrrp_strict #严格遵守VRRP协议
vrrp_garp_interval 0 #接口延迟
vrrp_gna_interval 0 #网卡延迟
}
vrrp_instance VI_1 {
state MASTER #keepalived角色描述信息
interface ens33 #将虚拟ip用于那块网卡
virtual_router_id 51 #实例ID
priority 100 #优先级
advert_int 1 #主服务器组播包发送间隔时间
authentication {
auth_type PASS #采用明文认证机制
auth_pass 1111 #明文密码
}
virtual_ipaddress {
192.168.200.222 #设置虚拟ip地址信息
}
}
服务器2
! Configuration File for keepalived
global_defs {
#发生切换时发送邮箱通知
notification_email {
tom@itcast.cn
jerry@itcast.cn
}
notification_email_from zhaomin@itcast.cn #设置邮箱发送者
smtp_server 192.168.200.1 #指定smpt服务地址
smtp_connect_timeout 30 #定义邮件发送超时时间
router_id keepalived2 #主机身份标识信息
vrrp_skip_check_adv_addr #跳过相邻地址
vrrp_strict #严格遵守VRRP协议
vrrp_garp_interval 0 #接口延迟
vrrp_gna_interval 0 #网卡延迟
}
vrrp_instance VI_1 {
state BACKUPR #keepalived角色描述信息
interface ens33 #将虚拟ip用于那块网卡
virtual_router_id 51 #实例ID
priority 90 #优先级
advert_int 1 #主服务器组播包发送间隔时间
authentication {
auth_type PASS #采用明文认证机制
auth_pass 1111 #明文密码
}
virtual_ipaddress {
192.168.200.222 #设置虚拟ip地址信息
}
}
keepalived脚本
keepalived只能做到对网络故障和keepalived本身的监控,即当出现网络故障或者keepalived本身出现问题时,进行切换。但是这些还不够,我们还需要监控keepalived所在服务器上的其他业务,比如Nginx,如果Nginx出现异常了,仅仅keepalived保持正常,是无法完成系统的正常工作的,因此需要根据业务进程的运行状态决定是否需要进行主备切换,这个时候,我们可以通过编写脚本对业务进程进行检测监控。
实现步骤:
- 在keepalived配置文件中添加对应的配置像
vrrp_script 脚本名称
{
script "脚本位置"
interval 3 #执行时间间隔
weight -20 #动态调整vrrp_instance的优先级
}
- 编写脚本
ck_nginx.sh
#!/bin/bash
num=`ps -C nginx --no-header | wc -l`
if [ $num -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then
killall keepalived
fi
fi
Linux ps命令用于显示当前进程 (process) 的状态。
-C(command) :指定命令的所有进程
–no-header 排除标题
- 为脚本文件设置权限
chmod 755 ck_nginx.sh
- 将脚本添加到
vrrp_script ck_nginx {
script "/etc/keepalived/ck_nginx.sh" #执行脚本的位置
interval 2 #执行脚本的周期,秒为单位
weight -20 #权重的计算方式
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 10
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.111
}
track_script {
ck_nginx
}
}
- 如果效果没有出来,可以使用
tail -f /var/log/messages
查看日志信息,找对应的错误信息。 - 测试