| 525 | |
| 526 | == Переключение на резерв == |
| 527 | |
| 528 | Далее будет описано два варианта настройки переключения на резервный сервер: |
| 529 | |
| 530 | * автоматическое переключение; |
| 531 | * ручное переключение. |
| 532 | |
| 533 | === Автоматическое переключение === |
| 534 | |
| 535 | Для автоматического переключения будем использовать протокол VRRP и демон keepalived. Устанавливаем пакет keepalived: |
| 536 | |
| 537 | {{{ |
| 538 | $ sudo apt-get install keepalived |
| 539 | }}} |
| 540 | |
| 541 | Конфигурируем keepalived. Сначала создадим скрипт /etc/keepalived/ka-master.pl, который будет передавать !FreeSwitch команду sofia recover при переходе сервера в состояние MASTER: |
| 542 | |
| 543 | {{{#!perl |
| 544 | #!/usr/bin/perl |
| 545 | |
| 546 | my $password = "secret"; |
| 547 | |
| 548 | open(STDOUT, "|/usr/bin/logger -t ka-master"); |
| 549 | print "Instance went to master, issuing sofia recover.\n"; |
| 550 | system("/usr/bin/fs_cli", "-p$password", "-x", "sofia recover"); |
| 551 | }}} |
| 552 | |
| 553 | где "secret" меняем на наш пароль доступа к event-socket !FreeSwitch. Так как файл содержит пароль, не забываем установить ему права доступа, разрешающие чтение только для пользователя root: |
| 554 | |
| 555 | {{{ |
| 556 | $ sudo chown root:root /etc/keepalived/ka-master.pl |
| 557 | $ sudo chmod 700 /etc/keepalived/ka-master.pl |
| 558 | }}} |
| 559 | |
| 560 | Создаем базовый файл конфигурации /etc/keepalived/keepalived.conf: |
| 561 | |
| 562 | {{{ |
| 563 | global_defs { |
| 564 | router_id FREESW |
| 565 | } |
| 566 | |
| 567 | vrrp_instance VI_FREESW { |
| 568 | state BACKUP |
| 569 | interface eth0 |
| 570 | virtual_router_id 51 |
| 571 | priority 100 |
| 572 | advert_int 1 |
| 573 | authentication { |
| 574 | auth_type PASS |
| 575 | auth_pass labuda25 |
| 576 | } |
| 577 | notify_master "/etc/keepalived/ka-master.pl" |
| 578 | virtual_ipaddress { |
| 579 | 192.168.0.63/24 dev eth0 label eth0:0 |
| 580 | } |
| 581 | } |
| 582 | }}} |
| 583 | |
| 584 | где "eth0" - имя сетевого интерфейса, "eth0:0" - алиас виртуального адреса - меняем их в соответствии с именем интерфейса каждого сервера. |
| 585 | |
| 586 | Запускаем keepalived на одном из серверов: |
| 587 | |
| 588 | {{{ |
| 589 | $ sudo service keepalived start |
| 590 | }}} |
| 591 | |
| 592 | Контролируем в /var/log/syslog, что демон успешно запустился и, так как на втором сервере keepalived еще не запуцщен, сразу после запуска keepalived должен перейти в состояние MASTER. Контролируем, что у сервера появился адрес 192.168.0.63. |
| 593 | |
| 594 | Теперь запускаем keepalived на втором сервере. Контролируем, что демон запустился, на находится в состоянии BACKUP, так как в сети уже есть MASTER. |
| 595 | |
| 596 | Контролируем переход сервера из состояния BACKUP в состояние MASTER. Для этого на несколько секунд отключаем активный в данный момент MASTER от сети (или просто останавливаем на нем демон keepalived). Контролируцем, что сервер, находившийся в состоянии BACKUP, перешел в состояние MASTER. |
| 597 | |
| 598 | На данном этапе у нас настроен переход сервера из резерва в активное состояние по единственному критерию - недоступности мастера, определяемой по протоколу VRRP. Теперь добавим сюда контроль работоспособности !FreeSwitch. Для этого создаем следующий скрипт: |
| 599 | |
| 600 | {{{#!perl |
| 601 | #!/usr/bin/perl |
| 602 | |
| 603 | my $password = "secret"; |
| 604 | my @required = ("internal"); |
| 605 | |
| 606 | my %saw = (); |
| 607 | open(my $in, "-|") || exec("/usr/bin/fs_cli", "-p$password", "-x", "sofia xmlstatus"); |
| 608 | while ( defined(my $line = <$in>) ) |
| 609 | { |
| 610 | if ( $line =~ m|<name>(.*)</name>|o ) |
| 611 | { |
| 612 | $saw{$1} = 1; |
| 613 | } |
| 614 | } |
| 615 | close($in); |
| 616 | |
| 617 | foreach my $profile ( @required ) |
| 618 | { |
| 619 | if ( ! $saw{$profile} ) |
| 620 | { |
| 621 | exit(1); |
| 622 | } |
| 623 | } |
| 624 | |
| 625 | exit(0); |
| 626 | }}} |
| 627 | |
| 628 | где "secert" заменяем на пароль доступа к event-socket !FreeSwitch-сервера, а массиву "@required" присваиваем имена SIP-профилей, наличие которых необходимо контролировать. Теперь, если все перечисленные в @required профили запущены, скрипт вернет 0, иначе - 1. Проверпим его функционирование, запустив вручную. Если все хорошо, укажем keepalived проверять работоспособность !FreeSwitch каждые 10 секунд. Для этого в /etc/keepalived/keepalived.conf добавляем секцию с описанием скрипта: |
| 629 | |
| 630 | {{{ |
| 631 | vrrp_script chk_fs { |
| 632 | script "/etc/keepalived/ka-status.pl" |
| 633 | interval 10 |
| 634 | } |
| 635 | }}} |
| 636 | |
| 637 | и в секцию {{{vrrp_instance VI_FREESW}}} добавляем указание использовать этот скрипт: |
| 638 | |
| 639 | {{{ |
| 640 | track_script { |
| 641 | chk_fs |
| 642 | } |
| 643 | }}} |
| 644 | |
| 645 | Перезапустим keepalived: |
| 646 | |
| 647 | {{{ |
| 648 | $ sudo service keepalived restart |
| 649 | }}} |
| 650 | |
| 651 | Контролируем, что сервер в состоянии BACKUP. Теперь подключаемся к консоли !FreeSwitch и останавливаем профиль internal: |
| 652 | |
| 653 | {{{ |
| 654 | > sofia profile internal stop |
| 655 | }}} |
| 656 | |
| 657 | Ждем 10 секунд и контролируем, что keepalived перешел в состояние FAULT. |
| 658 | |
| 659 | === Ручное переключение === |