Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Настройка репликации MySQL с мастер-хоста на слейв-хост (http://forum.oszone.net/showthread.php?t=88573)

Negativ 14-08-2007 11:11 627296

Настройка репликации 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 627318

Цитата:

Цитата Negativ
1. Вижу по размерам БД то, что они не соответствуют друг другу. Значит репликация не работает.

не работает :(

Цитата:

Query OK, 0 rows affected, 1 warning
- т.е. ничего не изменено.
А вообще пакеты идут к мастеру? Точнее, от мастера к слейву? У меня есть подозрения, что файерволл блокирует-с...

Цитата:

Цитата Negativ
2. Где взять более подробное описание настройки репликации?

-вроде, только в мане по mySQL. Кое-что есть на
opennet

Negativ 14-08-2007 12:09 627324

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 627328

Цитата:

Цитата Negativ
load data from master;

Данная команда выполняется всего один раз при первичной загрузке данных с мастера.
Чтобы включить репликацию достаточно стартонуть мастер, а потом слейв.

Самое важное: перед началом репликации базы данных должны быть абсолютно одинаковы! И схема базы и данные должны быть одинаковы.

Сделайте копию базы с мастера, запишите данную копию на слейв и только тогда стартуйте репликацию.

Ещё из личного опыта: не реплицируйте все базы данных - особенно нельзя реплицировать системную базу данных, а то там начнётся проблемы с созданием юзеров и тд.
Для ограничения репликации по базам данных используйте
HTML код:

--replicate-do-db=dbwiki
--replicate-wild-ignore-table=mysql%


Пара ссылок:
Команды и настрйка Репликации
Команды Репликации
Статья

Потестируйте сначало на тестовых баз данных, потом переходите на продуктивную

dmitryst 14-08-2007 12:26 627333

Negativ, я бы залил на мастер таблицы со слейва, якобы реплицированные ночью. Ну и сравнил бы.
Цитата:

Цитата 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 627342

Negativ,
Coветую из лчного опыта - сделайте полный Reset и начните заново - только базы данных подготовьте

Negativ 14-08-2007 12:53 627360

dmitryst
приходила такая мысль в голову, но т.к. рабочая БД постоянно меняется проверить идентичность практически нереально.

Цитата:

Цитата vadimiron
Coветую из лчного опыта - сделайте полный Reset и начните заново - только базы данных подготовьте

Под reset'ом Вы понимаете снос БД со слейва, удаление всех лог файлов как с мастера так и со слейва. Потом снова копирование БД с мастера на слейв. Так?

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

dmitryst 14-08-2007 12:58 627361

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

Negativ 14-08-2007 13:06 627368

Цитата:

Цитата vadimiron
Для ограничения репликации по базам данных используйте
HTML код:
--replicate-do-db=dbwiki
--replicate-wild-ignore-table=mysql%

Эти строчки как я понимаю нужно в my.conf на слейве внести?

vadimiron 14-08-2007 13:09 627371

Цитата:

Цитата Negativ
Под reset'ом Вы понимаете снос БД со слейва, удаление всех лог файлов как с мастера так и со слейва. Потом снова копирование БД с мастера на слейв. Так? >>>

Нет, есть спец команда для этого: RESET SLAVE, RESET MASTER
Эта команда затирает все логи и все ошибки. При проблемах я ей всегда пользуюсь. Когда возникают ошибки и репликация падает, я останавливаю репликацию, использую RESET, привожу базы данных на один уровень и запускаю репликацию.

Ошибки у меня возникали только в начале - потом когда всё понял и настроил, вообще проблем не возникает. Уже полгода даже не притрагивался к репликации.
У меня к тому же двухсторонняя репликация работает: то есть оба сервера обнавляют друг друга

dmitryst 14-08-2007 13:09 627372

Цитата:

Цитата Negativ
Я вот только догадываться могу, что это за позиция и где она вообще

лог слейва, позиция ... столько-то.. байтов (ака символов, начиная с нулевого). ИМХО.
Цитата:

Цитата Negativ
Эти строчки как я понимаю нужно в my.conf на слейве внести?

- кажется, да. На мастере без смысла.

vadimiron 14-08-2007 13:14 627379

Цитата:

Цитата Negativ
Эти строчки как я понимаю нужно в my.conf на слейве внести? >>>

Да, слейв сам решает, какие базы данных и таблицы он хочет реплицировать

Negativ 14-08-2007 13:14 627380

Цитата:

Цитата vadimiron
привожу базы данных на один уровень

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

vadimiron 14-08-2007 13:16 627383

Цитата:

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

Да, но это случалось всего пару раз и то в начале

Negativ 30-08-2007 15:31 635723

Впал в очередной ступор:
Код:

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 635781

Цитата:

Цитата Negativ
Кстати таблица 'v' не существует ни на мастере ни на слейве.

Так она у вас в запросе участвует!!! Разбиритесь, откуда она и потом только продолжайте репликацию
Цитата:

Цитата Negativ
from
visitors_requests v
where v.time >= '2007-08-14'

Верней таблица "visitors_requests" - с ней проблемы

Negativ 19-09-2007 11:34 645982

vadimiron,
Еще вопрос. Когда мне надо сделать бекап баз со слейва, мне надо делать SLAVE STOP?

vadimiron 28-09-2007 20:45 651217

Negativ,
Желательно. А то вдруг база находится в процесее апдейта и часть данных запищется а бекап, а другая нет.

Negativ 23-10-2007 10:52 665597

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

vadimiron 23-10-2007 11:29 665619

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

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

Negativ 23-10-2007 14:08 665711

vadimiron,
Как я понимаю сейчас можно на мастере поправить индексный файл в котором оставить только ссылку на последний бинарник и удалить лишние файлы журналов?

vadimiron 23-10-2007 16:17 665798

Negativ,
Я так никогда не делал, но возможно сработает (главное не забыть всё забэкапить :)).

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

Crush45 10-01-2013 09:44 2063093

Ребят, нужно автоматом получить значение masterlogpos, как сделать ?


Время: 15:12.

Время: 15:12.
© OSzone.net 2001-