一.heartbeat和ipvsadm简介
heartbeat简介:
heartbeat (Linux-HA)的工作原理:heartbeat最核心的包括两个部分,心跳监测部分和资源接管部分,心跳监测可以通过网络链路和串口进行,而且支持冗 余链路,它们之间相互发送报文来告诉对方自己当前的状态,如果在指定的时间内未受到对方发送的报文,那么就认为对方失效,这时需启动资源接管模块来接管运 行在对方主机上的资源或者服务。
可靠消息通信
Heartbeat通过插件技术实现了集群间的 串口、多播、广播和组播通信,在配置的时候可以根据通信媒介选择采用的通信协议,heartbeat启动的时候检查这些媒介是否存在,如果存在则加载相应的通信模块。这样开发人员可以很方便地添加新的通信模块,比如添加红外线通信模块。对于高可用集群系统,如果集群间的通信不可靠,那么很明显集群本身也不可靠。Heartbeat采用UDP协议和串口进行通信,它们本身是不可靠的,可靠性必须由上层应用来提供。那么怎样保证消息传递的可靠性呢?
Heartbeat通过冗余通信通道和消息重传机制来保证通信的可靠性。Heartbeat检测主通信链路工作状态的同时也检测备用通信链路状态,并把这一状态报告给系统管理员,这样可以大大减少因为多重失效引起的集群故障不能恢复。例如,某个工作人员不小心拨下了一个备份通信链路,一两个月以后主通信链路也失效了,系统就不能再进行通信了。通过报告备份通信链路的工作状态和主通信链路的状态,可以完全避免这种情况。因为这样在主通信链路失效以前,就可以检测到备份工作链路失效,从而在主通信链路失效前修复备份通信链路。
Heartbeat通过实现不同的通信子系统,从而避免了某一通信子系统失效而引起的通信失效。最典型的就是采用以太网和串口相结合的通信方式。这被认为是当前的最好实践,有几个理由可以使我们选择采用串口通信:
(1)IP通信子系统的失效不太可能影响到串口子系统。
(2)串口不需要复杂的外部设备和电源。
(3)串口设备简单,在实践中非常可靠。
(4)串口可以非常容易地专用于集群通信。
(5)串口的直连线因为偶然性掉线事件很少。
不管是采用串口还是以太网IP协议进行通信,heartbeat都实现了一套消息重传协议,保证消息包的可靠传递。实现消息包重传有两种协议,一种是发送者发起,另一种是接收者发起。
对于发送者发起协议,一般情况下接收者会发送一个消息包的确认。发送者维护一个计时器,并在计时器到时的时候重传那些还没有收到确认的消息包。这种方法容易引起发送者溢出,因为每一台机器的每一个消息包都需要确认,使得要发送的消息包成倍增长。这种现像被称为发送者(或者ACK)内爆(implosion)。
对于接收者发起协议,采用这种协议通信双方的接收者通过序列号负责进行错误检测。当检测到消息包丢失时,接收者请求发送者重传消息包。采用这种方法,如果消息包没有被送达任何一个接收者,那么发送者容易因NACK溢出,因为每个接收者都会向发送者发送一个重传请求,这会引起发送者的负载过高。这种现像被称为NACK内爆(implosion)。
Heartbeat实现的是接收者发起协议的一个变种,它采用计时器来限制过多的重传,在计时器时间内限制接收者请求重传消息包的次数,这样发送者重传消息包的次数也被相应的限制了,从而严格的限制了NACK内爆。
ipvs简介:
IPVS的含义
IPVS基本上是一种高效的Layer-4交换机,它提供 负载平衡的功能。当一个TCP连接的初始SYN报文到达时,IPVS就选择一台服务器,将报文转发给它。此后通过查发报文的IP和TCP报文头地址,保证此连接的后继报文被转发到相同的服务器。这样,IPVS无法检查到请求的内容再选择服务器,这就要求后端的服务器组是提供相同的服务,不管请求被送到哪一台服务器,返回结果都应该是一样的。但是在有一些应用中后端的服务器可能功能不一,有的是提供HTML文档的Web服务器,有的是提供图片的Web服务器,有的是提供CGI的Web服务器。这时,就需要基于内容请求分发 (Content-Based Request Distribution),同时基于内容请求分发可以提高后端服务器上访问的局部性。IPVS的工作原理
(1)先说下LVS提到IPVS就不得不提LVS(Linux Virtual Server),虚拟服务器是一个高度可扩展性和高可用性的服务器,建立在一个集群的服务器中。服务器集群的架构对用户是完全透明的,并且用户使用起来感觉它只有一个高性能虚拟服务器。
真正的服务器和负载平衡器之间通过高速局域网或地理上分散的广域网可以相互连接。负载平衡器可以将请求调度到不同的服务器并将并行的集群服务显示的像在一个单一的IP地址上的一个虚拟的服务,请求调度可以使用IP负载平衡技术或应用级负载平衡技术。系统的可扩展性是通过透明地添加或删除集群中的节点来实现的。通过检测节点或守护进程的失败和适当地重新配置系统提供高可用性。
(2)IPVS的原理
当一个TCP连接的初始SYN报文到达时,IPVS就选择一台服务器,将报文转发给它。此后通过查发报文的IP和TCP报文头地址,保证此连接的后继报文被转发到相同的服务器。这样,IPVS无法检查到请求的内容再选择服务器,这就要求后端的服务器组是提供相同的服务,不管请求被送到哪一台服务器,返回结果都应该是一样的。但是在有一些应用中后端>的服务器可能功能不一,有的是提供HTML文档的Web服务器,有的是提供图片的Web服务器,有的是提供CGI的Web服务器。这时,就需要基于内容请求分发 (Content-Based Request Distribution),同时基于内容请求分发可以提高后端服务器上访问的局部性。
上面已经说了IPVS是LVS的关键,因为LVS的IP负载平衡技术就是通过IPVS模块来实现的,IPVS是LVS集群系统的核心软件,它的主要作用是:安装在Director Server上,同时>在Director Server上虚拟出一个IP地址,用户必须通过这个虚拟的IP地址访问服务。这个虚拟IP一般称为LVS的VIP,即Virtual IP。访问的请求首先经过VIP到达负载调度器,然>后由负载调度器从Real Server列表中选取一个服务节点响应用户的请求。
二.案例所用的拓扑图
三.配置dns,web服务器配置
3.1 配置server1的dns服务
1)配置server1的ip地址
2)重启server1的网络服务
[root@localhost ~]# service network restart
正在关闭接口 eth0: [确定]
关闭环回接口: [确定]
弹出环回接口: [确定]
弹出界面 eth0: [确定]
3)配置server1的本地yum服务器
[root@localhost ~]# vim /etc/yum.repos.d/rhel-debuginfo.repo
修改配置文件如下图所示
4)挂载光盘
[root@localhost ~]# mount /dev/cdrom /mnt/cdrom
mount: block device /dev/cdrom is write-protected, mounting read-only
5)安装dns所需要的软件包
[root@localhost ~]# yum install bind -y
[root@localhost ~]# yum install bind-chroot -y
[root@localhost ~]# yum install caching-nameserver -y
6)生成dns主配置文件
[root@localhost ~]# cd /var/named/chroot/etc
[root@localhost etc]# cp -p named.caching-nameserver.conf named.conf
7)编辑主配置文件
[root@localhost etc]# vim named.conf
8) 声明bj.com区域
[root@localhost etc]# vim named.rfc1912.zones
9) 生成区域文件
[root@localhost etc]# cd ..
[root@localhost chroot]# cd var/named
[root@localhost named]# cp -p localhost.zone bj.com.zone
10) 编辑区域文件
[root@localhost named]# vim bj.com.zone
11) 修改dns指向
[root@localhost named]# vim /etc/resolv.conf
nameserver 192.168.20.133
12)修改主机名
[root@localhost named]# vim /etc/sysconfig/network
[root@localhost named]# hostname server1.bj.com
13)重启dns服务
[root@localhost ~]# service named start
启动 named: [确定]
[root@localhost ~]# chkconfig named on
3.2 配置server1的web服务
×××lamp环境
1)lamp 搭建用到的软件
mysql-5.5.15-linux2.6-i686.tar.gz
php-5.3.7.tar.bz2
httpd-2.2.19.tar.bz
2)想要实现源码安装,所需要的软件组。
[root@localhost ~]# yum grouplist
Development Tools //开发工具
Legacy Software Development //传统软件开发工具
Development Libraries //开发工具库
3)安装mysql
把mysql-5.5.15-linux2.6-i686.tar.gz拆解到/usr/local目录下
[root@server1 ~]# tar -zxvf mysql-5.5.15-linux2.6-i686.tar.gz -C /usr/local/
做软连接
[root@server1 ~]# cd /usr/local
[root@server1 local]# ln -s mysql-5.5.15-linux2.6-i686/ mysql
查看mysql安装文件
[root@server1 mysql]# less INSTALL-BINARY
按照mysql的安装说明文件执行如下操作
创建mysql用户及用户组
[root@server1 mysql]# groupadd mysql
[root@server1 mysql]# useradd -r -g mysql -s /sbin/nologin -M mysql
[root@server1 mysql]# chown -R mysql .
[root@server1 mysql]# chgrp -R mysql .
[root@server1 mysql]# scripts/mysql_install_db --user=mysql
把所有者和所属组该为root
[root@server1 mysql]# chown -R root .
把data的所有者改为mysql
[root@server1 mysql]# chown -R mysql data
[root@server1 mysql]# bin/mysqld_safe --user=mysql & //开启服务
4)设置用service来管理mysql
[root@server1 mysql]# cp support-files/mysql.server /etc/init.d/mysqld
[root@server1 mysql]# cd /etc/ld.so.conf.d/
[root@server1 ld.so.conf.d]# vim mysql.conf
创建mysql.conf文件指定库文件目录
[root@server1 ld.so.conf.d]# ldconfig -v |grep mysql
/usr/local/mysql/lib:
libmysqlclient.so.18 -> libmysqlclient_r.so.18.0.0
[root@server1 ld.so.conf.d]# cd /usr/include/
[root@server1 include]# ln -s /usr/local/mysql/include/ mysql
[root@server1 include]# chkconfig --add mysqld
[root@server1 include]# chkconfig --list |grep mysql
mysqld 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
[root@server1 rc3.d]# ll |grep mysql
lrwxrwxrwx 1 root root 16 09-11 01:23 S64mysqld -> ../init.d/mysqld
此时启动mysql
[root@server1 rc3.d]# service mysqld start
MySQL server PID file could not be found! [失败]
执行如下指令
[root@server1 Server]# pkill -9 mysqld
启动mysql
[root@server1 Server]# service mysqld start
Starting MySQL.. [确定]
4) 源码安装apache
拆解压缩文件
[root@server1 ~]# tar -jxvf httpd-2.2.19.tar.bz2 -C /usr/local/src
[root@server1 ~]# cd /usr/local/src
[root@server1 src]# ll
总计 4
drwxr-xr-x 11 xht xht 4096 2011-05-21 httpd-2.2.19
查看安装说明文件
[root@server1 httpd-2.2.19]# less INSTALL
检查预编译环境
[root@server1 httpd-2.2.19]# ./configure --prefix=/usr/local/apache //安装目录
--sysconfdir=/etc/httpd //配置文件目录
--enable-so // 开启 dso 动态共享对象
--enable-ssl //启用加密功能
--with-z //使用 zlib
编译
[root@server1 httpd-2.2.19]# make
安装
[root@server1 httpd-2.2.19]# make install
启动httpd服务
[root@server1 httpd]# cd /usr/local/apache/
[root@server1 apache]# ./bin/apachectl start
加入开机启动
[root@server1 apache]# vim /etc/rc.d/rc.local
创建http.conf 文件并指定http库文件目录
[root@server1 apache]# cd /etc/ld.so.conf.d/
[root@server1 ld.so.conf.d]# vim httpd.conf
在/usr/include/下为apache头文件建立软连接
[root@server1 ld.so.conf.d]# cd /usr/include/
[root@server1 include]# ln -s /usr/local/apache/include apache
重启服务
[root@server1 apache]# apachectl stop
[root@server1 apache]# apachectl start
5)为server1安装php
拆解软件包到/usr/local/src目录下
[root@server1 ~]# tar -jxvf php-5.3.7.tar.bz2 -C /usr/local/src
[root@server1 src]# cd php-5.3.7/
查看安装说明文件
[root@server1 php-5.3.7]# less INSTALL
检测预编译环境
--prefix=/usr/local/php //安装目录
将php编译成apache的模块,允许apache的apxx调用该模块
--with-apxs2=/usr/local/apache/bin/apxs
--with-mysql=/usr/local/mysql 指明mysql的安装位置
--with-mysqli=/usr/local/mysql/bin/mysql_config调用myql接口
支持宽字符
--enable-mbstring=all
[[email protected]]# ./configure
--prefix=/usr/local/php
--with-apxs2=/usr/local/apache/bin/apxs
--with-mysql=/usr/local/mysql
--with-mysqli=/usr/local/mysql/bin/mysql_config
--enable-mbstring=all
编译
[root@server1 php-5.3.7]# make
安装
[root@server1 php-5.3.7]# make install
查看网页文件如下图
修改配置文件使其支持php
[root@server1 htdocs]# vim /etc/httpd/httpd.conf
重启服务
[root@server1 htdocs]# /usr/local/apache/bin/apachectl stop
[root@server1 htdocs]# /usr/local/apache/bin/apachectl start
建立php网页文件
[root@server1 htdocs]# mv index.html index.php
6) 测试apache能否正常工作信息如下
7) 测试httpd能否调用php
[root@server1 htdocs]# vim index.php
测试php页面如下
8) 测试php调用mysql
[root@server1 htdocs]# vim index.php
测试页面如下
9) 测试mysql
利用mysql创建数据库
[root@server1 htdocs]# /usr/local/mysql/bin/mysql
3.3 配置server2的dns,web服务
Server2 的ip地址为192.168.20.134/28 主机名为server2.bj.com
1)server2的ip地址
2)配置主机名
[root@localhost ~]# vim /etc/sysconfig/network
3) 配置dns与server1的配置基本相同下面只将bj.com.zone的内容显示出来如图
[root@server2 ~]# cd /var/named/chroot/var/named
[root@server2 named]# vim bj.com.zone
搭建server2的lamp环境同搭建server1的lamp环境相同
只是将index.php改为:
It works!
$link=mysql_connect(‘127.0.0.1’,‘root’,’’);
If($link)
Echo “connect is ok”;
Else
Echo “disconnect”
?>
四. 配置两台direct转发器
4.1 配置direct1的ipvsadm
1)配置direct1的ip地址
心跳网卡的地址
2)重启网络服务
3)配置direct1的yum服务器
[root@localhost ~]# vim /etc/yum.repos.d/rhel-debuginfo.repo
4)安装ipvs
[root@localhost ~]# yum install -y ipvsadm
5)创建ipvsadm的规则,rr表示轮询算法
[root@localhost ~]# ipvsadm -A -u 192.168.20.137:53 -s rr
[root@localhost ~]# ipvsadm -a -u 192.168.20.137:53 -r 192.168.20.133 -g
[root@localhost ~]# ipvsadm -a -u 192.168.20.137:53 -r 192.168.20.134 -g
[root@localhost ~]# ipvsadm -A -t 192.168.20.137:80 -s rr
[root@localhost ~]# ipvsadm -a -t 192.168.20.137:80 -r 192.168.20.133 -g
[root@localhost ~]# ipvsadm -a -t 192.168.20.137:80 -r 192.168.20.134 –g
6)查看规则
7)保存规则并重新启动
[root@localhost ~]# service ipvsadm save
Saving IPVS table to /etc/sysconfig/ipvsadm: [确定]
4.2 配置Direct 2的ipvsadm
1)Director2服务器ip地址配置
心跳网卡的地址
2)重启网络服务
3)配置direct2的本地yum服务器
4)安装完ipvsadm后创建规则
5)保存规则
6)在direct2上查看规则
五. 利用heartbeat搭建direct转发器的高可用性群集
5.1 在direct1上配置heartbeat
1)编辑hosts文件
[root@n1 ~]# vim /etc/hosts
2)停止ipvsadm服务
3)修改主机名
4)利用yum安装heartbeat软件包
[root@n1 ~]# yum localinstall -y heartbeat-2.1.4-9.el5.i386.rpm --nogpgcheck
[root@n1~]#yum localinstall
heartbeat-pils-2.1.4-10.el5.i386.rpm
heartbeat-stonith-2.1.4-10.el5.i386.rpm
libnet-1.1.4-3.el5.i386.rpm perl-MailTools-1.77-1.el5.noarch.rpm –nogpgcheck
5)切换到heartbeat的配置目录复制所需文件
[root@n1 ]# cd /etc/ha.d
[root@n1 ha.d]# cp /usr/share/doc/heartbeat-2.1.4/ha.cf ./
[root@n1 ha.d]# cp /usr/share/doc/heartbeat-2.1.4/authkeys ./
[root@n1 ha.d]# cp /usr/share/doc/heartbeat-2.1.4/haresources ./
[root@n1 ha.d]# cp /etc/init.d/ipvsadm resource.d/
6)在eth1上发送心跳信息并指明两台direct转发器
[root@n1 ha.d]# vim ha.cf
7)编辑资源配置文件
[root@n1 ha.d]# vim haresources
8)利用随机函数产生随机数并用MD5加密
9)编辑验证文件
[root@n1 ha.d]# vim authkeys
10)查看heartbeat的状态
11)启动heartbeat的服务
5.2 配置direct2的heartbeat
1)配置direct2的主机名并修改hosts文件
[root@localhost ~]# vim /etc/sysconfig/network
[root@n2 ~]# vim /etc/hosts
2)安装heartbeat软件包
[root@n2~]#yumlocalinstall -y heartbeat-2.1.4-9.el5.i386.rpm \
heartbeat-pils-2.1.4-10.el5.i386.rpm \
heartbeat-stonith-2.1.4-10.el5.i386.rpm\
libnet-1.1.4-3.el5.i386.rpm \
perl-MailTools-1.77-1.el5.noarch.rpm –nogpgcheck
3)在配置目录下复制所需文件
[root@n2 ~]# cd /etc/ha.d
[root@n2 ha.d]# cp /usr/share/doc/heartbeat-2.1.4/ha
[root@n2 ha.d]# cp /usr/share/doc/heartbeat-2.1.4/ha.cf ./
[root@n2 ha.d]# cp /usr/share/doc/heartbeat-2.1.4/authkeys ./
[root@n2 ha.d]# cp /usr/share/doc/heartbeat-2.1.4/haresources ./
[root@n2 ha.d]# cp /etc/init.d/ipvsadm resource.d/
4)在eth1在心跳探测并指明两台direct转发器
[root@n2 ha.d]# vim ha.cf
5)编辑资源配置文件
[root@n2 ha.d]# vim haresources
6)编辑验证文件密码要和direct1上的相同
[root@n2 ha.d]# vim authkeys
7)修改验证文件的权限
[root@n2 ha.d]# chmod 600 authkeys
8)重启heartbeat服务
9)停止ipvsadm服务
[root@n2 ha.d]# service ipvsadm stop
六. 两台server服务器配合前面的director完成负载均衡群集
6.1 配置serve2
1)配置server2的虚拟地址
2)解决关于arp的问题
[root@server2 ~]# vim /etc/sysctl.conf
3) 配置路由
[root@server2 ~]# route add -host 192.168.20.137 dev lo:0
6.2 配置Server1
1)配置虚拟地址
2)解决arp问题
[root@server1 ~]# echo "net.ipv4.conf.all.arp_announce = 2" >> /etc/sysctl.conf
[root@server1 ~]# echo "net.ipv4.conf.lo.arp_announce = 2" >> /etc/sysctl.conf
[root@server1 ~]# echo "net.ipv4.conf.all.arp_ignore = 1" >> /etc/sysctl.conf
[root@server1 ~]# echo "net.ipv4.conf.lo.arp_ignore = 1" >> /etc/sysctl.conf
[root@server1 ~]# sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 4294967295
kernel.shmall = 268435456
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
3)创建路由并查看路由表
[root@server2 ~]# route add -host 192.168.20.137 dev lo:0
[root@server1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.20.137 0.0.0.0 255.255.255.255 UH 0 0 0 lo
192.168.20.128 0.0.0.0 255.255.255.240 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
0.0.0.0 192.168.20.131 0.0.0.0 UG 0 0
7. 客户机测试
1)客户端地址配置
2)用虚拟地址访问网页
3)用域名访问网页
刷新一次结果如下因为用的算法轮询
4)在direct1上面查看ipvsadm的规则因为direct1是激活设备所以能看到
5)在direct2则看不到
6)模拟direct1失效
7)再次访问网页依然可以正常访问
刷新一次
8)此时direct2为激活设备能看到ipvsadm规则
9)模拟direct1恢复此时direct1再次成为激活设备
查看ipvsadm规则
10)测试完毕。