Улучшаем работу MySQL с помощью Tarantool
MySQL-репликация — это одна из важнейших функций Tarantool. Она позволяет ускорить работу с существующей базой данных MySQL, а также значительно расширить базу за счет горизонтального масштабирования. Даже если вы не заинтересованы в расширении, сама замена существующих реплик на Tarantool может сэкономить вам деньги, потому что Tarantool более эффективно работает с ядром, чем MySQL. Отзыв компании, которая широко использует репликацию в Tarantool, можно прочитать здесь.
Примечания:
- если вы столкнетесь с какими-либо проблемами в отношении основ работы с Tarantool, то можете обратиться к руководству для начинающих или описанию модели данных.
- приведенные ниже инструкции относятся к CentOS 7.5 и MySQL 5.7. Также предполагается, что у вас установлен модуль systemd и вы работаете с существующей MySQL-установкой.
- во время выполнения практикума вам может пригодиться журнал для устранения неполадок
replicatord.log
, который находится в/var/log
. Также обратите внимание на журнал экземпляраexample.log
в/var/log/tarantool
.
Итак, начнем.
Для начала установим необходимые пакеты для CentOS:
yum -y install git ncurses-devel cmake gcc-c++ boost boost-devel wget unzip nano bzip2 mysql-devel mysql-lib
Затем клонируем пакет репликации Tarantool-MySQL из GitHub:
git clone https://github.com/tarantool/mysql-tarantool-replication.git
Сейчас мы можем собрать репликатор с помощью cmake:
cd mysql-tarantool-replication git submodule update --init --recursive cmake . make
Репликатор будет работать в виде демона systemd под названием replicatord, поэтому давайте отредактируем его служебный файл systemd, а именно
replicatord.service
, в репозитории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
Затем скопируем некоторые файлы из репозитория replicatord в другие места:
cp replicatord /usr/local/sbin/replicatord cp replicatord.service /etc/systemd/system
Сейчас откроем консоль MySQL и создадим пример базы данных (в зависимости от текущих настроек, разумеется, вы можете не быть пользователем root):
mysql -u root -p CREATE DATABASE menagerie; QUIT
Далее получим образец данных из 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
Откроем 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
Сейчас образец данных готов, и нам необходимо отредактировать конфигурационный файл MySQL для использования с репликатором.
cd nano /etc/my.cnf
Обратите внимание, что ваш
my.cnf
для MySQL может находиться в другом месте. Задайте:[mysqld] binlog_format = ROW server_id = 1 log-bin = mysql-bin interactive_timeout = 3600 wait_timeout = 3600 max_allowed_packet = 32M socket = /var/lib/mysql/mysql.sock bind-address = 127.0.0.1 [client] socket = /var/lib/mysql/mysql.sock
После выхода из nano, перезапустим mysqld:
systemctl restart mysqld
Далее установим Tarantool и настроим спейсы для репликации. Перейдите на страницу загрузки и установите Tarantool, следуя инструкциям.
Сейчас напишем стандартную Tarantool-программу путем редактирования Lua-примера, который поставляется вместе с Tarantool:
cd nano /etc/tarantool/instances.available/example.lua
Полностью заменим содержимое файла следующим текстом:
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; 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'}, if_not_exists = true}) end if not box.space.mysqldata then t = box.schema.space.create('mysqldata') t:create_index('primary', {type = 'tree', parts = {1, 'unsigned'}, if_not_exists = true}) end end bootstrap()
Чтобы понять, что здесь происходит, лучше всего обратиться к предыдущим статьям в серии Tarantool 101 или изучить наше руководство для начинающих.
Сейчас необходимо создать символическую ссылку из
instances.available
(доступные экземпляры) на директорию под названиемinstances.enabled
(активные экземпляры – похоже на NGINX). В/etc/tarantool
выполните следующую команду:mkdir instances.enabled ln -s /instances.available/example.lua instances.enabled
Next we can start up our Lua program with
tt
, the Tarantool command-line utility:tt start example
Сейчас перейдем на наш экземпляр Tarantool, где можно проверить, что необходимые спейсы были успешно созданы:
tt connect example
tarantool> box.space._space:select()
В самом низу вы увидите спейсы «mysqldaemon» и «mysqldata». Затем выйдите с помощью «CTRL+C».
Сейчас, после настройки MySQL и Tarantool, можно перейти к конфигурации репликатора. Для начала поработаем с
replicator.yml
в основной директорииtarantool-mysql-replication
:nano replicatord.yml
Полностью замените содержимое файла на следующее, убедившись, что вы добавили свой пароль для MySQL и указали правильного пользователя:
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
Сейчас необходимо скопировать replicatord.yml в место, где systemd будет искать его:
cp replicatord.yml /usr/local/etc/replicatord.yml
Теперь запустим репликатор:
systemctl start replicatord
Сейчас мы можем перейти на экземпляр Tarantool и выполнить выборку из спейса “mysqldata”. Увидим реплицируемые данные из MySQL:
tt connect example
tarantool> 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']
Наконец, внесем запись в MySQL, а затем вернемся в Tarantool, чтобы убедиться, что она реплицирована. Итак, сначала выйдем из экземпляра Tarantool с помощью
CTRL-C
, а затем введем:mysql -u root -p USE menagerie; INSERT INTO pet(name2, owner, species) VALUES ('Spot', 'Brad', 'dog'); QUIT
Вернувшись в терминал, введите:
tt connect example
tarantool> box.space.mysqldata:select()
Вы увидите реплицируемые данные в Tarantool!