如上图所示,102和103是内网nginx服务器,100和101是边界LB,clinet是1,这个实验是为了实现在LB上虚拟出一个VIP,client通过访问该VIP,来动态负载到两台内网nginx服务器上面来。流量的来回,都需要经过边界LB。

  我们首先分析一下,这种模式是一种NAT模式,流量的来回都要经过边界LB。回忆一下NAT的工作模式,LB在接收到client的数据请求后,根据自身负载均衡算法,将目标IP地址修改为内网RS地址,然后从内网口扔出去,内网服务器收到这个数据请求之后,目标MAC和IP都是自己,源地址是client,这个时候就会处理该数据包,返回,返回的数据包中,源地址是自己,目标地址是client,在经过LB的时候,会被转换,源地址为VIP地址,目标地址为client地址,然后client就会收到这个回包。

  这个和物理硬件LB的工作模式中,透明模式相同,透明模式也就是NAT模式。而物理硬件中的反向代理模式,和LVS中的tunnel模式相似,在接收到client的数据请求后,会将整个数据包进行改写,源地址为LB的内网地址,目标地址为某一个RS地址,然后数据包返回的时候,也就会再次进行转换。这种反向代理模式中,服务器正常情况下无法知道client的源,只知道是自己的LB访问了自己,可以通过配置LB,添加字段,来讲该client的地址一并发送给RS。

  物理硬件LB中的三角模式,也就是LVS的DR模式。需要在服务器上配置lo接口。

  回到环境中。这个地方采用的是NAT模式,也就是说流量必须要经过LB,最简单的做法,就是将两台NGINX服务器的网关,配置在LB上,而且是以VIP的形式存在,对外,LB也拿出一个VIP,作为client访问的入口,也就是说,LB上,有两个VRRP INSTANCE,而且要保持状态一致。这样才能实现高可用HA。

  下面开始做配置了,主要是在两台LB上配置keepalived,keepalived是默认安装的,配置文件存放在/etc/keepalived/目录下,启动脚本为/etc/init.d/keepalived,定义100为主,101为备。下面是两台设备的keepalived配置文件。

! Configuration File for keepalived
! The global defines,including notification server and target,router-id and others
global_defs {
notification_email {
admin@domain.com
@domain.com
}
notification_email_from keepalived@domain.com
smtp_server 127.0.0.1
smtp_connect_timeout
router_id LB_100
}
! The vrrp sync group,any vrrp instance in the vrrp sync group while keep the same status,
! no matter the priority ,for example ,VI_1 is master ,VI_2 is backup,the sync group status is backup
vrrp_sync_group VG1 {
group {
VI_To_client
VI_To_server
}
}
! The VRRP instance for client to connect,clients connect to the VIPs
vrrp_instance VI_To_client {
state MASTER
interface eth0
virtual_router_id
priority
nopreempt
advert_int
authentication {
auth_type PASS
auth_pass
}
virtual_ipaddress {
192.168.245.200
}
}
! The VRRP instance for real servers,real servers` default gateway
vrrp_instance VI_To_server {
state MASTER
interface eth1
virtual_router_id
priority
nopreempt
advert_int
authentication {
auth_type PASS
auth_pass
}
virtual_ipaddress {
10.0.0.254
}
}
! The LB configuration,including VS and RS,scheduling argu,and other options,health check
virtual_server 192.168.245.200 {
delay_loop
lb_algo rr
lb_kind NAT
persistence_timeout
protocol TCP real_server 10.0.0.102 {
weight
TCP_CHECK {
connect_timeout
}
} real_server 10.0.0.103 {
weight
TCP_CHECK {
connect_timeout
}
}
}

  在100的配置文件中,主要是配置了一个vrrp_sync_group,里面有两个VRRP INSTANCE,分别是面向client和面向RS的,两个VRRP INSTANCE的vrrp-_id是不同的,但是其他属性值都是ixiangtong的。另外,在keepalived的LB配置中,有对VS和RS的配置,同时对RS使用了health check,检查方法很简单,就是TCP的connect,当能够访问到时,将该RS动态的加入到ipvs中,如果访问不到,就从ipvs中移除。这个现象可以通过查看日志看到。

  slave的配置文件和master的配置文件大同小异,除了必要的字段不同,其他都是相同的。下面看看keepalived的日志信息。

Jul  :: CentOS_101 Keepalived[]: Starting Keepalived v1.2.13 (/,)
Jul :: CentOS_101 Keepalived[]: Starting Healthcheck child process, pid=
Jul :: CentOS_101 Keepalived[]: Starting VRRP child process, pid=
Jul :: CentOS_101 Keepalived_vrrp[]: Netlink reflector reports IP 192.168.245.101 added
Jul :: CentOS_101 Keepalived_healthcheckers[]: Netlink reflector reports IP 192.168.245.101 added
Jul :: CentOS_101 Keepalived_healthcheckers[]: Netlink reflector reports IP 10.0.0.101 added
Jul :: CentOS_101 Keepalived_healthcheckers[]: Netlink reflector reports IP fe80::20c:29ff:fe88: added
Jul :: CentOS_101 Keepalived_healthcheckers[]: Netlink reflector reports IP fe80::20c:29ff:fe88: added
Jul :: CentOS_101 Keepalived_healthcheckers[]: Registering Kernel netlink reflector
Jul :: CentOS_101 Keepalived_healthcheckers[]: Registering Kernel netlink command channel
Jul :: CentOS_101 Keepalived_healthcheckers[]: Opening file '/etc/keepalived/keepalived.conf'.
Jul :: CentOS_101 Keepalived_healthcheckers[]: Configuration is using : Bytes
Jul :: CentOS_101 Keepalived_healthcheckers[]: Using LinkWatch kernel netlink reflector...
Jul :: CentOS_101 Keepalived_vrrp[]: Netlink reflector reports IP 10.0.0.101 added
Jul :: CentOS_101 Keepalived_vrrp[]: Netlink reflector reports IP fe80::20c:29ff:fe88: added
Jul :: CentOS_101 Keepalived_vrrp[]: Netlink reflector reports IP fe80::20c:29ff:fe88: added
Jul :: CentOS_101 Keepalived_vrrp[]: Registering Kernel netlink reflector
Jul :: CentOS_101 Keepalived_vrrp[]: Registering Kernel netlink command channel
Jul :: CentOS_101 Keepalived_vrrp[]: Registering gratuitous ARP shared channel
Jul :: CentOS_101 Keepalived_vrrp[]: Opening file '/etc/keepalived/keepalived.conf'.
Jul :: CentOS_101 Keepalived_vrrp[]: Configuration is using : Bytes
Jul :: CentOS_101 Keepalived_vrrp[]: Using LinkWatch kernel netlink reflector...
Jul 15 13:57:01 CentOS_101 Keepalived_healthcheckers[26015]: Activating healthchecker for service [10.0.0.102]:80
Jul 15 13:57:01 CentOS_101 Keepalived_healthcheckers[26015]: Activating healthchecker for service [10.0.0.103]:80
Jul :: CentOS_101 Keepalived_vrrp[]: VRRP_Instance(VI_To_client) Entering BACKUP STATE
Jul :: CentOS_101 Keepalived_vrrp[]: VRRP_Instance(VI_To_server) Entering BACKUP STATE
Jul :: CentOS_101 Keepalived_vrrp[]: VRRP sockpool: [ifindex(), proto(), unicast(), fd(,)]
Jul :: CentOS_101 Keepalived_vrrp[]: VRRP sockpool: [ifindex(), proto(), unicast(), fd(,)]

  这个是启动日志,在启动的时候,就对两个RS就开启了健康检查。

Jul  :: CentOS_101 Keepalived_healthcheckers[]: TCP connection to [10.0.0.102]: failed !!!
Jul :: CentOS_101 Keepalived_healthcheckers[]: Removing service [10.0.0.102]: from VS [192.168.245.200]:
Jul :: CentOS_101 Keepalived_healthcheckers[]: TCP connection to [10.0.0.102]: success.
Jul :: CentOS_101 Keepalived_healthcheckers[]: Adding service [10.0.0.102]: to VS [192.168.245.200]:
Jul :: CentOS_101 Keepalived_healthcheckers[]: TCP connection to [10.0.0.103]: failed !!!
Jul :: CentOS_101 Keepalived_healthcheckers[]: Removing service [10.0.0.103]: from VS [192.168.245.200]:
Jul :: CentOS_101 Keepalived_healthcheckers[]: TCP connection to [10.0.0.103]: success.
Jul :: CentOS_101 Keepalived_healthcheckers[]: Adding service [10.0.0.103]: to VS [192.168.245.200]:

  这个是测试RS故障时候,keepalived的日志。日志写的很清楚,当主机故障时,就从VS中移除,同时可以看到ipvsadm的状态。

[root@CentOS_100 keepalived]# ipvsadm -L -n
IP Virtual Server version 1.2. (size=)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.245.200: rr persistent
-> 10.0.0.102: Masq
[root@CentOS_100 keepalived]# ipvsadm -L -n
IP Virtual Server version 1.2. (size=)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.245.200: rr persistent
-> 10.0.0.102: Masq
-> 10.0.0.103: Masq
[root@CentOS_100 keepalived]# ipvsadm -L -n

  client在访问的时候,只需要访问200这个虚拟地址就好了。如果不想LB作为RS的网关,可以直接在RS上写一条路由即可。

  在NAT模式中,需要在LB上开启转发,先查看sysctl -p查看是否开启了转发,如果没有开启,需要在/etc/sysctl.conf中修改net.ipv4.ip_forward为1,默认为0,如果为0,数据包在经过LB的时候,是不会被转发出去的。这个时候的LB,作为的是一个路由器,用linux作为路由器,是需要开启这个属性的。

keepalived+LVS实现网站负载均衡和HA的更多相关文章

  1. Linux 笔记 - 第十八章 Linux 集群之(三)Keepalived+LVS 高可用负载均衡集群

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

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

    一.原理及简介: 1.1 Keepalived简介      Keepalived是Linux下一个轻量级别的高可用解决方案.Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节 ...

  3. mysql高可用架构方案之二(keepalived+lvs+读写分离+负载均衡)

    mysql主从复制与lvs+keepalived实现负载高可用 文件夹 1.前言    4 2.原理    4 2.1.概要介绍    4 2.2.工作原理    4 2.3.实际作用    4 3方 ...

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

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

  5. Nginx+Keepalived(双机热备)搭建高可用负载均衡环境(HA)

    原文:https://my.oschina.net/xshuai/blog/917097 摘要: Nginx+Keepalived搭建高可用负载均衡环境(HA) http://blog.csdn.ne ...

  6. Nginx+Keepalived(双机热备)搭建高可用负载均衡环境(HA)-转帖篇

    原文:https://my.oschina.net/xshuai/blog/917097 摘要: Nginx+Keepalived搭建高可用负载均衡环境(HA) http://blog.csdn.ne ...

  7. LVS+Keepalived实现mysql的负载均衡

    1 初识LVS:Linux Virtual Server 1.1 LVS是什么       LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起 ...

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

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

  9. LVS+Keepalived 实现高可用负载均衡

    前言 在业务量达到一定量的时候,往往单机的服务是会出现瓶颈的.此时最常见的方式就是通过负载均衡来进行横向扩展.其中我们最常用的软件就是 Nginx.通过其反向代理的能力能够轻松实现负载均衡,当有服务出 ...

随机推荐

  1. DELPHI中MDI子窗口的关闭 和打开

    Delphi中MDI子窗口的关闭方式默认为缩小而不是关闭,所以当你单击子窗口右上角的关闭按钮时会发觉该子窗口只是最小化,而不是你预期的那样被关闭.解决办法是在子窗口的OnClose事件处理过程中加入如 ...

  2. 使用chcache 缓存

    在项目里碰到了表单提交和ajax访问后台取到的request对象不是同一个对象,所以不能够资源共享,问了大神决定配置一个缓存来处理这个问题. 引用jar :ehcache-core-2.5.2.jar ...

  3. hibernate主配置文件中指定session与当前线程绑定

    配置一条属性 <property name="hibernate.current_session_context_class">thread</property& ...

  4. 一、Java多人博客系统-开篇

    作为一个程序员,工作之外的不断学习是必须的.这个项目是我个人课外学习和练手的项目.最开始是一个个人网站.当时发现京东云可以免费部署网站的,就立即写了一个网站,当时就使用jsp技术,可以实现发布博客.评 ...

  5. Volatile的应用

    .java 的执行过程 Java代码在编译后会变成Java字节码 字节码被类加载器加载到JVM里 JVM执行字节码,转化为汇编指令在CPU上执行 Java中所使用的并发机制依赖于JVM的实现和CPU的 ...

  6. Subway POJ - 2502 最短路

    题意:给出地铁线  起点和 终点  坐地铁速度为v2  走路为v1 求起点到终点的最短距离  (答案需要四舍五入这里坑了好久) 拿给出的地铁站点 和起点终点建边即可  然后跑个迪杰斯特拉 #inclu ...

  7. Modelsim脚本仿真文件分析

    Do文件的实质是tcl脚本,本质上是ascii文件.所以扩展名可以任意的,不一定叫xx.do,也可以叫xx.tcl,甚至叫成你的名字也没有关系.看自己喜好,一般取do,不过我喜欢取成tcl,用代码编辑 ...

  8. Java和操作系统交互细节

    结合 CPU 理解一行 Java 代码是怎么执行的 根据冯·诺依曼思想,计算机采用二进制作为数制基础,必须包含:运算器.控制器.存储设备,以及输入输出设备,如下图所示. enter image des ...

  9. html图像、绝对路径和相对路径,链接

    html图像 <img>标签可以在网页上插入一张图片,它是独立使用的标签,通过"src"属性定义图片的地址,通过"alt"属性定义图片加载失败时显示 ...

  10. luogu1608 路径统计 (spfa)

    题意:给一个有向图(无零边),要求找出最短路的数量(重边只计算一次) 做spfa的时候,记一个cnt对于u-w->v如果dis[u]+w=dis[v],cnt[v]+=cnt[u] 如果dis[ ...