一、 背景知识
本文档将会用到以下两个重要的组件:
a) DRBD
DRBD的全称为:Distributed Replicated Block Device,意为分布式块设备复制, DRBD是由内核模块和相关脚本而构成,用以构建高可用性的集群。DRBD是linux的内核的存储层中的一个分布式存储系统,可用使用DRBD在两台Linux服务器之间共享块设备,共享文件系统和数据,类似于网络RAID-1。
b) HA
HA是High Available缩写,是双机集群系统简称,指高可用性集群,是保证业务连续性的有效解决方案,一般有两个或两个以上的节点,且分为活动节点及备用节点。当一个节点不可用或者不能处理客户的请求时,该请求会及时转到另外的可用节点来处理,而这些对于客户端是透明的,客户不必关心要使用资源的具体位置,集群系统会自动完成。
二、 详细配置过程
a) 网络规划
本例的配置使用一个网络端口也能完成,只是现在的服务器都配备了多个网口端口,所以这里我们使用两个网口来使用完成最终的配置。这也有利于将DRBD的同步流量与语音流量区分开来,尽可能减少对语音流量的影响,保证通讯稳定正常。只需用跳线将两个服务器上另一对网口连接起来就可以了,这样也能减少由于交换机故障或者断电带来的风险。如下图,具体配置不在本文体现:
b) 系统分区
DRBD配置时,需要用到一块独立的磁盘空间,因此在系统分区的时候必须采用自定义模式,留出一块未用的磁盘空间。建议用以下分区方案,将硬盘分为/boot(200M),swap(内存的同等大小即可),/(100G),其他磁盘空间不分配,如下图结构。
当然,两个服务器的分区必须一模一样。
还有一点需要注意的是,在Linux系统下每个设备都以文件的形式存在,我们需要知道我们的硬盘的名称,以便后续的配置。所以,分区的时候要记录下硬盘的名称,我这里是sda。
c) 创建新分区
正常安装完系统,建议使用SSH工具(putty或者SecureCRT)统一配置两台服务器,这样可以减少因为操作不同步而导致的配置失败。
在两个服务器上运行fdisk命令来创建新分区:
fdisk /dev/sda #使用fdisk命令,然后采用以下参数创建新分区:
- add a new partion (n)
- Primary (p)
- Partition number (4)
- Press enter until returned to fdisk command prompt {accepting defaults}
- Press “t” to change the partition system ID
- Press “4” to choose partition number
- Choose HEX 83 for type
- Press “w” to save changes
执行完输入‘reboot’,重启两台服务器。
重启之后,还是使用fdisk命令,查看下新的分区表的信息。
fdisk /dev/sda
输入p,打印分区表信息。
查看到类似信息后,说明新分区/dev/sda4已经创建好,退出fdisk命令模式。
格式化新分区
mke2fs –j /dev/sda4
dd if=/dev/zero bs=1M count=1 of=/dev/sda4 sync
d) 安装必要软件(只针对Elastix2.4)
如果服务器能连外网,直接使用yum install ** 安装是最快、最省事的。
net-snmp-utils
查看net-snmp*组件是否安装
rpm –aq net-snmp*
先卸载 net-snmp-libs-5.3.2.2-20.el5
rpm -e net-snmp-5.3.2.2-20.el5
升级 net-snmp-libs
rpm -Uvh net-snmp-libs-5.3.2.2-22.el5_10.1.x86_64.rpm
安装新版本的net-snmp
rpm -ivh net-snmp-5.3.2.2-22.el5_10.1.x86_64.rpm
安装新版本net-snmp-utils
rpm -ivh net-snmp-utils-5.3.2.2-22.el5_10.1.x86_64.rpm
heartbeat
安装顺序如下图,
错误可以接受,不影响功能
drbd83 and kmod-drbd83
直接安装
e) 配置DRBD
/etc/hosts (两个服务器一致)
添加两台服务器的host
/etc/drbd.conf (两个服务器一致)
# /usr/share/doc/drbd83/drbd.conf global { usage-count no; } resource repdata { #repdata 可以自定义名称 protocol C; startup { wfc-timeout 10; degr-wfc-timeout 30; } disk { on-io-error detach; } net { after-sb-0pri discard-younger-primary; after-sb-1pri discard-secondary; after-sb-2pri call-pri-lost-after-sb; cram-hmac-alg "sha1"; shared-secret "Yourownpassword"; #Yourownpassword 可以自定义 } syncer { rate 100M; } # set the above to 10M – single network card or 100M if using a # dedicated (second) network card for DRBD # make sure the name below matches your host name on SIP1 { #SIP1根据/etc/hosts device /dev/drbd0; disk /dev/sda4; # if using a second network card – make sure that this is the IP # of the second card on SIP1 Server address 192.168.1.1:7788; #根据实际情况,SIP1的IP地址 meta-disk internal; } # make sure the name below matches your host name on SIP2 { #SIP2根据/etc/hosts device /dev/drbd0; disk /dev/sda4; address 192.168.1.2:7788; #根据实际情况,SIP2的IP地址 # if using a second network card – make sure that this is the IP # of the second card on SIP2 server meta-disk internal; } }
配置DRBD
drbdadm create-md repdata #两个服务器都运行, repdata与/etc/drbd.conf的一致
service drbd start #两个服务器都开启drbd
查看两个服务器的drbd状态
此时,你会看到两个服务器现在都处在secondary的状态下。接下来我们需要将主服务器设置为primary。
drbdadm invalidate repdata #在备用服务器上运行 drbdadm primary repdata #在主服务器上运行
现在再次在主服务器运行‘cat /proc/drbd’命令,你将会看到主服务器已经处在primary状态了,而且正在处于数据同步状态
在备用服务器上运行‘cat /proc/drbd’命令时,备用服务器处在Secondary状态,也处在数据同步状态
整个同步过程需要一点时间,等到同步结束后,我们可以看到两台服务器都处ds:uptodate/uptodate, 这也表明两台服务器已完全同步。
同步完成后,在主服务器上格式化并挂载/dev/drbd0,输入以下命令:
mkfs.ext3 /dev/drbd0
mkdir /repdata #repdata要与之前的/etc/drbd.conf配置文件中的名称要一致,不建议改动
mount /dev/drbd0 /repdata
并在/repdata目录下生成几个测试文件,用于测试DRBD功能
for i in {1..5};do dd if=/dev/zero of=/repdata/file$i bs=1M count=100;done #将生成file1 file2 file3 file4 file5这5个文件
接下来,我们要手动把备服务器设置为primary状态,然后在备用服务器上格式化并/dev/drbd0,最后验证在主服务器/repdata中生成的文件是否同步过来。
在主服务器上,输入以下命令把primary状态变成secondary
umount /repdata #输入这条命令之前,需要退出这个目录。 drbdadm secondary repdata
在备用服务器上,输入以下命令把DRBD状态设置为primary
mkdir /repdata drbdadm primary repdata mount /dev/drbd0 /repdata
然后进入/repdata目录,查看文件,将会看到类似画面:
说明主服务生成的文件已经同步过来了。
现在我们在备用服务器上继续做反向的测试,运行以下命令:
rm /repdata/file2 #删除/repdata/目录下的file dd if=/dev/zero of=/repdata/file6 bs=100M count=2 #在/repdata下新生成一个file6
接着,我们切换回两个服务器的状态。
在备用服务器上,输入以下命令:
umount /repdata/ #输入这条命令之前,记得退出/repdata目录 drbdadm secondary repdata
在主服务器上,输入以下命令:
drbdadm primary repdata mount /dev/drbd0 /repdata
在主服务器上,进入/repdata目录,并查看文件,将看到类似如下画面:
到此为止,我们已经在两个服务器上设置了DRBD分区,配置了基本功能,并通过了实际测试的验证。
迁移Elastix相关的目录到同步区域
在主服务上通过运行以下命令将相关的文件转移到/repdata(在两个服务器上同步),然后移除旧文件,并设置相应软链接
cd /repdata tar -zcvf etc-asterisk.tgz /etc/asterisk/ tar -zxvf etc-asterisk.tgz tar -zcvf var-lib-asterisk.tgz /var/lib/asterisk/ tar -zxvf var-lib-asterisk.tgz tar -zcvf usr-lib-asterisk.tgz /usr/lib/asterisk/ tar -zxvf usr-lib-asterisk.tgz tar -zcvf var-www.tgz /var/www/ tar -zxvf var-www.tgz tar -zcvf var-spool-asterisk.tgz /var/spool/asterisk/ tar -zxvf var-spool-asterisk.tgz tar -zcvf var-lib-mysql.tgz /var/lib/mysql/ tar -zxvf var-lib-mysql.tgz tar -zcvf var-log-asterisk.tgz /var/log/asterisk/ tar -zxvf var-log-asterisk.tgz tar -zcvf tftpboot.tgz /tftpboot/ tar -zxvf tftpboot.tgz rm -rf /etc/asterisk/ rm -rf /var/lib/asterisk/ rm -rf /usr/lib/asterisk/ rm -rf /var/spool/asterisk/ rm -rf /var/lib/mysql/ rm -rf /var/log/asterisk/ rm -rf /tftpboot/ rm -rf /var/www ln -s /repdata/etc/asterisk/ /etc/asterisk ln -s /repdata/var/lib/asterisk/ /var/lib/asterisk ln -s /repdata/usr/lib/asterisk/ /usr/lib/asterisk ln -s /repdata/var/spool/asterisk/ /var/spool/asterisk ln -s /repdata/var/lib/mysql/ /var/lib/mysql ln -s /repdata/var/log/asterisk/ /var/log/asterisk ln -s /repdata/var/www /var/www ln -s /repdata/tftpboot /tftpboot
在主服务器上运行以下命令关掉相关服务
service mysqld stop service asterisk stop service httpd stop service elastix-portknock stop service elastix-updaterd stop
如果看到有个服务类似..port-knock的处于fail状态,那是正常的。
接下来,我们将手动切换两个服务器的DRBD状态,然后在备用服务器上删除旧文件,并建立相关软链接。
在主服务器上
umount /repdata #注意先退出/repdata目录 drbdadm secondary repdata
在备用服务器上
drbdadm primary repdata mount /dev/drbd0 /repdata
在备用服务器上,你现在可以看到/repdata的文件已经同步过来了。所以现在我们运行以下命令来,移除旧文件和生成软链接:
rm -rf /etc/asterisk/ rm -rf /var/lib/asterisk/ rm -rf /usr/lib/asterisk/ rm -rf /var/spool/asterisk/ rm -rf /var/lib/mysql/ rm -rf /var/log/asterisk/ rm -rf /var/www/ rm -rf /tftpboot/ ln -s /repdata/etc/asterisk/ /etc/asterisk ln -s /repdata/var/lib/asterisk/ /var/lib/asterisk ln -s /repdata/usr/lib/asterisk/ /usr/lib/asterisk ln -s /repdata/var/spool/asterisk/ /var/spool/asterisk ln -s /repdata/var/lib/mysql/ /var/lib/mysql ln -s /repdata/var/log/asterisk/ /var/log/asterisk ln -s /repdata/var/www /var/www ln -s /repdata/tftpboot /tftpboot
并关掉相关服务
service mysqld stop service asterisk stop service httpd stop service elastix-portknock stop service elastix-updaterd stop
所有这一切搞定后,我们切换回正常的DRBD状态,即主服务器为primary,备用服务器为secondary
在备用服务器上:
umount /repdata drbdadm secondary repdata
在主服务器上:
drbdadm primary repdata mount /dev/drbd0 /repdata
配置heartbeat
heartbeat会监控两个节点,并通过运行一些脚本让一些服务恢复工作状态。我们要做的是,在两台服务器上把一些服务禁用掉,让他们在系统启动时不自动启动,而是让heartbeat通过识别哪个服务器是primary来管理这些服务是否启动。
1.关闭服务
在两台服务器上运行以下命令:
chkconfig asterisk off chkconfig mysqld off chkconfig httpd off chkconfig elastix-portknock off chkconfig elastix-updaterd off service mysqld stop service asterisk stop service httpd stop service elastix-portknock stop service elastix-updaterd stop
可能回收到一些fail,那是因为有些服务在前面的操作中已经关闭了,只要确认这些服务都是关闭状态就可以了。
2. /etc/ha.d/ha.cf
两个服务器上编辑一样的内容,如下
debugfile /var/log/ha-debug logfile /var/log/ha-log logfacility local0 keepalive 2 deadtime 30 warntime 10 initdead 120 udpport 694 bcast eth0 auto_failback on node SIP1 node SIP2
3. /etc/ha.d/authkeys
两个服务器上编辑一样的内容,如下
auth 1
1 sha1 Yourownpassword
修改文件权限
chmod 600 /etc/ha.d/authkeys
4. /etc/ha.d/haresources
SIP1 drbddisk::repdata Filesystem::/dev/drbd0::/repdata::ext3 IPaddr::10.16.20.2/24/eth0:0 mysqld asterisk httpd elastix-portknock elastix-updaterd #注意,必须写在一行
主服务器上
service heartbeat start
备用服务器上
service heartbeat start
最后重启两台服务器,整个配置就完成了。
三、 有用的命令
下面几个命令可以查看DRBD的同步状态和当前角色,基本上记住一个就够了。
cat /proc/drbd
Run on either node – provides a detailed status of your DRBD replication and current role
drbd-overview
Run on either node – provides a very quick to read status of your DRBD replication and current role
/etc/init.d/drbd status
Run on either node – provides a very quick to read status of your DRBD replication connection state,current role and includes mount directory
drbdadm cstate repdata
Run on either node – reports back the resource (repdata) connection state