Версия:

Запуск приложения

Запуск приложения

Используя Tarantool в качестве сервера приложений, вы можете написать собственные приложения. Собственный язык Tarantool’а для приложений – Lua, поэтому типовое приложение представляет собой файл, который содержит Lua-скрипт. Однако вы также можете писать приложения на C или C++.

Примечание

Если вы только осваиваете Lua, рекомендуем выполнить практическое задание по Tarantool’у до работы с данной главой. Для запуска практического задания, выполните команду tutorial() в консоли Tarantool’а:

tarantool> tutorial()
 ---
 - |
  Tutorial -- Screen #1 -- Hello, Moon
  ====================================

  Welcome to the Tarantool tutorial.
  It will introduce you to Tarantool’s Lua application server
  and database server, which is what’s running what you’re seeing.
  This is INTERACTIVE -- you’re expected to enter requests
  based on the suggestions or examples in the screen’s text.
  <...>

Создадим и запустим первое приложение на языке Lua для Tarantool’а – самое простое приложение, старую добрую программу «Hello, world!»:

#!/usr/bin/env tarantool
 print('Hello, world!')

Сохраним приложение в файле. Пусть это будет myapp.lua в текущей директории.

Теперь рассмотрим, как можно запустить наше приложение с Tarantool’ом.

Запуск в Docker

If we run Tarantool in a Docker container, the following command will start Tarantool 1.9 without any application:

$ # create a temporary container and run it in interactive mode
$ docker run --rm -t -i tarantool/tarantool:1

Чтобы запустить Tarantool с нашим приложением, можно выполнить команду:

$ # create a temporary container and
$ # launch Tarantool with our application
$ docker run --rm -t -i \
             -v `pwd`/myapp.lua:/opt/tarantool/myapp.lua \
             -v /data/dir/on/host:/var/lib/tarantool \
             tarantool/tarantool:1 tarantool /opt/tarantool/myapp.lua

Здесь два ресурса подключаются к серверу в контейнере:

  • наш файл с приложением (\`pwd\`/myapp.lua) и
  • каталог данных Tarantool’а (/data/dir/on/host).

Традиционно в контейнере директория /opt/tarantool используется для кода приложения Tarantool’а, а директория /var/lib/tarantool используется для данных.

Запуск бинарной программы

При запуске Tarantool’а из бинарного пакета или сборке из исходников, можно запустить наше приложение:

  • в режиме скрипта,
  • как серверное приложение или
  • как демон службы.

Самый простой способ – передать имя файла в Tarantool при запуске:

$ tarantool myapp.lua
 Hello, world!
 $

Tarantool запускается, выполняет наш скрипт в режиме скрипта и завершает работу.

Теперь превратим этот скрипт в серверное приложение. Используем box.cfg из встроенного в Tarantool Lua-модуля, чтобы:

  • запустить базу данных (данные в базе находятся в персистентном состоянии на диске, которое следует восстановить после запуска приложения) и
  • настроить Tarantool как сервер, который принимает запросы по TCP-порту.

Также добавим простую логику для базы данных, используя space.create() и create_index() для создания спейса с первичным индексом. Используем функцию box.once(), чтобы обеспечить единовременное выполнение логики после первоначальной инициализации базы данных, поскольку мы не хотим создавать уже существующий спейс или индекс при каждом обращении к скрипту:

#!/usr/bin/env tarantool
            -- настроить базу данных
            box.cfg {
               listen = 3301
            }
            box.once("bootstrap", function()
               box.schema.space.create('tweedledum')
               box.space.tweedledum:create_index('primary',
                   { type = 'TREE', parts = {1, 'unsigned'}})
            end)

Далее запустим наше приложение, как делали ранее:

$ tarantool myapp.lua
 Hello, world!
 2016-12-19 16:07:14.250 [41436] main/101/myapp.lua C> version 1.7.2-146-g021d36b
 2016-12-19 16:07:14.250 [41436] main/101/myapp.lua C> log level 5
 2016-12-19 16:07:14.251 [41436] main/101/myapp.lua I> mapping 1073741824 bytes for tuple arena...
 2016-12-19 16:07:14.255 [41436] main/101/myapp.lua I> recovery start
 2016-12-19 16:07:14.255 [41436] main/101/myapp.lua I> recovering from `./00000000000000000000.snap'
 2016-12-19 16:07:14.271 [41436] main/101/myapp.lua I> recover from `./00000000000000000000.xlog'
 2016-12-19 16:07:14.271 [41436] main/101/myapp.lua I> done `./00000000000000000000.xlog'
 2016-12-19 16:07:14.272 [41436] main/102/hot_standby I> recover from `./00000000000000000000.xlog'
 2016-12-19 16:07:14.274 [41436] iproto/102/iproto I> binary: started
 2016-12-19 16:07:14.275 [41436] iproto/102/iproto I> binary: bound to [::]:3301
 2016-12-19 16:07:14.275 [41436] main/101/myapp.lua I> done `./00000000000000000000.xlog'
 2016-12-19 16:07:14.278 [41436] main/101/myapp.lua I> ready to accept requests

На этот раз Tarantool выполняет скрипт и продолжает работать в качестве сервера, принимая TCP-запросы на порт 3301. Можно увидеть Tarantool в списке процессов текущей сессии:

$ ps | grep "tarantool"
              PID TTY           TIME CMD
            41608 ttys001       0:00.47 tarantool myapp.lua <running>

Однако экземпляр Tarantool’а завершит работу, если мы закроем окно командной строки. Чтобы отделить Tarantool и приложение от окна командной строки, можно запустить режим демона. Для этого добавим некоторые параметры в box.cfg{}:

  • background = true, который собственно заставит Tarantool работать в качестве демона,
  • log = 'dir-name', который укажет, где демон Tarantool’а будет сохранять файл журнала (другие настройки журнала находятся в модуле Tarantool’а log module), а также
  • pid_file = 'file-name', который укажет, где демон Tarantool’а будет сохранять файл журнала pid-файл.

Например:

box.cfg {
             listen = 3301
             background = true,
             log = '1.log',
             pid_file = '1.pid'
          }

Запустим наше приложение, как делали ранее:

$ tarantool myapp.lua
 Hello, world!
 $

Tarantool выполняет наш скрипт, отделяется от текущей сессии (он не отображается при вводе ps | grep "tarantool") и продолжает работать в фоновом режиме в качестве демона, прикрепленного к общей сессии (с SID = 0):

$ ps -ef | grep "tarantool"
              PID SID     TIME  CMD
            42178   0  0:00.72 tarantool myapp.lua <running>

Рассмотрев создание и запуск Lua-приложения для Tarantool’а, перейдем к углубленному изложению методик программирования.