1.集群
1.1.集群介绍
- 一组通过高速网络互联的计算组,并以单一系统的模式加以管理
- 将很多服务器集中在一起,提供一种服务,在客户端看来就象是只有一个服务器
- 可以在付出较低成本的情况下获得在性能,可靠性,灵活性方面的相对较高的收益
- 任务调度是集群系统的核心技术
1.2 集群的作用
- 提高性能:计算密集应用,如天气预报,核试验模拟
- 降低成本:相对百万美元的超级计算机,价格便宜
- 提高可扩展性:只要增加集群节点即可
- 增强可靠性:多个节点完成相同功能,避免单点失败
1.3 集群分类
-
高性能计算集群HPC
- 通过以集群开发的并发应用程序,解决复杂的科学问题
-
负载均衡(LB)集群
- 客户端负载在计算机集群中尽可能平均分摊
-
高可用(HA)集群
- 避免单点故障,当一个系统发生故障时,可以快速迁移
2.lvs集群
2.1扩展分类
1.向上扩展
- 用更好的主机来代替性能更好的主机
2.向内扩展
- 组合多台主机来完成单个任务,将任务分散处理
2.2 lvs集群组成
-
前端:负载均衡层
- 由一台或多台负载调度器构成
-
中间:服务器群组层
- 有一组实际运行应用服务的服务器组成
-
后端:数据共享存储层
- 提供共享存储空间的存储区域
2.3 lvs专业用语
-
Director Server:调度服务器
- 将负载分发到Real Server的服务器
-
Real Server:真实服务器
- 真正提供应用服务的服务器
-
VIP:虚拟IP地址
- 公布给用户访问的虚拟IP地址
-
RIP:真实IP地址
- 集群节点上使用的IP地址
-
DIP:调度器连接节点服务器的IP地址
-
ipvsadm:用户空间的命令行工具,用于管理集群服务
-
ipvs:工作于内核中netfilter INPUT钩子上
2.4 lvs工作模式
2.4.1DR模式
Virtual Server via Direct Routing(VS-DR):用直接路由技术实现虚拟服务器。当参与集群的计算机和作为控制管理的计算机在同一个网段时可以用此方法,控制管理的计算机接收到请求包时直接送到参与集群的节点。直接路由模式比较特别,很难说和什么方面相似,前种模式基本上都是工作在网络层上(三层),而直接路由模式则应该是工作在数据链路层上(二层)。
工作原理:
如上图所示,Director和REAL SERVER都配置同一个IP(VIP),Director将该IP配置到对外的网卡上,Real server将该IP配置到lo网卡上。配置arp_ignore为1(目的是让数据包发出apr请求时,只有Director会响应该arp请求),所有REAL SERVER对本身这个IP的ARP请求保持静默。而Director收到数据包后根据调度算法,找出对应的 REAL SERVER,把目的MAC地址改为REAL SERVER的MAC并发给这台REAL SERVER。这时REAL SERVER通过网卡eth0收到这个数据包,由于Real Server上的lo网卡配置的也有VIP,所以RS接收该数据包。处理后直接返回给客户端(这里要配置arp_announce,目的是修改返回数据包的源ip地址。)。由于DR要对二层包头进行改换,所以DR和REAL SERVER之间必须在一个广播域,也可以简单的理解为在同一台交换机上。
数据包流转过程:
相对于NAT模式来言,DR模式能够较好的解决上述问题,其数据在服务器集群中的流向如上图所示,请求报文经过LVS到达后端真实的WEB服务器,而响应报文,则直接发给客户端,并不需要通过调度器。
2.4.2 TUN模式
- 客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。
- 负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将在客户端请求报文的首部再封装一层IP报文,将源地址改为DIP,目标地址改为RIP,并将此包发送给RS。
- RS收到请求报文后,会首先拆开第一层封装,然后发现里面还有一层IP首部的目标地址是自己lo接口上的VIP,所以会处理次请求报文,并将响应报文通过lo接口送给eth0网卡(这个网卡一般指和调度器在一个网段的网卡)直接发送给客户端。注意:需要设置lo接口的VIP不能在公网上出现。
- 在 VS/TUN 的集群系统中,负载调度器只将请求调度到不同的后端服务器,后端服务器将应答的数据直接返回给用户。这样,负载调度器就可以处理大量的请求,它甚至可以调度百台以上的服务器(同等规模的服务器),而它不会成为系统的瓶颈。即使负载调度器只有 100Mbps的全双工网卡,整个系统的最大吞吐量可超过 1Gbps。所以,VS/TUN 可以极大地增加负载调度器调度的服务器数量。VS/TUN 调度器可以调度上百台服务器,而它本身不会成为系统的瓶颈,可以 用来构建高性能的超级服务器。
2.4.3NAT模式
Virtual Server via NAT(VS-NAT):用地址翻译实现虚拟服务器。地址转换器有能被外界访问到的合法IP地址,它修改来自专有网络的流出包的地址。外界看起来包是来自地址转换器本身,当外界包送到转换器时,它能判断出应该将包送到内部网的哪个节点。
数据包流转的过程如上图所示:
- 1.当用户请求到达DirectorServer,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP 。
- 2.PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链。
- 3.IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP ,在这个过程完成了目标IP的转换。
- 4.POSTROUTING链通过选路,将数据包发送给Real Server。
- 5.Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP 。
- 6.Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP。
NAT模式优点是节省IP地址,能对内部进行伪装;缺点是效率低,因为返回给请求方的数据包经过调度器。
2.4.4 full-nat模式
特点:
- RIP,DIP可以使用私有地址;
- RIP和DIP可以不再同一个网络中,且RIP的网关未必需要指向DIP;
- 支持端口映射;
- RS的OS可以使用任意类型;
- 请求报文经由Director,响应报文也经由Director
- 抗攻击,跨vlan,需要重新编译内核
优点:解决了跨VLAN的问题。采用这种方式,LVS和RS的部署在VLAN上将不再有任何限制,大大提高了运维部署的便利性。
3.ipvsadm常用用法
//查看系统对ipvs的支持情况,包括算法
[root@yan ~]# grep -i -A 2 'ipvs' /boot/config-3.10.0-862.el7.x86_64
CONFIG_NETFILTER_XT_MATCH_IPVS=m
CONFIG_NETFILTER_XT_MATCH_LENGTH=m
CONFIG_NETFILTER_XT_MATCH_LIMIT=m
--
# IPVS transport protocol load balancing support
#
CONFIG_IP_VS_PROTO_TCP=y
--
# IPVS scheduler
#
CONFIG_IP_VS_RR=m
--
# IPVS SH scheduler
#
CONFIG_IP_VS_SH_TAB_BITS=8
--
# IPVS application helper
#
CONFIG_IP_VS_FTP=m
//安装ipvsadm
[root@dr ~]# yum -y install ipvsadm
[root@dr ~]# which ipvsadm
/usr/sbin/ipvsadm
//管理集群服务:
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask]
ipvsadm -D -t|u|f service-address
//常见的service-address:
tcp:-t ip:port
udp:-u ip:port
fwm:-f mark
-s scheduler:
默认为wlc
-p [timeout]:定义持久连接,timeout不指定时默认为300秒
//管理集群服务中的RS
ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight] [-x upper] [-y lower]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
server-address:
ip[:port]
lvs-type:
-g:gateway,dr模式
-i:ipip,tun模式
-m:masquerade,nat模式
-w:设定权重,可为0到正无穷数值,设为0时不会被调度,默认为1
权重值越大则表示性能越好,被调度的资源也会更多
//清空和查看:
ipvsadm -C 清空
ipvsadm -L|l [options] 查看
options:
-n:numeric,基于数字格式显示地址和端口
-c:connection,显示当前ipvs连接
--stats:统计数据
--rate:输出速率信息
--exact:显示精确值,不做单位换算
//保存和重载:
ipvsadm -R 重载
ipvsadm -S [-n] 保存
//置零计数器:
ipvsadm -Z [-t|u|f service-address]
4.通过FWM(FireWalld Mark)定义集群
通过FWM(FireWalld Mark)定义集群的方式:
- 功用:将共享一组RS的集群服务统一进行定义,统一进行调度
- 在director上的netfilter的mangle表的PREROUTING链定义用于“打标”的规则:
iptables -t mangle -A PREROUTING -d $VIP -p $PROTOCOL --dports $PORT -j MARK --set-mark #
$VIP:VIP地址
$PROTOCOL:协议,tcp/udp等
$PORT:端口号
最后的#号表示打标的标记号 - 基于FWM定义集群服务:
ipvsadm -A -f # -s scheduler
ipvsadm -a -f # -t $VIP[:PORT] -r $RIP -g
- 在director上的netfilter的mangle表的PREROUTING链定义用于“打标”的规则:
5. session保持的方法
session保持的方法有以下三种实现方式:
-
session绑定:
- 对某一特定服务:可以使用lvs的sh算法进行session绑定
- 对多个共享同一组RS的服务器,需要统一进行绑定时:可以使用lvs的persistence持久连接来实现
- 功能:无论ipvs使用何种调度方法,其都能实现将来自于同一个Client的请求始终定向至第一次调度时挑选出的RS
- lvs的persistence通过一个持久连接模板来实现持久连接,这个持久连接模板独立于算法之外,模板样式如下:
sourceip rs timer
-
持久连接的实现方式:
- 每端口持久:PPC,单服务持久调度。无论使用何种算法,可以使用此方式实现sh算法的功能,且能定义持久时长
- 每FWM持久:PFWMC,单FWM持久调度。将多种不同的服务通过iptables打标成同一种标记,然后通过FWM进行统一持久调度
- 每客户端持久:PCC,单客户端持久调度
- director上会将用户的任何请求都识别为集群服务,并向RS进行调度
tcp:1-65535
udp:1-65535
- director上会将用户的任何请求都识别为集群服务,并向RS进行调度
session复制
session服务器:memcached,redis(key-value,kv store)
6.配置lvs-dr
环境说明
主机名 | IP |
---|---|
dr | 192.168.214.200 |
sr1 | 192.168.214.150 |
sr2 | 192.168.214.100 |
配置说明
lvs-dr配置:director只需要一块网卡,vip配置在lo接口中即可,此处假设dip与rip在同一网段
配置director的ip地址信息(dip,vip)
配置dip(编辑物理网卡配置文件/etc/sysconfig/network-scripts/ifcfg-eth0)
配置vip:
ifconfig eth0:0 vip/32 broadcast vip up
配置RS的ip地址信息:
配置rip(编辑物理网卡配置文件/etc/sysconfig/network-scripts/ifcfg-eth0)
修改网卡内核参数:编辑/etc/sysctl.conf文件,添加如下内容:
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
配置vip:
ifconfig lo:0 vip/32 broadcast vip up
注意:此处必须先修改网卡内核参数然后再配置vip,因为如果先配vip,vip配好后就会立马通告给别人,而修改内核参数就是为了不通告
配置路由信息:在director和所有RS上进行如下配置:
route add -host vip dev interface:0
在director上添加并保存规则:
ipvsadm -A -t vip:port -s wrr
ipvsadm -a -t vip:port -r rip:port -g
ipvsadm -S > /etc/sysconfig/ipvsadm
配置dr
应此环境dip和rip在同一网段所以不用配置
//安装ipvsadm
[root@dr ~]# yum -y install ipvsadm
//配置vip
[root@dr ~]# ip addr add 192.168.214.250/32 dev lo
[root@dr ~]# ping 192.168.214.250
PING 192.168.214.250 (192.168.214.250) 56(84) bytes of data.
64 bytes from 192.168.214.250: icmp_seq=1 ttl=64 time=0.047 ms
64 bytes from 192.168.214.250: icmp_seq=2 ttl=64 time=0.073 ms
64 bytes from 192.168.214.250: icmp_seq=3 ttl=64 time=0.070 ms
//配置路由信息
[root@dr ~]# route add -host 192.168.214.250/32 dev lo
//配置规则
[root@dr ~]# ipvsadm -A -t 192.168.214.250:80 -s wrr
[root@dr ~]# ipvsadm -a -t 192.168.214.250:80 -r 192.168.214.150:80 -g
[root@dr ~]# ipvsadm -a -t 192.168.214.250:80 -r 192.168.214.100:80 -g
[root@dr ~]# ipvsadm -S > /etc/sysconfig/ipvsadm
配置rs1
同上rip不用配置 在同一网段
//添加文件到配置文件
[root@rs1 ~]# vim /etc/sysctl.conf
[root@rs1 ~]# tail /etc/sysctl.conf
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
net.ipv4.conf.all.arp_ignore = 1 添加
net.ipv4.conf.all.arp_announce = 2 添加
[root@rs1 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
配置vip
[root@rs1 ~]# ip addr add 192.168.214.250/32 dev lo
//配置路由信息
[root@rs1 ~]# route add -host 192.168.214.250/32 dev lo
配置rs2
同上rip不用配置 在同一网段
//添加文件到配置文件
[root@rs2 ~]# vim /etc/sysctl.conf
[root@rs2 ~]# sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
//配置vip
[root@rs1 ~]# ip addr add 192.168.214.250/32 dev lo
//配置路由信息
[root@rs2 ~]# route add -host 192.168.214.250/32 dev lo
验证
[root@dr ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.214.250:80 wrr
-> 192.168.214.100:80 Route 1 0 0
-> 192.168.214.150:80 Route 1 0 0
要求:dr模型实现http和https两种负载均衡集群,注意,各RS都要提供同一个私钥和同一个证书
实验步骤
1.在dr上创建ca
[root@dr ~]# cd /etc/pki/CA/
[root@dr CA]# (ls)
certs crl newcerts private
[root@dr CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048)\
>
Generating RSA private key, 2048 bit long modulus
................................................................+++
..................................+++
e is 65537 (0x10001)
[root@dr CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048)Generating RSA private key, 2048 bit long modulus
...............................................................+++
...............................+++
e is 65537 (0x10001)
[root@dr CA]# openssl rsa -in private/cakey.pem -pubout
writing RSA key
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwunWlsNbv6RDJXEBjISl
VRyfiRBtV7XtXKQ/pv9y9Imj6XPJoRllOBHLKx4xAw9ND1a0Yln0gtfAJSXa6qtW
2NdulC6fWLbX2C35z8mN7iB4D8jgwgevJP82+cbnhZCrTlqaCMQLH6wulbuM8kBq
djWRK+ayorl4vEZvt1eMTS8AIbPbWKw0OMiOXi0lA6siJUox1ILL4uhNMbJa91Gp
C55y/r6OXwR9pDVHHACZDP1Jsh1nyRiNG75gsu3ZmaoVTZ5xgOJmT8q9TfCXy7df
qvIlOZJSL+ynamGajuUp3k8ISusYoXIROe3txKKd2jHdinRJsSstKy55W7NP+W1o
WwIDAQAB
-----END PUBLIC KEY-----
[root@dr CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 1024
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:HB
Locality Name (eg, city) [Default City]:WH
Organization Name (eg, company) [Default Company Ltd]:RUNTIME
Organizational Unit Name (eg, section) []:RUNTIME
Common Name (eg, your name or your server's hostname) []:RUNTIME
Email Address []:
[root@dr CA]# touch index.txt && echo 01 > serial
```~~
\
~~
2.为两个rs申请身份证书,再发给dr,用dr上ca签署,把签署好的证书发给rs1,rs2
3.修改配置文件/etc/httpd/conf.d/ssl.conf ,把生成证书放到相应位置
4.启动httpd 监听443端口
5.调度443
[root@dr ~]# ipvsadm -A -t 192.168.214.250:443 -s wrr
[root@dr ~]# ipvsadm -a -t 192.168.214.250:443 -r 192.168.214.150:443 -g
[root@dr ~]# ipvsadm -a -t 192.168.214.250:443 -r 192.168.214.100:443 -g
[root@dr ~]# ipvsadm -S > /etc/sysconfig/ipvsadm
6.其他同上