一、前言

前两节分别介绍了 Linux 的高可用集群和负载均衡集群,也可以将这两者相结合,即 Keepalived+LVS 组成的高可用负载均衡集群,Keepalived 加入到 LVS 中的原因有以下几点:

1)LVS 拥有一个很关键的角色 Dir(分发器),如果分发器宕机,所有的服务和访问都将会中断。因为入口全部都在 Dir 上,所以需要对分发器做高可用,使用 Keepalived 来实现高可用,Keepalived 其实也具有负载均衡的作用。

2)在使用 LVS 时,如果没有其他额外的操作,把其中一个 Real Server 关机,再去访问是会出现问题的,因为 LVS 依然会把请求转发给已经宕机的服务器,Keepalived 的出现 就可以解决这个问题,即使有一台 Real Server 宕机了,它也能正常提供服务,当请求分发过来时它能够自动检测到后端的 Real Server 宕机,就不会再把请求继续转发到有问题的 Real Server 上。

一个完整的 Keepalived+LVS 架构至少需要有两台调度器(角色为 Dir),分别安装 Keepalived 来实现高可用。Keepalived 内置了 ipvsadm 功能,所以不需要再安装 ipvsadm 包,也不用编写和执行 lvs_dir.sh 脚本。

二、创建 Keepalived+LVS 高可用负载均衡集群

以下使用 Keepalived+LVS 来实现高可用负载均衡集群。

2.1 准备集群节点

准备4台服务器,其中两台作为主备分发器(也叫作调度器,简称 Dir),均安装 Keepalived 服务,另外两台是 Real Server,均安装 nginx 服务,用作处理用户请求的服务器。

主机名 masternode:主调度器,网卡 IP 是 192.168.93.140 是内网(VMWare 网络地址转换 NAT)。

主机名 backupnode:备用调度器,网卡 IP 是 192.168.93.139 是内网(VMWare 网络地址转换 NAT)。

主机名 datanode1:Real Server 1,IP 为 192.168.93.141。

主机名 datanode2:Real Server 2,IP 为 192.168.93.142。

VIP:192.168.93.200

为4台服务器分别设置好 IP 地址和主机名,并关闭防火墙。

2.2 设置 master 主服务器的 Keepalived

编辑配置文件 /etc/keepalived/keepalived.conf,设置为如下内容:

[root@masternode keepalived]# vim /etc/keepalived/keepalived.conf
! Configuration File for master node keepalived global_defs {
notification_email {
admin@moonxy.com
}
notification_email_from root@moonxy.com
smtp_server 127.0.0.1
smtp_connect_timeout
router_id LVS_DEVEL
} vrrp_instance VI_1 {
state MASTER
#绑定VIP的网卡为ens33
interface ens33
virtual_router_id
#设置主服务器优先级为100
priority
advert_int
authentication {
auth_type PASS
auth_pass moonxy
}
virtual_ipaddress {
192.168.93.200
}
} virtual_server 192.168.93.200 {
#每隔10秒钟检查一次Real Server状态
delay_loop
#LVS 负载均衡算法
lb_algo rr
#LVS DR 模式
lb_kind DR
#同一个IP的连接多少秒内被分配到同一台Real Server上,此处设置为0
persistence_timeout
#用TCP协议检查Real Server状态
protocol TCP real_server 192.168.93.141 {
#权重
weight
TCP_CHECK {
#10秒无响应超时
connect_timeout
nb_get_retry
delay_before_retry
connect_port
}
}
real_server 192.168.93.142 {
#权重
weight
TCP_CHECK {
#10秒无响应超时
connect_timeout
nb_get_retry
delay_before_retry
connect_port
}
}
}

主服务器好的配置文件和备份服务器的配置文件的设置基本相同,将 state 设置为 BACKUP,将 priority 设置为 90

2.3 设置 backup 备份服务器的 Keepalived

编辑配置文件 /etc/keepalived/keepalived.conf,设置为如下内容:

[root@backupnode keepalived]# vim /etc/keepalived/keepalived.conf
! Configuration File for master node keepalived global_defs {
notification_email {
admin@moonxy.com
}
notification_email_from root@moonxy.com
smtp_server 127.0.0.1
smtp_connect_timeout
router_id LVS_DEVEL
} vrrp_instance VI_1 {
state BACKUP
#绑定VIP的网卡为ens33
interface ens33
virtual_router_id
#设置备用服务器优先级为90
priority
advert_int
authentication {
auth_type PASS
auth_pass moonxy
}
virtual_ipaddress {
192.168.93.200
}
} virtual_server 192.168.93.200 {
#每隔10秒钟检查一次Real Server状态
delay_loop
#LVS 负载均衡算法
lb_algo rr
#LVS DR 模式
lb_kind DR
#同一个IP的连接多少秒内被分配到同一台Real Server上,此处设置为0
persistence_timeout
#用TCP协议检查Real Server状态
protocol TCP real_server 192.168.93.141 {
#权重
weight
TCP_CHECK {
#10秒无响应超时
connect_timeout
nb_get_retry
delay_before_retry
connect_port
}
}
real_server 192.168.93.142 {
#权重
weight
TCP_CHECK {
#10秒无响应超时
connect_timeout
nb_get_retry
delay_before_retry
connect_port
}
}
}

如果在之前执行过 LVS 的脚本,需要提前执行一些操作:

# ipvsadm -C

# systemctl restart network

或者可重启调度服务器。

2.4 启动相关服务

在 masternode 和 backupnode 上面分别启动 keepalived 服务,如下:

masternode:

[root@masternode log]# systemctl start keepalived
[root@masternode log]# ps aux |grep keepalived
root 0.0 0.1 ? Ss : : /usr/sbin/keepalived -D
root 0.0 0.3 ? S : : /usr/sbin/keepalived -D
root 0.0 0.2 ? S : : /usr/sbin/keepalived -D
root 0.0 0.0 pts/ R+ : : grep --color=auto keepalived
[root@masternode log]# ip addr
: lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue state UNKNOWN group default qlen
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
valid_lft forever preferred_lft forever
inet6 ::/ scope host
valid_lft forever preferred_lft forever
: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fast state UP group default qlen
link/ether :0c::3b:: brd ff:ff:ff:ff:ff:ff
inet 192.168.93.140/ brd 192.168.93.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.93.200/ scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::1bb9:5b87:893c:e112/ scope link noprefixroute
valid_lft forever preferred_lft forever
: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fast state UP group default qlen
link/ether :0c::3b:: brd ff:ff:ff:ff:ff:ff
inet 192.168.150.140/ brd 192.168.150.255 scope global noprefixroute ens37
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe3b:/ scope link
valid_lft forever preferred_lft forever
[root@masternode log]# ipvsadm -Ln
IP Virtual Server version 1.2. (size=)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.93.200: rr
-> 192.168.93.141: Route
-> 192.168.93.142: Route

backupnode:

[root@backupnode keepalived]# systemctl start keepalived
[root@backupnode keepalived]# ps aux |grep keepalived
root 0.0 0.1 ? Ss : : /usr/sbin/keepalived -D
root 0.0 0.3 ? S : : /usr/sbin/keepalived -D
root 0.0 0.2 ? S : : /usr/sbin/keepalived -D
root 0.0 0.0 pts/ S+ : : grep --color=auto keepalived
[root@backupnode keepalived]# ip addr
: lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue state UNKNOWN group default qlen
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
valid_lft forever preferred_lft forever
inet6 ::/ scope host
valid_lft forever preferred_lft forever
: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fast state UP group default qlen
link/ether :0c::::9b brd ff:ff:ff:ff:ff:ff
inet 192.168.93.139/ brd 192.168.93.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80:::62bc:4a07:d345/ scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::1bb9:5b87:893c:e112/ scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::8cac:8f3b:14b2:47ae/ scope link noprefixroute
valid_lft forever preferred_lft forever
: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fast state UP group default qlen
link/ether :0c::::a5 brd ff:ff:ff:ff:ff:ff
inet 192.168.150.139/ brd 192.168.150.255 scope global noprefixroute ens37
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe88:29a5/ scope link
valid_lft forever preferred_lft forever
[root@backupnode keepalived]# ipvsadm -Ln
IP Virtual Server version 1.2. (size=)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.93.200: rr
-> 192.168.93.141: Route
-> 192.168.93.142: Route

可以看到此时 VIP:192.168.93.200 绑定在了 masternode 的网卡 ens33 上。

由于在 Keepalived 的配置文件中定义的 LVS 模式为 DR,所以还需要在两台 RS 上分别执行 lvs_rs.sh 脚本,这与上一节的脚本相同,如下:

[root@datanode1 sbin]# service nginx start
Redirecting to /bin/systemctl start nginx.service
[root@datanode1 sbin]# sh /usr/local/sbin/lvs_rs.sh
......
[root@datanode2 sbin]# service nginx start
Redirecting to /bin/systemctl start nginx.service
[root@datanode2 sbin]# sh /usr/local/sbin/lvs_rs.sh

相关服务启动完毕之后,可执行测试。

2.5 测试高可用负载均衡集群

在宿主机上请求 VIP 地址:192.168.93.200,如下:

可以看到实现了负载均衡的效果。

1)测试关闭两台调度器中的 maternode 主调度器

再来看看分发器的高可用,关闭 masternode 主分发器,如下:

可以看到 masternode 已经解除了 VIP 地址的绑定,backupnode 自动绑定了这个 VIP,如下:

再次请求 VIP 地址,如下正常显示:

2)测试关闭 Real Server 中的 datanode2 的 nginx 服务

现在我们再关闭 RS 中的 datanode2 的 nginx,如下:

访问 VIP 地址,看到了 Keepalived 已经自动将所有请求都转发到了 datanode1 上面了,如下:

ipvsadm 转发规则会自动将 "删除" datanode2,如下:

3)测试再次启动 Real Server 中的 datanode2 的 nginx

如果再次启动 datanode2 上面的 nginx 服务,此时 ipvsadm 又会自动添加其转发规则,如下:

访问 VIP,如下:

可以发现 Keepalived 功能确实很强大。

Linux 笔记 - 第十八章 Linux 集群之(三)Keepalived+LVS 高可用负载均衡集群的更多相关文章

  1. Keepalived+LVS高可用负载均衡集群

    概述 Keepalived是专门针对LVS设计的一款强大的辅助工具,主要用来提供故障切换(Failover)和健康检查(HeathChecking)功能——判断LVS负载调度器.节点服务器的可用性,及 ...

  2. LVS+Keepalived 实现高可用负载均衡集群

    LVS+Keepalived  实现高可用负载均衡集群     随着网站业务量的增长,网站的服务器压力越来越大?需要负载均衡方案!商业的硬件如 F5 ,Array又太贵,你们又是创业型互联公司如何有效 ...

  3. haproxy + keepalived 实现高可用负载均衡集群

    1. 首先准备两台tomcat机器,作为集群的单点server. 第一台: 1)tomcat,需要Java的支持,所以同样要安装Java环境. 安装非常简单. tar xf  jdk-7u65-lin ...

  4. 基于Haproxy+Keepalived构建高可用负载均衡集群

    实验环境: 主机名 IP地址 VIP 192.168.200.254 Haproxy-1 192.168.200.101 Haproxy-2 192.168.200.102 Nginx1 192.16 ...

  5. Nginx+Keepalived搭建高可用负载均衡集群

    本文的重点是Keepalived的配置,Nginx的配置就简略带过.软件:CentOS 7.2 / Nginx 1.12.2 / Keepalived 1.3.9 ha-01:192.168.1.97 ...

  6. Haproxy+Keepalived构建高可用负载均衡集群

    实验环境: 主机名 IP地址 VIP 192.168.200.254 Haproxy-1 192.168.200.101 Haproxy-2 192.168.200.102 Nginx1 192.16 ...

  7. Dubbo入门到精通学习笔记(二十):MyCat在MySQL主从复制的基础上实现读写分离、MyCat 集群部署(HAProxy + MyCat)、MyCat 高可用负载均衡集群Keepalived

    文章目录 MyCat在MySQL主从复制的基础上实现读写分离 一.环境 二.依赖课程 三.MyCat 介绍 ( MyCat 官网:http://mycat.org.cn/ ) 四.MyCat 的安装 ...

  8. Dubbo入门到精通学习笔记(十四):ActiveMQ集群的安装、配置、高可用测试,ActiveMQ高可用+负载均衡集群的安装、配置、高可用测试

    文章目录 ActiveMQ 高可用集群安装.配置.高可用测试( ZooKeeper + LevelDB) ActiveMQ高可用+负载均衡集群的安装.配置.高可用测试 准备 正式开始 ActiveMQ ...

  9. LVS+Keepalived搭建MyCAT高可用负载均衡集群

    LVS+Keepalived 介绍 LVS LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统.本项目在1998年5月由章文嵩博士成立,是中国 ...

随机推荐

  1. .Net MVC 框架基础知识

    一.什么是MVC? MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式. MVC全名是Model View Controlle ...

  2. Go---go-cache包学习

    github.com/patrickmn/go-cachego-cache是一款类似于memached 的key/value 缓存软件.它比较适用于单机执行的应用程序.go-cache实质上就是拥有过 ...

  3. F#周报2019年第34期

    新闻 高效的F#,提示与技巧 Fable 社区资源 Visual Studio提示与技巧:为.NET增加生产力 无风险地尝试Compositional IT的培训包--如果没有增加任何价值,可以得到完 ...

  4. 安装tomcat出现的问题

    今天在安装tomcat时出现了配置环境不对的问题. 在正确配置Tomcat环境变量后,遇到很多次运行startup.bat后,一个窗口一闪而过的. 解决方法: 1.在tomcat的目录下选中start ...

  5. JVM(十三):后端编译优化

    JVM(十三):后端编译优化 在 JVM(一):源文件的转变 中我们介绍了 Java 中的前端优化,即将 Java 源代码转换为字节码文件.在本文中,我们将介绍字节码文件如何转换为本地机器码,并如何对 ...

  6. Codeforces 1008D/1007B

    题意略. 思路: 由于这个长方体是可以翻转的,所以我们不必考虑小长方体3个维度的出处,反正3条边一定有长有短能分出大小. 现在我们来考虑A,B,C三个数字,如果它们3个产生的因子互不相同,分别产生了a ...

  7. HDU 5057

    题意略. 开始想开一个三维的树状数组,但是一算空间不够,正解是离线操作,按位来计算,一共是10位,所以总共是扫10遍,第i遍只处理第i位的询问, 注意在修改后,要把当前这个位的值存下来(这就是cur数 ...

  8. P2746 [USACO5.3]校园网Network of Schools tarjan 缩点

    题意 给出一个有向图,A任务:求最少需要从几个点送入信息,使得信息可以通过有向图走遍每一个点B任务:求最少需要加入几条边,使得有向图是一个强联通分量 思路 任务A,比较好想,可以通过tarjan缩点, ...

  9. CodeForces 982 C Cut 'em all!

    Cut 'em all! 题意:求删除了边之后,剩下的每一块联通块他的点数都为偶数,求删除的边最多能是多少. 题解:如果n为奇数,直接返回-1,因为不可能成立.如果n为偶数,随意找一个点DFS建树记录 ...

  10. Different Integers 牛客网暑期ACM多校训练营(第一场) J 离线+线状数组或者主席树

    Given a sequence of integers a1, a2, ..., an and q pairs of integers (l 1, r1), (l2, r2), ..., (lq, ...