实现网络节点的高可用性
案例一:简单的本地http服务
通过heartbeat实现服务器的高可用性及负载均衡本地的两个web节点的相互之间使用heartbeat架构高可用性配置如下:
实验拓扑图:
设备环境
我使用vmware完成的实验
dr1:eth0 vmnet 1 区域
eth1 vmnet 3 区域
dr2:eth0 vmnet 1 区域
eth1 vmnet 3 区域
dr1上的网卡配置
dr2上的网卡配置
修改dr1与dr2的主机名及hosts解析文件,如下
dr1 :
[root@love ~]# vim /etc/sysconfig/network
HOSTNAME=a.abc.com
5 192.168.20.100 a.abc.com
6 192.168.20.99 b.abc.com
使用“hostname HOSTNAME”
dr2上的配置:
[root@love ~]# vim /etc/sysconfig/network
HOSTNAME=b.abc.com
#退出重新登录即可
[root@b ~]# vim /etc/hosts
5 192.168.20.100 a.abc.com
6 192.168.20.99 b.abc.com
在两个节点上安装heartbeat软件包。制作本地 yum
[root@b ~]# yum install -y httpd
[root@a ~]# yum localinstall 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 --nogpgchek
[root@b ~]# cd /usr/share/doc/heartbeat-2.1.4/
[root@b heartbeat-2.1.4]# cp authkeys ha.cf haresources /etc/ha.d/
Vim /etc/ha.cf
95 bcast eth1 #指定heartbeat的心跳探测接口
214 node a.abc.com
215 node b.abc.com
#生成随机的MD5加密密钥
[root@b ha.d]# dd if=/dev/random bs=512 count=1 |openssl md5
0+1 records in
0+1 records out
128 bytes (128 B) copied, 0.000363242 seconds, 352 kB/s
ecd37c45ac679040bab37eeceb801837
[root@b ha.d]# vim authkeys
27 auth 3
28 3 md5 ecd37c45ac679040bab37eeceb801837
[root@b ha.d]# vim haresources
45 a.abc.com 192.168.20.101/24/eth0/192.168.20.255 httpd #指定对httpd服务进行控制
将服务的启动脚本拷贝到资源库中,以备heartbeat服务进行控制
cp /etc/init.d/httpd resource.d/
同时在dr1与dr2上执行以上相同配置
注意:保持密钥一致即可
此时测试服务可以正常访问
案例二:高可用性与负载均衡群集的实现
通过heartbeat服务控制ipvsadm实现对http服务的一种高可用性
实验拓扑图
设备环境
使用heartbeat实现高可用性的分发器(director)。使用LVS-DR模型搭建负载均衡群集
我使用vmware模拟软件完成整个服务器群集的搭建
使用的5台设备。这些设备进均为linux操作系统
dr1:eth0 vmnet 1 区域
eth1 vmnet 3 区域
dr2:eth0 vmnet 1 区域
eth1 vmnet 3 区域
web1:eth0 vmnet 1 区域
eth1 vmnet 4 区域
web2:eth0 vmnet 1 区域
eth1 vmnet 4 区域
存储:eth0 vmnet 4 区域
实验配置如下:
对案例一中的配置进行修改即可
[root@b ha.d]# vim haresources
45 a.abc.com 192.168.20.101/24/eth0/192.168.20.255 ipvsadm #对ipvsadm服务进行控制
将ipvsadm的控制脚本放入资源库中
cp /etc/init.d/ipvsadm /etc/ha.d/resource.d/
添加一些规则
ipvsadm –A –t 192.168.20.101:80 –s rr
ipvsadm –a –t 192.168.20.101:80 –r 192.168.20.200 -g
ipvsadm –a –t 192.168.20.101:80 –r 192.168.20.201 -g
service ipvsadm save #并执行保存配置的命令
在dr1与dr2上分别配置如上的命令
启用heartbeat服务。此时可以对web1及web2上的服务提供高可用性服务。案例三:实现完整的后方服务器监控高可用性与负载均衡
使用的环境依旧是案例二中的拓扑环境及服务器设备。
添加及修改配置如下
清空ipvsadm中添加的规则并保存。
关闭heartbeat 服务
安装heartbeat-ldirectord 控制软件
[root@b ~]# rpm -ivh heartbeat-ldirectord-2.1.4-9.el5.i386.rpm
[root@b ~]# rpm -ql heartbeat-ldirectord
/etc/ha.d/resource.d/ldirectord #该服务的控制脚本已经默认情况下安装到资源目录下
/etc/init.d/ldirectord
/etc/logrotate.d/ldirectord
/usr/sbin/ldirectord
/usr/share/doc/heartbeat-ldirectord-2.1.4
/usr/share/doc/heartbeat-ldirectord-2.1.4/COPYING
/usr/share/doc/heartbeat-ldirectord-2.1.4/README
/usr/share/doc/heartbeat-ldirectord-2.1.4/ldirectord.cf #提供一些配置参数的文件
/usr/share/man/man8/ldirectord.8.gz
[root@b ~]# cp /usr/share/doc/heartbeat-ldirectord-2.1.4/ldirectord.cf /etc/ha.d/
[root@b ha.d]# vim ldirectord.cf #修改配置文件中的有用行
12 checktimeout=3 #检测超时
13 checkinterval=1 #队后方服务器的探测间隔
15 autoreload=yes #修改配置文件后自动重新载入配置
21 quiescent=no #启用静默方式
24 virtual=192.168.20.101:80 #数据目标ip
25 real=192.168.20.200:80 gate #转发规则
26 real=192.168.20.201:80 gate #转发规则
29 service=http #探测使用的服务
30 request=".test.html" #探测页面
31 receive="ok!!!" #探测页面的内容
33 scheduler=rr #调度算法
36 protocol=tcp #使用的协议
修改haresources文件
[root@b ha.d]# vim haresources
45 a.abc.com 192.168.20.101 ldirectord::ldirectord.cf
Echo ‘ok!!!’ >/var/www/html/.test.html #创建探测页面
此时在dr1上保持与dr2上的配置相同
使用浏览器访问“http://192.168.20.101”
[root@a ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.20.101:80 rr
-> 192.168.20.201:80 Route 1 0 1
-> 192.168.20.200:80 Route 1 0 0
此时不在需要使用到“ipvsadm”添加规则。ldirectord 服务已经可以自动添加规则
此时的转发表会在后方的探测页面出现问题时自动将相应的路由表项删除
创建一个共享的服务器 FC-SAN
存储服务器上的配置如下:
安装scsi单元工具
[root@target Server]# yum install scsi-target-utils
[root@target Server]# rpm -ql scsi-target-utils
/etc/rc.d/init.d/tgtd #服务进程的控制脚本
/usr/sbin/tgt-admin #逻辑单元的操作工具(scsi target 管理工具)
/usr/sbin/tgtd #服务进程的名字
新建一块存储的硬盘或分区均可
[root@target ~]# fdisk /dev/sda
Command (m for help): n
Command action
e extended
p primary partition (1-4)
e
Command (m for help): n
First cylinder (1420-2610, default 1420):
Using default value 1420
Last cylinder or +size or +sizeM or +sizeK (1420-2610, default 2610): +200M
创建一个新的分区用于fc-san的存储
Command (m for help): p
Disk /dev/sda: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux
/dev/sda2 14 1288 10241437+ 83 Linux
/dev/sda3 1289 1419 1052257+ 82 Linux swap / Solaris
/dev/sda4 1420 2610 9566707+ 5 Extended
/dev/sda5 1420 1444 200781 83 Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: 设备或资源忙.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.
此时系统依旧使用老的磁盘。在远端服务器上进行格式化。
[root@target ~]# partprobe /dev/sda
修改服务器的主机名
[root@target ~]# vim /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=target.abc.com
[root@target ~]# service tgtd start
Starting SCSI target daemon: [ OK ]
[root@target ~]# chkconfig tgtd on
[root@target ~]# tgtadm --lld iscsi --op new --mode target --tid 1 --targetname iqn.2012-10.com.abc.target:disk
[root@target ~]# tgtadm --ld iscsi --op new --mode=logicalunit --tid=1 --lun=1 --backing-store /dev/sda5
[root@target ~]# tgtadm --lld iscsi --op show --mode target
Target 1: iqn.2012-10.com.abc.target:disk
System information:
Driver: iscsi
State: ready
I_T nexus information:
LUN information:
LUN: 0
Type: controller
SCSI ID: deadbeaf1:0
SCSI SN: beaf10
Size: 0 MB
Online: Yes
Removable media: No
Backing store: No backing store
LUN: 1
Type: disk
SCSI ID: deadbeaf1:1
SCSI SN: beaf11
Size: 206 MB
Online: Yes
Removable media: No
Backing store: /dev/sda5
Account information:
ACL information:
添加访问控制规则
[root@target ~]# tgtadm --lld iscsi --op bind --mode=target --tid=1 --initiator-address=192.168.40.0/24
[root@target ~]# tgtadm --lld iscsi --op show --mode target
……………………………………………
Account information:
ACL information:
192.168.40.0/24
以上的配置为临时型配置。永久性配置方案可以以上配置添加到linux的开机脚本中。或使用如下方案解决。
服务的配置文件
[root@target ~]# vim /etc/tgt/targets.conf
6 <target iqn.2012-10.com.abc.target:disk>
7 # List of files to export as LUNs
8 backing-store /dev/sda5
10 # Authentication :
11 # if no "incominguser" is specified, it is not used
12 #incominguser backup secretpass12
14 # Access control :
15 # defaults to ALL if no "initiator-address" is specified
16 initiator-address 192.168.1.0/24
17 </target>
在web1服务器上的配置
[root@web1 ~]# cd /mnt/cdrom/Server/
[root@web1 Server]# rpm -ivh iscsi-initiator-utils-6.2.0.871-0.10.el5.i386.rpm
[root@web1 Server]# vim /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2012-10.com.a.web1
[root@web1 Server]# service iscsi start
iscsid 已停
Turning off network shutdown. Starting iSCSI daemon: [确定]
[确定]
设置 iSCSI 目标:iscsiadm: No records found! [确定]
做探测发现
[root@web1 ~]# iscsiadm --mode discovery --type sendtargets --portal 192.168.40.100
192.168.40.100:3260,1 iqn.2012-10.com.abc.target:disk
[root@web1 ~]# iscsiadm --mode node --targetname iqn.2012-10.com.abc.target:disk --portal 192.168.40.100:3260 --login
Logging in to [iface: default, target: iqn.2012-10.com.abc.target:disk, portal: 192.168.40.100,3260]
Login to [iface: default, target: iqn.2012-10.com.abc.target:disk, portal: 192.168.40.100,3260]: successful
[root@web1 ~]# fdisk -l
Disk /dev/sda: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux
/dev/sda2 14 1288 10241437+ 83 Linux
/dev/sda3 1289 1419 1052257+ 82 Linux swap / Solaris
Disk /dev/sdb: 205 MB, 205599744 bytes
7 heads, 57 sectors/track, 1006 cylinders
Units = cylinders of 399 * 512 = 204288 bytes
Disk /dev/sdb doesn't contain a valid partition table
对新生成的磁盘文件进行分区格式化
[root@web1 ~]# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won't be recoverable.
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4):
Value out of range.
Partition number (1-4): 1
First cylinder (1-1006, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-1006, default 1006):
Using default value 1006
Command (m for help): p
Disk /dev/sdb: 205 MB, 205599744 bytes
7 heads, 57 sectors/track, 1006 cylinders
Units = cylinders of 399 * 512 = 204288 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 1006 200668+ 83 Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
对新建的磁盘分区进行格式化
[root@web1 ~]# mkfs -t ext3 /dev/sdb1
[root@web1 ~]# mount /dev/sdb1 /var/www/html/
[root@web1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 9.5G 2.6G 6.5G 29% /
/dev/sda1 99M 12M 83M 12% /boot
tmpfs 42M 0 42M 0% /dev/shm
/dev/hdc 2.8G 2.8G 0 100% /media/RHEL_5.4 i386 DVD
/dev/hdc 2.8G 2.8G 0 100% /mnt/cdrom
/dev/sdb1 190M 5.6M 175M 4% /var/www/html
创建探测文件“.test.html” 及主页“index.html”
[root@web1 ~]#cd /var/www/html
[root@web1 html]#echo ‘ok!!!’ > .test.html
[root@web1 html]#echo ‘hello,baby,hehe!!!’ > index.html
正如以上步骤对web1的配置。对web2进行相同配置。除了对磁盘文件进行格式化和创建文件。这样完成web服务器上的配置。重新启动heartbeat服务。
此时对web服务器进行访问测试
在dr1上查看规则匹配
[root@a ha.d]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.20.101:80 rr
-> 192.168.20.201:80 Route 1 0 1
-> 192.168.20.200:80 Route 1 0 0
在dr2上查看规则匹配
[root@b ha.d]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
此时搭建的有共享存储的群集已经完成。