一、     背景知识

本文档将会用到以下两个重要的组件:

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

Elastix 2.4 双服务器热备搭建文档的更多相关文章

  1. ArcSDE Redhat Linux下双机热备部署文档

    http://www.gisall.com/html/47/122747-3867.html ArcSDE系统环境: 操作系统:Red Hat Enterprise Linux AS/ES 5.5 ( ...

  2. Nginx系列篇四:Nginx+keepalived搭建一个高可用的双机双主热备

    建议:先阅读Nginx+keepalived主从配置,因为此篇是接着上篇开始的 上一篇我们简单的介绍了主从配置及其缺点,我们看一下双主热备配置: 2台Nginx+keepalived互为主备,各自绑定 ...

  3. Mysql双主热备+LVS+Keepalived高可用操作记录

    MySQL复制能够保证数据的冗余的同时可以做读写分离来分担系统压力,如果是主主复制还可以很好的避免主节点的单点故障.然而MySQL主主复制存在一些问题无法满足我们的实际需要:未提供统一访问入口来实现负 ...

  4. 高可用Mysql架构_Mysql主从复制、Mysql双主热备、Mysql双主双从、Mysql读写分离(Mycat中间件)、Mysql分库分表架构(Mycat中间件)的演变

    [Mysql主从复制]解决的问题数据分布:比如一共150台机器,分别往电信.网通.移动各放50台,这样无论在哪个网络访问都很快.其次按照地域,比如国内国外,北方南方,这样地域性访问解决了.负载均衡:M ...

  5. MySQL双主热备问题处理

    1. Slave_IO_Running: No mysql> show slave status\G *************************** 1. row *********** ...

  6. mysql双主热备

    先搭建mysql主从模式,主从请参考mysql 主从笔记 然后在在配置文件里添加如下配置 1 log_slave_updates= #双主热备的关键参数.默认情况下从节点从主节点中同步过来的修改事件是 ...

  7. 使用Keepalived实现Nginx的自动重启及双主热备高可用

    1.概述 之前我们使用Keepalived实现了Nginx服务的双机主备高可用,但是有几个问题没有解决,今天一起探讨一下. 1)在双机主备机制中,Keepalived服务如果宕了,会自动启用备机进行服 ...

  8. Mysql + keepalived 实现双主热备读写分离【转】

    Mysql + keepalived 实现双主热备读写分离 2013年6月16日frankwong发表评论阅读评论   架构图 系统:CentOS6.4_X86_64软件版本:Mysql-5.6.12 ...

  9. Mysql双主热备+LVS+Keepalived高可用部署实施手册

    MySQL复制能够保证数据的冗余的同时可以做读写分离来分担系统压力,如果是主主复制还可以很好的避免主节点的单点故障.然而MySQL主主复制存在一些问题无法满足我们的实际需要:未提供统一访问入口来实现负 ...

随机推荐

  1. 使用 npm 安装 Vue

    使用 npm 安装 Vue 需要 node.js 就不多说了(从 nodejs.org 中下载 nodejs ) (1)安装 Vue,在 cmd 里直接输入: npm install -g cnpm ...

  2. 《你不知道的JavaScript-上卷》笔记

    这段时间看了<你不知道的JavaScript>上卷,对很多知识有了重新的认识,所以在这里罗列一些知识点作为巩固. 作用域和闭包 词法作用域 变量赋值操作会执行的两个动作 答:编译器会在当前 ...

  3. 有关使用 iview 表单验证的问题

    Vue的UI解决框架,element-UI, iview-UI 有关表单验证使用的是同一个插件,async-validator,有关这个插件的用法就不做赘述,但是在iview表单的使用中可能会用到验证 ...

  4. Java软件编码规范要求

    1.一个类对应一个文件,文件名与类名保持一致 虽然一个“.java”源文件可以有多个类(不是内部类),但是不提倡那么写.

  5. 初识WCF2

    参照: http://blog.csdn.net/songyefei/article/details/7371571 在上一篇中,我们在一个控制台应用程序中编写了一个简单的WCF服务并承载了它.先回顾 ...

  6. Windows 10 host where Credential Guard or Device Guard is enabled fails when running Workstation (2146361)

    To disable Device Guard or Credential Guard on Itanium based computers: Disable the group policy set ...

  7. Ionic开发项目

    hybrid app是移动开发代替原生开发完成app应用项目的一种方案,Ionic是hybrid app开发的一种选择.对ionic有兴趣可以去网上找相应的基础知识来学习了解,因为Ionic是基于An ...

  8. 贪心算法和动态规划[zz]

    http://www.cnblogs.com/asuran/archive/2010/01/26/1656399.html 贪心算法 1.贪心选择性质 所谓贪心选择性质是指所求问题的整体最优解可以通过 ...

  9. PL/SQL编程基础——PL/SQL简介

    课程教师:李兴华 课程学习者:阳光罗诺 日期:2018-07-28 知识点: 1. 了解PL/SQL的主要特点 2. 掌握PL/SQL块的基本结构 PL/SQL PL/SQL是Oracle在关系数据库 ...

  10. Django路由系统---url无命名分组

    django重点之url无命名分组[参数有顺序要求] settigs.py:增加STATICFILES_DIRS静态资源路径配置,名称为创建的文件夹名称 'DIRS': [os.path.join(B ...