在大型网站中一般服务端会做集群,同时利用负载均衡器做负载均衡。这样有利于将大量的请求分散到各个服务器上,提升网站的响应速度。当然为了解决单点故障的问题,还会做热备份方案。这里演示利用LVS做负载均衡器,同时利用Keepalived保证其高可用,基于LVS的DR模式构建Nginx集群。

1、环境准备

各个软件及其版本信息如下:

软件 版本
Centos系统 Linux release 7.3.1611 (Core)
Nginx 1.16.0
LVS ipvsadm-1.27-7.el7.x86_64
Keepalived keepalived.x86_64 0:1.3.5-8.el7_6

节点分配及角色如下:

节点 角色
192.168.208.154 lvs master
192.168.208.155 lvs slave
192.168.208.150 nginx1
192.168.208.151 nginx2

同时特别注意这里设置的VIP地址为:192.168.208.100,VIP也即虚拟的IP地址,即当外部请求所访问的IP地址。

2、部署架构

基于上述的环境,部署的架构如下:

特别注意:

由于是采用DR模式,也即当用户请求发送到VIP时,LVS会根据所设置的负载均衡算法将请求转发到具体的Nginx服务器(Real Server)上,而当具体的Nginx服务器处理完后是直接将结果返回给用户。所以在具体的Nginx服务器是要设置回环的IP,即在lo网卡上设置VIP的地址。

3、部署程序

(1)、首先在lvs master节点和slave节点安装lvs和keepalived:

yum install ipvsadm
yum install keepalived

(2)、在nginx1和nginx2节点上安装nginx:

# 添加nginx的yum源
rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm # 安装
yum install nginx

安装完成nginx后,编辑其默认页面,加上特定的信息,这样才能判断请求到底是哪个nginx处理的,即:

vi /usr/share/nginx/html/index.html

对于nginx1加上150字样,nginx2加上151字样,即:

当直接访问nginx1时,效果为:

当直接访问nginx2时,效果为:

(3)、在lvs master节点和lvs slave节点配置keepalived信息:

首先配置lvs master节点:

编辑如下文件:

vi /etc/keepalived/keepalived.conf

内容为:

! Configuration File for keepalived

global_defs {
# 这里将这些邮件设置的相关信息都注释掉了
# notification_email {
# acassen@firewall.loc
# failover@firewall.loc
# sysadmin@firewall.loc
# }
# notification_email_from Alexandre.Cassen@firewall.loc
# smtp_server 192.168.200.1
# smtp_connect_timeout 30
# router_id是keepalived的一个标识,最好不同的keepalived配置成不一样
router_id LVS_DEVEL
# vrrp_skip_check_adv_addr
# vrrp_strict
# vrrp_garp_interval 0
# vrrp_gna_interval 0
} vrrp_instance VI_1 {
# MASTER表示是主节点,备份节点是BACKUP
state MASTER
# 网卡名称,这个不同的服务器,可能有所不同
interface ens33
# 路由标识,MASTER和BACKUP节点的该值要保持一致
virtual_router_id 51
# 优先级,MASTER节点的值必须大于BACKUP的值
priority 100
# MASTER与BACKUP同步的时间间隔,单位为秒
advert_int 1
# lvs对应的真实IP
mcast_src_ip=192.168.208.154
authentication {
auth_type PASS
auth_pass 1111
}
# 虚拟IP的址
virtual_ipaddress {
192.168.208.100
}
} virtual_server 192.168.208.100 80 {
# 健康检查的时间,单位为秒
delay_loop 6
# 负载调度算法,这里设置为rr,即轮询算法
lb_algo rr
# 设置DR模式
lb_kind DR
# 虚拟地址的子网掩码
nat_mask 255.255.255.0
# 会话保持时间,单位为秒
persistence_timeout 50
protocol TCP # 配置真实服务器信息
real_server 192.168.208.150 80 {
# 节点的权值
weight 1
TCP_CHECK {
# 超时时间
connect_timeout 3
# 重试次数
nb_get_retry 3
# 重试间隔
delay_before_retry 3
}
} real_server 192.168.208.151 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}

基于上述的配置,那么lvs slave的配置如下:

! Configuration File for keepalived

global_defs {
# notification_email {
# acassen@firewall.loc
# failover@firewall.loc
# sysadmin@firewall.loc
# }
# notification_email_from Alexandre.Cassen@firewall.loc
# smtp_server 192.168.200.1
# smtp_connect_timeout 30
router_id LVS_DEVEL_SLAVE
# vrrp_skip_check_adv_addr
# vrrp_strict
# vrrp_garp_interval 0
# vrrp_gna_interval 0
} vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 99
advert_int 1
mcast_src_ip=192.168.208.155
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.208.100
}
} virtual_server 192.168.208.100 80 {
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP real_server 192.168.208.150 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
} real_server 192.168.208.151 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}

分别启动lvs master和slave的keepalived,并且设置为开机自启动:

systemctl start keepalived
systemctl enable keepalived

此时在lvs master节点查看IP地址情况:

ip a

结果为:

说明此时VIP在master节点上的ens33网卡上生成好了。

在lvs master节点查看路由转发情况:

ipvsadm -Ln

结果为:

这个结果跟预期的是一样的。

(4)、关闭lvs master和slave节点上的访火墙:

systemctl stop firewalld
systemctl disable firewalld

(5)、在nginx服务器上设置回环IP:

由于服务器重启后设置的回环IP会失效,所以将设置的内容放在脚本lvs-rs.sh中,内容如下:

#!/bin/bash
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 sysctl -w net.ipv4.ip_forward=1
ifconfig lo:0 192.168.208.100 broadcast 192.168.208.100 netmask 255.255.255.255 up
route add -host 192.168.208.100 dev lo:0

执行后,查看IP信息,可以在lo网卡中看到VIP的信息,即:

4、测试

分别打开Chrome、IE浏览器,同时输入http://192.168.208.100,结果如下:

结果也达到预期的效果的。

现在测试将lvs master节点关闭掉,然后查看lvs slave节点的IP路由情况:

ip a

结果为:

此时VIP漂移到了lvs slave节点上了。

ipvsadm -Ln

结果为:

此时lvs slave已经可以做路由地址转发了。

关注我

以你最方便的方式关注我:

微信公众号:

LVS + Keepalived + Nginx基于DR模式构建高可用方案的更多相关文章

  1. Keepalived+Nginx+tomcat实现系统的高可用

    Keepalived+Nginx+tomcat实现系统的高可用 1:安装vmware虚拟机 2:安装linux系统,我自己下载的centos6.5 3:安装JDK,tomcat 解压tomcat到/u ...

  2. lvs+keepalived部署k8s v1.16.4高可用集群

    一.部署环境 1.1 主机列表 主机名 Centos版本 ip docker version flannel version Keepalived version 主机配置 备注 lvs-keepal ...

  3. Nginx的进程模型及高可用方案(OpenResty)

    1. Nginx 进程模型简介 Nginx默认采用多进程工作方式,Nginx启动后,会运行一个master进程和多个worker进程.其中master充当整个进程组与用户的交互接口,同时对进程进行监护 ...

  4. 基于GTID的Mysql-Mha高可用方案探索

    声明: 本篇文章内容整理来源于互联网以及本人自己的梳理总结,目的是从零到一的搭建起来mysql mha高可用架构. 一.软件概述 MHA(Master High Availability)目前在MyS ...

  5. LVS+keepalived DR模式配置高可用负载均衡集群

    实验环境 LVS-Master 10.0.100.201 VIP:10.0.100.203 LVS-Slave       10.0.100.204 WEB1-Tomcat 10.0.2.29 gat ...

  6. 利用LVS+Keepalived搭建Mysql双主复制高可用负载均衡环境

    应用背景: MySQL复制(主主,主从...)能在保证数据的备份的同时也能够做读写分离分摊系统压力,但是发生单点故障时,需要手动 切换到另外一台主机.LVS和Keppalived可以设定一个VIP来实 ...

  7. MySQL主从复制与lvs+keepalived单点写入读负载均衡高可用实验【转】

    一.环境Master(主机A):192.168.1.1Slave(主机B) :192.168.1.2  W-VIP(写入)  :192.168.1.3 R-VIP(读取)  :192.168.1.4  ...

  8. 高可用高性能分布式文件系统FastDFS进阶keepalived+nginx对多tracker进行高可用热备

    在上一篇 分布式文件系统FastDFS如何做到高可用 中已经介绍了FastDFS的原理和怎么搭建一个简单的高可用的分布式文件系统及怎么访问. 高可用是实现了,但由于我们只设置了一个group,如果现在 ...

  9. keepalived+nginx负载均衡+ApacheWeb实现高可用

    1.Keepalived高可用软件 Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能.因此,kee ...

随机推荐

  1. System.arraycopy 和 Arrays.copyOf

    System.arraycopy /* native关键字 本地方法 System类 java.lang.System.class 参数说明: src - 源数组. srcPos - 源数组中的起始位 ...

  2. Netty源码分析--Channel注册(中)(六)

    接上一篇,我们继续看 不知道大家第一次看这段代码的时候有没有一脸懵逼,反正我是一脸懵,为什么这个if else 最终都是调用的register0方法,都是一样的. 其实这里就是为什么Netty是线程安 ...

  3. spring 5.x 系列第9篇 —— 整合mongodb (xml配置方式)

    源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.说明 1.1 项目结构说明 配置文件位于resources下,项目以单 ...

  4. GitLab通过API创建项目

    示例: #!/usr/bin/python # -*- coding:utf-8 -*- import os import json import requests import subprocess ...

  5. Flink中的状态与容错

    1.概述 Flink支持有状态计算,根据支持得不同状态类型,分别有Keyed State和Operator State.针对状态数据得持久化,Flink提供了Checkpoint机制处理:针对状态数据 ...

  6. 常用的方法论-SWOT

  7. 蓝桥杯:最大的算式(爆搜 || DP)

    http://lx.lanqiao.cn/problem.page?gpid=T294 题意:中文题意. 思路:1.一开始想的是,乘号就相当于隔板,把隔板插入到序列当中,同一个隔板的就是使用加法运算, ...

  8. kuangbin专题 专题一 简单搜索 Find a way HDU - 2612

    题目链接:https://vjudge.net/problem/HDU-2612 题意:‘@’表示KTV,‘#’表示无法走的地方,‘Y’,'M’表示两个人,他们要在KTV见面,问他们都到达KTV要花费 ...

  9. Java学习笔记之---方法和数组

    Java学习笔记之---方法与数组 (一)方法 (1)什么是方法? 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 (2)方法的优点 使程序变得更简短而 ...

  10. set.contains()分析

    先看一段代码 Set s = new HashSet(); List<String> list = new ArrayList<>(); list.add("a&qu ...