Top.Mail.Ru
Улучшаем работу MySQL с помощью Tarantool | Tarantool
Tarantool
Узнайте содержание релиза 2.8
Практические задания Улучшаем работу MySQL с помощью Tarantool

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

Улучшаем работу 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.

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

  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, в репозитории

    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 в другие места:

    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 для использования с репликатором.

    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
    
  10. После выхода из nano, перезапустим mysqld:

    systemctl restart mysqld
    
  11. Далее установим Tarantool и настроим спейсы для репликации. Перейдите на страницу загрузки и установите 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;
         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 или изучить наше руководство для начинающих.

  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
    
    tarantool> box.space._space:select()
    

    В самом низу вы увидите спейсы «mysqldaemon» и «mysqldata». Затем выйдите с помощью «CTRL+C».

  17. Сейчас, после настройки 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
    
  18. Сейчас необходимо скопировать replicatord.yml в место, где systemd будет искать его:

    cp replicatord.yml /usr/local/etc/replicatord.yml
    
  19. Теперь запустим репликатор:

    systemctl start replicatord
    

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

    tarantoolctl enter example.lua
    
    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']
    
  20. Наконец, внесем запись в 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
    
    tarantool> box.space.mysqldata:select()
    

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