集群高可用之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/

配置图如上:

配置如下:

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的响应数据包

集群高可用之lvs+keepalive的更多相关文章

  1. 集群高可用之lvs

    集群: 随着互联网的发展,大量的客户端的请求,服务器的负载越来越大,单台服务器的负载有限,会导致服务器响应客户端请求的时间越长,甚至产生拒绝服务的情况.目前网站是24小时不间断提供网络服务,仅采用单点 ...

  2. Rabbitmq集群高可用测试

    Rabbitmq集群高可用 RabbitMQ是用erlang开发的,集群非常方便,因为erlang天生就是一门分布式语言,但其本身并不支持负载均衡. Rabbit模式大概分为以下三种:单一模式.普通模 ...

  3. bitmq集群高可用测试

    Rabbitmq集群高可用 RabbitMQ是用erlang开发的,集群非常方便,因为erlang天生就是一门分布式语言,但其本身并不支持负载均衡. Rabbit模式大概分为以下三种:单一模式.普通模 ...

  4. openstack pike 集群高可用 安装 部署 目录汇总

    # openstack pike 集群高可用 安装部署#安装环境 centos 7 史上最详细的openstack pike版 部署文档欢迎经验分享,欢迎笔记分享欢迎留言,或加QQ群663105353 ...

  5. 浅谈MySQL集群高可用架构

    前言 高可用架构对于互联网服务基本是标配,无论是应用服务还是数据库服务都需要做到高可用.对于一个系统而言,可能包含很多模块,比如前端应用,缓存,数据库,搜索,消息队列等,每个模块都需要做到高可用,才能 ...

  6. Eureka 集群高可用配置.

    SERVER:1 server: port: 1111 eureka: instance: hostname: ${spring.cloud.client.ip-address} instance-i ...

  7. mysql集群高可用架构

    前言 高可用架构对于互联网服务基本是标配,无论是应用服务还是数据库服务都需要做到高可用.对于一个系统而言,可能包含很多模块,比如前端应用,缓存,数据库,搜索,消息队列等,每个模块都需要做到高可用,才能 ...

  8. hadoop+zookeeper集群高可用搭建

                                                                  hadoop+zookeeper集群高可用搭建 Senerity 发布于 2 ...

  9. RabbitMQ从零到集群高可用(.NetCore5.0) - 死信队列,延时队列

    系列文章: RabbitMQ从零到集群高可用(.NetCore5.0) - RabbitMQ简介和六种工作模式详解 RabbitMQ从零到集群高可用(.NetCore5.0) - 死信队列,延时队列 ...

随机推荐

  1. CF1060C Maximum Subrectangle

    思路: 不难发现,对矩阵中的数字求和实际上是先分别对a,b两个数列中对应子段的元素求和再相乘.题目是要求在和不超过给定值的情况下使选出的矩阵面积最大.我们反其道而行之,考虑在子段长度一定的情况下,和最 ...

  2. JS动态获取项目名以及获取URL地址中的参数

    在项目当中我们可能会遇到例如改变的项目名称之后,相对应的地址就需要改变,为了减少工作量,将地址当中的项目名这一块写成动态获取的,那么最关键一点就是我要先获取它,再进行操作: 知识点整理,话不多说,直接 ...

  3. 将生成的Excel表发送到邮箱

    本文接上一篇,将得到的Excel表发送到邮箱.. 在上一篇中,本人使用的是直接从数据库中获取数据,然后包装成Excel表.现在将该Excel表发送到目的邮箱,如果需要跟上篇一样,定时每天某时刻发送,就 ...

  4. HDU 5469 Antonidas (树形DP,暴力)

    题意: 给一棵n节点的树图,每个点都是一个小写字母,要求找到两个点(a,b),从a->b的路径上形成了一个字符串为s.给出s,问是否存在这样的点对. 思路: 考虑一个点,要么从该点出发,要么在该 ...

  5. jQuery备忘录

    jquery 中遍历数组 var arr = [1,2,3,4,5] $.each(arr,function(i,j){ console.log(i,j) }) 结果 0 1 1 2 .... jQu ...

  6. 作用域插槽 向父组件传递 <template slot-scope="{ row, index }" slot="dateNo">

    作用域插槽 向父组件传递 <template slot-scope="{ row, index }"  slot="dateNo"> slotTes ...

  7. mongodb测试类

    public class MongoManager { private static final String MONGO_DBNAME="local"; private stat ...

  8. UVa-101-木块问题

    这题用vector比较好写,我们设置对应的几个函数,然后进行相应的操作来简化代码,这样才不易出错. 对于输入和操作来说我们经分析之后,可以看到最后一个操作时最原始的操作也就是不需要还原任意一个堆任意高 ...

  9. emoji等表情符号存mysql的方法

    项目中需要存储用户信息(用户昵称有表情符号),自然就遇到了emoji等表情符号如何被mysql DB支持的问题 这里引用先行者博文:https://segmentfault.com/a/1190000 ...

  10. MYSQL数据库SQL语句集锦

    *特别说明:FILED代表数据表字段,CONDITIONS代表where之后的条件,TABLENAME代表数据表名   []中括号内的内容代表 可有可无. 创建数据库 create  database ...