RFC (Request for Comments, Запрос на комментарии) - серия документов, публикуемая сообществом исследователей и разработчиков, руководствующихся практическими интересами, в которой описывается набор протоколов и обобщается опыт функционирования Интернет.
Эта статья написана на быструю руку и не претендует на что-либо. Я её написал, чтобы не забыть, как я это сделал, на случай если понадобится повторить или, может быть, ещё кому-то она будет полезной. Прошу зараннее не искать у меня орфографических ошибок, ибо их там тьма! :-)
************************************************************* Пролог: Вы только представьте, появилась необходимость в ***Донецком национальном академическом украинском музыкально-драматическом театре*** (говоря эти слова, аж слёзы на глазах выступают). Ладно, пропустим эпиграф патриотизма и стёба, ближе к делу - делаем MySQL сервер в режиме Master Master… Зачем? Не скажу - военная тайна!
Акт первый:
Итак, приступим, у нас имеется два сервера. Давайте, к примеру, их назовём BSD1 и BSD2. У каждого из них есть энное количество интерфейсов. Желательно между серверами сделать кроссовер с карточками эквивалентом 1Gbit, это преблезительно 128 MB/s, что приблизительно приравнивается к скорости работы винта! В случае репликации больших баз данных это значительно облегчит ситуацию… Первый сервер (BSD1) объеденим со вторым сервером (BSD2) кроссовером через интерфейсы:
BSD1 re0 ip: 10.10.10.10 BSD2 re0 ip: 10.10.10.20
Теперь приступим к установке MySQL, я выбрал версию 5.1, кто-то может выбрать другую, более новую, но меня устраивает такая! Для начала обновим порты, как это сделать? Вы наверняка знаете, если не знаете, то найдёте уйму материала, на данном замечательном ресурсе… 1. Устанавливаем на обоих серверах, MySQL сервер, я делал это так:
# cd /usr/ports/databases/mysql51-server/
# make BUILD_OPTIMIZED=yes WITH_OPENSSL=yes WITH_CHARSET=koi8r
# make install clean
#rehash
а у кого bash, тот делает:
#hash -r
Я выбрал кодировку koi8r, вы можете указать другую, например, cp1251, но я сторонник koi8r! Создаём MySQL базу:
2. Когда вы дошли до этого этапа, можно приступить к настройке первой фазы репликации Master + Slave (Ведущий + Ведомый), в нашем случае Master будет (BSD1), а Slave будет (BSD2). Начнём редактировать конфиг Master (BSD1). my.cnf:
Обратите внимание – это очень важно, чтобы у вас в конфиге не повторялись строки, такие как:
old_passwords=
log-bin=
server-id=
Иначе может ничего не получится, в лучшем случае будет работать с косяками, если строки где-то повторяются, закомментируйте их! Также обратите внимание на такие строки, как:
#Та база(ы), которая будет подвергаться репликации
binlog-do-db=testdb
#Та база(ы), которая, наоборот, будет игнорировать репликацию
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
Ещё раз напоминаю, чтобы проверяли, не повторяются ли строки в конфигах!!!
old_passwords=
log-bin=
server-id=
4. На обоих серверах добавляем автозагрузку MySQL в rc.conf:
mysql_enable="YES"
Запускаем на обоих серверах MySQL:
# /usr/local/etc/rc.d/mysql-server start
Проверяем работает ли:
# sockstat | grep mysql
mysql mysqld 7518413 tcp4 *:3306 *:*
mysql mysqld 7518415 stream /tmp/mysql.sock
Обратите внимание, чтобы MySQL слушал во всех направлениях и чтобы не получилось так, что он будет слушать localhost или какой-то отдельный ip. Нам нужна будет репликация, поэтому MySQL должен слушать как минимум в сторону кроссовера или лучше во всех направлениях, а кто боится о безопасности, то заткните при помощи FireWall те места!
5. Настраиваем root пользователя на обоих серверах:
# mysqladmin -u root password 'root_password'
Заходим:
# mysql -u root -p
Enter password:
На сервере Master (BSD1) добавляем пользователя для репликации Salvae:
mysql> grant replication slave on *.* to
'replication'@10.10.10.20 identified by 'slavepass1';
Показывает состояние Yes, значит всё получилось! Режим Master + Slave работает! 6. Тестируем: На сервере Master (BSD1), проверяем состояние Master:
mysql> show master status;
Должно быть примерно так:
+------------------+----------+--------------+--------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+--------------------------+
| mysql-bin.000001 | 106 | testdb | mysql,information_schema |
+------------------+----------+--------------+--------------------------+
1 row in set (0.00 sec)
Отсюда мы видим, что две базы игнорируют репликацию, а одна подвергается! Создаём базу на сервере Master:
mysql> create database testdb;
Проверяем на сервере Slave:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
| testdb |
+--------------------+
3 rows in set (0.01 sec)
Видим, что на втором сервере Slave также появилась база testdb! 7. Этот пункт можно пропустить, но я бы сделал так - вносим полезные изменения в MySQL сервера, причем это нужно сделать на обоих серверах! Удаляем test базу:
А у Slave вот так: +-----------+------+-------------------------------------------+ | Host | User | Password | +-----------+------+-------------------------------------------+ | localhost | root | *28B7B09A25EC723332B51CF8FD7286F9BD8CFB44 | | BSD2 | root | | | 127.0.0.1 | root | | | localhost | | | | BSD2 | | | +-----------+------+-------------------------------------------+ Такой вид - это не есть гуд! Грохаем ненужных пользователей:
mysql> delete from user where Host='BSD1';
Query OK, 2 rows affected (0.01 sec)
Разумеется, что для сервера BSD2, мы BSD1 заменим на BSD2!
mysql> delete from user where Host='127.0.0.1';
Query OK, 1 row affected (0.00 sec)
mysql> delete from user where Host='localhost' and User='';
Query OK, 1 row affected (0.00 sec)
Вот теперь есть гуд для Master:
mysql> select Host,user,Password from user;
+-----------------+-------------+------------------+
| Host | user | Password |
+-----------------+-------------+------------------+
| localhost | root | 352c4a5701107150 |
| 10.10.10.20 | replication | 48ea58092bbc51a3 |
+-----------------+-------------+------------------+
2 rows in set (0.00 sec)
И для Slave:
mysql> select Host,User,Password from user;
+-----------+------+-------------------------------------------+
| Host | User | Password |
+-----------+------+-------------------------------------------+
| localhost | root | *28B7B09A25EC723332B51CF8FD7286F9BD8CFB44 |
+-----------+------+-------------------------------------------+
1 row in set (0.01 sec)
Ну вот мы и справились с первой фазой, с настройкой и оптимизацией! Конец первого акта, антракт, идём пить чай, кофе, капучино, приставать к нетрезвым женщинам!
*********** АНТРАКТ ***********
Акт второй: Master (BSD1) + Slave (BSD2) мы осуществили, теперь нужно организовать симметрично Master (BSD2) + Slave (BSD1) для полного режима Master + Master! 1. Приступим! Правим конфиг Slave (BSD1). Добавляем в my.cnf:
А также добавляем на Master (BSD2) учётную запись репликации:
mysql> grant replication slave on *.* to 'replication'@10.10.10.10
identified by 'slavepass2';
Query OK, 0 rows affected (0.00 sec)
А теперь перезапускаем оба сервера:
# /usr/local/etc/rc.d/mysql-server restart
Итак, теперь помолимся пару секунд богам FreeBSD, можно в жертву принести компашку с Windows! :-) Проверяем, на обоих серверах делаем:
mysql> show slave status\G;
И если мы правильно молились, то увидим на обоих серверах:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Если у вас также, то боги вас услышали!
3. Тестируем: На сервере Master (BSD2) добавляем таблицу в базе testdb:
mysql> use testdb;
Database changed
mysql> create table test (id int(11) auto_increment,name varchar(255),
primary key(id));
Query OK, 0 rows affected (0.02 sec)
Проверяем на сервере Master (BSD1), добавилась ли таблица?
mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| test |
+------------------+
1 row in set (0.01 sec)
Теперь останавливаем любой из серверов, к примеру, Master (BSD1), а на сервере Master (BSD2) добавляем данные:
# /usr/local/etc/rc.d/mysql-server stop
mysql> insert into test (name) values('fox');
mysql> insert into test (name) values('fortero');
Запускаем остановленный сервер:
# /usr/local/etc/rc.d/mysql-server start
Проверяем, добавилась ли новая информация?
mysql> select * from test;
+----+---------+
| id | name |
+----+---------+
| 1 | fox |
| 2 | fortero |
+----+---------+
2 rows in set (0.00 sec)
Работает! Можно ещё долго тестировать… Ну, это вы сами сможете сделать.
Примечания! 0. Будьте внимательны с нетрезвыми женщинами! 1. Будьте внимательны с конфигами, проверяйте, чтобы строки не повторялись! 2. Если вы переделываете уже существующий MySQL сервер, вам придётся лучше забекапить базы, грохнуть все файлы в директории /var/db/mysql/, разумеется папки с базами можно не трогать! Иначе могут быть косяки с репликацией! 3. Если вдруг ошиблись или поменяли ip адреса серверов, когда поменяете в конфиге ip репликации, то ещё надо будет грохнуть файл:
# rm /var/db/mysql/master.info
4. И обязательно нужно настроить правильно время на обоих серверах! Время должно чётко работать согласно временным поясам, лучше всего это организовать через ntpd демона, на данном ресурсе имеются статьи о том, как это сделать!