在之前一篇使用nginx搭建高可用的解决方案的时候,很多同学会问,如果nginx挂掉怎么办,比如下面这张图:

你可以清楚的看到,如果192.168.2.100这台机器挂掉了,那么整个集群就下线了,这个问题该怎么解决呢??? 简单的想想确实不大好处理,因为你

的webBrowser总得要访问一个ip地址,对吧。。这个问题怎么破呢?

一:问题分析

  如果你有一些网络底子的话,就会明白,你给一个不在本网段的机器发送请求的话,这个请求会先经过你的网关IP,然后通过网关IP传给对方的网关IP,然

后网关IP会将请求转给它所在局域网的主机,当然我的网关IP和对方的网关IP之间可能有很多跳的路由地址,大概的流程就是下面这样:

如果你不信的话,可以用tracert 看看你到www.ctrip.com的路由总过程。

从上图中可以看到,从我当前主机到ctrip.com一共有20跳,第一条是192.168.2.1,这个就是我的路由器IP,也就是我的网关IP。

二:虚拟路由冗余协议

  好了,说了这么多有什么用呢?其实大家仔细观察这张图,你会想我能不能在网关IP上做一些手脚呢? 可喜的是如今的路由器基本上都支持一个叫做

VRRP(虚拟路由冗余协议),这一协议的作用你可以理解成把网关IP虚拟化成一个网关IP集群,就好像兽族剑圣的镜像技能,这里面有master,也有slave,

然后局域网内的主机设置的都是虚拟的masterIP(VIP),刚好keepealived就是一个实现VRRP的一款应用程序,你需要,我专业,大家就这样走到一块了。

三:keepalived搭建一览

1. 下载:从官网上找到当前最新的版本1.4.2。http://www.keepalived.org/software/keepalived-1.4.2.tar.gz。

配置机器: 192.168.23.156 【centos】

              192.168.23.157 【centos】

 [root@localhost app]# wget http://www.keepalived.org/software/keepalived-1.4.2.tar.gz
---- ::-- http://www.keepalived.org/software/keepalived-1.4.2.tar.gz
Resolving www.keepalived.org (www.keepalived.org)... 37.59.63.157, :41d0::7a9d::
Connecting to www.keepalived.org (www.keepalived.org)|37.59.63.157|:... connected.
HTTP request sent, awaiting response... OK
Length: (721K) [application/x-gzip]
Saving to: ‘keepalived-1.4..tar.gz’ %[==================================================================>] , .24KB/s in 4m 44s

2. 然后把相关依赖装起来:yum install -y openssl openssl-devel。

 [root@localhost app]# yum install -y openssl openssl-devel
Loaded plugins: fastestmirror, langpacks
Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock error was
: curl# - "Empty reply from server"
base | 3.6 kB ::
epel/x86_64/metalink | 7.8 kB ::
Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=extras&infra=stock error was
: curl# - "Empty reply from server"
extras | 3.4 kB ::
updates | 3.4 kB ::
updates//x86_64/primary_db | 6.9 MB ::

3. 接下来继续解压,最后安装三板斧: ./configure --prefix=/usr/app/keepalived && make && make install。

[root@localhost app]# tar -zxvf keepalived-1.4..tar.gz
[root@localhost app]# ls
keepalived-1.4. keepalived-1.4..tar.gz
[root@localhost app]# cd keepalived-1.4.
[root@localhost keepalived-1.4.]# ls
aclocal.m4 bin_install configure COPYING genhash keepalived Makefile.am README.md
ar-lib ChangeLog configure.ac depcomp INSTALL keepalived.spec.in Makefile.in snap
AUTHOR compile CONTRIBUTORS doc install-sh lib missing TODO
[root@localhost keepalived-1.4.]#

[root@localhost keepalived-1.4.2]# ./configure --prefix=/usr/app/keepalived && make && make install

安装好了之后,你就会看到如下的内容,那就恭喜你,安装成功了。

Keepalived configuration
------------------------
Keepalived version : 1.4.
Compiler : gcc
Preprocessor flags :
Compiler flags : -Wall -Wunused -Wstrict-prototypes -Wextra -g -O2 -fPIE -D_GNU_SOURCE
Linker flags : -pie
Extra Lib : -lcrypto -lssl
Use IPVS Framework : Yes
IPVS use libnl : No
IPVS syncd attributes : No
IPVS bit stats : No
fwmark socket support : Yes
Use VRRP Framework : Yes
Use VRRP VMAC : Yes
Use VRRP authentication : Yes
With ip rules/routes : Yes
SNMP vrrp support : No
SNMP checker support : No
SNMP RFCv2 support : No
SNMP RFCv3 support : No
DBUS support : No
SHA1 support : No
Use Debug flags : No
smtp-alert debugging : No
Use Json output : No
Stacktrace support : No
Memory alloc check : No
libnl version : None
Use IPv4 devconf : No
Use libiptc : No
Use libipset : No
init type : systemd
Build genhash : Yes
Build documentation : No

4. 安装好了之后,在/usr/app/keepalived/etc/keepalived目录下有一个keepalived.conf文件,现在你要做的事情就是

将它copy到/etc/keepalived文件夹下就可以了。

 [root@localhost keepalived]# ls
keepalived.conf samples
[root@localhost keepalived]# pwd
/usr/app/keepalived/etc/keepalived
[root@localhost keepalived]# mkdir -p /etc/keepalived
[root@localhost keepalived]# cp ./keepalived.conf /etc/keepalived/keepalived.conf

5. 接下来我们改一下配置文件。

在192.168.23.156机器中的配置文件,修改如下:

【原来】

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
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval
vrrp_gna_interval
} vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id
priority
advert_int
authentication {
auth_type PASS
auth_pass
}
virtual_ipaddress {
192.168.200.16
192.168.200.17
192.168.200.18
}
}

【修改】

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
router_id NodeA
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval
vrrp_gna_interval
} vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id
priority 150
advert_int
authentication {
auth_type PASS
auth_pass
}
virtual_ipaddress {
192.168.2.200
}
}

其中要注意的就是:

  《1》priority 150

     节点的优先级,master要比slave高。

  《2》interface ens33

     ens33大家可以通过ipconfig查看一下自己的网卡。

[root@localhost ~]# ifconfig
br-11757db6abf5: flags=<UP,BROADCAST,MULTICAST> mtu
inet 172.22.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
ether ::c2:e0:: txqueuelen (Ethernet)
RX packets bytes (0.0 B)
RX errors dropped overruns frame
TX packets bytes (0.0 B)
TX errors dropped overruns carrier collisions br-875e3c64ec79: flags=<UP,BROADCAST,MULTICAST> mtu
inet 172.23.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
ether ::4e::5b:a0 txqueuelen (Ethernet)
RX packets bytes (0.0 B)
RX errors dropped overruns frame
TX packets bytes (0.0 B)
TX errors dropped overruns carrier collisions br-904f2c62861e: flags=<UP,BROADCAST,MULTICAST> mtu
inet 172.19.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
ether ::6d::: txqueuelen (Ethernet)
RX packets bytes (0.0 B)
RX errors dropped overruns frame
TX packets bytes (0.0 B)
TX errors dropped overruns carrier collisions br-b0028a425959: flags=<UP,BROADCAST,MULTICAST> mtu
inet 172.21.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
ether ::::: txqueuelen (Ethernet)
RX packets bytes (1.4 KiB)
RX errors dropped overruns frame
TX packets bytes (3.8 KiB)
TX errors dropped overruns carrier collisions br-c4a09a75fc67: flags=<UP,BROADCAST,MULTICAST> mtu
inet 172.18.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
ether :::f9:2d: txqueuelen (Ethernet)
RX packets bytes (340.0 B)
RX errors dropped overruns frame
TX packets bytes (340.0 B)
TX errors dropped overruns carrier collisions br-f0fb207788a0: flags=<UP,BROADCAST,RUNNING,MULTICAST> mtu
inet 172.20.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
inet6 fe80:::86ff:fe1e:c970 prefixlen scopeid 0x20<link>
ether :::1e:c9: txqueuelen (Ethernet)
RX packets bytes (0.0 B)
RX errors dropped overruns frame
TX packets bytes (0.0 B)
TX errors dropped overruns carrier collisions docker0: flags=<UP,BROADCAST,MULTICAST> mtu
inet 172.17.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
ether ::8f:8c:a9:a7 txqueuelen (Ethernet)
RX packets bytes (0.0 B)
RX errors dropped overruns frame
TX packets bytes (0.0 B)
TX errors dropped overruns carrier collisions ens33: flags=<UP,BROADCAST,RUNNING,MULTICAST> mtu
inet 192.168.23.157 netmask 255.255.255.0 broadcast 192.168.23.255
inet6 fe80::20c:29ff:fe54:4f5a prefixlen scopeid 0x20<link>
ether :0c:::4f:5a txqueuelen (Ethernet)
RX packets bytes (10.8 MiB)
RX errors dropped overruns frame
TX packets bytes (585.6 KiB)
TX errors dropped overruns carrier collisions lo: flags=<UP,LOOPBACK,RUNNING> mtu
inet 127.0.0.1 netmask 255.0.0.0
inet6 :: prefixlen scopeid 0x10<host>
loop txqueuelen (Local Loopback)
RX packets bytes (340.0 B)
RX errors dropped overruns frame
TX packets bytes (340.0 B)
TX errors dropped overruns carrier collisions veth4d72ad4: flags=<UP,BROADCAST,RUNNING,MULTICAST> mtu
inet6 fe80::d4fb:fcff:feeb:cd7c prefixlen scopeid 0x20<link>
ether d6:fb:fc:eb:cd:7c txqueuelen (Ethernet)
RX packets bytes (1.2 KiB)
RX errors dropped overruns frame
TX packets bytes (4.0 KiB)
TX errors dropped overruns carrier collisions vethe634b1c: flags=<UP,BROADCAST,RUNNING,MULTICAST> mtu
inet6 fe80::e0c6:88ff:fe1c:f4a1 prefixlen scopeid 0x20<link>
ether e2:c6::1c:f4:a1 txqueuelen (Ethernet)
RX packets bytes (1.4 KiB)
RX errors dropped overruns frame
TX packets bytes (3.8 KiB)
TX errors dropped overruns carrier collisions virbr0: flags=<UP,BROADCAST,MULTICAST> mtu
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether ::::: txqueuelen (Ethernet)
RX packets bytes (0.0 B)
RX errors dropped overruns frame
TX packets bytes (0.0 B)
TX errors dropped overruns carrier collisions [root@localhost ~]#

《3》virtual_ipaddress 192.168.23.200

设置好虚拟IP(VIP)为:192.168.23.200

同样的道理,在192.168.23.157设置如下:

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
router_id NodeB
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval
vrrp_gna_interval
} vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id
priority
advert_int
authentication {
auth_type PASS
auth_pass
}
virtual_ipaddress {
192.168.23.200
}
}

7. 接下来就可以启动keepalived了。

[root@localhost sbin]# ./keepalived -D
[root@localhost sbin]# ps -ef | grep keepalived
root : ? :: ./keepalived -D
root : ? :: ./keepalived -D
root : ? :: ./keepalived -D
root : pts/ :: grep --color=auto keepalived

五:检测

1. 通过ip a  看看当前ens33网卡上是否绑定了192.168.23.200虚拟IP。

2. 然后通过arp -a 查看当前的vip映射到的物理(mac)地址,可以看到当前的vip映射到的是192.168.23.156上面。

C:\Users\hxc>arp -a

接口: 192.168.23.1 --- 0x6
Internet 地址 物理地址 类型
192.168.23.156 00-0c-29-75-7e-20 动态
192.168.23.157 -0c---4f-5a 动态
192.168.23.200 00-0c-29-75-7e-20 动态
192.168.23.255 ff-ff-ff-ff-ff-ff 静态
224.0.0.22 --5e--- 静态
224.0.0.251 --5e---fb 静态
224.0.0.252 --5e---fc 静态
239.11.20.1 --5e-0b-- 静态
239.255.255.250 --5e-7f-ff-fa 静态
255.255.255.255 ff-ff-ff-ff-ff-ff 静态

3. 然后我们把156这台机器关闭了,可以看到当前的vip已经漂移到了157这台机器上了。

C:\Users\hxc>arp -a

接口: 192.168.23.1 --- 0x6
Internet 地址 物理地址 类型
192.168.23.156 -0c---7e- 动态
192.168.23.157 00-0c-29-54-4f-5a 动态
192.168.23.200 00-0c-29-54-4f-5a 动态
192.168.23.255 ff-ff-ff-ff-ff-ff 静态
224.0.0.22 --5e--- 静态
224.0.0.251 --5e---fb 静态
224.0.0.252 --5e---fc 静态
239.11.20.1 --5e-0b-- 静态
239.255.255.250 --5e-7f-ff-fa 静态
255.255.255.255 ff-ff-ff-ff-ff-ff 静态

好了,这个就是本篇所说的所有内容,希望对您有帮助。

你需要了解的高可用方案之使用keepalived搭建双机热备一览的更多相关文章

  1. Mysql - 高可用方案之MM+Keepalived

    一.概述 本文将介绍mysql的MM+Keepalived方案.该方案由两个mysql服务器组成,这两个mysql互为主备.其中一台主作为写服务器,另一台主作为读服务器.通过keepalived软件管 ...

  2. MySQL高可用方案 MHA之四 keepalived 半同步复制

    主从架构(开启5.7的增强半同步模式)master: 10.150.20.90   ed3jrdba90slave: 10.150.20.97    ed3jrdba97 10.150.20.132 ...

  3. 大型网站系统架构实践(五)深入探讨web应用高可用方案

    从上篇文章到这篇文章,中间用了一段时间准备,主要是想把东西讲透,同时希望大家给与一些批评和建议,这样我才能有所进步,也希望喜欢我文章的朋友,给个赞,这样我才能更有激情,呵呵. 由于本篇要写的内容有点多 ...

  4. MYSQL数据库高可用方案探究

    MySQL作为最关键的应用数据存储中心,如何保证MySQL服务的可靠性和持续性,是我们不得不细致考虑的一个问题.当master宕机的时候,我们如何保证数据尽可能的不丢失,如何保证快速的获知master ...

  5. MySQL 同步复制及高可用方案总结

    1.前言 mysql作为应用程序的数据存储服务,要实现mysql数据库的高可用.必然要使用的技术就是数据库的复制,如果主节点出现故障可以手动的切换应用到从节点,这点相信运维同学都是知道,并且可以实现的 ...

  6. Keepalived + haproxy双机高可用方案

    上一篇文章已经讲到了keepalived实现双机热备,且遗留了一个问题 master的网络不通的时候,可以立即切换到slave,但是如果只是master上的应用出现问题的时候,是不会 主动切换的. 上 ...

  7. MySQL高可用方案

    高可用架构对于互联网服务基本是标配,无论是应用服务还是数据库服务都需要做到高可用.虽然互联网服务号称7*24小时不间断服务,但多多少少有一些时候服务不可用,比如某些时候网页打不开,百度不能搜索或者无法 ...

  8. Heartbeat+DRBD+MySQL高可用方案

    1.方案简介 本方案采用Heartbeat双机热备软件来保证数据库的高稳定性和连续性,数据的一致性由DRBD这个工具来保证.默认情况下只有一台mysql在工作,当主mysql服务器出现问题后,系统将自 ...

  9. [转]MYSQL高可用方案探究(总结)

    前言 http://blog.chinaunix.net/uid-20639775-id-3337432.htmlLvs+Keepalived+Mysql单点写入主主同步高可用方案 http://bl ...

随机推荐

  1. 学习H5仿制网站时遇到的问题

    学习H5的第二周,开始仿制网站,在本过程中也发现了自己存在的更多问题. 1.TOP块:在制作top中,遇到的第一个问题,一旦top左右的背景色不同该怎样去调整 解决方式:建立两个div取代一个div ...

  2. lxml etree的一个问题

    <div> <a href="xxxx">123</a> <a href="xxxx">45</a> ...

  3. 对 url 中含有的中文进行转码操作

    对 url 中含有的中文进行转码操作 一般情况下,将带有中文的 url 拷贝到开发工具,开发工具都会有相应的转码(自动转码), 现在大部分的浏览器也可以对含有中文的 url 进行转码(自动转码) 情景 ...

  4. [翻译]编写高性能 .NET 代码 第二章:垃圾回收

    返回目录 第二章:垃圾回收 垃圾回收是你开发工作中要了解的最重要的事情.它是造成性能问题里最显著的原因,但只要你保持持续的关注(代码审查,监控数据)就可以很快修复这些问题.我这里说的"显著的 ...

  5. ASP.NET Core 使用 URL Rewrite 中间件实现 HTTP 重定向到 HTTPS

    在传统 ASP.NET 程序中,我们可以通过配置 IIS 的“URL 重写”功能实现将 HTTP 请求重定向为 HTTPS .但是该方法在 ASP.NET Core 应用中不再工作.在 ASP.NET ...

  6. 在centos 6.8下安装docker

    1.检查自己的系统内核是不是64位系统,因为docker只能安装在64位系统中 命令: uname -a 结果 2.6.32-642.6.2.el6.x86_64 2.查看自己centos的版本 ca ...

  7. 深入研究Node.js的底层原理和高级使用

    深入研究Node.js的底层原理和高级使用

  8. Egret学习笔记.2 (Egret开发环境)

    配置Egret的开发环境是很简单的,去https://www.egret.com/products/engine.html下载 然后基本就是下一步下一步,安装好了就好了,装好了选择Wing组件,然后下 ...

  9. UVA - 1632 Alibaba 区间dp

    题意:给定n个点,其中第i个点的坐标是,且它会在秒后消失.Alibaba可以从任意位置出发,求访问完所有点的最短时间.无解输出No solution. 思路:表示访问完区间后停留在i点的最短时间,表示 ...

  10. Acm弱校奋斗史

    我也是来自弱校的,没有教练,甚至老师都不理我们这种Acmer.看完这篇文章感触颇深. 原文链接 http://acmicpc.info/archives/369 原文 题解:还记得2年前的一个晚上,我 ...