FreeSWITCH的高可用部署方式有兩種:主備切換和負載均衡,官方文檔介紹的主備切換部署是采用Corosync & Pacemaker,負載均衡采用前置opensips排嫌。但對使用keepalived進行主備切換的高可用方式?jīng)]有介紹惧蛹,同時網(wǎng)上對該種部署方式也沒有介紹唬党。
本人對Corosync & Pacemaker不熟悉撩银,目前在職的公司web應用大部分采用keepalived+haproxy给涕,所以對keepalived稍微熟悉一點,因此嘗試使用keepalived進行freeswitch進行主備切換的高可用部署蜒蕾。
使用keepalived進行freeswitch進行主備切換的高可用部署比較簡單,本文介紹的部署方案有兩個亮點(自以為):1焕阿、主節(jié)點不搶占VIP咪啡,否則可能導致主節(jié)點恢復后VIP切換導致正在交互的SIP信令處理失敗暮屡;2撤摸、FS可用性檢測腳本和主備切換后話務接管腳本。
一、前提
1准夷、freeswicth和keepalived均能通過服務啟動钥飞; ——通過apt安裝freeswitch和keepalived即可通過服務啟動
2、兩個節(jié)點freeswitch連接同一個pgsql或者mysql數(shù)據(jù)庫衫嵌; ——當然也可以是其他外部數(shù)據(jù)庫
二读宙、環(huán)境
os:debian 8
A節(jié)點IP:172.16.100.10
B節(jié)點IP:172.16.100.11
VIP:172.16.100.12
freeswitch域名:sofia.superpipi.cn ——域名也可以直接使用VIP
三、配置
3.1 允許應用綁定非本機IP
在兩個節(jié)點均執(zhí)行以下命令:
echo 'net.ipv4.ip_nonlocal_bind=1' >> /etc/sysctl.conf
sysctl -p
3.2 配置freeswitch
修改“/usr/local/freeswitch/conf/vars.xml ” ——具體路徑視實際情況
將“l(fā)ocal_ip_v4”的值修改為VIP:“172.16.100.12”
將“domain”的值修改為:“sofia.superpipi.cn”
3.3 配置keepalived
keepalived默認配置文件路徑“/etc/keepalived/keepalived.conf ”
A節(jié)點keepalived配置:
! Configuration File for keepalived
global_defs {
notification_email {
acassen
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 172.16.100.251
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script check_fs {
script "/etc/keepalived/script/check_fs.sh"
interval 1
weight 2
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
garp_master_delay 10
smtp_alert
virtual_router_id 51
priority 100
nopreempt #主節(jié)點不搶占VIP
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
check_fs
}
virtual_ipaddress {
172.16.100.12/24
172.16.100.12/24 label eth0:1
}
notify_master "/etc/keepalived/script/fs_recover.sh"
}
B節(jié)點keepalived配置:
! Configuration File for keepalived
global_defs {
notification_email {
acassen
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 172.16.100.251
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script check_fs {
script "/etc/keepalived/script/check_fs.sh"
interval 1
weight 2
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
garp_master_delay 10
smtp_alert
virtual_router_id 51
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
check_fs
}
virtual_ipaddress {
172.16.100.12/24
172.16.100.12/24 label eth0:1
}
notify_master "/etc/keepalived/script/fs_recover.sh"
}
3.4 檢測腳本
檢測腳本路徑:
mkdir -p /etc/keepalived/script/
檢測可用性腳本
vim /etc/keepalived/script/check_fs.sh
!/bin/sh
FS_CLI_PROG='/usr/local/freeswitch/bin/fs_cli'
FS_CLI_HOST='127.0.0.1'
FS_CLI_PORT='8021'
FS_CLI_PASS='ClueCon'
PROFILES='sofia.superpipi.cn'
VIP='172.16.100.12'
fs_cli() {
FS_CLI_HOST -P
FS_CLI_PASS -x "$1"
}
sofia_profile_started() {
fs_cli "sofia xmlstatus" | grep "<name>$1</name>" | wc -l
}
save_log(){
count=1
str_tmp="date +%Y-%m-%d_%H:%M:%S
"
while [ str_tmp
str_tmp >>/var/log/check_fs_
date +%Y-%m-%d
.log
}
check_vrrp(){
ip a|grep $VIP|wc -l
}
check_fs_service(){
ps -ef |grep freeswitch.service|grep -v 'grep'|wc -l
}
fs_cli "sofia recover"
for p in p"
-eq 0 ]; then # echo "$p DOWN" log_str="$p DOWN" save_log $log_str if [
check_vrrp-eq 1 ];then save_log "本機已經(jīng)綁定VRRP楔绞,即將重啟keepalived和FreeSWITCH结闸。" service keepalived restart save_log "vrrp切換完成!" if [
check_fs_service-eq 1 ];then save_log "freeswitch服務正在操作中酒朵。" else service freeswitch restart save_log "freeswitch重啟成功桦锄!" fi else if [
check_fs_service` -eq 1 ];then
save_log "freeswitch服務正在操作中。 "
else
save_log "本機沒有綁定VRRP蔫耽,重啟FreeSWITCH结耀。"
service freeswitch restart
save_log "freeswitch重啟成功!"
fi
fi
exit 1
fi
done
save_log "freeswitch狀態(tài)檢測:OK!"
echo "OK"
exit 0
切換為主節(jié)點后恢復通話腳本
vim /etc/keepalived/script/fs_recover.sh
!/bin/sh
FS_CLI_PROG='/usr/local/freeswitch/bin/fs_cli'
FS_CLI_HOST='127.0.0.1'
FS_CLI_PORT='8021'
FS_CLI_PASS='ClueCon'
PROFILES='sofia.superpipi.cn'
VIP='172.16.100.12'
fs_cli() {
FS_CLI_HOST -P
FS_CLI_PASS -x "$1"
}
save_log(){
count=1
str_tmp="date +%Y-%m-%d_%H:%M:%S
"
while [ str_tmp
str_tmp >>/var/log/check_fs_
date +%Y-%m-%d
.log
}
save_log "本節(jié)點切換為主用狀態(tài)匙铡,開始接管切換前的通話图甜。"
fs_cli "sofia recover"
fs_cli "raloadxml"