集群高可用之lvs+keepalive

时间:2023-12-20 18:32:08

集群高可用之lvs+keepalive

keepalive简介:

负载均衡架构依赖于知名的IPVS内核模块,keepalive由一组检查器根据服务器的健康情况动态维护和管理服务器池。keepalive通过VRRP协议实现高可用架构。VRRP是路由灾备的实现基础。

LVS核心是调度器,所有的数据请求需要经过调度器进行调度转发。万一调度器发生故障,整个集群系统全部崩溃,所以需要keepalive实现集群系统的高可用。

部署两台或多台lvs调度器,仅有一台调度器做主服务器,其他为备用。当主发生故障后,keepalive可以自动将备用调度器作为主,实现整个集群系统的高负载,高可用

VRRP协议介绍:

VRRP协议是为消除在静态缺省路由环境下的缺省路由器单点故障引起的网络失效而设计的主备模式的协议,使得在发生故障而进行设备功能切换时可以不影响内外数据通信,不需要再修改内部网络的网络参数。VRRP协议需要具有IP地址备份,优先路由选择,减少不必要的路由器间通信等功能。

VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器IP(一个或多个),而在路由器组内部,如果实际拥有这个对外IP的路由器如果工作正常的话就是MASTER,或者是通过算法选举产生,MASTER实现针对虚拟路由器IP的各种网络功能,如ARP请求,ICMP,以及数据的转发等;其他设备不拥有该IP,状态是BACKUP,除了接收MASTER的VRRP状态通告信息外,不执行对外的网络功能。当主机失效时,BACKUP将接管原先MASTER的网络功能。

配置VRRP协议时需要配置每个路由器的虚拟路由器ID(VRID)和优先权值,使用VRID将路由器进行分组,具有相同VRID值的路由器为同一个组,VRID是一个0~255的正整数;同一组中的路由器通过使用优先权值来选举MASTER,优先权大者为MASTER,优先权也是一个0~255的正整数。

有一种特殊情况,将虚拟路由IP地址设置为多台路由设备中某台设备的真实ip地址,该路由设备将永远处于主设备状态。

本例用centos7服务器

keepalived 搭建

yum -y install gcc openssl-devel popt-devel libnl libnl-devel kernel-devel ipvsadm
cd /usr/local/src
wget http://www.keepalived.org/software/keepalived-1.2.7.tar.gz
tar -xzf keepalived-1.2.7.tar.gz
cd keepalived-1.2.7/
./configure
make && make install
ln -s /usr/local/etc/keepalived/ /etc
ln -s /usr/local/etc/rc.d/init.d/keepalived /etc/init.d/
ln -s /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
ln -s /usr/local/sbin/keepalived /usr/sbin/

集群高可用之lvs+keepalive

配置图如上:

配置如下:

web1,web2 的操作

nginx1的操作
vim /etc/sysconfig/network-scripts/ifcfg-eno16
DEVICE=eno16
BOOTPROTO=statci
ONBOOT=yes
TYPE=Ethernet
IPADDR=192.168.1.30
NETMASK=255.255.255.0
GATEWAY=192.168.1.1 vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
BOOTPROTO=statci
ONBOOT=yes
TYPE=Ethernet
IPADDR=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.1 vim /etc/sysctl.conf
net.ipv4.conf.eno16.arp_ignore = 1
net.ipv4.conf.eno16.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce =2 sysctl -p
systemctl restart network
echo "192.168.1.100" > /usr/local/nginx/conf/html/index.html
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload nginx2的操作
vim /etc/sysconfig/network-scripts/ifcfg-eno16
DEVICE=eno16
BOOTPROTO=statci
ONBOOT=yes
TYPE=Ethernet
IPADDR=192.168.1.40
NETMASK=255.255.255.0
GATEWAY=192.168.1.1 vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
BOOTPROTO=statci
ONBOOT=yes
TYPE=Ethernet
IPADDR=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.1 vim /etc/sysctl.conf
net.ipv4.conf.eno16.arp_ignore = 1
net.ipv4.conf.eno16.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce =2 sysctl -p
systemctl restart network
echo "192.168.1.40" > /usr/local/nginx/conf/html/index.html
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload

调度器lvs1和lvs2的配置

lvs1的配置
vim /etc/sysconfig/network-scripts/ifcfg-eno16
DEVICE=eno16
BOOTPROTO=statci
ONBOOT=yes
TYPE=Ethernet
IPADDR=192.168.1.10
NETMASK=255.255.255.0
GATEWAY=192.168.1.1 systemctl restart network
yum -y install keepalived ipvsadm
将lvs1设置为主,lvs2设置为备,保证其中一台调度器出现故障后,另一台可以及时。
自动激活替换损坏的故障设备。在该配置文件中添加虚拟服务,
并为该虚拟服务添加后端真实web服务器组和相应的调度算法。

vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived global_defs {
notification_email {
test@gmail.com
}
notification_email_from root@localhost
smtp_server 127.0.0.1
smtp_connect_timeout
router_id lvs1
} vrrp_instance LVS_HA {
state MASTER #lvs_2为备用
interface eno16
virtual_router_id #lvs_2的VRID必须与lvs_1相同
priority #在相同的VRID组中优先级高者为主设备
advert_int
authentication {
auth_type PASS
auth_pass
}
virtual_ipaddress {
192.168.0.1/
}
} virtual_server 192.168.0.1 {
delay_loop
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout
protocol TCP real_server 192.168.1.30 {
weight
TCP_CHECK {
connetct_timeout
connect_port
nb_get_retry
}
} real_server 192.168.1.40 {
weight
TCP_CHECK {
connetct_timeout
connect_port
nb_get_retry
}
}

}
systemctl start keepalived
systemctl enable keepalived
ip addr show
ipvsadm -Ln
firewall-cmd --set-default-zone=trusted

同理在上面配置lvs2

更改下网卡信息

vim /etc/keepalived/keepalived.conf

router_id lvs_2和priority 50

在软路由上配置ip省略。

省略ip的配置
systemctl restart network
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
因为使用的是Linux的软路由,下面需要使用iptables实现NAT地址转发功能,
实现内网和外网的数据通信
iptables -t nat -I PREPOUTING -d 124.126.147.168 -p tcp \
-dport \ -j DNAT --to-destination 192.168.1.100: iptables -t nat -I POSTROUTING -S 192.168.1.0/ -P tcp \
-j SNAT --to-source 124.126.147.168 vim /etc/sysctl.conf
net.ipv4.ip_forward = sysctl -p
客户端验证:http://124.126.147.168,可以得到不同real server的响应数据包