什么是keepalived呢?keepalived是实现高可用的一种轻量级的技术手段 ,主要用来防止单点故障 ( 单点故障是指一旦某一点出现故障就会导致 整个系统架构的不可用 ) 的发生。之所以说keepalived是轻量级的,是相对于corosync + ldirectord来说的。keepalived也可以实现高可用集群,而且配置起来比 corosync + ldirectord 简单方便很多,keepalived与corosync的工作机制相差很多。 corosync + ldirectord实现 的功能虽然强大,但配置起来比较麻烦,而keepalived功能虽然简单,但配置起来比较容易。也就是说keepalived可实现 corosync + ldirectord实现的功能,只不过前者没有后者功能强大而已。 这里主要介绍keepalived。corosync相关的配置及实现会在以后的博客中更新,敬请关注。
在介绍keepalived之前,不得不先介绍下一个协议——VRRP。之所以要介绍这个协议,是因为VRRP协议是keepalived实现的基础。下面先来一块看下这个这协议是干吗用的吧。
基于keepalived(主从+双主) + LVS(DR模型) + DNS实现http高可用集群服务_第1张图片
如上图所示,通常,同一网段内的所有主机都设置一条相同的、以网关为下一跳的缺省路由。主机发往其他网段的报文将通过缺省路由发往网关,再由网关进行转发,从而实现主机与外部网络的通信。当网关发生故障时,本网段内所有以网关为缺省路由的主机将无法与外部网络通信,仅能实现内部主机间通信。缺省路由为用户的配置操作提供了方便,但是对缺省网关设备提出了很高的稳定性要求。增加出口网关是提高系统可靠性的常见方法,此时如何在多个出口之间进行选路就成为需要解决的问题。而VRRP正好解决了此问题。
VRRP:Virtual Router Redundancy Protocol,虚拟路由冗余协议。VRRP说白了就是实现地址漂移的,是一种容错协议,在提高可靠性的同时,简化了主机的配置。该协议能够实现将可以承担网关功能的一组路由器加入到备份组中,形成一台虚拟路由器,由VRRP的选举机制决定哪台路由器承担转发任务,局域网内的主机只需将虚拟路由器配置为缺省网关。
在VRRP协议出现之前,为了不让单个路由器成为本地与外部通信的瓶颈,我们需要有多个路由,在此种模式下,我们内部的主机就需要将自己的网关指向不同的路由器,这样的配置对我们的网关管理员来说是很麻烦的,且不容易实现。在VRRP协议出现后,为了不让单个路由器成为本地与外部通信的瓶颈,我们仍需要有多个路由,但可以使用同一个缺省网关,我们只需将内部主机指定一个缺省网关即可。VRRP协议会根据优先级来选择一个正常的路由作为主路由器实现与外部的通信,而其他路由则作为备份路由不参与转发。在此模式下,多个路由器组成虚拟路由器组,物理上是多个路由器组成,但在逻辑上却是表现为只有一个路由。效果如下图所示:
基于keepalived(主从+双主) + LVS(DR模型) + DNS实现http高可用集群服务_第2张图片
在上图中,Router A、Router B和Router C组成一个虚拟路由器。各虚拟路由器都有自己的IP地址。局域网内的主机将虚拟路由器设置为缺省网关。Router A、Router B和Router C中优先级最高的路由器作为Master路由器,承担网关的功能。其余两台路由器作为Backup路由器。当master路由器出故障后,backup路由器会根据优先级重新选举新的master路由器承担网关功能。Master 路由器周期性地发送VRRP 报文,在虚拟路由器中公布其配置信息(优先级等)和工作状况。Backup路由器通过接收到VRRP 报文的情况来判断Master 路由器是否工作正常。
VRRP根据优先级来确定备份组中每台路由器的角色(Master 路由器或Backup 路由器)。优先级越高,则越有可能成为Master 路由器。VRRP优先级的可配置的取值范围为1 到254。
为了防止非法用户构造报文***备份组,VRRP通过在VRRP报文中增加认证字的方式,验证接收到的VRRP报文。VRRP提供了两种认证方式:
simple:简单字符认证。发送VRRP 报文的路由器将认证字填入到VRRP 报文中,而收到VRRP 报文的路由器会将收到的VRRP 报文中的认证字和本地配置的认证字进行比较。如果认证字相同,则认为接收到的报文是真实、合法的VRRP 报文;否则认为接收到的报文是一个非法报文。
md5:MD5 认证。发送VRRP 报文的路由器利用认证字和MD5 算法对VRRP 报文进行摘要运算,运算结果保存在Authentication Header(认证头)中。收到VRRP 报文的路由器会利用认证字和MD5 算法进行同样的运算,并将运算结果与认证头的内容进行比较。如果相同,则认为接收到的报文是真实、合法的VRRP 报文;否则认为接收到的报文是一个非法报文。
在有多个路由器组成的虚拟路由中,当我们的内部主机很多时,如果所有主机都使用同一个master路由,会使得其他路由器很清闲,很浪费资源,我们期望我们本地的内部主机平分到各个路由器上,即让我们的内部主机的缺省网关指向不同的路由,从而减轻因只有一个master路由而造成网络带宽拥堵的负担。这就是负载分担VRRP。但这个如何实现呢?先看下面的配置效果图:
基于keepalived(主从+双主) + LVS(DR模型) + DNS实现http高可用集群服务_第3张图片
在此情况下,同一台路由器同时加入多个VRRP备份组,在不同备份组中有不同的优先级,从而实现负载分担。
在上图中,有三个备份组存在:
备份组1:对应虚拟路由器1。Router A作为Master路由器,Router B和Router C作为Backup路由器。
备份组2:对应虚拟路由器2。Router B作为Master路由器,Router A和Router C作为Backup路由器。
备份组3:对应虚拟路由器3。Router C作为Master路由器,Router A和Router B作为Backup路由器。
为了实现业务流量在Router A、Router B和Router C之间进行负载分担,需要将局域网内的主机的缺省网关分别设置为虚拟路由器1、2和3。在配置优先级时,需要确保三个备份组中各路由器的VRRP优先级形成交叉对应。为了便于理解,这里给出一张表,我们假定有三个路由设备Router A、B、C和三台主机Host A、B、C,列举有在不同的虚拟路由组中,各路由器所具有的VRRP优先级如下表所示。
基于keepalived(主从+双主) + LVS(DR模型) + DNS实现http高可用集群服务_第4张图片
从上表可以看到,各路由分别属于不同的虚拟路由组。对路由器A来说,因在虚拟路由组1中Router A的优先级高于另外两个,因此,Router A 作为 Master 路由器,Router B 和Router C 作为 Backup路由器;同样,对路由器B来说,因在虚拟路由器组2中Router B的优先级高于另外两个,因此,Router B 作为 Master 路由器,Router A 和Router C 作为 Backup路由器;对路由器C来说,因在虚拟路由器组3中Router C的优先级高于另外两个,因此,Router C 作为 Master 路由器,Router A 和Router B 作为 Backup路由器。对不同的主机来说,一旦其master路由器出故障后,会在另外正常的路由器中根据优先级重新选定master路由。如这里假定Host A的默认网关指向Router A,即Host A指向虚拟路由器组1的默认网关,对主机A来说,如果其master路由出现故障,即Router A出现故障,则会从另外两个正常的备份虚拟路由中根据各自的优先级选取高优先级的作为新的master路由,这里就是选取Router B作为其master路由来完成网关功能。假如想了解更多关于VRRP协议相关的信息请查阅相关资料,这里不再过多介绍。
在文章开始我就提到,keepalived实现的基础就是基于VRRP协议,上边介绍了那么多关于VRRP协议的相关知识,不知道你是否已经猜到keepalived与VRRP协议到底有什么关系。
keepalived设计之初就是为LVS提供高可用集群的,下面给出一个keepalived官方给的设计图:
基于keepalived(主从+双主) + LVS(DR模型) + DNS实现http高可用集群服务_第5张图片
从上图可以看出,keepalived包括三个组件:IO复用组件、内存管理组件和控制组件。在核心组件中IPVS wrapper就是负责生成ipvs规则的,所以说keepalived设计之初就是为ipvs也就是LVS提供高可用集群功能的。早期的keepalived实现的共能很简单,一般只需三个功能:一个是将IP地址转移到其他节点上,一个就是在另一个主机上生成ipvs规则,最后一个就是健康状况检查。那如何实现IP地址漂移呢,或者说如何实现IP地址转移的呢?这就需要借助于VRRP协议实现了。keepalived通过软件的方式在其内部模拟实现VRRP协议,然后借助于VRRP协议实现IP地址漂移。现在知道为什么花那么多篇幅介绍VRRP协议了吧。在下面配置keepalived的时候,还会用到VRRP协议的相关知识,因此一定要清楚的理解VRRP的工作机制,否则在下面配置keepalived的时候你可能会眼花缭乱。从上边的设计图我们就可以看到,keepalived的出生就是为lvs提供高可用集群服务的,因此,采用keepalived为lvs提供高可用集群服务,配置起来比较简单方便。
在上边我一直强调keepalived设计之初是为lvs提供高可用集群服务的,现在假如我只想通过keepalived为某个服务,不再为lvs高可用服务,比如说通过两台主机为web服务提供高可用服务,该怎么办呢,或者说能否实现呢?上边提到,keepalived实现的功能主要有三个,既然我们不为lvs提供高可用服务了,那生成ipvs规则和健康状况检查就不需要了,仅需要提供IP地址转移即可。因此,采用keepalived来实现IP地址转移,我们仍然可以实现为web服务提供高可用服务。但又遇到另一个问题,我们进实现了IP地址漂移,那我们的web服务怎么办呢,如何实现高可用呢,不能进实现IP地址转移啊,那样的话只能说是IP地址高可用,不能说是web服务高可用?其实现在的keepalived还有其他额外的功能。keepalived可以通过调用外部脚本的功能,来监控外部其他资源。在keepalived的配置文件中,一般都会有包含如下三行信息:
vrrp_script "killall -0 SERVICE_NAME"
notify-master "script"
notify-backup "script"
第一行仅仅实现改变优先级,当IP实现漂移后,在另一个节点上检查是否有该服务,如果有该服务,尝试杀死该服务时会返回正确结果,如果没有该服务会返回错误结果,然后根据返回的结果来修改自身的优先级;第二行表示,如果是主节点,执行相应的脚本,启动相应的服务;第三行表示,如果是从节点,执行相应的脚本,停止相应的服务。但是这个脚本需要自己写,这是keepalived中比较麻烦的一个问题。在下面keepalived的配置文件中会详细介绍如何调用外部脚本来监控其他外部资源。这里不再具体阐述,读者仅仅有个印象即可。枯燥的理论知识终于介绍完毕,你是不是有种解脱的感觉。好吧,下面跟着我一块来配置keepalived吧。Let 's  go !
实验场景:
在VMware上安装RedHat5.8,内核为Linux-2.6.18,这里模拟实现http服务的高可用,采用两台主机做keepalived高可用,另外两台做http高可用服务集群,安装的系统均为RedHat5.8,内核为Linux-2.6.18。
keepalived高可用主机IP:172.16.32.30和172.16.32.31
http服务高可用主机IP:172.16.32.32和172.16.32.33
VIP采用172.16.32.5
这里采用LVS的DR模型来实现集群服务。所以keepalived只需一个网卡即可。假如你想做NAT模型,请添加第二块网卡。LVS的相关理论知识会在以后的博客中介绍。
关闭四台主机的selinux。在命令行界面执行setenforce 0可关闭selinux,否则会对我们的测试有影响。
关闭iptables防火墙。
基于keepalived(主从+双主) + LVS(DR模型) + DNS实现http高可用集群服务_第6张图片
各虚拟机及主机名和IP对应关系如下所示:
虚拟机                   主机名                         IP地址
 HA1            node1.langdu.com           172.16.32.30
 HA2            node2.langdu.com           172.16.32.31
 HA3            node3.langdu.com           172.16.32.32
 HA4            node4.langdu.com           172.16.32.33
知识点补充:
集群(Cluster)类型:
LB:Load Balancing,负载均衡集群,以提高服务的并发能力为着眼点
HA:High Available,高可用集群,以提高服务可用性为着眼点
HP(HPC):High Performance,高性能集群,以提高服务系统处理性能为着眼点
对于高可用集群来说,为避免集群分裂,一个高可用集群至少要有3个节点,或奇数个节点。这里因硬件的限制,我仅用了两个节点,在实际使用中最好使用奇数个节点。既然是高可用集群了,那可用性如何计算呢?这里给出一个计算公式:可用性=在线时间/(在线时间+故障处理时间)
可能用到的各IP简写:
CIP:Client IP
VIP:virtual IP
DIP:Director IP
RIP:realserver IP  
LVS类型:
    LVS-NAT:地址转换
    LVS-DR:直接路由
    LVS-TUN:隧道


各类型需遵循的法则:
LVS-NAT:
    集群节点跟director必须在同一个IP网络中
    RIP地址通常是私有地址,仅用于各集群节点间通信
    director位于client和reals erver之间,并负责处理进出的所有通信
    realserver必须将网关指向DIP
    支持端口映射
    realserver可以使用任意OS
    较大规模应用场景中,director易成为系统瓶颈

LVS-DR:此模型下VIP地址配置在realserver的网卡别名上,通常情况下是隐藏的。
    集群节点跟director必须在同一个物理网络中
    RIP可以使用公网地址,实现便捷的远程管理和监控
    director仅负责处理入站请求,响应报文则由realserver直接发往客户端
    realserver不能将网关指向DIP
    不支持端口映射

LVS-TUN    
    集群节点可以跨越互联网
    RIP必须是公网IP地址
    director仅负责处理入站请求,响应报文则由realserver直接发往客户端
    realserver不能将网关指向director
    只有支持隧道功能的OS才能用于realserver
    不支持端口映射
Director调度策略:    
静态调度
    rr:轮叫,又称轮询
    wrr:Weight rr,加权轮询
    sh:source hashing,源地址hash
         实现会话绑定:session affinity
         ssession sharing:会话共享
    dh:destination hash:目标地址hash          

动态调度    
    lc:最少连接
         active*256+inactive
         谁的小,挑谁
    wlc:加权最少连接
         (active*256+inactive)/weight
         谁的小,挑谁
    sed:最短期望延迟
         (active+1)*256/weight
    nq:never queue,永不排队
    LBLC:基于本地的最少连接
    LBLCR:基于本地的带复制功能的最少连接    

安装完ipvsadm后默认方法:wlc
LVS-DR模型:
    kernel parameter:
         arp_announce:定义将自己的地址向外通告时的通告级别
              0:将本机任何接口上的任何地方向外通告(默认为0)
              1:试图仅想目标网络通告与其网络匹配的地址
              2:仅将与本地接口上地址匹配的网络进行通告

         arp_ignore:定义接受到ARP请求时的响应级别
              0:只要本地配置的有相应地址,就给予响应(默认为0)
              1:仅在请求的目标地址配置请求到达的接口上的时候,才给予响应

集群相关基础性知识基本就这些了。还有其他的这里就暂不介绍了,相关更多知识会在以后的集群博客中介绍。这里知识帮助理解。


实现集群的前提:
1、时间同步,这里采用cron任务计划实现;
2、主机名解析,最好通过配置/etc/hosts实现,不要使用DNS来实现,这里通过配置/etc/hosts来实现;
3、双机互信。
首先,解决时间同步的问题:
service ntpd stop    #在四台主机上关闭本机上时间同步的服务,因我们常挂起虚拟机,各虚拟机时间可能不相同,因此我们不使用系统时间同步的服务
ntpdate 172.16.0.1#在各主机上执行该命令,同步时间与该地址的时间相同,该地址最好可以上网,这里是与本地网关服务器的时间同步
crontab -e    #在各主机上使用该命令添加cron任务,每5分钟同步一下时间,同步后不管输出什么信息都送到/dev/null中,否则,你会每5分钟收到一封邮件
*/5****/sbin/ntpdate 172.16.0.1&> /dev/null
然后,配置主机名解析:
我们先来修改各主机名:
hostname node1.langdu.com     #使用该命令修改主机名,可立即生效,使用logout退出虚拟机后在登录即可看到效果
vim  /etc/sysconfig/network    #编辑IP为172.16.32.30的主机,修改其主机名
HOSTNAME=node1.langdu.com     #修改主机名
同样在其他主机上也修改主机名。
hostname node2.langdu.com     #使用该命令修改主机名,可立即生效,使用logout退出虚拟机后在登录即可看到效果
vim  /etc/sysconfig/network    #编辑IP为172.16.32.31的主机,修改其主机名
HOSTNAME=node2.langdu.com     #修改主机名
hostname node3.langdu.com     #使用该命令修改主机名,可立即生效,使用logout退出虚拟机后在登录即可看到效果
vim  /etc/sysconfig/network    #编辑IP为172.16.32.32的主机,修改其主机名
HOSTNAME=node3.langdu.com     #修改主机名
hostname node4.langdu.com     #使用该命令修改主机名,可立即生效,使用logout退出虚拟机后在登录即可看到效果
vim  /etc/sysconfig/network    #编辑IP为172.16.32.33的主机,修改其主机名
HOSTNAME=node4.langdu.com     #修改主机名
vim /etc/hosts  #在IP为172.16.32.30的主机上,编辑该文件,添加如下四行信息
172.16.32.30node1.langdu.com     node1
172.16.32.31node2.langdu.com     node2
172.16.32.32node3.langdu.com     node3
172.16.32.33node4.langdu.com     node4
在node1主机上使用scp命令将该文件传给其他三台主机:
scp /etc/hosts 172.16.32.31:/etc/#执行该命令时,需输入各主机的密码,可能有点麻烦
scp /etc/hosts 172.16.32.32:/etc/
scp /etc/hosts 172.16.32.33:/etc/
最后,实现双机互信:
因我们这里是两台主机做keepalived,两台主机做http,因此,我们将前两台实现双机互信,后两台实现双机互信,即node1和node2双机互信,node3和node4双机互信。
首先在node1上:
ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''    #在/root目录下执行该命令,生成密钥文件,密码为空
ssh-copy-id-i .ssh/id_rsa.pub [email protected]#使用该命令将该密钥传给另一台主机,身份为root,确保当前处于/root目录下
接着在node2上:
ssh-keygen -t rsa  -P ''    #在/root目录下执行该命令,生成密钥文件,密码为空
ssh-copy-id-i .ssh/id_rsa.pub [email protected]#使用该命令将该密钥传给另一台主机,身份为root,确保当前处于/root目录下
这样,以后在node1和node2之间通信时,我们就不需要输入密码了
ssh node2 'ifconfig'#在node1主机上,使用该命令,查看下是否已实现双机互信
同样在另外两台主机上也需要执行上述命令
在node3主机上,执行如下命令:
ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''    #在/root目录下执行该命令,生成密钥文件,密码为空
ssh-copy-id-i .ssh/id_rsa.pub [email protected]#使用该命令将该密钥传给另一台主机,身份为root,确保当前处于/root目录下
接着在node4上:
ssh-keygen -t rsa  -P ''    #在/root目录下执行该命令,生成密钥文件,密码为空
ssh-copy-id-i .ssh/id_rsa.pub [email protected]#使用该命令将该密钥传给另一台主机,身份为root,确保当前处于/root目录下


准备工作已经完毕,现在来安装我们的keepalived软件包。这里我们通过安装rpm包来实现,有兴趣的读者也可以从网上下载源码包,自己编译安装。本rpm是经过源码编译制作的rpm包,相关的脚本及示例配置文件都已制作进来,所以,直接在本地安装即可。假如你是从网上下载的rpm包,里边是没有示例配置文件和相关脚本的,需要自己写。

首先准备好我们的yum源,解决依赖关系时有可能用到里边的相关rpm包。
在node1上,使用如下命令完成安装,同样在node2上也需要安装该软件包,因node1和node2实现keepalived高可用。
yum -y --nogpgcheck localinstall keepalived-1.2.7-5.el5.i386.rpm   #因rpm我们以下载至本地,所以采用本地安装,别忘了在另一台主机上也安装该软件包
rpm -ql keepalived    #使用该命令查看安装的rpm生成哪些文件,这里只贴出生成的部分文件
/etc/keepalived
/etc/keepalived/keepalived.conf
/etc/keepalived/keepalived.conf.haproxy_example       #配置示例文件,网上下载的rpm包安装后没有该文件
/etc/keepalived/notify.sh       #脚本文件,同样网上下载安装的也没有该脚本文件
/etc/rc.d/init.d/keepalived
/etc/sysconfig/keepalived
/usr/bin/genhash
/usr/sbin/keepalived
一起来看下配置文件里的内容:
/etc/keepalived/keepalived.conf配置文件中,可分为三个部分:
global_defs     #全局配置部分
vrrp_instance VI_1     #vrrp实例,用来定义虚拟路由组
virtual_server 192.168.200.100 443    #虚拟服务部分,用来定义LVS相关配置的
各部分配置的各参数含义:
global_defs {
notification_email {    #通知邮件收件人
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]     #定义通知邮件的来源
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {     #vrrp实例部分
state MASTER           #定义初始状态下虚拟路由状态
interface eth0           #定义配置在哪个端口上
virtual_router_id 51#虚拟路由组ID号
priority 100#优先级
advert_int 1#每隔1秒进行通告
authentication {             #实现认证
auth_type PASS         #采用字符认证
auth_pass 1111#认证需要的字符串,最好是随机生成的,两边主机需一样
}
virtual_ipaddress {        #在对应接口上配置虚拟IP,可根据需要进行添加或删除
192.168.200.16
192.168.200.17
192.168.200.18
}
}
virtual_server 192.168.200.100443{    #虚拟服务部分,虚拟IP和端口分别是多少,
delay_loop 6#获取服务时的等待时间
lb_algo rr           #集群调度策略,默认为轮询,可自行修改
lb_kind NAT        #集群转发方式
nat_mask 255.255.255.0#虚拟IP的掩码
persistence_timeout 50#集群持久连接超时时长,不想支持持久连接可去掉该项
protocol TCP       #协议为TCP
sorry_server 192.168.200.2001358#定义当real_server都down之后,该怎么办
real_server 192.168.201.100443{     #真实后台服务器IP及端口号,当有多个RIP时可出现多次
weight 1#该服务器的权重
SSL_GET {          #采用SSL进行健康检查,还有其他方式也可实现健康检查
url {
path /#通过443端口到指定路径下获取相关服务
digest ff20ad2481f97b1754ef3e12ecd3a9cc    #摘要码
}
url {
path /mrtg/
status_code 200#状态码,访问正常时状态码为200
}
connect_timeout 3#定义多长时间检查一次
nb_get_retry 3#检查不健康后,重试次数
delay_before_retry 3#多长时间重试一次
}
}
}
keepalived配置文件主要内容已经介绍完毕。想要了解更多keepalived配置文件的信息可使用该命令来查看:man keepalived.conf
接下来我们先去配置好http高可用服务两台主机,然后再回来配置keepalived。既然是LVS的DR模型,那我们先来配置另外两台主机,来实现http高可用集群。
首先,打开另外两外两台提供http服务的虚拟机,这里是HA3和HA4。为了方便你也可以改为RS1和RS2。
先在HA3上执行如下命令:
rpm -q httpd    #确保已经安装过httpd软件包,如果没有请自行安装该软件包
echo "

RS1.langdu.com

" > /var/www/html/index.html     #为http提供主界面
service httpd start       #启动服务
同样,在HA4虚拟机上也执行同样的命令,但主界面要换成相应的命令。
rpm -q httpd    #确保已经安装过httpd软件包,如果没有请自行安装该软件包
echo "

RS2.langdu.com

" > /var/www/html/index.html     #为http提供主界面
service httpd start       #启动服务
然后在我们的物理机上尝试访问这两个IP,看是否可以访问。
基于keepalived(主从+双主) + LVS(DR模型) + DNS实现http高可用集群服务_第7张图片
在DR模型中,只添加个http服务还不行,还有许多需要修改,貌似不是很简单,好吧,为了节约时间,这里我们通过一个脚本实现修改各个数据。


#!/bin/bash
#
# Script to start LVS DR real server.
# chkconfig: - 90 10
# description: LVS DR real server
#
.  /etc/rc.d/init.d/functions
VIP=172.16.32.5#定义VIP
host=`/bin/hostname`
case "$1"in
start)
# Start LVS-DR real server on this machine.
/sbin/ifconfig lo down
/sbin/ifconfig lo up
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
/sbin/ifconfig lo:0$VIP broadcast $VIP netmask 255.255.255.255up
/sbin/route add -host $VIP dev lo:0
;;
stop)
# Stop LVS-DR real server loopback device(s).
/sbin/ifconfig lo:0down
echo 0> /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 0> /proc/sys/net/ipv4/conf/lo/arp_announce
echo 0> /proc/sys/net/ipv4/conf/all/arp_ignore
echo 0> /proc/sys/net/ipv4/conf/all/arp_announce
;;
status)
# Status of LVS-DR real server.
islothere=`/sbin/ifconfig lo:0| grep $VIP`
isrothere=`netstat -rn | grep "lo:0"| grep $VIP`
if[ ! "$islothere"-o ! "isrothere"];then
# Either the route or the lo:0 device
# not found.
echo "LVS-DR real server Stopped."
else
echo "LVS-DR real server Running."
fi
;;
*)
# Invalid entry.
echo "$0: Usage: $0 {start|status|stop}"
exit 1
;;
esac


记得该脚本需要在另一个主机上也要执行一下。
两台主机上都执行过上边的脚本后,验证下各参数是否已经修改:下面几个命令均在node3主机上执行,可在node3上使用ssh node4 'COMMAND'来验证下node4上各参数是否已修改


ifconfig    #在node3上执行该命令,查看是否有VIP,使用ssh node4 'ifconfig'命令查看node4上是否也有VIP
eth0      Link encap:Ethernet  HWaddr 00:0C:29:7F:8F:44
inet addr:172.16.32.33Bcast:172.16.255.255Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST  MTU:1500Metric:1
RX packets:162748errors:0dropped:0overruns:0frame:0
TX packets:2368errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:1000
RX bytes:26502458(25.2MiB)  TX bytes:200681(195.9KiB)
Interrupt:59Base address:0x2000
lo        Link encap:Local Loopback
inet addr:127.0.0.1Mask:255.0.0.0
UP LOOPBACK RUNNING  MTU:16436Metric:1
RX packets:10errors:0dropped:0overruns:0frame:0
TX packets:10errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:0
RX bytes:666(666.0b)  TX bytes:666(666.0b)
lo:0Link encap:Local Loopback
inet addr:172.16.32.5Mask:255.255.255.255
UP LOOPBACK RUNNING  MTU:16436Metric:1
route -n   #查看是否有配置的VIP特定路由
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
172.16.32.50.0.0.0255.255.255.255UH    000lo
169.254.0.00.0.0.0255.255.0.0U     000eth0
172.16.0.00.0.0.0255.255.0.0U     000eth0
0.0.0.0172.16.0.10.0.0.0UG    000eth0
cat /proc/sys/net/ipv4/conf/all/arp_ignore
1
cat /proc/sys/net/ipv4/conf/all/arp_announce
2


到此,我们的两台RealServer都以配置完毕,而且其http服务也已正常工作。
现在去编辑我们的keepalived的配置文件,并修改成我们所需要的。
先在node1主机上进行修改:

vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
root@localhost     #有通告信息时将邮件发给管理员
}
notification_email_from keepalived@localhost    #通告邮件来自哪里
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_httpd {     #定义该vrrp脚本,上边应提到keepalived就是靠这些脚本来实现其相关功能的
script "killall -0 httpd"#尝试杀死该服务,但不是真正杀死该服务,仅为了测试该服务是否启动而已
interval 2
# check every 2 seconds
weight -2
# if failed, decrease 2 of the priority
fall 2
# require 2 failures for failures
rise 1
# require 1 sucesses for ok
}
vrrp_script chk_schedown {        #定义该vrrp脚本,来实现手动转移IP地址,待会演示效果
script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"#如果有这个文件,则返回1,否则返回0
interval 2
weight -2#优先级减2
}
vrrp_instance VI_1 {
state MASTER                  #定义该主机为master路由
interface eth0
virtual_router_id 132#定义虚拟路由组ID号,同一网段内不要使用相同的组ID,否则会报错
priority 101#定义其优先级
advert_int 1
authentication {
auth_type PASS
auth_pass langdu          #字符串认证时使用的字符串,可自行修改,但要保证两个keepalived主机上的字符串相同
}
virtual_ipaddress {
172.16.32.5/16dev eth0 label eth0:0#定义VIP,并制定设备和别名
}
track_script {     #健康检查脚本
chk_httpd
chk_schedown
}
notify_master "/etc/keepalived/notify.sh master"#如果是master路由器,传递master参数
notify_backup "/etc/keepalived/notify.sh backup"#如果是backup路由,传递backup参数
notify_fault "/etc/keepalived/notify.sh fault"#如果失败了,传递fault参数
}
virtual_server 172.16.32.580{    #定义虚拟服务器,因我们测试的是http服务,所以端口为80
delay_loop 6
lb_algo rr
lb_kind DR
nat_mask 255.255.0.0#该掩码为虚拟服务器的掩码
# persistence_timeout 50     #为了待会刷新界面时查看效果,这里我没有启用持久连接,而是将其注释掉了
protocol TCP
real_server 172.16.32.3280{    #定义RIP和端口号
weight 1#权重,在rr调度方式下,该值没有实际意义
HTTP_GET {          #使用HTTP进行健康检查,假如你使用的是https服务,就需要使用基于SSL的健康检查
url {
path /
status_code 200#状态码
}
connect_timeout 2
nb_get_retry 3
delay_before_retry 2
}
}
real_server 172.16.32.3380{     #指定另一个RIP和端口号,上边已经提到,当有多个realserver时,该项可以出现多次
weight 2
HTTP_GET {
url {
path /
status_code 200
}
connect_timeout 2
nb_get_retry 3
delay_before_retry 3
}
}
}
下面这个脚本时实现健康检查用的。即上边用到的notify.sh脚本。
#!/bin/bash
# Author: onlyyou
# description: An example of notify script
#
ifalias=${2:-eth0:0}
interface=$(echo $ifalias | awk -F: '{print $1}')
vip=$(ip addr show $interface | grep $ifalias | awk '{print $2}')
contact='root@localhost'
workspace=$(dirname $0)
notify() {
subject="$ip change to $1"
body="$ip change to $1 $(date '+%F %H:%M:%S')"
echo $body | mail -s "$1 transition"$contact    #实现发送邮件
}
case "$1"in
master)
notify master
exit 0
;;
backup)
notify backup
/etc/rc.d/init.d/httpd restart
exit 0
;;
fault)
notify fault
exit 0
;;
*)
echo 'Usage: $(basename $0) {master|backup|fault}'
exit 1
;;
esac
scp /etc/keepalived/keepalived.conf node2:/etc/keepalived/#将配置文件发给另一个keepalived主机,这里发给node2,假如你的主机不是node2,请做相应修改
在node2主机上,修改刚传过来的keepalived的配置文件。这里只需修改两项即可:
vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state BACKUP          #设置该node2主机为backup路由
interface eth0
virtual_router_id 132
priority 100#设定node2主机的优先级为100,低于node1
advert_int 1
authentication {
auth_type PASS
auth_pass langdu
}
virtual_ipaddress {
172.16.32.5/16dev eth0 label eth0:0
}
track_script {
chk_httpd
chk_schedown
}
notify_master "/etc/keepalived/notify.sh master"
notify_backup "/etc/keepalived/notify.sh backup"
notify_fault "/etc/keepalived/notify.sh fault"
}


在node2主机上,我们只需修改上述两项即可。
修改完成后保存退出,接下来就可以启动keepalived服务了。
在上边给的keepalived设计图中我们已经看到,keepalived是为ipvs提供高可用服务的,并且会生成ipvs规则,但需要我们事先安装ipvsadm软件包。好吧,现在我们去安装ipvsadm软件包,然后再启动keepalived服务。
ssh node2 'yum -y install ipvsadm'   #通过node1主机在node2上安装ipvsadm软件包
yum -y install ipvsadm   #在node1上安装软件包
安装完毕后启动我们的keepalived服务。
service keepalived start    #启动node1上的keepalived服务
ssh node2 'service keepalived start'   #在node1上启动node2的keepalived服务
我们先来看下我们的日志,看有没有记录什么信息。
tail /var/log/messages    #查看日志
May 1618:19:22node1 Keepalived_vrrp[789]: Using LinkWatch kernel netlink reflector...
May 1618:19:22node1 Keepalived_vrrp[789]: VRRP sockpool: [ifindex(2), proto(112), fd(11,12)]
May 1618:19:22node1 Keepalived_vrrp[789]: VRRP_Instance(VI_1) Transition to MASTER STATE   #传输master状态
May 1618:19:22node1 Keepalived_vrrp[789]: VRRP_Instance(VI_1) Received lower prio advert, forcing new election
May 1618:19:23node1 Keepalived_vrrp[789]: VRRP_Instance(VI_1) Entering MASTER STATE       #进入master状态
May 1618:19:23node1 Keepalived_vrrp[789]: VRRP_Instance(VI_1) setting protocol VIPs.            #设置VIP地址
May 1618:19:23node1 Keepalived_vrrp[789]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for172.16.32.5
May 1618:19:23node1 Keepalived_vrrp[789]: Netlink reflector reports IP 172.16.32.5added
May 1618:19:23node1 Keepalived_healthcheckers[788]: Netlink reflector reports IP 172.16.32.5added
May 1618:19:28node1 Keepalived_vrrp[789]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for172.16.32.5
从上边的日志可以看到,我们的配置已经生效。那一起看下ipvs规则吧。
ipvsadm -l -n   #使用该命令,查看是否有ipvs规则,显示如下:
IP Virtual Server version 1.2.1(size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.16.32.5:80rr
-> 172.16.32.33:80Route   100
-> 172.16.32.32:80Route   100
ifconfig    #查看下node1上的IP配置情况
eth0      Link encap:Ethernet  HWaddr 00:0C:29:9F:2F:AF
inet addr:172.16.32.30Bcast:172.16.255.255Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST  MTU:1500Metric:1
RX packets:290653errors:1dropped:0overruns:0frame:0
TX packets:13874errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:1000
RX bytes:46393162(44.2MiB)  TX bytes:2014631(1.9MiB)
Interrupt:59Base address:0x2000
eth0:0Link encap:Ethernet  HWaddr 00:0C:29:9F:2F:AF
inet addr:172.16.32.5Bcast:0.0.0.0Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST  MTU:1500Metric:1
Interrupt:59Base address:0x2000
lo        Link encap:Local Loopback
inet addr:127.0.0.1Mask:255.0.0.0
UP LOOPBACK RUNNING  MTU:16436Metric:1
RX packets:10errors:0dropped:0overruns:0frame:0
TX packets:10errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:0
RX bytes:666(666.0b)  TX bytes:666(666.0b)


配置的VIP也已生效,我们的ipvs规则已经实现。现在在我们的物理机上访问下172.16.32.5,看一下,是否可以访问,显示什么信息吧。
基于keepalived(主从+双主) + LVS(DR模型) + DNS实现http高可用集群服务_第8张图片
到目前为止,貌似我们还没有实现IP地址漂移。好吧,从上边给的配置文件,可以看出来,我们只需在master路由主机上,在相应目录下创建一个down文件即可实现手动漂移IP地址。
在node1上
cd /etc/keepalived/#进入该目录
touch down    #创建该文件,用来实现手动漂移IP地址
tail /var/log/messages    #停几秒钟后,查看日志
May 1619:15:32node1 Keepalived_vrrp[2816]: VRRP_Instance(VI_1) Entering MASTER STATE
May 1619:15:32node1 Keepalived_vrrp[2816]: VRRP_Instance(VI_1) setting protocol VIPs.
May 1619:15:32node1 Keepalived_vrrp[2816]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for172.16.32.5
May 1619:15:32node1 Keepalived_healthcheckers[2815]: Netlink reflector reports IP 172.16.32.5added
May 1619:15:32node1 Keepalived_vrrp[2816]: Netlink reflector reports IP 172.16.32.5added
May 1619:15:32node1 Keepalived_vrrp[2816]: VRRP_Instance(VI_1) Received higher prio advert    #收到更高优先级的通告信息
May 1619:15:32node1 Keepalived_vrrp[2816]: VRRP_Instance(VI_1) Entering BACKUP STATE     #进入backup状态
May 1619:15:32node1 Keepalived_vrrp[2816]: VRRP_Instance(VI_1) removing protocol VIPs.     #转移VIP地址
May 1619:15:32node1 Keepalived_healthcheckers[2815]: Netlink reflector reports IP 172.16.32.5removed
May 1619:15:32node1 Keepalived_vrrp[2816]: Netlink reflector reports IP 172.16.32.5removed
ifconfig   #使用该命令,查看下node1主机的VIP是否存在,可看到已转移到其他主机
eth0      Link encap:Ethernet  HWaddr 00:0C:29:9F:2F:AF
inet addr:172.16.32.30Bcast:172.16.255.255Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST  MTU:1500Metric:1
RX packets:347881errors:1dropped:0overruns:0frame:0
TX packets:21333errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:1000
RX bytes:50760780(48.4MiB)  TX bytes:2653767(2.5MiB)
Interrupt:59Base address:0x2000
lo        Link encap:Local Loopback
inet addr:127.0.0.1Mask:255.0.0.0
UP LOOPBACK RUNNING  MTU:16436Metric:1
RX packets:10errors:0dropped:0overruns:0frame:0
TX packets:10errors:0dropped:0overruns:0carrier:0
collisions:0txqueuelen:0
RX bytes:666(666.0b)  TX bytes:666(666.0b)
在node2主机上查看其日志。
tail /var/log/messages   #查看node2的日志信息
May 1619:15:32node1 Keepalived_vrrp[2464]: VRRP_Instance(VI_1) forcing a new MASTER election
May 1619:15:32node1 Keepalived_vrrp[2464]: VRRP_Instance(VI_1) forcing a new MASTER election
May 1619:15:33node1 Keepalived_vrrp[2464]: VRRP_Instance(VI_1) Transition to MASTER STATE
May 1619:15:34node1 Keepalived_vrrp[2464]: VRRP_Instance(VI_1) Entering MASTER STATE    #进入master状态
May 1619:15:34node1 Keepalived_vrrp[2464]: VRRP_Instance(VI_1) setting protocol VIPs.    #设定VIP
May 1619:15:34node1 Keepalived_healthcheckers[2463]: Netlink reflector reports IP 172.16.32.5added
May 1619:15:34node1 avahi-daemon[3375]: Registering new address record for172.16.32.5on eth0.
May 1619:15:34node1 Keepalived_vrrp[2464]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for172.16.32.5
May 1619:15:34node1 Keepalived_vrrp[2464]: Netlink reflector reports IP 172.16.32.5added
May 1619:15:39node1 Keepalived_vrrp[2464]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for172.16.32.5


在在我们的物理机访问下,看能否访问。依然在浏览器地址栏输入172.16.32.5,可以看到,访问正常。
现在,我们删掉/etc/keepalived/down这个文件,看能否实现IP漂移回来。
rm /etc/keepalived/down      #删除node1主机上该文件
rm: remove regular empty file`down'? y
tail /var/log/messages    #查看日志信息
May 1619:15:32node1 Keepalived_vrrp[2816]: Netlink reflector reports IP 172.16.32.5removed
May 1619:27:54node1 Keepalived_vrrp[2816]: VRRP_Script(chk_schedown) succeeded
May 1619:27:55node1 Keepalived_vrrp[2816]: VRRP_Instance(VI_1) forcing a new MASTER election
May 1619:27:55node1 Keepalived_vrrp[2816]: VRRP_Instance(VI_1) forcing a new MASTER election
May 1619:27:56node1 Keepalived_vrrp[2816]: VRRP_Instance(VI_1) Transition to MASTER STATE
May 1619:27:57node1 Keepalived_vrrp[2816]: VRRP_Instance(VI_1) Entering MASTER STATE    #进入master状态
May 1619:27:57node1 Keepalived_vrrp[2816]: VRRP_Instance(VI_1) setting protocol VIPs.
May 1619:27:57node1 Keepalived_vrrp[2816]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for172.16.32.5
May 1619:27:57node1 Keepalived_healthcheckers[2815]: Netlink reflector reports IP 172.16.32.5added
May 1619:27:57node1 Keepalived_vrrp[2816]: Netlink reflector reports IP 172.16.32.5added


至此,我们已成功实现了keepalived的相关功能。以上演示的仅仅是主从模式下地址漂移。那我们能否实现在双主模式下实现地址漂移呢?答案是肯定的。


实现双主模式配置:
在node1主机上,修改keepalived配置文件
vim /etc/keepalived/keepalived.conf   #其他信息不变,仅修改如下信息
vrrp_instance VI_2 {    #添加虚拟路由组2
state BACKUP          #定义该路由在虚拟路由组2中为backup路由
interface eth0
virtual_router_id 232#定义组ID
priority 200#定义在该组中的优先级
advert_int 1
authentication {
auth_type PASS
auth_pass langdu
}
virtual_ipaddress {
172.16.32.6/16dev eth0 label eth0:1#因是双主模型,定义VIP及设备和别名,同上边定义的别名要区分开
}
track_script {
chk_httpd
chk_schedown
}
notify_master "/etc/keepalived/notify.sh master eth0:1"#修改这三项,因我们有意定义成其他别名
notify_backup "/etc/keepalived/notify.sh backup eth0:1"
notify_fault "/etc/keepalived/notify.sh fault eth0:1"
}
同时注释掉virtual_server部分。在双主模型下,我们不使用virtual_server部分。
scp /etc/keepalived/keepalived.conf  node2:/etc/keepalived/#将该配置文件传给另一个主机,即node2
在node2上,修改keepalived配置文件
vim /etc/keepalived/keepalived.conf
vrrp_instance VI_2 {     #在该主机上修改虚拟路由组2
state MASTER       #修改在该组中本路由为master路由
interface eth0
virtual_router_id 232#定义组ID
priority 201#修改在该组中的优先级,一定要高于node1中虚拟路由组2的优先级
advert_int 1
authentication {
auth_type PASS
auth_pass langdu
}
virtual_ipaddress {
172.16.32.6/16dev eth0 label eth0:1#因是双主模型,定义VIP及设备和别名,同上边定义的别名要区分开
}
track_script {
chk_httpd
chk_schedown
}
notify_master "/etc/keepalived/notify.sh master eth0:1"
notify_backup "/etc/keepalived/notify.sh backup eth0:1"
notify_fault "/etc/keepalived/notify.sh fault eth0:1"
}


在双主模型下,为了让同一个域名解析到不同的IP上,我们需要用到DNS将其解析到不同的两个IP上。这里,为了查看效果,我们先不安装DNS解析。待会在实现。
以上配置好后,重启keepalived服务。在物理机上在浏览器地址栏分别输入172.16.32.5和172.16.32.6查看显示效果。
可以看到,显示正常。我们的配置是正确的。
在我们的node1主机上,我们来手动实现地址漂移,看能否实现。
cd /etc/keepalived   #进入该目录
touch down        #创建该文件
tail /var/log/messages      #查看日志信息
May 1621:25:25node1 named[16646]: zone localhost/IN: loaded serial 0
May 1621:25:25node1 named[16646]: zone managed-keys.bind/IN/_meta: loaded serial 10
May 1621:25:25node1 named[16646]: running
May 1621:25:25node1 named[16646]: zone langdu.com/IN: sending notifies (serial 2013005)
May 1621:45:59node1 Keepalived_vrrp[11785]: VRRP_Script(chk_schedown) failed
May 1621:46:00node1 Keepalived_vrrp[11785]: VRRP_Instance(VI_1) Received higher prio advert
May 1621:46:00node1 Keepalived_vrrp[11785]: VRRP_Instance(VI_1) Entering BACKUP STATE    #可看到进入backup状态
May 1621:46:00node1 Keepalived_vrrp[11785]: VRRP_Instance(VI_1) removing protocol VIPs.      #VIP漂移成功
May 1621:46:00node1 Keepalived_vrrp[11785]: Netlink reflector reports IP 172.16.32.5removed
May 1621:46:00node1 Keepalived_healthcheckers[11784]: Netlink reflector reports IP 172.16.32.5removed
现在,一起看下node2上的日志信息:
tail /var/log/messages
May 1621:46:00node1 Keepalived_vrrp[11537]: VRRP_Instance(VI_1) forcing a new MASTER election
May 1621:46:00node1 Keepalived_vrrp[11537]: VRRP_Instance(VI_1) forcing a new MASTER election
May 1621:46:01node1 Keepalived_vrrp[11537]: VRRP_Instance(VI_1) Transition to MASTER STATE
May 1621:46:02node1 Keepalived_vrrp[11537]: VRRP_Instance(VI_1) Entering MASTER STATE     #进入master状态
May 1621:46:02node1 Keepalived_vrrp[11537]: VRRP_Instance(VI_1) setting protocol VIPs.
May 1621:46:02node1 Keepalived_vrrp[11537]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for172.16.32.5
May 1621:46:02node1 Keepalived_vrrp[11537]: Netlink reflector reports IP 172.16.32.5added   #添加另一个VIP
May 1621:46:02node1 Keepalived_healthcheckers[11536]: Netlink reflector reports IP 172.16.32.5added
May 1621:46:02node1 avahi-daemon[3375]: Registering new address record for172.16.32.5on eth0.
May 1621:46:07node1 Keepalived_vrrp[11537]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for172.16.32.5
现在我们来安装DNS服务器,实现将同一个域名解析到不同的IP地址上。这里我们将node1作为DNS服务器来负责域名解析。因此,以下命令在node1主机上执行。
yum -y install bind97 bind97-utils   #安装bind97,来提供DNS服务,在安装前请确保你的虚拟机上没有安装其他bind软件包
vim /etc/named.rfc1912.zones    #编辑该文件,添加如下信息
zone "langdu.com"IN {         #添加该区域,DNS相关配置请查看我的相关博客,里边有详细介绍
typemaster;         
file"langdu.com.zone";
};
zone "32.16.172.in-addr.arpa"IN {
typemaster;
file"172.16.32.zone";
};
cd /etc/named
vim 172.16.32.zone#编辑该文件,添加如下内容:
$TTL 600
@          IN     SOA     ns.langdu.com.          admin.langdu.com. (
2013005
4H
5M
3D
1D)
IN     NS     ns.langdu.com.
30IN     PTR     ns.langdu.com.
6IN     PTR     www.langdu.com.
5IN     PTR     www.langdu.com.
vim langdu.com.zone     #编辑该文件,添加如下内容:
$TTL 600
@          IN     SOA     ns.langdu.com.          admin.langdu.com. (
2013005
4H
5M
3D
1D)
IN     NS     ns
IN     NS     www
IN     NS     www
ns              IN     A     172.16.32.30
www          IN     A     172.16.32.5#实现将同一个域名解析到不同的IP上
www          IN     A     172.16.32.6
named-checkconf    #检查配置文件
named-checkzone "langdu.com"/var/named/langdu.com.zone       #检查区域文件
named-checkzone "32.16.172.in-addr.arpa"/var/named/172.16.32.zone
在我们的物理机上修改hosts文件。
打开C:\Windows\System32\drivers\etc/hosts文件,添加两行信息:
172.16.32.5www.langdu.com
172.16.32.6www.langdu.com
检查没有问题后启动服务。
service named start
dig -t A www.langdu.com @172.16.32.30#使用该命令查询下DNS服务器是否可用,以下是显示结果:
; <<>> DiG 9.7.0-P2-RedHat-9.7.0-6.P2.el5_7.4<<>> -t A www.langdu.com @172.16.32.30
;; globaloptions: +cmd
;; Got answer:
;; ->>HEADER<<-opcode: QUERY, status: NOERROR, id: 5351
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 2, ADDITIONAL: 1
;; QUESTION SECTION:
;www.langdu.com.               IN     A
;; ANSWER SECTION:
www.langdu.com.          600IN     A     172.16.32.5#解析成功,可看到同一域名解析出两个IP地址
www.langdu.com.          600IN     A     172.16.32.6
;; AUTHORITY SECTION:
langdu.com.          600IN     NS     ns.langdu.com.
langdu.com.          600IN     NS     www.langdu.com.
;; ADDITIONAL SECTION:
ns.langdu.com.          600IN     A     172.16.32.30
;; Query time: 5msec
;; SERVER: 172.16.32.30#53(172.16.32.30)
;; WHEN: Thu May 1621:42:072013
;; MSG SIZE  rcvd: 111


我们的DNS服务器也做好了。现在在物理机上的浏览器地址栏输入www.langdu.com,查看下显示效果。因为是DNS服务器解析得到的,因此,刷新多次后可能还是显示同一个界面内容。
到此,不管是主从模型还是双主模型,我们基本上都已实现。怎么样,介绍了这么多,你学的如何了呢?
后边还会更新更多相关集群的博客,敬请关注。