Улучшаем работу MySQL с помощью Tarantool

MySQL-репликация -- это одна из важнейших функций in-memory СУБД Tarantool. Она позволяет ускорить работу с существующей базой данных MySQL, а также значительно расширить базу за счет горизонтального масштабирования. Даже если вы не заинтересованы в расширении, сама замена существующих реплик на Tarantool может сэкономить вам деньги, потому что Tarantool более эффективно работает с ядром, чем MySQL. Отзыв компании, которая широко использует репликацию в Tarantool, можно прочитать здесь, а также здесь.

Примечания:

  • Если вы столкнетесь с какими-либо проблемами в отношении основ работы с Tarantool'ом, то можете обратиться к первым двум практикумам из серии Tarantool 101, которые можно найти здесь и здесь.
  • Приведенные ниже инструкции относятся к CentOS 7.5 и MySQL 5.7. Также предполагается, что у вас установлен модуль systemd и вы работаете с существующей MySQL-установкой.
  • Во время выполнения практикума вам может пригодиться журнал для устранения неполадок replicatord.log, который находится в /var/log. Также обратите внимание на журнал экземпляра example.log в /var/log/tarantool.

Итак, начнем.

1. Для начала установим необходимые пакеты для CentOS:

yum -y install git ncurses-devel cmake gcc-c++ boost boost-devel wget unzip nano bzip2 mysql-devel mysql-lib

2. Затем клонируем пакет репликации Tarantool-MySQL из GitHub:

git clone https://github.com/tarantool/mysql-tarantool-replication.git

3. Сейчас мы можем собрать репликатор с помощью cmake:

cd mysql-tarantool-replication
git submodule update --init --recursive
cmake .
make

4. Репликатор будет работать в виде демона systemd под названием replicatord, поэтому давайте отредактируем его служебный файл systemd, а именно replicatord.service, в репозитории

mysql-tarantool-replication. nano replicatord.service

Измените следующую строку:

ExecStart=/usr/local/sbin/replicatord -c /usr/local/etc/replicatord.cfg

Замените расширение .cfg на .yml:

ExecStart=/usr/local/sbin/replicatord -c /usr/local/etc/replicatord.yml

5. Затем скопируем некоторые файлы из репозитория replicatord в другие места locations:

cp replicatord /usr/local/sbin/replicatord
cp replicatord.service /etc/systemd/system

6. Сейчас откроем консоль MySQL и создадим пример базы данных (в зависимости от текущих настроек, разумеется, вы можете не быть пользователем root):

mysql -u root -p
CREATE DATABASE menagerie;
QUIT

7. Далее получим образец данных из MySQL, которые поместим в корневую директорию, а затем установим из терминала:

cd
wget http://downloads.mysql.com/docs/menagerie-db.zip
unzip menagerie-db.zip
cd menagerie-db
mysql -u root -p menagerie < cr_pet_tbl.sql
mysql -u root -p menagerie < load_pet_tbl.sql
mysql menagerie -u root -p < ins_puff_rec.sql
mysql menagerie -u root -p < cr_event_tbl.sql

8. Откроем MySQL-консоль и обработаем данные для использования с репликатором Tarantool'а (добавляем идентификатор, меняем имя поля во избежание конфликта и сокращаем количество полей; обратите внимание, что для реальных данных этот шаг потребует большого количества настроек):

mysql -u root -p
USE menagerie;
ALTER TABLE pet ADD id INT PRIMARY KEY AUTO_INCREMENT FIRST;
ALTER TABLE pet CHANGE COLUMN `name` `name2` VARCHAR(255);
ALTER TABLE pet DROP sex, DROP birth, DROP death;
QUIT

9. Сейчас образец данных готов, и нам необходимо отредактировать конфигурационный файл MySQL для использования с репликатором. Вся работа с этим файлом пойдет непосредственно под “[mysqld]”. (Обратите внимание, что ваш my.cnf для MySQL может находиться в другом месте.)

cd nano /etc/my.cnf Задайте: binlog_format = ROW server_id = 1 log-bin=mysql-bin interactive_timeout=3600 wait_timeout=3600 max_allowed_packet=32M

После выхода из nano, перезапустим mysqld:

systemctl restart mysqld

11. Далее установим Tarantool и настроим спейсы для репликации. Полностью скопируйте скрипт изhttps://www.tarantool.io/en/download/os-installation/1.10/rhel-centos-6-7/ и вставьте в терминал. Возможно, нужно будет нажать “enter” после последней строки (“yum -y install tarantool”).

12. Сейчас напишем стандартную Tarantool-программу путем редактирования Lua-примера, который поставляется вместе с Tarantool'ом:

cd
nano /etc/tarantool/instances.available/example.lua

13. Полностью заменим содержимое файла следующим текстом:

box.cfg {
    listen = 3301;
    memtx_memory = 128 * 1024 * 1024; -- 128Mb
    memtx_min_tuple_size = 16;
    memtx_max_tuple_size = 128 * 1024 * 1024; -- 128Mb
    vinyl_memory = 128 * 1024 * 1024; -- 128Mb
    vinyl_cache = 128 * 1024 * 1024; -- 128Mb
    vinyl_max_tuple_size = 128 * 1024 * 1024; -- 128Mb
    vinyl_write_threads = 2;
    wal_mode = "none";
    wal_max_size = 256 * 1024 * 1024;
    checkpoint_interval = 60 * 60; -- one hour
    checkpoint_count = 6;
    force_recovery = true;
 
     -- 1 – SYSERROR
     -- 2 – ERROR
     -- 3 – CRITICAL
     -- 4 – WARNING
     -- 5 – INFO
     -- 6 – VERBOSE
     -- 7 – DEBUG
     log_level = 7;
     log_nonblock = true;
     too_long_threshold = 0.5;
 }
 
 box.schema.user.grant('guest','read,write,execute','universe')
 
 local function bootstrap()
 
     if not box.space.mysqldaemon then
         s = box.schema.space.create('mysqldaemon')
         s:create_index('primary',
         {type = 'tree', parts = {1, 'unsigned'}})
     end
 
     if not box.space.mysqldata then
         t = box.schema.space.create('mysqldata')
         t:create_index('primary',
         {type = 'tree', parts = {1, 'unsigned'}})
     end
 
 end
 
 bootstrap()

Чтобы понять, что здесь происходит, лучше всего обратиться к предыдущим статьям в серии Tarantool 101.

14. Сейчас необходимо создать символьную ссылку из instances.available (доступные экземпляры) на директорию под названием instances.enabled (активные экземпляры -- похоже на NGINX). В /etc/tarantool выполните следующую команду:

mkdir instances.enabled
ln -s /instances.available/example.lua instances.enabled

15. Далее мы можем запустить Lua-программу с помощью tarantoolctl (надстройки для systemd)

tarantoolctl start example.lua

16. Сейчас перейдем на наш экземпляр Tarantool'а, где можно проверить, что необходимые спейсы были успешно созданы:

tarantoolctl enter example.lua box.space._space:select()

17. Сейчас, после настройки MySQL и Tarantool'а, можно перейти к конфигурации репликатора. Для начала поработаем с replicator.yml в основной директории tarantool-mysql-replication.

nano replicatord.yml

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

17. В самом низу вы увидите спейсы “mysqldaemon” и “mysqldata”. Выйдем с помощью “CTRL-C”.

mysql:     
     host: 127.0.0.1
     port: 3306
     user: root
     password: 
     connect_retry: 15 # seconds
 
 tarantool:
     host: 127.0.0.1:3301
     binlog_pos_space: 512
     binlog_pos_key: 0
     connect_retry: 15 # seconds
     sync_retry: 1000 # milliseconds
 
 mappings:
     - database: menagerie
     table: pet
     columns: [ id, name2, owner, species]
     space: 513
     key_fields:  [0]
     # insert_call: function_name
     # update_call: function_name
     # delete_call: function_name

18. Сейчас необходимо скопировать replicatord.yml в место, где systemd будет искать его:

cp replicatord.yml /usr/local/etc/replicatord.yml

19. Далее можно запустить репликатор

systemctl start replicatord

20. Сейчас мы можем перейти на экземпляр Tarantool'а и выполнить выборку из спейса “mysqldata”. Увидим реплицируемые данные из MySQL:

tarantoolctl enter example.lua
box.space.mysqldata:select()

Получим следующий результат:

- - [1, 'Fluffy', 'Harold', 'cat']
   - [2, 'Claws', 'Gwen', 'cat']
   - [3, 'Buffy', 'Harold', 'dog']
   - [4, 'Fang', 'Benny', 'dog']
   - [5, 'Bowser', 'Diane', 'dog']
   - [6, 'Chirpy', 'Gwen', 'bird']
   - [7, 'Whistler', 'Gwen', 'bird']
   - [8, 'Slim', 'Benny', 'snake']
   - [9, 'Puffball', 'Diane', 'hamster']

21. Наконец, внесем запись в MySQL, а затем вернемся в Tarantool, чтобы убедиться, что она реплицирована. Итак, сначала выйдем из экземпляра Tarantool'а:

CTRL-C

Далее:

mysql -u root -p
USE menagerie;
INSERT INTO pet(name2, owner, species) VALUES (‘Spot’, ‘Brad’, ‘dog’);
QUIT

(Обратите внимание, что для вышеуказанного оператора вставки может потребоваться заменить обратные кавычки на прямые кавычки, если возникают проблемы.)
Вернувшись в терминал, введите:

tarantoolctl enter example.lua
box.space.mysqldata:select()

Вы увидите реплицируемые данные в Tarantool'е!