曾曉娟
摘要:該文主要采用corosync+pacemaker+mysql技術(shù)方案,詳細(xì)介紹了安裝與配置策略,避免了傳統(tǒng)的高可用集群的解決方案的弊端,提高了配置的彈性,從而使功能多元化。
關(guān)鍵詞:Pacemaker;FreeSWITCH;高可用;解決方案
中圖分類號(hào):TP393 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2014)22-5365-05
本文主要采用corosync+pacemaker+mysql技術(shù)方案,并詳細(xì)介紹了安裝與配置策略,避免了傳統(tǒng)的高可用集群的解決方案的弊端,提高了配置的彈性,從而使功能多元化。
1 技術(shù)方案
1.1 Linux HA應(yīng)用方案選擇
Linux HA社區(qū)的早期方案heartbeat+pacemaker, 由于heartbeat項(xiàng)目官方已經(jīng)停止開發(fā),所以不再采用。CentOS 6.4之后,官方改用CMAN+Pacemaker,但是應(yīng)用還不廣泛。所以采用目前最主流成熟的corosync+pacemaker+mysql方案,系統(tǒng)CentOS 6.3。
1.2雙機(jī)熱備形式
Active/Standby方式是傳統(tǒng)的雙機(jī)熱備份解決方案,主機(jī)運(yùn)行時(shí),備機(jī)或備機(jī)資源處于offline狀態(tài),當(dāng)主機(jī)故障時(shí),備機(jī)馬上啟動(dòng)將服務(wù)接替。典型的實(shí)現(xiàn)是通過(guò)應(yīng)用(例如pacemaker)來(lái)監(jiān)測(cè)集群結(jié)點(diǎn)的資源狀態(tài),恢復(fù)備機(jī)資源。 Active/Active 方式是集群所有節(jié)點(diǎn)同時(shí)在線,同時(shí)提供所有資源和服務(wù),某個(gè)節(jié)點(diǎn)故障時(shí),用戶服務(wù)實(shí)時(shí)轉(zhuǎn)移到其他備機(jī)。
1.3存儲(chǔ)方案選擇
存儲(chǔ)方式主要有二種方案:基于共享存儲(chǔ)(磁盤陣列)的方式、全冗余(雙機(jī)雙存儲(chǔ))方式。
1) 基于共享存儲(chǔ)(磁盤陣列)的方式
這種方式因?yàn)槭褂靡慌_(tái)存儲(chǔ)設(shè)備,往往被業(yè)內(nèi)人士稱為磁盤單點(diǎn)故障。一般來(lái)講存儲(chǔ)的安全性較高, 這種方式也是業(yè)內(nèi)采用最多的熱備方式。但存儲(chǔ)作為雙機(jī)熱備中唯一存儲(chǔ)數(shù)據(jù)的設(shè)備,它一旦發(fā)生故障往往會(huì)造成雙機(jī)熱備系統(tǒng)全面崩潰。
2) 全冗余(雙機(jī)雙存儲(chǔ))方式
這種方式實(shí)現(xiàn)了存儲(chǔ)的HA,特點(diǎn)包括:
1) 兩個(gè)數(shù)據(jù)庫(kù)之間的同步是完全實(shí)時(shí)的,不存在任何時(shí)間延時(shí)。
2) 服務(wù)器的切換,不影響存儲(chǔ)之間的初始化,增量同步及數(shù)據(jù)復(fù)制。
2 基于Corosync/Pacemaker 的HA工作原理
2.1 Corosync
Corosync主要負(fù)責(zé)不同節(jié)點(diǎn)之間的通信, 它使用集群協(xié)議(Totem), 通過(guò)UDP完成通信(端口5405, 如果使用防火墻,請(qǐng)注意開放此端口), 它默認(rèn)工作在多播模式下, 1.4.2以后版本也支持單播模式. Pacemaker使用Corosync作為消息通信服務(wù)。
2.2 Pacemaker
Pacemaker(直譯:心臟起搏器),是一個(gè)集群資源管理器。它實(shí)現(xiàn)了集群資源級(jí)故障檢測(cè)和恢復(fù),它本身還需依賴其他集群基礎(chǔ)工具(如Corosync或Heaerbeat)所提供的消息通信和成員關(guān)系的能力。它可以做乎任何規(guī)模的集群,管理員能夠準(zhǔn)確地實(shí)施集群結(jié)點(diǎn)間資源的運(yùn)行關(guān)系(包括順序和位置)。Pacemaker主要通過(guò)Resource Agents來(lái)實(shí)現(xiàn)資源的啟動(dòng),停止,監(jiān)測(cè)等功能。
2.2.1 LSB(Linux Standard Base) Resources Agents
這是由操作系統(tǒng)提供,放在/etc/init.d下面的各種services,services(Script)必須符合LSB規(guī)范才能被Pacemaker 兼容。查看當(dāng)前集群系統(tǒng)所支持的LSB資源:
2.2.2 OCF(Open Clustering Framework) Resources Agents
OCF是LSB規(guī)范的擴(kuò)展,放在/usr/lib/ocf/resource.d/xxx。查看當(dāng)前集群系統(tǒng)所支持的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 查看某個(gè)資源的配置方法
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 確保資源在同一個(gè)節(jié)點(diǎn)運(yùn)行
當(dāng)我們?cè)诩褐信渲昧硕鄠€(gè)資源后,可能會(huì)出現(xiàn)不同資源運(yùn)行在不同結(jié)點(diǎn)上,比如我們配置了freeswitch 和虛擬ip 兩個(gè)資源,結(jié)果分別運(yùn)行在主機(jī)和備機(jī)上,因?yàn)閜acemaker默認(rèn)會(huì)在集群中盡量分散資源。這對(duì)我們部署應(yīng)用來(lái)說(shuō)是不成立的,即此兩者資源必須同時(shí)運(yùn)行在某節(jié)點(diǎn)上。有兩種方法可以解決,一種是定義組資源,將freeswitch與虛擬 Ip同時(shí)加入一個(gè)組中,可以實(shí)現(xiàn)將資源運(yùn)行在同節(jié)點(diǎn)上,另一種是定義資源約束 (colocation constraint)可實(shí)現(xiàn)將資源運(yùn)行在同一節(jié)點(diǎn)上。我們先來(lái)說(shuō)定義組資源。
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 定義資源約束
資源約束則用以指定在哪些群集節(jié)點(diǎn)上運(yùn)行資源,以何種順序裝載資源,以及特定資源依賴于哪些其它資源,可以更靈活的配置集群的資源運(yùn)行方式。pacemaker共給我們提供了三種資源約束方法:
Resource Location(資源位置):定義資源可以、不可以或盡可能在哪些節(jié)點(diǎn)上運(yùn)行;Resource Collocation(資源排列):排列約束用以定義集群資源可以或不可以在某個(gè)節(jié)點(diǎn)上同時(shí)運(yùn)行;
Resource Order(資源順序):順序約束定義集群資源在節(jié)點(diǎn)上啟動(dòng)的順序;定義約束時(shí),還需要指定分?jǐn)?shù)。各種分?jǐn)?shù)是集群工作方式的重要組成部分,在計(jì)算出資源分?jǐn)?shù)后,集群選擇分?jǐn)?shù)最高的節(jié)點(diǎn);對(duì)于freeswitch, 虛擬ip的例子,可以簡(jiǎn)單配置如下,并檢查狀態(tài):
crm(live)configure# colocation fs-with-ip INFUNTY: fs-ip fs
我們還得確保freeswitch在某節(jié)點(diǎn)啟動(dòng)之前得先啟動(dòng)虛擬ip,這可以使用如下命令實(shí)現(xiàn):
crm(live)configure# order fs-after-vip mandatory: fs-ip fs
由于HA集群本身并不強(qiáng)制每個(gè)節(jié)點(diǎn)的性能相同或相近。所以,某些時(shí)候我們可能希望在正常時(shí)服務(wù)總能在某個(gè)性能較強(qiáng)的節(jié)點(diǎn)上運(yùn)行,這可以通過(guò)位置約束來(lái)實(shí)現(xiàn):
crm(live)configure# location prefer-fs01-a fs-ip node_pref::200: fs01-a
2.5.2 資源黏性
資源黏性是指:資源更傾向于運(yùn)行在哪個(gè)節(jié)點(diǎn)。資源黏性值范圍及其作用:
0:這是默認(rèn)選項(xiàng)。資源放置在系統(tǒng)中的最適合位置。這意味著當(dāng)負(fù)載能力“較好”或較差的節(jié)點(diǎn)變得可用時(shí)才轉(zhuǎn)移資源。此選項(xiàng)的作用基本等同于自動(dòng)故障回復(fù),只是資源可能會(huì)轉(zhuǎn)移到非之前活動(dòng)的節(jié)點(diǎn)上;
大于0:資源更愿意留在當(dāng)前位置,但是如果有更合適的節(jié)點(diǎn)可用時(shí)會(huì)移動(dòng)。值越高表示資源越愿意留在當(dāng)前位置;
小于0:資源更愿意移離當(dāng)前位置。絕對(duì)值越高表示資源越愿意離開當(dāng)前位置;
INFINITY:如果不是因節(jié)點(diǎn)不適合運(yùn)行資源(節(jié)點(diǎn)關(guān)機(jī)、節(jié)點(diǎn)待機(jī)、達(dá)到migration-threshold 或配置更改)而強(qiáng)制資源轉(zhuǎn)移,資源總是留在當(dāng)前位置。此選項(xiàng)的作用幾乎等同于完全禁用自動(dòng)故障回復(fù);-INFINITY:資源總是移離當(dāng)前位置;我們這里可以通過(guò)以下方式為資源指定默認(rèn)黏性值:
crm(live)configure# rsc_defaults resource-stickiness=10
3 安裝與配置手冊(cè)
3.1 Linux 系統(tǒng)安裝與環(huán)境配置
從官方網(wǎng)站下載發(fā)行版 centOS 6.3
vault.centos.org/6.3/os/i386
安裝兩個(gè)linux服務(wù)器(標(biāo)準(zhǔn)安裝,必須的包為:gcc, glibc, mysql);IP: 10.74.10.224 hostname fs01-a;IP: 10.74.10.223 hostname fs01-b;安裝完成后修改每個(gè)機(jī)器的/etc/hosts文件添加如下:10.74.10.224 fs01-a;10.74.10.223 fs01-b
3.2 增加yum數(shù)據(jù)源
因?yàn)閘inux-HA 項(xiàng)目代碼源不在centOS的源庫(kù)中,需要手動(dòng)添加
/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 重啟服務(wù)器
1) 安裝各種強(qiáng)制或可選的軟件包,以下包是編譯FreeSWITCH必須安裝的。
[root@fs01-a]# yum install git autoconf automake libtool ncurses-devel libjpeg-devel
2) 安裝運(yùn)行corosync/pacemaker/freeswitch。
(1) 下載并編譯freeswitch 源碼, 我們使用1.2穩(wěn)定版而不是最新代碼
[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) 生成群結(jié)點(diǎn)間的通信密鑰
密鑰會(huì)生成在/etc/corosync/authkey, 需要把這個(gè)文件拷貝到所有群結(jié)點(diǎn)的同路徑下
[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) 兩個(gè)結(jié)點(diǎn)分別啟動(dòng)corosync
[root@fs01-a]# service corosync start
3.7 配置集群資源
拷貝freeswitch對(duì)應(yīng)lsb資源文件FSSofia 到lsb目錄/etc/init.d/FSSofia;兩個(gè)結(jié)點(diǎn)都要拷貝。兩個(gè)結(jié)點(diǎn)分別配置集群資源,結(jié)點(diǎn)名稱分別改為fs01-a, fs01-b
1) 每個(gè)結(jié)點(diǎn)分別配置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) 每個(gè)結(jié)點(diǎn)分別配置互為熱備的MYSQL數(shù)據(jù)庫(kù)。配置fs01-a,fs01-b各自運(yùn)行自己的mysql數(shù)據(jù)庫(kù),連個(gè)數(shù)據(jù)庫(kù)之間互為備份,安裝如下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服務(wù)器上,第一次啟動(dòng)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服務(wù)器上拷貝文件 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) 完成后運(yùn)行命令檢查odbc連接
[root@fs01-a]#isql -v freeswitch;;| Connected!|;| sql-statement || help [tablename] |;| quit |;| SQL> quit
(9) 在fs01-a,fs01-b服務(wù)器上,停止slave并重置 master(在fs01-a,fs01-b上登陸mysql,以后凡是前綴為:“#”表示是命令狀態(tài),前綴為“mysql> ”表示通過(guò)登陸了mysql 客戶端:
[root@fs01-a]#mysql -uroot —pfreeswitch ;mysql> stop slave; mysql> reset master;
(10) 在fs01-a上增加權(quán)限。注意:如果要限制權(quán)限的話可以將紅色的'%'替換為服務(wù)器的域名或者IP
mysql> grant replication slave on *.* to 'freeswitch'@'%' identified by 'freeswitch';
mysql> flush privileges;
(11) 在fs01-a,fs01-b服務(wù)器上下刷表并鎖定
mysql> flush tables with read lock;
(12) 將fs01-a的數(shù)據(jù)庫(kù)文件復(fù)制到fs01-b:將my.tar文件復(fù)制到fs01-b上;檢查fs01-a上的服務(wù)器狀態(tài):mysql> show master status;
+————————-+————-+——————-+————————-+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+————————-+————-+——————-+————————-+
| mysql-bin.000001 | 106 | freeswitch | mysql |
+————————-+————-+——————-+————————-+
配置fs01-b實(shí)現(xiàn)主服務(wù)器同步。配置完成,可以嘗試在任意一個(gè)服務(wù)器上對(duì)數(shù)據(jù)庫(kù)freeswitch進(jìn)行操作,則在另外一個(gè)服務(wù)器上馬上就能看到相應(yīng)的動(dòng)作;
4 結(jié)束語(yǔ)
本文基于pacemaker 實(shí)現(xiàn)FreeSWITCH的高可用集群驗(yàn)證成功。在配置過(guò)程中我們通過(guò)pacemaker 實(shí)現(xiàn)高可用集群的方案對(duì)資源的配置具有更大的彈性,因此該解決方案能夠?qū)崿F(xiàn)高可用集群的更多功能和多元化。
參考文獻(xiàn):
[1] 徐小濤.數(shù)字集群移動(dòng)通信系統(tǒng)原理與應(yīng)用[M].北京:人民郵電出版社,2008.
[2] 黃建堯.數(shù)字集群移動(dòng)通信系統(tǒng)終端關(guān)鍵技術(shù)研究[M].天津:天津大學(xué),2010.
[3] 汪筱紅.高可用多節(jié)點(diǎn)集群技術(shù)的研究與實(shí)現(xiàn)[D].上海:上海交通大學(xué),2006.