Отказоустойчивость
Когда реализуется кластерная конфигурация, узким местом становится точка входа - адрес, который слушает kamailio. Чтобы сделать кластер отказоустойчивым, kamailio может слушать отдельный набор айпи-адресов, "мастер-адрес", и в случае отказа/недоступности ноды можно перекинуть его на живую ноду. Есть особенность, что нельзя запускать kamailio на нескольких нодах, это сломает базу регистраций клиентов.
Самый простой вариант это ip addr add ... и service kamailio start; service kamailio_reload start, но это можно автоматизировать. Основные варианты:
- keepalive
- corosync
- pacemaker
- heartbeat
Самый простой – keepalived
Можно поставить скрипты из пакета ringme-setup-redundant и вписать общий внешний айпи в файл /usr/local/admin/vrrp/ext_ip.txt, без маски, например 1.2.3.4
А файл /etc/keepalived/keepalived.conf привести к виду
global_defs { notification_email { admin1@domain.ru admin2@domain.ru } notification_email_from keepalived@domain.ru smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id domain_node1 } ! vrrp_sync_groups make sure that several router instances ! stay together on a failure - a good example of this is ! that the external interface on one router fails and the backup server ! takes over, you want the internal interface on the failed server ! to failover as well, otherwise nothing will work. ! you can have as many vrrp_sync_group blocks as you want. vrrp_sync_group G1 { group { VI_1 VI_2 } notify /usr/local/admin/vrrp/notify.sh } ! each interface needs at least one vrrp_instance ! each vrrp_instance is a group of VIPs that are logically grouped ! together ! you can have as many vrrp_instaces as you want vrrp_instance VI_1 { state BACKUP nopreempt interface eth1 virtual_router_id 61 priority 90 ! how often should we vote, in seconds? advert_int 1 authentication { auth_type PASS auth_pass somerandompass } virtual_ipaddress { 1.2.3.4/32 2.3.4.5/32 } smtp_alert notify /usr/local/admin/vrrp/notify.sh } vrrp_instance VI_2 { state BACKUP nopreempt interface eth2 virtual_router_id 62 priority 90 ! how often should we vote, in seconds? advert_int 1 authentication { auth_type PASS auth_pass somerandompass } virtual_ipaddress { 192.168.100.100/32 } smtp_alert notify /usr/local/admin/vrrp/notify.sh }
Переменные, которые нужно изменить:
notification_email -- сюда вписываем 1 или несколько почтовых адресов, кто будет получать письма о переключении.
notification_email_from – адрес отправителя. Для корректной отправки почты системными администраторами должна быть настроена почтовая система.
router_id -- уникальный id сервера, он же будет в теме писем.
interface в обоих секциях instance -- вписываем реальные интерфейсы с внутренним и внешним IP, где VI_1 -- внешний интерфейс, VI_2 – внутренний.
nopreempt – не возвращаться в slave после возврата старого мастера. В случае, если один сервер должен быть всегда мастером, комментируем/удаляем эту опцию в обоих блоках и на мастер-сервере state меняем на MASTER и priority в 100.
auth_pass – сюда вписываем некий пароль, который должен быть одинаковым на всех серверах.
virtual_ipaddress – вписываем сюда все айпи, за которыми keepalive будет следить, в VI_1 – внешние адреса, в VI_2 – внутренние.
У keepalived есть нюанс: если между серверами потеряна связь, они оба становятся мастерами, и при восстановлении связи происходит перевыбор мастера, так что им может стать и старый мастер.