PDA

Показать полную графическую версию : Настройка репликации MySQL с мастер-хоста на слейв-хост


Страниц : [1] 2

Negativ
14-08-2007, 11:11
В интернете есть множество статей, как это сделать. Так же есть официальный мануал по настройке репликации.
Сделал все как там написано.
В итоге имею мастер хост с такими настройками:

[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)

Negativ
14-08-2007, 12:09
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 и начните заново - только базы данных подготовьте

Negativ
14-08-2007, 12:53
dmitryst
приходила такая мысль в голову, но т.к. рабочая БД постоянно меняется проверить идентичность практически нереально.

Coветую из лчного опыта - сделайте полный Reset и начните заново - только базы данных подготовьте
Под reset'ом Вы понимаете снос БД со слейва, удаление всех лог файлов как с мастера так и со слейва. Потом снова копирование БД с мастера на слейв. Так?

position 441295868
Я вот только догадываться могу, что это за позиция и где она вообще. :dont-know

dmitryst
14-08-2007, 12:58
Negativ, а если на доп. компе по-быстренькому сделать имитацию? Базы, конечно ,не нужно реальные, можно просто какой-нибудь тестовой чепухой забить, и время от времени менять. Ручками. И контролировать слейв.

Negativ
14-08-2007, 13:06
Для ограничения репликации по базам данных используйте
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 на слейве внести? >>>
Да, слейв сам решает, какие базы данных и таблицы он хочет реплицировать

Negativ
14-08-2007, 13:14
привожу базы данных на один уровень

Копирование БД Мастера на Слейв ? Или я ошибаюсь?

vadimiron
14-08-2007, 13:16
Копирование БД Мастера на Слейв ? Или я ошибаюсь?
Да, но это случалось всего пару раз и то в начале

Negativ
30-08-2007, 15:31
Впал в очередной ступор:

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" - с ней проблемы

Negativ
19-09-2007, 11:34
vadimiron,
Еще вопрос. Когда мне надо сделать бекап баз со слейва, мне надо делать SLAVE STOP?

vadimiron
28-09-2007, 20:45
Negativ,
Желательно. А то вдруг база находится в процесее апдейта и часть данных запищется а бекап, а другая нет.

Negativ
23-10-2007, 10:52
Обнаружил оглядываясь на тему http://forum.oszone.net/thread-89466.html , что есть проблемка в разрастании бинарных файлов журналов. На данный момент их уже 5. В индексном файле base-bin.index на мастере содержатся ссылки на активные бинарные файлы журналов, т.е. те которые используются в репликации (по крайней мере так сказано в хелпе).
Вопрос: как узнать, используются ли старые бинарные журналы при репликации?

vadimiron
23-10-2007, 11:29
Negativ,
Активно пишется, наверно, только текущий файл - все остальные просто в качестве архива лежат. Если вдруг появится вообще нулевой слейв, то ему можно будет всё скопировать, начиная с первой команды первого файла лога - для этого они и нужны.
100% гарантии не даю

Хотя "надеятся" на старые файлы лога не стоит - лучше скопировать текущее состояние базы и начать репликацию с момента данного состояния - по такой логике нужен только один, то есть текущий файл




© OSzone.net 2001-2012