Chinaunix首页 | 论坛 | 博客
  • 博客访问: 137507
  • 博文数量: 38
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 460
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-24 15:48
文章分类

全部博文(38)

文章存档

2011年(1)

2009年(11)

2008年(26)

我的朋友

分类: LINUX

2009-06-10 14:26:32

术语:
LVS: Linux Virtual Server的简写,指linux虚拟服务器集群,有时也指服务器上启动的lvs服务。
DR: Director的简写,LVS中进行连接分派的前端服务器。有时候也指LVS的直接路由(Direct Route)方式。
RS: RealServer的简写,LVS中实际提供服务的服务器。
VIP: Virtual IP的简写,即虚拟IP,用户访问的服务都指向此IP而非DR或RS的IP,此IP由DRx上启动,能够在DRx之间无缝迁移。

 
0、预备
0.0、通常情况下,我们的服务都是单机提供服务的,那么当我们需要进行服务器软硬维护或服务器出现故障导致拓机而使服务器暂时不能提供服务的时候,就会影响到用户的体验,甚至影响用户对我们的信心。为了避免出现此类的情况,我们可以构建服务器集群,在服务器集群中,用户所看到的只是集群系统的DR上的VIP,而后端实际提供服务的服务器(下称RS)对用户来说是透明的,机器系统的DR管理用户的连接,将用户的连接通过一定的算法分发到后端的RS上,并当某台RS服务离线时,DR将此RS从其后端列表中移除或不分派连接到此RS,通过这种方式可以将单机的故障对用户的影响降到最低。服务器集群可以通过硬件和软件来实现,其中硬件方式具有快速高效和方便的优势,同时当然设备的价格也是相当的昂贵,而软件实现方式虽然效率和管理方式都不如硬件方式,但是它的成本非常低,而且对于中小型的企业来说,它的处理能力也已经足够应付用户的访问需求。高可用的服务器集群可以分为两个部分,一个部分就是HA,另一个部分就是LVS,HA部分对服务器进行热备份,当主服务器down的时候,自动切换服务到备份服务器上并继续提高用户的访问,LVS部分进行服务器集群,对用户隐藏真实的物理服务器。HA通过heartbeat来实现,而LVS的管理则通过ldirectord脚本来实现,这里要注意的是ldirectord只是LVS的管理工具,并不是实现LVS的软件,LVS是通过在系统中安装ipvsadm包来实现的。
下面我们就介绍如果使用软件方式来实现高可用的服务器集群。
 
0.1、四台安装RHEL5u2或CENTOS5u2的服务器,两台作为LVS DR(用heartbeat进行热备,同一时间只有单台提供连接分发服务),两台作为LVS RS(同时提供WEB服务)。
 
0.2、服务器角色分工与配置:

0.3、架构图
 
 
1、安装(dr1、dr2中执行)
在Heartbeat的源代码包中已经包含ldirectord脚本,所以我们只需要编译安装Heartbeat源代码即已完成Heartbeat和ldirectord的安装。
1.1、关联包:autoconf   automake  libtool  glib2-devel  python-devel  e2fsprogs-devel   pam-devel gnutls-devel swig libxml2-devel bzip2-devel bison flex perl-libwww-perl  perl-DateTime ipvsadm perl-MailTool libnet
关联关系包大部分都可以通过yum进行安装,其中perl-MailTool可以下载RPM包进行安装,libnet需要编译源代码。
perl-MailTool下载地址:
libnet下载地址:
 
用yum安装关联包:
yum install -y autoconf   automake  libtool  glib2-devel  python-devel  e2fsprogs-devel   pam-devel gnutls-devel swig libxml2-devel bzip2-devel bison flex perl-libwww-perl  perl-DateTime ipvsadm
 
安装perl-MailTool的RPM包:
rpm -ivh per-MailTools-xxx.rpm
 
安装libnet包:
./configure
make
make install
cp libnet-config /usr/bin/libnet-config
 
1.2、用源代码安装HeartBeat
./ConfigureMe configure
make
make install
添加heartbeat启动需要的组和用户:
groupadd haclient
useradd -g haclient -s /sbin/nologin hacluster
至此,Heartbeat和ldirectord都已经正常安装到我们的系统中,接着我们就可以配置他们来实现我们的高可用LVS了。
 
2、DR配置(dr1、dr2中执行)
2.1、LVS配置
首先我们先实现我们的LVS,然后我们再使用Heartbeat来实现LVS中的DR热备。
LVS的转发方式有三种:TUN、DR、NAT。
DR和TUN方式可以支持的RS数目比NAT方式要高许多,DR和TUN方式中VIP提供服务的端口跟RS提供服务的端口必须相同,NAT可以为不同端口;DR方式的限制就是所有的DR跟RS必须在同一个物理网络内,TUN方式不受此限制,但是需要服务器支持tunnel。由于NAT方式所有的包都通过DR来转发,所以它的弊端就比较明显了,因此现实中一般比较多使用DR或TUN方式,我们这里就以DR方式为例实现我们的LVS。
首先需要建立一个ldirectord的配置文件,让它通过这个配置文件来建立我们的LVS并检测LVS的状态。这个配置文件应该放在/etc/ha.d/目录并命名为ldirectord.cf,如果命名为其他的名称,那么在配置HA的时候需要相应的修改/etc/ha.d/haresources中ldirectord配置文件的名称。在配置ldirectord.cf的时候需要注意的是缩进,在virtual指令后面属于此虚拟服务器机器的配置都需要缩进至少1个TAB或4个空格,否则ldirectord在启动的时候可能会报告错误的配置文件或未知的参数等。下面为ldirectord的大部分配置项:
#ldirectord.cf
checktimeout = 5                      #检测超时时间
checkinterval = 10                    #检测间隔
checkcount = 1                        #检测多少次失败后认为服务离线
autoreload = no                       #配置文件修改后是否自动重载配置文件,重载只对virtual部分的修改有效,对新增或删除virtual无效
callback = "/path/to/callback"        #配置文件修改后调用的脚本,跟autoreload配置无关
fallback = 127.0.0.1:80               #所有的RS都离线时转向的服务器IP和端口
logfile = /var/log/ldirectord.log     #日志文件
emailalert = "emailaddress"           #用于发送在virtual服务中配置的任何real server连接状态改变的警告的合法email地址。
emailalertfreq = 300                  #当任何virtual服务中的real server持续不可访问时延迟多少秒后重复发送邮件警告。0秒为不重复。
emailalertstatus = all                #什么类型的状态改变需要发送邮件
execute = "configuration"             #指定ldirectord配置文件
supervised = no                       #是否前台运行
fork = no                             #是否对每个virtual部分生成一个子进程
quiescent = yes                       #当RS down时是否将其从LVS表中删除
virtual = 192.168.0.1:80              #开始一个虚拟服务器集群,注意下面的缩进
  real = 192.168.0.4:80 gate          #RS配置IP、LVS转发方式和权重,可为gate(DR),masq(NAT),ipip(TUN)
  real = 192.168.0.5:80 gate          #权重不配置的话默认都为1
  checktype = negotiate               #对RS服务进行检测的类型,可以为ping或connect或off等,默认为negotiate,它的检测方法为发送一个字符
         #串并对返回的字符串进行匹配
  service = http                      #检测使用的协议,checktype设置为negotiate时要配置的选项,根据此值会使用不同的协议进行服务的检测
  checkport = 80                      #设置RS服务的检测端口,可选,不配置的话即为服务端口
  request = ".ldirectord.html"        #检测时请求的对象
  receive = "it_works"                #请求的对象返回的期望正则表达式值,如果返回的对象与此匹配则判断RS在线,否则判定为离线
  httpmethod = GET                    #获取对象的方法
  scheduler = sh                      #负载均衡方式,可以为rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq中的任一个
  persistent = 30                     #持续连接的秒数(可选)
  protocol = tcp                      #使用的协议。如果virtual以IP地址和端口的形式指定,那么协议必须为tcp或udp(端口为53时使用)。
  monitorfile = "/var/log/ldmonfile"   #记录本virtual部分的RS何时及为何down
 
根据实际情况修改上面的部分或全部配置项完成ldirectord的配置,至此LVS的DR就已经配置好了。
上面的例子我们是使用了LVS的DR方式,如果使用NAT的方式,需要在DR上打开ip转发。修改/etc/sysctl.conf文件,加入下面的配置:
net.ipv4.ip_forward = 1
并执行:
sysctl -p
使配置生效。

2.2、HA配置
HA(高可用)是通过heartbeat来实现,下面配置heartbeat。
heartbeat要正常启动,需要配置三个文件:/etc/ha.d/ha.cf  /etc/ha.d/haresources  /etc/ha.d/authkeys
2.1.1>/etc/ha.d/authkeys
这个是Heartbeat之间通讯的验证文件,它的权限必须设置为600模式。其中可以配置的方法有三种:sha1,md5,crc。其中crc不进行密钥验证,其他两个需要设置密钥。Sha1是推荐使用的验证方法,因为它消耗的资源比较小而且很安全。下面实例:
#authkeys file
auth 1     #使用验证方法1
1 sha1 This_is_4_Heartbeat!  #验证方法1
2 sha1 this4smoothTransition~  #验证方法2
 
2.1.2>/etc/ha.d/ha.cf
这可以认为是本地Heartbeat的配置文件,它控制着Heartbeat的某些行为和指定Heartbeat运行的一些参数。其中必须配置的项有:节点列表{node …},检测接口{serial,bcast,mcast,ucast}中的一个,auto_failback的值。下面是配置实例:
#ha.cf file
use_logd on   #使用logging daemon
udpport 694   #监听udp端口694,两台服务器的端口配置必须相同
keepalive 1   #keepalive时间值
deadtime 30   #判定节点死亡的时间值
initdead 60   #初始判定节点死亡时间值,一般deadtime值的两倍
bcast eth1   #检测接口配置,配置发送心跳检测广播包的端口
node dr1 dr2   #节点列表,dr1,dr2为节点的名称,必须与机器上运行
  #uname –n时显示的结果相同
crm no    #是否使用CRM
auto_failback yes  #如果设置为yes,那么在主DR正常的情况下都由主DR提供服务
    #设置为no的话,在主DR出现故障然后恢复的时候,如果备DR正常,则继续由备DR提供服务
 
2.1.3>/etc/ha.d/haresources
这是当集群中的节点拓机和启动时从一台机器转移到另一台机器的resources列表,不要包含管理或已用IP地址在这个文件中。这个文件在集群的所有节点中都必须相同,如果有不同,将导致某些部件不能正常工作。下面是配置实例:
dr1  IPaddr::192.168.0.1/24/eth0 ldirectord::ldirectord.cf #dr1为运行我们的资源的主节点,192.168.0.1为服务
                                                           #VIP,24为子网掩码,并且把这个VIP绑定在eth0上,
                                                           #ldirectord为我们启动服务的脚本,必须出现在
                                                           #/etc/ha.d/resources.d目录下,冒号后面的ldirectord.cf
                                                           #为启动ldirectord的配置文件,与上面我们建立的配置文件名称一致
至此完成heartbeat的配置,在上面的配置中,我们利用heartbeat来启动一个VIP(192.168.0.1)和ldirectord,我们已经完成了Heartbeat和ldirectord的配置,也就是说LVS中的DR服务器已经配置好了。只要配置好RS,整个LVS就配置完成了。
 
3、RS配置(rs1、rs2中执行)
上面我们的转发服务器都配置成了直接路由的模式,那么对VIP上的服务的请求将会直接路由到我们的RS上,此时的数据包中的目的地址为VIP,为了让我们的RS能够处理发送到VIP的包,所以我们必须在RS上绑定一个VIP,同时由于一个局域网有了多个VIP对应的IP地址,我们也要采取措施来防止ARP竞争。
首先禁止我们的物理网卡响应非本端口的IP的ARP请求,我们这里假定物理网卡为eth0和eth1,具体根据实际情况进行修改,在系统中加入下面的参数:
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth1.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.eth0.arp_announce = 2
net.ipv4.conf.eth1.arp_announce = 2
接下来需要在RS上绑定VIP,如果将VIP绑定在物理网卡上,那么比必然造成一个物理网段内存在多个VIP而形成IP冲突,又或者多个VIP竞相相应对VIP的ARP查询而引起ARP竞争。所以我们应该选择把VIP绑定在环回端口,即lo接口上。首先我们假定lo上原来没有绑定出127.0.0.1以外的端口,如果有,那么需要注意下面的lo:0中的0需要相应进行修改,我们先在/etc/sysconfig/network-scripts建立一个ifcfg-lo:0文件,加入类似下面的配置:
#/etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.0.1
NETMASK=255.255.255.255  #此处的子网掩码必须为255.255.255.255
ONBOOT=yes
NAME=loopback
在所有的RS都进行如此配置后就完成了RS的配置了。
如果我们是采用NAT方式的话,RS上就不需要进行上面的操作,只需要将RS的网关指向DR就完成了RS的配置。
 
4、启动
 在rs1和rs2上启动我们的WEB服务,在dr1和dr2上启动Heartbeat服务,稍等一阵然后在主DR(我们这里配置为dr1)上执行ipvsadm -l命令查看lvs是否成功,用ifconfig命令可以查看VIP是否正常启动。
下面为正常的LVS的样例:
# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.0.1:http sh
  -> 192.168.0.4:http             Route   1      0          0        
  -> 192.168.0.5:http             Route   1      0          0  
阅读(903) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

qiangzhang19842009-07-30 16:52:45

好文章!!