target
opensips 实现高可用,主备节点共用一个浮动IP, 共享dialog数据,每个dialog指定一个tag标签,
当一个活动的节点出现故障以后,备用节点将会继续为标识的tag服务。通过主备方式进行HA的处理。
tag的状态将会迁移到另外一个备用的节点上。
环境:
两个opensips 3.2实例
keepalived 实例
keepalived配置
! Configuration File for keepalived
vrrp_script chk_opensips
{
script "/usr/local/etc/opensips/check_opensips_pid.sh"
interval 1
weight 2
}
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_instance VI_1 {
state MASTER
interface em1
garp_master_delay 10
smtp_alert
virtual_router_id 53
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 915119
}
virtual_ipaddress {
192.168.1.200 dev em1 label em1:1
}
track_script {
chk_opensips
}
}
check_opensips_pid.sh
#!/bin/bash
#时间变量,用于记录日志
d=`date --date today +%Y/%m/%d-%H:%M:%S`
#计算opensips进程数量
n=`ps -C opensips --no-heading|wc -l`
if [ $n -eq "0" ]; then
# /usr/sbin/opensips -f /usr/local/etc/opensips/opensips.cfg #尝试启动opensips
# n2=`ps -C opensips --no-heading|wc -l`
# 再次启动失败,说明opensips无法启动,此时需要关闭keepalived
# if [ $n2 -eq "0" ]; then
echo "$d opensips down,keepalived will stop" >> /etc/keepalived/check_opensips.log
systemctl stop keepalived # 停止keepalived
fi
opensips 相关配置
主备节点通过BIN 协议复制dialog数据,主备节点共享同一浮动IP地址通过dialog的更新来实现节点数据的交互。节点设置同一tag标签
socket=bin:192.168.1.25:26501 # CUSTOMIZE ME
loadmodule "proto_bin.so"
modparam("proto_bin", "bin_port", 26501)
modparam("dialog", "dialog_replication_cluster", 1)
loadmodule "clusterer.so"
modparam("clusterer", "my_node_id", 3)
modparam("clusterer", "seed_fallback_interval", 5)
modparam("clusterer", "db_url", "mysql://opensips:opensipsrw@192.168.1.251/opensips")
modparam("clusterer", "my_node_info", "cluster_id=1, url=bin:192.168.1.25:26501")
modparam("clusterer", "sharing_tag", "vip/1=active")
......
......
# account only INVITEs
if (is_method("INVITE")) {
# create dialog with timeout
if ( !create_dialog() ) {
send_reply(500,"Internal Server Error");
exit;
}
# dialog tag 设置共用的tag标签
set_dlg_sharing_tag("vip");
do_accounting("db","cdr");
}