Linux集群架构
- 集群介绍
- keepalived介绍
- 用keepalived配置高可用
- 负载均衡集群介绍
- LVS介绍
- LVS的调试算法
- LVS NAT模式搭建
- LVS DR模式搭建
- keepalived LVS
集群介绍
根据功能划分为两大类:高可用和负载均衡
高可用集群常为两台服务器,一台工作,另外一台作为冗余,当提供服务的机器宕机,冗余将接替继续提供服务
实现高可用的开源软件有:keepalived、heartbeat
负载均衡集群,需要有一台服务器作为分发器,它负责把用户的请求分发给后端的服务器处理,在这个集群里,除了分发器外,就是给用户提供服务的服务器了,这些服务器数量至少为2
实现负载均衡的开源软件有LVS、keepalived、haproxy、nginx,商业的有F5、Netscaler
keepalived介绍
使用keepalived来实现高可用集群,因为heartbeat在centos6上有一些问题
keepalived通过VRRP(Virtual Router Redundancy Protocol)来实现高可用
在这个协议里会将多台功能相同的路由器组成一个小组,这个小组会有1个master角色和N(N>=1)个backup角色。
master会通过组播的形式向各个backup发送VRRP协议的数据包,当backup收不到master发来的VRRP数据包时,就会认为master宕机了。此时就需要根据各个backup的优先级来决定谁成为新的master。
keepalived有三个模块,分别是core、check和vrrp。其中core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件加载和解析,check模块负责健康检查,vrrp模块是来实现VRRP的。
用keepalived配置高可用集群
mater:192.168.221.10
1.安装keepalived
2.安装nginx
3.编辑keepalived.conf
4.编辑监控脚本,给脚本文件执行权限
5.启动keepalived
代码如下:
yum install keepalived.x86_64 -y
yum install epel-release -y
yum install nginx -y
vim keepalived.conf //以下是文件内容
1 global_defs {
2 notification_email {
3 apeng@apenglinux.com
4 }
5 notification_email_from root@apenglinux.com
6 smtp_server 127.0.0.1
7 smtp_connect_timeout 30
8 router_id LVS_DEVEL
9 }
10 vrrp_script check_nginx {
11 script "/usr/local/sbin/check_nginx.sh"
12 interval 3
13 }
14 vrrp_instance VI_1 {
15 state MASTER
16 interface ens33
17 virtual_router_id 51
18 priority 100
19 advert_int 1
20 authentication {
21 auth_type PASS
22 auth_pass 1111
23 }
24 virtual_ipaddress {
25 192.168.221.100
26 }
27 track_script {
28 check_nginx
29 }
30 }
vim /usr/local/sbin/check_nginx.sh
#!/bin/bash
#
d=`date --date today +%Y%m%d_%H:%M:%S`
n=`ps -C nginx --on-heading | wc -l`
if [ $n -eq "0" ]; then
systemctl start nginx
n2=`ps -C nginx --no-heading | wc -l`
if [ $n2 -eq "0" ]; then
echo "$d nginx down,keepalived will stop." >> /var/log/check_nginx.log
systemctl stop keepalived
fi
fi
chmod +x /usr/local/sbin/check_nginx.sh
systemctl start keepalived
启动keepalived时,如果没有将拉起nginx进程,则需要关闭selinux
backup:192.168.221.20
1.安装keepalived
2.安装nginx(源码包安装过了)
3.编辑keepalived.conf
4.编辑监控脚本,给脚本文件执行权限
5.启动keepalived
代码如下:
yum install keepalived.x86_64 -y
vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
apeng@apenglinux.com
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script check_nginx {
script "/usr/local/sbin/check_nginx.sh"
interval 3
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.221.100
}
track_script {
check_nginx
}
}
vim /usr/local/sbin/check_nginx.sh
#!/bin/bash
#
d=`date --date today +%Y%m%d_%H:%M:%S`
n=`ps -C nginx --no-heading | wc -l`
if [ $n -eq "0" ]; then
/etc/init.d/nginx start
n2=`ps -C nginx --no-heading | wc -l`
if [ $n2 -eq "0" ]; then
echo "$d nginx down,keepalived will stop." >> /var/log/check_nginx.log
systemctl stop keepalived
fi
fi
chmod +x /usr/local/sbin/check_nginx.sh
systemctl start keepalived.service
vip:192.168.221.100(用于用户访问)
负载均衡集群介绍
主流开源软件LVS、keepalived、haproxy、nginx等
其中LVS属于4层(网络OSI7层模型),nginx属于7层,haproxy既可以为是4层,也可以当做7层使用
keepalived的负载均衡功能其实就是lvs
lvs这种4层的负载均衡是可以分发除80外的其他端口通信的,比如Mysql的,而nginx仅仅支持http、https、mail、haproxy也支持mysql这种
相比较来说,LVS这种4层的更稳定,能承受更多的请求,而nginx这种7层的更加灵活,能实现更多的个性化需求
LVS介绍
LVS(Linux Virtual Server)是由中国大牛章文嵩开发的,这款软件的流行度不亚于Apache的httpd,它是一款四层的负载均衡软件,是针对TCP/IP做的转发和路由,所以稳定性和效率相当高。虽然目前越来越多的企业选择使用Nginx实现负载均衡,但LVS依然被很多企业应用在核心的架构中。该架构中有一个核心的角色叫做调度器(Load Balance),用来分发用户的请求,还有诸多的真实服务器(Real Server),也就是处理用户的服务器。
LVS根据实现方式的不同,主要分为三种类型:NAT模式、IP Tunnel(IP隧道)模式、DR模式。
LVS NAT模式
调试器会把用户的请求通过预设的iptables规则转发给后端的真实服务器。其中调试器有两个IP,一个是公网ip,一个是内网ip,而真实服务器只有内网ip。用户访问的时候请求的是调试器的公网IP,它会把用户的请求转发到真实服务器的内网ip上。这种模式的好处是节省公网ip,但是调试器会成为一个瓶颈。
IP Tunnel模式
IP隧道是将一个IP报文封装在另一个IP报文的技术,这可以使目标为一个IP地址的数据报文能被封装和转发到另一个IP地址。像大家熟知的×××技术其实就是IP隧道。在LVS的IP Tunnel架构中,后端服务器有一组而非一个,所以不可能静态地建立一一对应的隧道,而是动态地选择一台服务器,将请求报文封装和转发给选出的服务器。这样,我们可以利用IP隧道的原理,将一组服务器上的网络服务组成在一个IP地址上的虚拟网络服务。
这种模式需要有一个公共的IP配置在分发器和所有rs上,我们把它叫做vip。
客户端请求的目标IP为vip,分发器接收到请求数据包后,会对数据包做一个加工,会把目标ip所为rs的ip,这样数据包就到了rs上。rs接收数据包后,会还原始数据包,这样目标ip为vip,因为所有rs上配置了这个vip,所以它会认为是它自己。
DR模式
和IP Tunnel模式方法相同,用户的请求被调度器动态地分配到真实服务器上,真实服务器响应请求把结果返回给用户。不过,在这种模式下不会封装ip,而是将数据帧的MAC地址改为真实服务器的MAC地址。
LVS的调度算法
调度器把客户端发来的请求均衡地分发给后端的真实服务器,这是依靠预先设定好的调度算法实现的,在LVS中支持的调度算法主要有以下8种。
- 轮询调度(Round-Robin)
- 带权重的轮询调度(Weighted Round-Robin)
- 最小连接调度(Least-Connection)
- 带权重最小连接调度(Weight Least-Connection)
- 基于局部性的最少链接调度(Locality-Based Least Connection)
- 带复制的基于局部性最小链接调度(Locality-Based Least-Connection with Replication)
- 目标地址散列调度(Destination Hashing)
- 源地址散列调度(Source Hashing)
LVS NAT模式搭建
- 调度器dir :192.168.221.10(内网) 192.168.1.50(外网) 安装ipvsadm,脚本lvs_nat.sh
- 真实服务器rs1:192.168.221.20(内网) nginx
- 真实服务器rs2:192.168.221.30(内网) ngnix
- rs1,rs1的网关指向dir的内网ip
- 将三台机器上的防火墙规则清空
iptables -F;iptables -t nat -F;service iptables save
调度器dir的配置代码如下:
yum install ipvsadm.x86_64 -y
vim /usr/local/sbin/lvs_nat.sh //以下脚本内容 #!/bin/bash # echo 1 > /proc/sys/net/ipv4/ip_forward echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects echo 0 > /proc/sys/net/ipv4/conf/ens33/send_redirects echo 0 > /proc/sys/net/ipv4/conf/ens37/send_redirects iptables -t nat -F iptables -t nat -X iptables -t nat -A POSTROUTING -s 192.168.221.0/24 -j MASQUERADE IPVSADM="/usr/sbin/ipvsadm" $IPVSADM -C $IPVSADM -A -t 192.168.1.50:80 -s wlc -p 300 $IPVSADM -a -t 192.168.1.50:80 -r 192.168.221.20:80 -m -w 1 $IPVSADM -a -t 192.168.1.50:80 -r 192.168.221.30:80 -m -w 1
ipvsadm [options]
-C //清空规则
-A //增加Virtual Server
-t //tcp
-s //调度算法
-p //指定超时时间
-a //添加rs
-r //指定rs的ip
-m //表示lvs的模式为NAT(masquerad)
-g //表示lvs模式为DR
-i //表示lvs模式为IP Tunnel
bash /usr/local/sbin/lvs_nat.sh
rs1配置如下:
yum install epel-release -y
yum install nginx -y
grep -i gateway ifcfg-ens33 //以下一行是查出的内容
GATEWAY=192.168.221.10
echo "Real Server1 IP is 192.168.221.20" > /usr/share/nginx/html/index.html
systemctl start nginx.service
rs2配置如下:
yum install epel-release -y
yum install nginx -y
grep -i gateway ifcfg-ens33 //以下一行是查出的内容
GATEWAY=192.168.221.10
echo "Real Server2 IP is 192.168.221.30" > /usr/share/nginx/html/index.html
systemctl start nginx.service
测试
在dir上分别访问两个rs,在dir上访问dir外网ip:192.168.1.50(多访问几次,看看效果)
curl 192.168.221.20
Real Server1 IP is 192.168.221.20
curl 192.168.221.30
Real Server2 IP is 192.168.221.30
curl 192.168.1.50
Real Server2 IP is 192.168.221.30
在浏览器中访问dir外网
LVS DR模式搭建
- 调度器dir:192.168.221.10 lvs_dr.sh 安装ipvsadm
- 真实服务器rs1:192.168.221.20 lvs_dr_rs.sh nginx
- 真实服务器rs2:192.168.221.30 lvs_dr_rs.sh nginx
- VIP:192.168.221.100
调度器dir代码如下:
vim /usr/local/sbin/lvs_dr.sh
#!/bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
ipv="/usr/sbin/ipvsadm"
vip=192.168.221.100
rs1=192.168.221.20
rs2=192.168.221.30
ifconfig ens33:2 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip dev ens33:2
$ipv -C
$ipv -A -t $vip:80 -s rr
$ipv -a -t $vip:80 -r $rs1:80 -g -w 1
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1
bash /usr/local/sbin/lvs_dr.sh
rs1代码如下:
vim /usr/local/sbin/lvs_dr_rs.sh
#!/bin/bash
vip="192.168.221.100"
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip 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
bash /usr/local/sbin/lvs_dr_rs.sh
rs2代码如下:
vim /usr/local/sbin/lvs_dr_rs.sh
#!/bin/bash
vip="192.168.221.100"
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip 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
bash /usr/local/sbin/lvs_dr_rs.sh
在浏览器中访问
keepalived LVS
LVS架构中,不管是NAT模式还是DR模式,当后端的RS宕掉时,调度器依然会把请求转发到宕掉的RS上,这样的结果并不是我们想要的。其实,keepalived就可以解决该问题,它不仅仅有高可用的功能,还有负载均衡的功能。在调度器上只要安装了keepalived,就不用再安装ivpsadm了,也不用去编写lvs相关的脚本了,也就是说keepalived已经嵌入了lvs功能了。完整的keepalived+lvs架构需要有两台调度器实现高可用,提供调度器服务的只需要一台,另外一台作为备用。
- 调度器dir1:192.168.221.10 keepalived 开启路由转发功能
- 调度器dir2:192.168.221.50 keepalived 开启路由转发功能
- 真实服务器rs1:192.168.221.20 nginx
- 真实服务器rs2:192.168.221.30 nginx
- VIP:192.168.221.100
调度器dir1的代码如下(dir1与dir2代码一样):
yum install keepalived -y
vim /etc/keepalived/keepalived.conf //以下是文件内容
vrrp_instance VI_1 {
state MASTER //dir2上为"BACKUP"
interface ens33
virtual_router_id 51
priority 100 //dir2上改为“90”
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.221.100
}
}
virtual_server 192.168.221.100 80 {
delay_loop 6
lb_algo wlc
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.221.20 80 {
weight 100
TCP_CHECK {
connection_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.221.30 80 {
weight 100
TCP_CHECK {
connection_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
rs1,rs2上分别执行
bash /usr/local/sbin/lvs_dr_rs.sh //内容与上面定义的一样
测试
在浏览器中访问192.168.221.100
关闭rs1中的nginx进行测试
关闭dir1中的keepalived进行测试
转载于:https://blog.51cto.com/13480443/2083289