曾晓娟
摘要:该文主要采用corosync+pacemaker+mysql技术方案,详细介绍了安装与配置策略,避免了传统的高可用集群的解决方案的弊端,提高了配置的弹性,从而使功能多元化。
关键词:Pacemaker;FreeSWITCH;高可用;解决方案
中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2014)22-5365-05
本文主要采用corosync+pacemaker+mysql技术方案,并详细介绍了安装与配置策略,避免了传统的高可用集群的解决方案的弊端,提高了配置的弹性,从而使功能多元化。
1 技术方案
1.1 Linux HA应用方案选择
Linux HA社区的早期方案heartbeat+pacemaker, 由于heartbeat项目官方已经停止开发,所以不再采用。CentOS 6.4之后,官方改用CMAN+Pacemaker,但是应用还不广泛。所以采用目前最主流成熟的corosync+pacemaker+mysql方案,系统CentOS 6.3。
1.2双机热备形式
Active/Standby方式是传统的双机热备份解决方案,主机运行时,备机或备机资源处于offline状态,当主机故障时,备机马上启动将服务接替。典型的实现是通过应用(例如pacemaker)来监测集群结点的资源状态,恢复备机资源。 Active/Active 方式是集群所有节点同时在线,同时提供所有资源和服务,某个节点故障时,用户服务实时转移到其他备机。
1.3存储方案选择
存储方式主要有二种方案:基于共享存储(磁盘阵列)的方式、全冗余(双机双存储)方式。
1) 基于共享存储(磁盘阵列)的方式
这种方式因为使用一台存储设备,往往被业内人士称为磁盘单点故障。一般来讲存储的安全性较高, 这种方式也是业内采用最多的热备方式。但存储作为双机热备中唯一存储数据的设备,它一旦发生故障往往会造成双机热备系统全面崩溃。
2) 全冗余(双机双存储)方式
这种方式实现了存储的HA,特点包括:
1) 两个数据库之间的同步是完全实时的,不存在任何时间延时。
2) 服务器的切换,不影响存储之间的初始化,增量同步及数据复制。
2 基于Corosync/Pacemaker 的HA工作原理
2.1 Corosync
Corosync主要负责不同节点之间的通信, 它使用集群协议(Totem), 通过UDP完成通信(端口5405, 如果使用防火墙,请注意开放此端口), 它默认工作在多播模式下, 1.4.2以后版本也支持单播模式. Pacemaker使用Corosync作为消息通信服务。
2.2 Pacemaker
Pacemaker(直译:心脏起搏器),是一个集群资源管理器。它实现了集群资源级故障检测和恢复,它本身还需依赖其他集群基础工具(如Corosync或Heaerbeat)所提供的消息通信和成员关系的能力。它可以做乎任何规模的集群,管理员能够准确地实施集群结点间资源的运行关系(包括顺序和位置)。Pacemaker主要通过Resource Agents来实现资源的启动,停止,监测等功能。
2.2.1 LSB(Linux Standard Base) Resources Agents
这是由操作系统提供,放在/etc/init.d下面的各种services,services(Script)必须符合LSB规范才能被Pacemaker 兼容。查看当前集群系统所支持的LSB资源:
2.2.2 OCF(Open Clustering Framework) Resources Agents
OCF是LSB规范的扩展,放在/usr/lib/ocf/resource.d/xxx。查看当前集群系统所支持的OCF资源:
crm(live)ra# list ocf heartbeat;CTDB Delay Dummy Filesystem IPaddr IPaddr2 IPsrcaddr LVM MailTo Route SendArp Squid VirtualDomain Xinetd apache conntrackd dhcpd
2.3 查看某个资源的配置方法
crm(live)ra# info ocf:heartbeat:IPaddr2;Manages virtual IPv4 and IPv6 addresses (Linux specific version) (ocf:heartbeat:IPaddr2);ip* (string): IPv4 or IPv6 address
The IPv4 (dotted quad notation) or IPv6 address (colon hexadecimal notation)
example IPv4 "192.168.1.1".; example IPv6 "2001:db8:DC28:0:0:FC57:D4C8:1FFF".
nic (string): Network interface
2.4 确保资源在同一个节点运行
当我们在集群中配置了多个资源后,可能会出现不同资源运行在不同结点上,比如我们配置了freeswitch 和虚拟ip 两个资源,结果分别运行在主机和备机上,因为pacemaker默认会在集群中尽量分散资源。这对我们部署应用来说是不成立的,即此两者资源必须同时运行在某节点上。有两种方法可以解决,一种是定义组资源,将freeswitch与虚拟 Ip同时加入一个组中,可以实现将资源运行在同节点上,另一种是定义资源约束 (colocation constraint)可实现将资源运行在同一节点上。我们先来说定义组资源。
2.5 定义组资源
crm(live)# configure
crm(live)configure# group cluster_services fs-ip fs;crm(live)configure# show
primitive fs-ip ocf:heartbeat:IPaddr2 \; params ip="10.74.10.200" nic="eth0:0" cidr_netmask="24" \; op monitor interval="2s";group cluster_services fs-ip fs;location cli-prefer-cluster_services cluster_services \;
2.5.1 定义资源约束
资源约束则用以指定在哪些群集节点上运行资源,以何种顺序装载资源,以及特定资源依赖于哪些其它资源,可以更灵活的配置集群的资源运行方式。pacemaker共给我们提供了三种资源约束方法:
Resource Location(资源位置):定义资源可以、不可以或尽可能在哪些节点上运行;Resource Collocation(资源排列):排列约束用以定义集群资源可以或不可以在某个节点上同时运行;
Resource Order(资源顺序):顺序约束定义集群资源在节点上启动的顺序;定义约束时,还需要指定分数。各种分数是集群工作方式的重要组成部分,在计算出资源分数后,集群选择分数最高的节点;对于freeswitch, 虚拟ip的例子,可以简单配置如下,并检查状态:
crm(live)configure# colocation fs-with-ip INFUNTY: fs-ip fs
我们还得确保freeswitch在某节点启动之前得先启动虚拟ip,这可以使用如下命令实现:
crm(live)configure# order fs-after-vip mandatory: fs-ip fs
由于HA集群本身并不强制每个节点的性能相同或相近。所以,某些时候我们可能希望在正常时服务总能在某个性能较强的节点上运行,这可以通过位置约束来实现:
crm(live)configure# location prefer-fs01-a fs-ip node_pref::200: fs01-a
2.5.2 资源黏性
资源黏性是指:资源更倾向于运行在哪个节点。资源黏性值范围及其作用:
0:这是默认选项。资源放置在系统中的最适合位置。这意味着当负载能力“较好”或较差的节点变得可用时才转移资源。此选项的作用基本等同于自动故障回复,只是资源可能会转移到非之前活动的节点上;
大于0:资源更愿意留在当前位置,但是如果有更合适的节点可用时会移动。值越高表示资源越愿意留在当前位置;
小于0:资源更愿意移离当前位置。绝对值越高表示资源越愿意离开当前位置;
INFINITY:如果不是因节点不适合运行资源(节点关机、节点待机、达到migration-threshold 或配置更改)而强制资源转移,资源总是留在当前位置。此选项的作用几乎等同于完全禁用自动故障回复;-INFINITY:资源总是移离当前位置;我们这里可以通过以下方式为资源指定默认黏性值:
crm(live)configure# rsc_defaults resource-stickiness=10
3 安装与配置手册
3.1 Linux 系统安装与环境配置
从官方网站下载发行版 centOS 6.3
vault.centos.org/6.3/os/i386
安装两个linux服务器(标准安装,必须的包为:gcc, glibc, mysql);IP: 10.74.10.224 hostname fs01-a;IP: 10.74.10.223 hostname fs01-b;安装完成后修改每个机器的/etc/hosts文件添加如下:10.74.10.224 fs01-a;10.74.10.223 fs01-b
3.2 增加yum数据源
因为linux-HA 项目代码源不在centOS的源库中,需要手动添加
/etc/yum.repos.d/ha-clustering.repo(或ha-clustering.repo 到 /etc/yum.repos.d/)
[haclustering];name=HA;Clustering ;baseurl=http://download.opensuse.org/repositories/network:/ha-clustering:/Stable/CentOS_CentOS-6/ enabled=1 gpgcheck=0
3.3 禁止selinux
[root@fs01-a]# /bin/sed -i -e s,'SELINUX=enforcing','SELINUX=disabled', /etc/selinux/config
3.4 禁止iptables
修改/etc/rc3.d/S08iptables 和 /etc/rc3.d/S08ip6tables 文件,在第二行增加“exit”
# !/bin/sh exit#;# iptalbes Start iptables firewall
3.5 配置DNS和NTP
修改/etc/resolv.conf
domain xxxx.com;nameserver xx.xx.xx.xx;nameserver xx.xx.xx.xx
3.6 重启服务器
1) 安装各种强制或可选的软件包,以下包是编译FreeSWITCH必须安装的。
[root@fs01-a]# yum install git autoconf automake libtool ncurses-devel libjpeg-devel
2) 安装运行corosync/pacemaker/freeswitch。
(1) 下载并编译freeswitch 源码, 我们使用1.2稳定版而不是最新代码
[root@fs01-a]# cd /usr/local/src;[root@fs01-a]# git clone -b v1.2.stable git://git.freeswitch.org/freeswitch.git
(2) 安装pacemaker,corosync和crmsh
[root@fs01-a]# yum install pacemaker corosync crmsh -y
(3) 拷贝corosync.conf 到/etc/corosync/, 修改ip地址
aisexec { # Run as root - this is necessary to be able to manage resources with Pacemaker
user: root; group: root;}service {
# Load the Pacemaker Cluster Resource Manager
ver: 1; name: pacemaker; use_mgmtd: no; use_logd: no}
3) 生成群结点间的通信密钥
密钥会生成在/etc/corosync/authkey, 需要把这个文件拷贝到所有群结点的同路径下
[root@fs01-a]# corosync-keygen
Press keys on your keyboard to generate entropy (bits = 496);Press keys on your keyboard to generate entropy (bits = 560);Press keys on your keyboard to generate entropy (bits = 624);Writing corosync key to /etc/corosync/authkey.
4) 两个结点分别启动corosync
[root@fs01-a]# service corosync start
3.7 配置集群资源
拷贝freeswitch对应lsb资源文件FSSofia 到lsb目录/etc/init.d/FSSofia;两个结点都要拷贝。两个结点分别配置集群资源,结点名称分别改为fs01-a, fs01-b
1) 每个结点分别配置FreeSWITCH
(1) 允许freeswitch 绑定非本地ip
[root@fs01-a]# echo 'net.ipv4.ip_nonlocal_bind=1' >> /etc/sysctl.conf
[root@fs01-a]# sysctl -p
(2) 修改sofia.conf.xml
[root@fs01-a]# vi /usr/local/freeswitch/conf/autoload_configs/sofia.conf.xml;;
(3) 修改switch.conf.xml
[root@fs01-a]# vi /usr/local/freeswitch/conf/autoload_configs/switch.conf.xml
(4) 修改sip profile, 包括internal.xml,external.xml 或者其他使用到的sip profile
[root@fs01-a]# vi /usr/local/freeswitch/conf/sip_profiles/internal.xml;;
(5) 每个结点分别配置互为热备的MYSQL数据库。配置fs01-a,fs01-b各自运行自己的mysql数据库,连个数据库之间互为备份,安装如下rpm包:
mysql-server-5.1.61-4.el6.i686;unixODBC-devel-2.2.14-12.el6_3.i686;unixODBC-2.2.14-12.el6_3.i686
(6) 在fs01-a,fs01-b服务器上,第一次启动mysql
[root@fs01-a]#service mysqld start;[root@fs01-a]#chkconfig —add mysqld
[root@fs01-a]#/usr/bin/mysqladmin -u root password 'freeswitch'
[root@fs01-a]#mysql -uroot —pfreeswitch
(7) 在fs01-a,fs01-b服务器上拷贝文件 odbc*.ini 到 /etc/并修改,fs01-a SERVER 为 10.74.10.224;fs01-b SERVER 为 10.74.10.223
[root@fs01-a]#cp odbc*.ini /etc/[root@fs01-a]#vi /etc/odbc.ini;[freeswitch] #Driver = MYSQL ;SDriver = /usr/lib/li;bmyodbc5.so SERVER = 10.74.10.223
(8) 完成后运行命令检查odbc连接
[root@fs01-a]#isql -v freeswitch;;| Connected!|;| sql-statement || help [tablename] |;| quit |;| SQL> quit
(9) 在fs01-a,fs01-b服务器上,停止slave并重置 master(在fs01-a,fs01-b上登陆mysql,以后凡是前缀为:“#”表示是命令状态,前缀为“mysql> ”表示通过登陆了mysql 客户端:
[root@fs01-a]#mysql -uroot —pfreeswitch ;mysql> stop slave; mysql> reset master;
(10) 在fs01-a上增加权限。注意:如果要限制权限的话可以将红色的'%'替换为服务器的域名或者IP
mysql> grant replication slave on *.* to 'freeswitch'@'%' identified by 'freeswitch';
mysql> flush privileges;
(11) 在fs01-a,fs01-b服务器上下刷表并锁定
mysql> flush tables with read lock;
(12) 将fs01-a的数据库文件复制到fs01-b:将my.tar文件复制到fs01-b上;检查fs01-a上的服务器状态:mysql> show master status;
+————————-+————-+——————-+————————-+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+————————-+————-+——————-+————————-+
| mysql-bin.000001 | 106 | freeswitch | mysql |
+————————-+————-+——————-+————————-+
配置fs01-b实现主服务器同步。配置完成,可以尝试在任意一个服务器上对数据库freeswitch进行操作,则在另外一个服务器上马上就能看到相应的动作;
4 结束语
本文基于pacemaker 实现FreeSWITCH的高可用集群验证成功。在配置过程中我们通过pacemaker 实现高可用集群的方案对资源的配置具有更大的弹性,因此该解决方案能够实现高可用集群的更多功能和多元化。
参考文献:
[1] 徐小涛.数字集群移动通信系统原理与应用[M].北京:人民邮电出版社,2008.
[2] 黄建尧.数字集群移动通信系统终端关键技术研究[M].天津:天津大学,2010.
[3] 汪筱红.高可用多节点集群技术的研究与实现[D].上海:上海交通大学,2006.