[TOC]

一、集群的含义

由多台主机构成,但对外表现为一个整体

二、集群的分类

1、负载均衡集群

1、提高应用系统的响应能力,尽可能处理更多的访问请求,减少延迟为目标,获得高并发,高负载的整体性能

2、LB的负载分配依赖于主节点的分流算法

2、高可用集群

1、提高应用系统的可靠性,尽可能减少中断时间为目标,确保服务的连续性,达到高可用(HA)的容错效果

2、HA的工作方式包括双工和主从两种模式

3、高性能运算集群

1、提高应用系统的CPU运算速度,扩展硬件资源和分析能力为目标,获得相当于大型、超级计算机的高性能运算(HPC)能力

2、高性能依赖于“分布式运算”、“并行计算”,通过专用硬件和软件将多个服务器的CPU、内存等资源整合在一起,实现只有大型、超级计算机才具备的计算能力

三、负载均衡集群

1、架构

第一层:负载均衡池(LVS)

第二层:服务器池

第三层:共享存储

2、LVS-NAT

img

1)、介绍

1、负载调度器为所有服务节点的网关,即作客户机的访问入口,也是各节点回应客户机的访问出口;

2、服务器节点使用私有IP地址,与调度器处于同一个物理网络,安全性优于其他两种方式。

director(调度器)与RS(服务节点)必须在同一个局域网内。

RS的网关必须指向director的私网DIP。

请求和响应报文都需要director转发,会成为整个系统的瓶颈。

支持端口映射,client访问80端口,director可以映射到RS的8080端口上。

director必须是Linux系统。

director需要两个网卡,一个与互联网通信的公网VIP,一个与RS通信的私网DIP。

2)、环境

调度服务器一台:

1
2
3
IP地址:192.168.100.10(内网)

​ 192.168.73.10(外网)

Web服务器两台:

1
2
3
IP地址:192.168.100.11(Server1)

IP地址:192.168.100.12(Server2)

NFS共享服务器一台:(可省略)

1
IP地址:192.168.100.13 (内网)

3)、调度器配置

1、两张网卡,一张用于内网通信,一张用于外网通信

1
2
3
192.168.100.10(VM1)

192.168.73.10(VM8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
[root@LVS-Server ~]# modprobe ip_vs ###加载LVS内核模块(LVS现已成为Linux内核的一部分,默认编译为ip_vs模块,必要时能够自动调用。以下操作能够手动加载ip_vs模块,并查看当前系统中的ip_vs模块的版本信息)

[root@LVS-Server ~]# cat /proc/net/ip_vs

IP Virtual Server version 1.2.1 (size=4096) ###版本信息

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn



[root@LVS-Server ~]# rpm -ivh /mnt/Packages/ipvsadm-1.27-7.el7.x86_64.rpm ###安装管理软件ipvsadm,不需要启动



[root@LVS-Server ~]# vi /etc/sysctl.conf

net.ipv4.ip_forward = 1 ###开启路由转发



[root@LVS-Server ~]# sysctl -p

net.ipv4.ip_forward = 1



[root@LVS-Server ~]# vi nat.sh ###编辑调度服务器脚本

\#!/bin/bash

echo "1" > /proc/sys/net/ipv4/ip_forward ###开启路由地址转换

ipvsadm -C ###清除内核虚拟服务器表中的所有记录

ipvsadm -A -t 192.168.73.10:80 -s rr ###创建虚拟服务器

ipvsadm -a -t 192.168.73.10:80 -r 192.168.100.11:80 -m ###添加服务器节点

ipvsadm -a -t 192.168.73.10:80 -r 192.168.100.12:80 -m ###添加服务器节点

ipvsadm -Ln ###查看节点状态,“-n”以数字形式显示显示地址,端口信息



[root@LVS-Server ~]# sh nat.sh

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP 192.168.73.10:80 rr

-> 192.168.100.11:80 Masq 1 0 0

-> 192.168.100.12:80 Masq 1 0 0

ipvsadm命令解析

1
2
3
4
5
6
7
8
9
ipvsadm命令选项解析:
-C:清除内核虚拟服务器表中的所有记录
-A:增加一台新的虚拟服务器
-t:说明虚拟服务器提供的是tcp的服务
-s rr:启用轮询算法
-a:在一个虚拟服务器中增加一台新的真实服务器
-r:指定真实服务器
-m:指定LVS的工作模式为NAT模式
ipvsadm:启用LVS功能

4)、Web服务器配置

1、网关为调度器内网IP;

2、route -n查看是否有默认路由生成;

3、挂载NFS共享

5)、验证方式

访问调度器外网IP,刷新看是否会轮询

3、LVS-DR

img

1)、特点

1、保证前端路由将目标地址为VIP的报文全部发送给DS,而不是RS

2、RS的RIP可以使用私有地址,但也可以使用公网地址

3、RS和director必须在同一物理网络中

4、请求报文有director调度,但响应报文不一定经由director

不支持端口映射

5、RS的网关不能指向DIP(LVS服务器IP)

2)、报文转发过程

1)client发送请求到vip,real-server配置限制对vip应答arp,而lvs会对vip响应arp,因此client将请求发到LVS。

2)LVS机器收到发往vip的报文后,根据目的IP和目的port匹配ipvs规则,将报文目的mac改为real server的mac,同时将源mac改为LVS的mac后,发送到real server。

3)real server收到之后,mac/IP都是本机的,就将报文交由系统处理。

4)回程报文因real server收到的报文源IP就是client IP,real server直接将请求回给client。如果client和real server是同一个网段,响应报文直接通过二层透传发送给client,报文目的mac即为client mac;如果client和real server不是同一个网段,响应报文先发送到gateway,再走三层转发返回client。

3)、环境

调度服务器一台;

1
IP地址:192.168.100.10

Web服务器两台:

1
2
3
IP地址:192.168.100.11(Server1)

IP地址:192.168.100.12(Server2)

NFS共享服务器一台:(可省略)

1
IP地址:192.168.100.13 

4)、调度器配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
[root@LVS-Server ~]# modprobe ip_vs ###加载LVS内核模块(LVS现已成为Linux内核的一部分,默认编译为ip_vs模块,必要时能够自动调用。以下操作能够手动加载ip_vs模块,并查看当前系统中的ip_vs模块的版本信息)
[root@LVS-Server ~]# cat /proc/net/ip_vs
IP Virtual Server version 1.2.1 (size=4096) ###版本信息
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn

[root@LVS-Server ~]# rpm -ivh /mnt/Packages/ipvsadm-1.27-7.el7.x86_64.rpm ###安装管理软件ipvsadm,不需要启动

[root@LVS-Server ~]# vi /etc/sysctl.conf
net.ipv4.ip_forward=1

[root@LVS-Server ~]# vi dr.sh ###编辑调度服务器脚本
#!/bin/bash
ifconfig ens33:0 192.168.100.100 broadcast 192.168.100.100 netmask 255.255.255.255 up ###添加虚拟地址的虚接口
route add -host 192.168.100.100 dev ens33:0 ###给ens33:0添加路由
ipvsadm -C ###清除内核虚拟服务器表中的所有记录
ipvsadm -A -t 192.168.100.100:80 -s rr ###创建虚拟服务器
ipvsadm -a -t 192.168.100.100:80 -r 192.168.100.11:80 -g ###添加服务器节点
ipvsadm -a -t 192.168.100.100:80 -r 192.168.100.12:80 -g ###添加服务器节点
ipvsadm -Ln ###查看节点状态,加个“-n”将以数字形式显示地址、端口信息

[root@LVS-Server ~]# sh dr.sh
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.100.100:80 rr
-> 192.168.100.12:80 Route 1 0 0
-> 192.168.100.11:80 Route 1 0 0

[root@LVS-Server ~]# ip addr ###看是否有虚拟路由生成
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:42:ea:42 brd ff:ff:ff:ff:ff:ff
inet 192.168.100.10/24 brd 192.168.100.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.100.100/32 brd 192.168.100.100 scope global ens33:0
valid_lft forever preferred_lft forever
inet6 fe80::a2b4:ea7e:78e6:4f86/64 scope link
valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN qlen 1000
link/ether 52:54:00:ea:07:54 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 1000
link/ether 52:54:00:ea:07:54 brd ff:ff:ff:ff:ff:ff

5)、Web服务器配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
[root@Web1 ~]# vi web.sh
#!/bin/bash
ifconfig lo:0 192.168.100.100 broadcast 192.168.100.100 netmask 255.255.255.255 up
route add -host 192.168.100.100 dev lo:0
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p &> /dev/null

[root@Web1 ~]# sh web.sh
[root@Web1 ~]# ifconfig ###查看是否有虚拟路由生成
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.100.11 netmask 255.255.255.0 broadcast 192.168.100.255
inet6 fe80::e654:4e48:ec26:2279 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:9f:bd:e6 txqueuelen 1000 (Ethernet)
RX packets 713398 bytes 1035992165 (987.9 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 59733 bytes 3967447 (3.7 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
RX packets 164 bytes 18108 (17.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 164 bytes 18108 (17.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo:0: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 192.168.100.100 netmask 255.255.255.255
loop txqueuelen 1 (Local Loopback)

virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:dc:14:16 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

6)、验证方式

访问虚拟IP,看是否会进行轮询

四、负载均衡+高可用集群

1、LVS+Keepalived

1)、实现原理

1、由多台路由器组成一个热备组,通过共用的虚拟IP地址对外提供服务;

2、每个热备组内同时只有一台主路由器提供服务,其他路由器处于冗余状态;

3、若当前在线的路由器失效,则其他路由器会根据设置的优先级自动接替虚拟IP地址,继续提供服务

2)、故障切换

是由虚拟IP地址的漂移来实现的,适用于各种应用服务器

3)、主要优势

1、对LVS负载调度器实现热备切换,提高可用性

2、对服务器池中的节点进行健康检查,自动移除失效节点,恢复后再重新加入

4)、Master节点

(1)全局配置、热备参数配置

要为master和backup调度器实现热备功能,漂移地址使用LVS群集的VIP地址

(2)Web服务器池配置

在keepalived的热备配置基础上,添加“virtual_server VIP 端口 {…}”区段来配置虚拟服务器

包括负载调度算法、群集工作模式、健康检查间隔、真实服务器地址等参数

5)、Backup节点

和master服务器有三个配置要不相同,其余配置均相同:

1
2
3
4
5
(1)router_id:设和其他web服务器不一样的名称

(2)state:设为BACKUP

(3)priority:值要低于主服务器

6)、具体配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
[root@Server1 ~]# modprobe ip_vs ###加载ip_vs模块
[root@Server1 ~]# rpm -ivh /mnt/Packages/ipvsadm-1.27-7.el7.x86_64.rpm ###安装管理软件ipvsadm

[root@Server1 ~]# yum -y install gcc gcc-c++ make popt-devel kernel-devel openssl-devel
[root@Server1 ~]# tar zxf keepalived-2.0.13.tar.gz
[root@Server1 ~]# cd keepalived-2.0.13/
[root@Server1 keepalived-2.0.13]# ./configure --prefix=/
[root@Server1 keepalived-2.0.13]# make && make install
[root@Server1 keepalived-2.0.13]# cp keepalived/etc/init.d/keepalived /etc/init.d ###加入系统管理服务
[root@Server1 keepalived-2.0.13]# systemctl enable keepalived.service ###设置开机自启动
[root@Server1 ~]# vi /etc/keepalived/keepalived.conf ###编辑配置文件
global_defs { #全局参数
router_id LVS_01 #指定名称,各个服务器名称要不一样
}

vrrp_instance VI_1 { #指定vrrp热备参数
state MASTER #服务器角色是master,备份服务器设置为BACKUP
interface ens33 #修改物理网卡名称,默认是centos6的eth0
virtual_router_id 51 #组号相同
priority 100 #优先级,主服务器设置要大于备服务器
authentication {
auth_type PASS #验证类型和密码,不建议修改
auth_pass 1111
}
virtual_ipaddress {
192.168.100.100 #漂移地址(VIP)地址,可以有多个
}
}
virtual_server 192.168.100.100 80 { #配置虚拟服务器
delay_loop 6
protocol TCP #健康检查用的是TCP还是UDP
lb_algo rr #调度算法为轮询
lb_kind DR #LVS的工作模式为DR(直连路由)

real_server 192.168.100.12 80 {
weight 1
TCP_CHECK { #健康检查参数
connect_port 80 #检查80端口连接是否正常
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.100.13 80 {
weight 1
TCP_CHECK {
connect_port 80
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}

2、Haproxy

1)、与LVS的区别

1、LVS在企业应用中抗负载能力很强,但存在不足

LVS不支持正则处理,不能实现动静分离(nginx都支持)

对于大型网站,LVS的实施配置复杂,维护成本相对较高

2、Haproxy是一款可提供高可用性、负载均衡、及基于TCP和HTTP应用的代理的软件

适用于负载大的Web站点

运行在硬件上可支持数以万计的并发连接的连接请求

2)、Haproxy调度算法原理

第一种(RR):

RR算法是最简单最常用的一种算法,即轮询调度

理解举例

有三个节点A、B、C,第一个用户访问会被指派到节点A,第二个用户访问会被指派到节点B,第三个用户访问会被指派到C节点

第四个用户访问继续指派到节点A,轮询分配访问请求实现负载均衡效果

第二种(LC):

LC算法即最小连接数算法,根据后端的节点连接数大小动态分配前端请求

理解举例

有三个节点A、B、C,各节点的连接数分别为A:4、B:5、C:6,此时如果有第一个用户连接请求,会被指派到A上,连接数变为A:5、B:5、C:6

第二个用户请求会继续分配到A上,连接数变为A6、B:5、C:6;再有新的请求会分配给B,每次将新的请求指派给连接数最小的客户端

由于实际情况下A、B、C的连接数会动态释放,很难会出现一样连接数的情况,因此此算法相比较rr算法有很大改进,是目前用到比较多的一种算法

第三种(SH):

SH即基于来源访问调度算法,此算法用于一些有 Session会话记录在服务器端的场景,可以基于来源的IP、Cookie等做集群调度(上一次请求分给哪个web服务器的下次还是分给该服务器)

理解举例

有三个节点A、B、C,第一个用户第一次访问被指派到了A,第二个用户第次访问被指派到了B

当第一个用户第二次访问时会被继续指派到A,第二个用户第二次访问时依旧会被指派到B,只要负载均衡调度器不重启,第一个用户访问都会被指派到A,第二个用户访问都会被指派到B,实现集群的调度

此调度算法好处是实现会话保持,但某些IP访问量非常大时会引起负载不均衡,部分节点访问量超大,影响业务使用

3)、配置文件详解

1、global:全局配置

1
2
3
4
5
6
7
8
9
1、log127.0.0.1 lcal0:配置日志记录,local0为日志设备,默认存放到系统日志

2、log127.0.0.1 loca1 notice:notice为日志级别,通常有24个级别

3、maxconn4096:最大连接数

4、uid 99:用户uid

5、gid 99:用户gid

2、defaults:默认配置

一般会被应用组件继承,如果在应用组件中没有特别声明,将安装默认配置参数设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1、log global:定义日志为global配置中的日志定义

2、mode http:模式为http

3、option httplog:采用http日志格式记录日志

4、retries 3:检查节点服务器失败连续达到三次则认为节点不可用

5、maxconn2000:最大连接数

6、contimeout5000:连接超时时间

7、clitimeout50000:客户端超时时间

8、srvtimeout50000:服务器超时时间

3、listen:应用组件配置

1
2
3
4
5
6
7
8
9
10
11
1、listen appli4- backup 0.0.0.0:10004:定义一个appli4- backup的应用

2、option httpchk /index.html检查服务器的index.html文件

3、option persist:强制将请求发送到已经down掉的服务器(注释掉,否则起服务会报错)

4、balance roundrobin:负载均衡调度算法使用轮询算法

5、server inst1 192.168.114.56:80 check inter 2000 fall 3:定义在线节点

6、server inst2 192.168 114.56:81 check inter 2000 fall 3 backup:定义备份节点

4)、具体配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@Haproxy haproxy]# vim haproxy.cfg

下面两项前面加上注释

\#chroot /usr/share/haproxy #固有目录,可注释掉

\#redispatch #当使用了cookie时,haproxy将会将其请求的后端服务器的serverID插入到cookie中,以保证会话的SESSION持久性;而此时,如果后端的服务器宕掉了,但是客户端的cookie是不会刷新的,如果设置此参数,将会将客户的请求强制定向到另外一个后端server上,以保证服务的正常。需要注释掉

将原来的listen配置项删除,添加如下参数:

listen webcluster 0.0.0.0:80

​ option httpchk GET /index.html

​ balance roundrobin

​ server web1 192.168.73.20:80 check inter 2000 fall 3

​ server web2 192.168.73.30:80 check inter 2000 fall 3

5)、日志管理

1、默认是输出到系统的syslog(系统日志)中,生成环境中一般单独定义

2、具体配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@Haproxy ~]# vi /etc/haproxy/haproxy.cfg
global
log /dev/log local0 info
log /dev/log local0 notice
[root@Haproxy ~]# systemctl restart haproxy.service

[root@Haproxy ~]# vi /etc/rsyslog.d/haproxy.conf
if ($programname == 'haproxy' and $syslogseverity-text == 'info')
then -/var/log/haproxy/haproxy-info.log
&~
if ($programname == 'haproxy' and $syslogseverity-text == 'notice')
then -/var/log/haproxy/haproxy-notice.log
&~
[root@Haproxy ~]# systemctl restart rsyslog.service
[root@Haproxy ~]# systemctl restart haproxy.service

[root@Haproxy ~]# cd /var/log/haproxy/ ###可看日志信息
[root@Haproxy haproxy]# ll
总用量 8
-rw-------. 1 root root 329 11月 5 18:02 haproxy-info.log
-rw-------. 1 root root 132 11月 5 18:02 haproxy-notice.log

6)、参数优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1、maxconn:最大连接数,根据应用实际情况进行调整,推荐使用10240

2、daemon:守护进程模式, Haproxy可以使用非守护进程模式启动,建议使用守护进程模式启动

3、nbproc:负载均衡的并发进程数,建议与当前服务器CPU核数相等或为其2倍

4、retries:重试次数,主要用于对集群节点的检查,如果节点多,且并发量大,设置为2次或3次

5、option http-server-close:主动关闭http请求选项,建议在生产环境中使用此选项

6、timeout http-keep-alive:长连接超时时间,设置长连接超时时间,可以设置为10s

7、timeout http-request:http请求超时时间,建议将此时间设置为5~10s,增加http连接释放速度

8、timeout client:客户端超时时间,如果访问量过大,节点响应慢,可以将此时间设置短一些,建议设置为1min左右就可以了

五、负载均衡+keepalived故障:

1.keepalived服务启动了,但是VIP没出来

主要是启动keepalived服务的时候不会报错;

vrrp_scripts{}中定义了一个函数,里面放了判断nginx存活的脚本,下面track_script{}注意位置,要包含在vrrp_instance{}实例中; (因为一个括号问题排障了接近一个多小时,VIP就是起不来)

2.负载均衡常见典型故障

后台服务器down了,nginx就不会分配请求给它了,但是如果没有down,只是返回异常状态码了,比如504、502、404等,这时需要多一个负载均衡的配置,如下:

proxy_next_upstream http_500 | http_502 | http_503 | http_504 |http_404;意思是,当其中一台返回错误码404,500…等错误时,可以分配到下一台服务器程序继续处理,提高平台访问成功率

3.Nginx负载均衡优化

(1)健康检查

下载nginx_upstream_check模块第三方模块 master.zip

upstream web {

​ server 172.16.1.7:80 max_fails=2 fail_timeout=10s;

​ server 172.16.1.8:80 max_fails=2 fail_timeout=10s;

​ check interval=3000 rise=2 fall=3 timeout=1000 type=tcp;

​ #interval 检测间隔时间,单位为毫秒

​ #rise 表示请求2次正常,标记此后端的状态为up

​ #fall 表示请求3次失败,标记此后端的状态为down

​ #type 类型为tcp

​ #timeout 超时时间,单位为毫秒

location /upstream_check {

​ check_status;

(2)nginx配置文件中调优

1、worker_processes 8;

nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cpu计为8)。

2、worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

为每个进程分配cpu,上例中将8个进程分配到8个cpu,当然可以写多个,或者将一个进程分配到多个cpu。

3、worker_rlimit_nofile 65535;

这个指令是指当一个nginx 进程打开的最多文件描述符数目,理论值应该是最多打开文

件数(ulimit -n)与nginx 进程数相除,但是nginx 分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。

现在在linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。

这是因为nginx调度时分配请求到进程并不是那么的均衡,所以假如填写10240,总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误。

4、use epoll;

使用epoll 的I/O 模型

六、如何进一步优化负载均衡群集架构?

使用外部两台LVS作为接入入口;进入之后再用多台nginx来分担请求

1.在keepalived+nginx的主备容灾高可用的架构中,nginx是作为外部访问系统的唯一入口,理论上一台nginx的最大并发量可以高达50000,但是当并发量更大的时候,keepalived+nginx的高可用机制是没办法满足需求的,因为keepalived+nginx的架构中只有一台nginx在工作(VIP在一台上),只有当master宕机或异常时候,备份机才会上位。那么如何解决更大的高并发问题呢,也许会问能不能搭建nginx集群,直接对外提供访问?

很显然这是欠妥当的,因为当nginx作为外部的唯一访问入口,没办法直接以集群的形式对外提供服务。但是在内网环境下,是可以用nginx集群(nginx横向扩展服务集合)的,当然总得有一个对外入口,所以需要在nginx集群之上,在加一层负载均衡器(两个LVS),作为系统的唯一入口。

2.LVS都有哪些模式,你们公司用的哪一种?

DR模式:客户端请求是到负载均衡器,负载均衡器将请求分发给后面的真实服务器之后,服务器直接回应到客户端

优点:

DR模式相对于NAT模式,RealServer直接在不经DirectServer的情况下直接将客户端的访问结果返回至给客户端,效率更加高效;

缺点:

所有的RealServer和DirectServer必须在同一局域网中;

除了这个DR模式之外,我还了解过IP隧道模式和NAT模式,不过没有在生产中用过。

IPVS的运行,使用的服务器资源主要是 CPU、内存I/O、网络I/O;IPVS完全运行在内存中,并且运行在内核态。

当IPVS的应用在DR模式时,既不耗CPU,也不耗I/O,运行非常快,所以系统负载非常的低,跟据我的经验,一般负载总是0。所以 LVS 应用对服务器的配置要求非常低。以为 LVS 很重要,所以配置一个相当高端的服务器,实在是一种浪费。

其实我们可以做一下计算:

就是说,当系统当前有100 万连接的时候,才用去内存 208 M,所以 IPVS 的主机,即使是1G的内存,也足以承载负载。

七、Haproxy和LVS/NGINX对比

(1)LVS在企业应用中康复在能力很强,但存在不足,LVS不支持正则处理,不能实现动静分离,对于大型网站,LVS的实施配置复杂,维护成本相对较高。

(2)haproxy特别适用于那些高负载、访问量很大,但提供高可用性、负载均衡、及TCP(四层)和HTTP(七层)应用的代理的软件的业务应用,不能实现动静分离。

(3)nginx配置简单,可以在实现负载均衡的同时,处理静态页面,分担Tomcat的负担。

LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?

LVS:Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。

LVS: 是基于四层的转发

Nginx:Nginx是一款轻量级的web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。

Nginx: 是WEB服务器,缓存服务器,又是反向代理服务器,可以做七层的转发

HAproxy:HAproxy是一个使用C语言编写的自由及开放源代码软件[1],其提供高可用性,负载均衡,以及基于TCP和HTTP的应用程序代理。

HAproxy: 是基于四层和七层的转发,是专业的代理服务器

区别: LVS由于是基于四层的转发所以只能做端口的转发,而基于URL的、基于目录的这种转发LVS就做不了

总结:通过概念方面,我们可以看得出来,都可以提供高可用和负载均衡等的服务,所以从概念方面,没有什么区别

工作选择:

HAproxy和Nginx由于可以做七层的转发,所以URL和目录的转发都可以做

在很大并发量的时候我们就要选择LVS,像中小型公司的话并发量没那么大

选择HAproxy或者Nginx足已,由于HAproxy由是专业的代理服务器

配置简单,所以中小型企业推荐使用HAproxy