Pull to refresh
70.26
Слёрм
Учебный центр для тех, кто работает в IT

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

Reading time 7 min
Views 16K

Бывают случаи, когда нужно менять архитектуру системы на ходу. Возможно вы нашли узкое место в своем проекте или решили, что при текущем темпе роста в скором времени могут возникнуть сложности с масштабированием или отказоустойчивостью. Как раз для таких случаев существует 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 у вас уже установлен, вам нужно будет только подправить его конфигурацию, как описано ниже, и завести пользователя для репликации.
Если MySQL еще не установлен, жмем сюда
Подключим необходимые репозитории:
# rpm -Uvh download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# rpm -Uvh rpms.famillecollet.com/enterprise/remi-release-6.rpm

Устанавливаем 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 у вас уже есть, можете переходить к следующему пункту.
Если нет, инструкция по установке Mongo здесь.
Подключим репозиторий MongoDB:
# vim /etc/yum.repos.d/mongodb.repo

[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
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 tungsten-replicator.googlecode.com/files/tungsten-replicator-2.2.0-292.tar.gz
# 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


В заключение, стоит отметить, что 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
Tags:
Hubs:
+27
Comments 12
Comments Comments 12

Articles

Information

Website
slurm.io
Registered
Founded
Employees
51–100 employees
Location
Россия
Representative
Антон Скобин