понедельник, 26 января 2009 г.

mysql-failover

описание создание файловера mysql с фильтром запросов

1.строим мастер-мастер репликацию
кроме стандартного mysql сервера ставим mysql-proxy и heartbeat
в конфиге my.cnf обязательные параметры
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
old_passwords=1
port=3307 # на стандартном 3306 будет слушать mysql-proxy
log-bin # писать обязательно бинарные логи
server-id=2 #у каждой ноды свой номер
[mysql.server]
user=mysql
basedir=/var/lib

запускаем обе ноды и сервера баз на них
пусть будет node1 192.168.50.151
и node2 192.168.50.152

шаг первый
сделаем node1 master а node2 slave
на каждой назначаем пользователя для репликаций
grant replication slave on *.* to 'replication_user'@192.168.50.152 identified
by 'replication_password';
192.168.50.152 - нода которая будет slave относительно данной

узнаем с какого файла и с какой операции реплицировать
show master status;
пример вывода:
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| mysqld-bin.000009 | 411 | | |
+-------------------+----------+--------------+------------------+


на slave ноде назначаем мастер сервер
change master to master_host='192.168.50.151', master_user
= 'replication_user', master_password = 'replication_password', master_port =
3307, master_log_file = 'mysqld-bin.000009', master_log_pos = 411 ;


запускаем репликацию на slave запускаем
slave start;
проверяем все лиработает
show slave status\G;

основные записи
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
если хоть одна No то ищем почему сервера не могут общаться (файрвол,пароли и
пр.)

На данный момент у нас одна нода ведущая, вторая читает бинарный лог операций и
совершает их у себя.
второй шаг - делаем так что б одновременно node1 была и master для node2 и
slave для node2
операции те же - данные немного меняются

grant replication slave on *.* to 'replication_user'@192.168.50.151 identified
by 'replication_password';

change master to master_host='192.168.50.152', master_user
= 'replication_user', master_password = 'replication_password', master_port =
3307, master_log_file = 'mysqld-bin.000002', master_log_pos = 411 ;

flush privileges;
slave start;

и обязательно проверяем
show slave status/G;

2. mysql-proxy
тут все просто
mysql-proxy --proxy-lua-script=/root/big_query_filter.lua\
--proxy-address=:3306\
--proxy-backend-addresses=/var/lib/mysql/mysql.sock\ #локальную базу через
сокет потому как быстрее на 10% , в 0.6 версии не работало потому пришлось все гонять через lo
--proxy-read-only-backend-addresses=192.168.50.152:3307\ база на другой ноде
только для чтения
--pid-file=/var/run/mysql-proxy.pid
--daemon

скрипт big_query_filter.lua просто не пускает запросы с более чем 500
символами возвращая ошибку с комментарием

3. heartbeat
ставим heartbeat
задаем метод аутентификации /etc/ha.d/authkeys
auth 3
3 md5 secret_password

конфиг /etc/ha.d/ha.cf
logfile /var/log/ha-log
logfacility local0
keepalive 1 # интервал между проверками
deadtime 10 # время через которое вторая нода подхватит ip первой
warntime 4 # предупреждение чере 4 сек
udpport 694
bcast eth1
auto_failback on
node node1
node node2

описание ресурсов которые проверяются /etc/ha.d/haresources
mysql1 IPaddr::192.168.50.151/24/eth1

в случае отказа 192.168.50.151 ее адресс алиасом цепляется к второй ноде через
10сек(можно и меньше)
добивать отказавшую ноду не вижу смысла
ввод в строй отказавшей ноды руками - что б данные не потерялись

прикреплена файлы скриптов запуска mysql-proxy и скрипта big_query_filter.lua