Отказоустойчивость Mysql master-master на основе Keepalived

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

 

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.