...

вторник, 4 февраля 2014 г.

Репликация данных из MySQL в MongoDB

Бывают случаи, когда нужно менять архитектуру системы на ходу. Возможно вы нашли узкое место в своем проекте или решили, что при текущем темпе роста в скором времени могут возникнуть сложности с масштабированием или отказоустойчивостью. Как раз для таких случаев существует Tungsten Replicator.

Tungsten Replicator — это бесплатное с открытым исходным кодом, приложение написанное на Java, расширяющее функционал репликации СУБД MySQL. Возможности Tungsten широки, это и мульти-мастер репликация, параллельная репликация, гетерогенная репликация данных между MySQL и Oracle, PostgreSQL, MongoDB. В данной статье будет рассматриваться гетерогенная репликация мастера MySQL с подчиненным сервером MongoDB, в качестве ОС будет выступать CentOS 6.5.

Установка зависимостей


Поскольку Tungsten Replicator написан java, вам как минимум понадобится установить OpenJDK 1.6 либо Oracle Java 6. Также, часть скриптов написана на ruby, поэтому его тоже нужно будет установить (версии => 1.8), если у вас его еще нет:

# yum install java-1.6.0-openjdk ruby


Установка MySQL


Если MySQL Server у вас уже установлен, вам нужно будет только подправить его конфигурацию, как описано ниже, и завести пользователя для репликации.


Подключим необходимые репозитории:

# rpm -Uvh http://ift.tt/15BjGfv

# rpm -Uvh http://ift.tt/1fY6w3I


Устанавливаем MySQL Server 5.5:

# yum --enablerepo=remi install mysql mysql-server


Скорректируем конфигурацию MySQL для нужд репликации:

# vim /etc/my.cnf




# Назначаем сервер “Мастером”
server-id = 1
# Куда писать бинарный лог
log_bin = /var/log/mysql/mysql-bin.log
expire_logs_days = 10
# Для реликации с MongoDB обязательно выставлять формат бинарного лога в “ROW”
binlog_format = ROW
# Максимальный размер файла лога
max_binlog_size = 256M
# Частота синхронизации операций из бинарного лога с диском
sync_binlog = 1
...




Активируем автоматический запуск MySQL при загрузке системы и запускаем сервис:

# chkconfig --level 35 mysqld on

# service mysqld start

Запустим скрипт первоначальной установки MySQL установим пароль для root.

# mysql_secure_installation



Enter current password for root (enter for none):
Change the root password? [Y/n] y
New password: SomeSecretPasswD
Re-enter new password: SomeSecretPasswD
Remove anonymous users? [Y/n] y
Disallow root login remotely? [Y/n] y
Remove test database and access to it? [Y/n] y
Reload privilege tables now? [Y/n] y




Для репликации желательно завести отдельного пользователя:

# mysql -u root -p

# mysql > grant all on *.* to tungsten identified by 'password' with grant option;

Query OK, 0 rows affected (0.01 sec)

Установка MongoDB


В случае если и MongoDB у вас уже есть, можете переходить к следующему пункту.


Подключим репозиторий MongoDB:

# vim /etc/yum.repos.d/mongodb.repo



[mongodb]
name=MongoDB Repository
baseurl=http://ift.tt/1dNYwSr
gpgcheck=0
enabled=1




И установим пакеты MongoDB Server 2.4:

# yum install mongo-10gen mongo-10gen-server

Активируем автоматический запуск MongoDB, при загрузке системы и запустим сервис:

# chkconfig --level 35 mongodb on

# service mongodb start


Для проверки работоспособности сервиса, посмотрим список баз:

# mongo

MongoDB shell version: 2.4.3

connecting to: test

> show dbs

local 0.078125GB

По умолчанию авторизация не требуется.


Установка мастер-репликатора для MySQL


Актуальная, на момент написания статьи, версия репликатора находится по этой ссылке.

Для начала, сделаем несколько директорий для нашего репликатора, например в /opt:

# cd /opt

# mkdir replicator

# cd replicator

# mkdir mysql # Здесь мы разместим репликатор для мастер-ноды

# mkdir mongodb # Здесь будет репликатор для слейва


Скачаем архив с репликатором в текущую директорию:

# wget http://ift.tt/1iomCCO

# tar -xzf tungsten-replicator-2.2.0-292.tar.gz

# mv tungsten-replicator-2.2.0-292/ tungsten-replicator/


Теперь, подготовим скрипт инсталляции для мастер-репликатора:

# vim master-installer.sh



cd /opt/replicator/tungsten-replicator

./tools/tungsten-installer --master-slave -a \
--datasource-type=mysql \
--master-host=127.0.0.1 \
--datasource-user=tungsten \
--datasource-password=password \
--datasource-mysql-conf=/etc/my.cnf
--datasource-log-directory=/var/log/mysql/
--datasource-port=3306 \
--service-name=mongodb \
--home-directory=/opt/replicator/mysql \
--cluster-hosts=127.0.0.1 \
--thl-port=10001 \
--rmi-port=11001 \
--java-file-encoding=UTF8 \
--mysql-use-bytes-for-string=false \
--mysql-enable-enumtostring=true \
--mysql-enable-settostring=true \
--svc-extractor-filters=colnames,pkey \
--svc-parallelization-type=none --start-and-report




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

Если вам необходимо реплицировать строго определенные таблицы, можно сразу обозначить фильтр, заменив предпоследнюю строку (svc-extractor-filters) в скрипте на:

--svc-extractor-filters=replicate \
"--property=replicator.filter.replicate.do=db1.table1,db2.table2,dbN.tableN" \


Соответственно, вместо db1.table1 и пр. укажите свои базы и таблицы, которые, вам необходимо будет реплицировать.

Для мастера все готово, можем запустить скрипт установки:

# sh master-installer.sh


INFO >> 127_0_0_1 >> Getting services list

INFO >> 127_0_0_1 >>…

Processing services command…

NAME VALUE

— — appliedLastSeqno: 0

appliedLatency: 1.218

role: master

serviceName: mongodb

serviceType: local

started: true

state: ONLINE

Finished services command…



Мастер готов, теперь можно подключить к нему один или несколько слейвов — MySQL или PostgreSQL например. Но наша цель — репликация с MongoDB, перейдем к ней.

Установка слейв-репликатора для MongoDB


Подготовим скрипт для инсталяции слейв-репликатора, который будет подкачивать данные в MongoDB.

# vim slave-installer.sh



cd /opt/replicator/tungsten-replicator

tools/tungsten-installer --master-slave -a \
--datasource-type=mongodb \
--master-host=127.0.0.1 \
--service-name=mongodb \
--home-directory=/opt/replicator/mongodb \
--cluster-hosts=127.0.0.1 \
--datasource-port=27017 \
--master-thl-port=10001 \
--thl-port=10002 \
--rmi-port=11002 \
--java-file-encoding=UTF8 \
--skip-validation-check=InstallerMasterSlaveCheck \
--svc-parallelization-type=none --start-and-report


Заметьте, я провожу репликацию на одном хосте, если вам потребуется делать репликацию на другой хост, не забудьте указать правильный адрес хоста на котором у вас мастер и открыть в фаерволле соответствующие порты(thl-port, rmi-port).

Если все условия соблюдены, можно запускать скрипт установки.

# sh slave-installer.sh


WARN >> 127.0.0.1 >> Currently unable to check for the THL schema in mongodb

INFO >> 127_0_0_1 >> Getting services list

INFO >> 127_0_0_1 >> Processing services command…

NAME VALUE

— — appliedLastSeqno: 0

appliedLatency: 0.5

role: slave

serviceName: mongodb

serviceType: local

started: true

state: ONLINE

Finished services command…



Если в строке “state” вы видите статус “ONLINE”, значит установка прошла успешно и можно попробовать проверить работает ли репликация.

Проверка репликации


Прежде чем приступить к проверке, нужно разобраться, как из реляционной базы данных можно перенести данные в нереляционную базу данных, такую как MongoDB. Ведь, в отличие, от традиционных СУБД таких как MySQL, Oracle и прочих, хранящих данные в таблицах, в Mongo данные хранятся в упрощенном виде — “ключ — значение”. Поэтому данные из таблиц MySQL нужно транслировать в “коллекции” MongoDB. При этом реплицироваться могут только операции “вставки”, “обновления” и “удаления” таблиц, остальные операции (CREATE/DROP/ALTER) репликатор будет игнорировать.

Проверим как будут реплицироваться вставки. Для этого сделаем тестовую схему и таблицу:

mysql> create schema testdb;

mysql> use testdb;

mysql> create table testrepl (id int not null primary key, name char(20), date date);

Query OK, 0 rows affected (0.00 sec)

Сделаем два произвольных инсерта:

mysql> insert into testrepl values (1, 'Vasya', '1965-01-01');

Query OK, 1 row affected (0.00 sec)

mysql> insert into testrepl values (2, 'Petya', '1991-02-02');

Query OK, 1 row affected (0.00 sec)

Теперь посмотрим, что сгенерировал репликатор на стороне слейва:

> show dbs

local 0.078125GB

testdb 0.203125GB

tungsten_mongodb 0.203125GB

> use testdb

switched to db testdb

> show collections

testrepl

system.indexes

> db.testdb.find()

{ "_id" : “01”, "id" : "1", "name" : "Vasya", "date" : "1965-01-01" }

{ "_id" : “02”, "id" : "2", "name" : "Petya", "date" : "1991-02-02" }


Проверим как реплицируются обновления:

mysql> update testrepl set name = 'Vasya P' where id =1;

Query OK, 1 row affected (0.01 sec)

Rows matched: 1 Changed: 1 Warnings: 0


Результат в Mongo:

> db.testrepl.find()

{ "_id" : “01”, "id" : "1", "name" : "Vasya P", "d" : "1965-01-01" }

{ "_id" : “02”, "id" : "2", "name" : "Petya", "date" : "1991-02-02" }


Также репликатор обрабатывает удаление:

mysql> delete from testrepl where id =2;

Query OK, 1 row affected (0.00 sec)

На приемнике запись тоже удалилась:

> db.myfirst.find()

{ "_id" : “01”, "id" : "1", "name" : "Vasya P", "d" : "1965-01-01" }


Мы рассмотрели несколько примеров, показывающих как работает репликация. Чтобы окончательно убедится, что репликатор справляется со своей задачей, можете попробовать залить какой-нибудь большой дамп, а затем подсчитать количество таблиц и коллекций в MySQL и MongoDB, соответственно.


Проверить статус репликации, перезапустить репликатор или остановить репликацию можно командой trepctl из директории соответствующего сервиса:

# cd /opt/replicator/

Для слейва (MongoDB):

# ./mongodb/tungsten/tungsten-replicator/bin/trepctl status

И для мастера (MySQL):

# ./mysql/tungsten/tungsten-replicator/bin/trepctl status


Подробности о том как управлять сервисом репликации вам расскажет опция “help”.


Зачем?


Логичный вопрос, зачем может понадобится репликация с MongoDB или какой-то другой СУБД? Сценариев может быть несколько. Например, желание разработчика испытать преимущества нереляционной СУБД. А может быть использовать данные для создания нового приложения спроектированного под использование MongoDB.


В заключение, стоит отметить, что Tungsten Replicator может оказаться для вас, таким же полезным инструментом для различных вариантов репликации MySQL, каким он стал для нас. Его функционал широк и описание может занять не одну статью. Впрочем, на официальном сайте есть достаточно подробная документация. Кого-то может заинтересовать платная enterprise-версия от компании Continuent. В enterprise-редакции, в дополнение к преимуществам community-версии, заявлены: автоматическое восстановление, отказоустойчивость, обновление без простоя и прочие плюшки, но уже за немалые деньги.


Документация по Tungsten Replicator:

Heterogeneous Replication

MySQL to MongoDB Replication

Administration

Полезные статьи:

Installing and Administering Tungsten Replicator

Getting started with replication from MySQL to MongoDB


MongoDB Manual


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

Отправить комментарий