Показать полную графическую версию : Настройка репликации MySQL с мастер-хоста на слейв-хост
В интернете есть множество статей, как это сделать. Так же есть официальный мануал по настройке репликации.
Сделал все как там написано.
В итоге имею мастер хост с такими настройками:
[mysqld]
log-bin
server-id=1
character_set_server=cp1251
default-character-set=cp1251
init-connect="SET NAMES cp1251"
И слейв хост:
[mysqld]
master-host=192.168.4.1
master-user=replicator
master-password=пароль
master-port=3306
server-id=2
#log-bin = /var/log/mysql/bin.log
#log-bin-index = /var/log/mysql/log-bin.index
log-error = /var/log/mysql/error.log
#relay-log = /var/log/mysql/relay.log
#relay-log-info-file = /var/log/mysql/relay-log.info
#relay-log-index = /var/log/mysql/relay-log.index
character_set_server=cp1251
default-character-set=cp1251
init-connect="SET NAMES cp1251"
На Мастере:
mysql> show master status;
+--------------------+-----------+-------------------+-----------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+-----------+-------------------+-----------------------+
| host-bin.000001 | 436849134 | | |
+--------------------+-----------+--------------+------------------+
1 row in set (0.00 sec)
На слейве:
show slave status;
Slave_IO_State Waiting for master to send event
Master_Host 192.168.4.1
Master_User Replicator
Master_Port 3306
Connect_Retry 60
Master_Log_File host-bin.000001
Read_Master_Log_Pos 436871384
Relay_Log_File host-relay-bin.000010
Relay_Log_Pos 1040597
Relay_Master_Log_File host-bin.000001
Slave_IO_Running Yes
Slave_SQL_Running Yes
Replicate_Do_DB
Replicate_Ignore_DB
Replicate_Do_Table
Replicate_Ignore_Table
Replicate_Wild_Do_Table
Replicate_Wild_Ignore_Table 0
Last_Errno
Last_Error 0
Skip_Counter 436871384
Exec_Master_Log_Pos 1040597
Relay_Log_Space None
Until_Condition
Until_Log_File 0
Until_Log_Pos No
Master_SSL_Allowed
Master_SSL_CA_File
Master_SSL_CA_Path
Master_SSL_Cert
Master_SSL_Cipher
Master_SSL_Key
Seconds_Behind_Master 0
На слейве:
load data from master;
Query OK, 0 rows affected, 1 warning (5.10 sec)
Собственно вопросы:
1. Вижу по размерам БД то, что они не соответствуют друг другу. Значит репликация не работает.
2. Где взять более подробное описание настройки репликации?
Как я понимаю команда SLAVE START, стартует запись в двоичный журнал.
А команда load data from master, уже реплицирует данные. Причем при старте самой репликации таблицы мастер хоста блокируются.
3. Почему в моем случае, команда load data from master не выполняет своих действий так, как должна?
dmitryst
14-08-2007, 11:53
1. Вижу по размерам БД то, что они не соответствуют друг другу. Значит репликация не работает. не работает :(
Query OK, 0 rows affected, 1 warning - т.е. ничего не изменено.
А вообще пакеты идут к мастеру? Точнее, от мастера к слейву? У меня есть подозрения, что файерволл блокирует-с...
2. Где взять более подробное описание настройки репликации? -вроде, только в мане по mySQL. Кое-что есть на
opennet (http://www.opennet.ru/base/dev/mysql_replicator.txt.html)
dmitryst
Собственно в логах слейва вижу это:
file host.local.err:
070814 11:21:45 mysqld started
070814 11:21:45 InnoDB: Started; log sequence number 0 43655
070814 11:21:45 [Warning] Neither --relay-log nor --relay-log-index were used; s
o replication may break when this MySQL server acts as a slave and has his hostn
ame changed!! Please use '--relay-log=host-relay-bin' to avoid this problem.
070814 11:21:45 [Note] /usr/local/libexec/mysqld: ready for connections.
Version: '5.0.27' socket: '/tmp/mysql.sock' port: 3306 FreeBSD port: mysql-se
rver-5.0.27
070814 11:21:45 [Note] Slave SQL thread initialized, starting replication in log
'host-bin.000001' at position 441269501, relay log './host-relay-bin.0000
02' position: 4363820
070814 11:21:50 [Note] Slave I/O thread: connected to master 'replicator@192.168.4.1
1:3306', replication started in log 'host-bin.000001' at position 441269501
070814 11:24:27 [Note] Slave I/O thread killed while reading event
070814 11:24:27 [Note] Slave I/O thread exiting, read up to log 'host-bin.000
001', position 441295868
070814 11:24:27 [Note] Error reading relay log event: slave SQL thread was kille
d
070814 11:24:32 [Note] Slave SQL thread initialized, starting replication in log
'host-bin.000001' at position 441295868, relay log './host-relay-bin.0000
01' position: 4
070814 11:24:37 [Note] Slave I/O thread: connected to master 'replicator@192.168.4.1
1:3306', replication started in log 'host-bin.000001' at position 441295868
Но! Вижу в каталоге БД на слейве (пример):
...
-rw-rw---- 1 mysql mysql 3040 Aug 13 02:09 property_definitions.MYD
-rw-rw---- 1 mysql mysql 10240 Aug 13 02:09 property_definitions.MYI
-rw-rw---- 1 mysql mysql 8764 Aug 13 02:09 property_definitions.frm
-rw-rw---- 1 mysql mysql 22360 Aug 13 02:09 property_values.MYD
-rw-rw---- 1 mysql mysql 45056 Aug 13 02:09 property_values.MYI
-rw-rw---- 1 mysql mysql 8634 Aug 13 02:09 property_values.frm
...
А это говорит о том, что файлы переписывались ночью. Приходит в голову мысль, что возможно репликация проходит нормально, а разница в размерах БД связана с ростом таблиц во время дневной активности. Ночью же просиходит оптимизация таблиц скриптами.
Интересен момент: автоматически сервер MySQL может реплицировать данные, без ручной команды load data from master? Возможно эффект
load data from master;
Query OK, 0 rows affected, 1 warning (5.10 sec)
зависит от активности БД?
vadimiron
14-08-2007, 12:17
load data from master;
Данная команда выполняется всего один раз при первичной загрузке данных с мастера.
Чтобы включить репликацию достаточно стартонуть мастер, а потом слейв.
Самое важное: перед началом репликации базы данных должны быть абсолютно одинаковы! И схема базы и данные должны быть одинаковы.
Сделайте копию базы с мастера, запишите данную копию на слейв и только тогда стартуйте репликацию.
Ещё из личного опыта: не реплицируйте все базы данных - особенно нельзя реплицировать системную базу данных, а то там начнётся проблемы с созданием юзеров и тд.
Для ограничения репликации по базам данных используйте
--replicate-do-db=dbwiki
--replicate-wild-ignore-table=mysql%
Пара ссылок:
Команды и настрйка Репликации (http://dev.mysql.com/doc/refman/5.1/en/replication.html)
Команды Репликации (http://dev.mysql.com/doc/refman/5.1/de/replication-sql.html)
Статья (http://www.onlamp.com/pub/a/onlamp/2006/04/20/advanced-mysql-replication.html)
Потестируйте сначало на тестовых баз данных, потом переходите на продуктивную
dmitryst
14-08-2007, 12:26
Negativ, я бы залил на мастер таблицы со слейва, якобы реплицированные ночью. Ну и сравнил бы. 070814 11:21:50 [Note] Slave I/O thread: connected to master 'replicator@192.168.4.1 1:3306', replication started in log 'host-bin.000001' at position 441269501 070814 11:24:27 [Note] Slave I/O thread killed while reading event 070814 11:24:27 [Note] Slave I/O thread exiting, read up to log 'host-bin.000 001', position 441295868 а что там на этой позиции?
vadimiron
14-08-2007, 12:36
Negativ,
Coветую из лчного опыта - сделайте полный Reset и начните заново - только базы данных подготовьте
dmitryst
приходила такая мысль в голову, но т.к. рабочая БД постоянно меняется проверить идентичность практически нереально.
Coветую из лчного опыта - сделайте полный Reset и начните заново - только базы данных подготовьте
Под reset'ом Вы понимаете снос БД со слейва, удаление всех лог файлов как с мастера так и со слейва. Потом снова копирование БД с мастера на слейв. Так?
position 441295868
Я вот только догадываться могу, что это за позиция и где она вообще. :dont-know
dmitryst
14-08-2007, 12:58
Negativ, а если на доп. компе по-быстренькому сделать имитацию? Базы, конечно ,не нужно реальные, можно просто какой-нибудь тестовой чепухой забить, и время от времени менять. Ручками. И контролировать слейв.
Для ограничения репликации по базам данных используйте
HTML код:
--replicate-do-db=dbwiki
--replicate-wild-ignore-table=mysql%
Эти строчки как я понимаю нужно в my.conf на слейве внести?
vadimiron
14-08-2007, 13:09
Под reset'ом Вы понимаете снос БД со слейва, удаление всех лог файлов как с мастера так и со слейва. Потом снова копирование БД с мастера на слейв. Так? >>>
Нет, есть спец команда для этого: RESET SLAVE, RESET MASTER
Эта команда затирает все логи и все ошибки. При проблемах я ей всегда пользуюсь. Когда возникают ошибки и репликация падает, я останавливаю репликацию, использую RESET, привожу базы данных на один уровень и запускаю репликацию.
Ошибки у меня возникали только в начале - потом когда всё понял и настроил, вообще проблем не возникает. Уже полгода даже не притрагивался к репликации.
У меня к тому же двухсторонняя репликация работает: то есть оба сервера обнавляют друг друга
dmitryst
14-08-2007, 13:09
Я вот только догадываться могу, что это за позиция и где она вообще лог слейва, позиция ... столько-то.. байтов (ака символов, начиная с нулевого). ИМХО.
Эти строчки как я понимаю нужно в my.conf на слейве внести? - кажется, да. На мастере без смысла.
vadimiron
14-08-2007, 13:14
Эти строчки как я понимаю нужно в my.conf на слейве внести? >>>
Да, слейв сам решает, какие базы данных и таблицы он хочет реплицировать
привожу базы данных на один уровень
Копирование БД Мастера на Слейв ? Или я ошибаюсь?
vadimiron
14-08-2007, 13:16
Копирование БД Мастера на Слейв ? Или я ошибаюсь?
Да, но это случалось всего пару раз и то в начале
Впал в очередной ступор:
mysql> show slave status;
...
Error 'Table 'v' is
marked as crashed and should be repaired' on query. Default database: 'basename'
. Query: 'insert into user_stat
select
date(v.time) date,
count(v.id) requests
from
visitors_requests v
where v.time >= '2007-08-14'
group by v.userID,date'
...
я так подозреваю что репликация спотыкается на этом шаге. Может ли репликация спотыкаться из-за того что таблица user_stat постоянно активна и оптимизируется раз в сутки?
Кстати таблица 'v' не существует ни на мастере ни на слейве.
vadimiron
30-08-2007, 16:55
Кстати таблица 'v' не существует ни на мастере ни на слейве.
Так она у вас в запросе участвует!!! Разбиритесь, откуда она и потом только продолжайте репликациюfrom
visitors_requests v
where v.time >= '2007-08-14'
Верней таблица "visitors_requests" - с ней проблемы
vadimiron,
Еще вопрос. Когда мне надо сделать бекап баз со слейва, мне надо делать SLAVE STOP?
vadimiron
28-09-2007, 20:45
Negativ,
Желательно. А то вдруг база находится в процесее апдейта и часть данных запищется а бекап, а другая нет.
Обнаружил оглядываясь на тему http://forum.oszone.net/thread-89466.html , что есть проблемка в разрастании бинарных файлов журналов. На данный момент их уже 5. В индексном файле base-bin.index на мастере содержатся ссылки на активные бинарные файлы журналов, т.е. те которые используются в репликации (по крайней мере так сказано в хелпе).
Вопрос: как узнать, используются ли старые бинарные журналы при репликации?
vadimiron
23-10-2007, 11:29
Negativ,
Активно пишется, наверно, только текущий файл - все остальные просто в качестве архива лежат. Если вдруг появится вообще нулевой слейв, то ему можно будет всё скопировать, начиная с первой команды первого файла лога - для этого они и нужны.
100% гарантии не даю
Хотя "надеятся" на старые файлы лога не стоит - лучше скопировать текущее состояние базы и начать репликацию с момента данного состояния - по такой логике нужен только один, то есть текущий файл
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.