Keepalived позволяет выполнять балансировку трафика и повышает отказоустойчивость за счет виртуального IP на основе протокола VRRP. Для нашей конфигурации мы не будем использовать балансировку трафика, а только настроем виртуальный IP для двух Mysql серверов, работающих в режиме master-master.
Имеем следующие исходные данные:
10.1.11.11 — виртуальный ip, на который маршрутизируются mysql соединения
10.1.11.10 — mysql сервер test1
10.1.11.9 — mysql сервер test2
Mysql на серверах test1 и test2 находятся в master-master репликации, запись одновременно происходит только на один сервер. В случае падение одного из серверов, виртуальный ip автоматически переключается на второй сервер. При восстановление работоспособности сервера возможна автоматическая обратная миграция виртуального ip или же можно ее отключить с помощью опции (nopreempt).
Установку и конфигурацию keepalived будем осуществлять в дистрибутиве RHEL6. Самую последнюю версию keepalived можно скачать с официального сайта. Установка может быть выполнена с помощью исходных кодов или же предварительно создав rpm пакет из исходников, как было описано в предыдущей статье.
Установим keepalived
sudo apt-get install keepalived
Отредактируем конфигурационный файл на первом сервере test1:
[testrpm@test1 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived global_defs { notification_email { funix@gmail.com ##email для отправки уведомлений } notification_email_from keepalived@test1 ##для второго сервера keepalived@test2 smtp_server localhost smtp_connect_timeout 30 router_id test1-keepalived ##для второго сервера test2-keepalived } vrrp_script check_mysql { script "/usr/local/bin/check_mysql.sh" ##скрипт для проверки mysql interval 1 fall 3 ##количество неуспешных проверок для переключения VIP на другой сервер } vrrp_instance Mysql-VIP { state BACKUP interface bond0 ##интерфейс для привязки VIP virtual_router_id 10 priority 101 ##VRRP приоритет сервера, для второго сервера 100 advert_int 1 unicast_peer { 10.1.11.9 ##для второго сервера 10.1.11.10 } authentication { auth_type PASS auth_pass myvrrp } track_script { check_mysql } nopreempt ##не выполнять обратное переключение smtp_alert ##включить отправку email сообщений virtual_ipaddress { 10.1.11.11 } notify_master "/usr/local/bin/check_mysql.sh master"##вызов скрипта при notify_backup "/usr/local/bin/check_mysql.sh backup"##изменении состояния notify_fault "/usr/local/bin/check_mysql.sh fault" #на master,backup или fault }
Скрипт можно создать с помощью следующего мануалы, который описывает процесс отправки сообщений с помощью mutt. Для конфигурации keepalived на втором сервере скопируем конфигурационный файл /etc/keepalived/keepalived.conf и внесем изменения, которые были указаны в комментариях.
Скрипт проверки работоспособности mysql очень простой и состоит из одной строчки, для удобства логирование событий переключения keepalived и проверки доступности mysql обьеденим в один скрипт:
[root@vas-msp-test1 ~]# vim /usr/local/bin/check_mysql.sh
#!/bin/bash #This script is used by keepalived for checking mysqld work #Additional info about keepalived work you can find in /var/log/messages state=$1 host=`hostname` current_date=`/bin/date +"%b %d %H:%M:%S"` password='mypass' logfile='/var/tmp/keepalived.log' case $state in master) echo "$current_date Keepalived: $host now Master server with VIP on it" >> $logfile ;; backup) echo "$current_date Keepalived: $host now Backup server" >> $logfile ;; fault) echo "$current_date Keepalived: $host server fault. Mysql check failed. Trying switchover" >> $logfile ;; *) mysql -u root -p$password --connect_timeout=2 -e "select version();" 2>/dev/null ;; esac
Необходимо скопировать скрипт проверки mysql на второй сервер test2 и сделать его исполняемым:
[root@vas-msp-test1 ~]# chmod +x /usr/local/bin/check_mysql.sh
Запустим keepalived на обоих серверах и проверим, что был поднят виртуальный ip:
[root@test1 ~]# /etc/init.d/keepalived start
[root@test1 ~]# ip addr show bond0 4: bond0:<BROADCAST,MULTICAST,MASTER,UP,LOWER_UP>mtu 1500 qdisc noqueue state UP link/ether 00:21:5a:eb:91:86 brd ff:ff:ff:ff:ff:ff inet 10.1.11.10/24 brd 10.1.14.255 scope global bond0 inet 10.1.11.11/32 scope global bond0 inet6 fe80::221:5aff:feeb:9186/64 scope link valid_lft forever preferred_lft forever
Можно протестировать несколько сценариев работы keepalived:
— остановка mysql на мастер сервере
— остановка сетевого подключения на мастер сервере
— перезагрузка ОС на мастер сервере
Для проверки корректной работый необходимо проверить:
— почтовые уведомления
— логи /var/log/messages и /var/tmp/keepalived.log на обоих серверах
— состояния виртуального ip на обоих серверах
[root@test1 ~]# ip addr show bond0
— время переключения и доступности mysql (выполняем постоянные подключения к mysql во время переезда VIP):
[root@test1 ~]# while true; do echo `date`; mysql -uroot -pmypass --host=10.1.11.11 --port=3306 -sse "select version();"; sleep 0.5; done