Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
databases:tarantool [2021/12/23 05:31] admin |
databases:tarantool [2021/12/29 10:52] (текущий) admin [Примеры] |
||
---|---|---|---|
Строка 21: | Строка 21: | ||
- | Все строится **вокруг инстанса** (приложения). Пользователи/ | + | Все строится **вокруг инстанса** (приложения). Пользователи/ |
- | Для хранения конфигурации есть две папки " | + | |
+ | Для хранения конфигурации есть две папки " | ||
Для управления служит утилита " | Для управления служит утилита " | ||
Строка 28: | Строка 30: | ||
Примененные впоследствии скрипты **не сохраняют своего действия** при перезагрузке приложения + перезагрузка **основной службы не влияет на работу приложений** (инстансов).\\ | Примененные впоследствии скрипты **не сохраняют своего действия** при перезагрузке приложения + перезагрузка **основной службы не влияет на работу приложений** (инстансов).\\ | ||
+ | Система может выполняться: | ||
+ | * интерактивно- просто запустить tarantool | ||
+ | * в режиме скрипта- подать аргументом скрипт, | ||
+ | * в режиме серверного приложения, | ||
+ | * background | ||
+ | * log | ||
+ | * pid_file | ||
- | Конфигурация находится в файлах *.lua, есть две папки: **etc/ | ||
- | |||
- | В конфиге описываются все параметры инсталляции, | ||
< | < | ||
- | < | + | < |
За основу можно взять файл " | За основу можно взять файл " | ||
<code lua> | <code lua> | ||
Строка 74: | Строка 80: | ||
</ | </ | ||
</ | </ | ||
- | |||
- | |||
- | Управление происходит командой **tarantoolctl**, | ||
Строка 86: | Строка 89: | ||
* **TREE** - не уникальны, | * **TREE** - не уникальны, | ||
* **RTREE** и **BITSET** - поиск на двумерной плоскости и работа с битовыми данными | * **RTREE** и **BITSET** - поиск на двумерной плоскости и работа с битовыми данными | ||
+ | |||
+ | Есть два движка хранения данных: | ||
+ | |||
+ | |||
Строка 92: | Строка 99: | ||
После запуска инсталляции, | После запуска инсталляции, | ||
<code bash># tarantoolctl enter < | <code bash># tarantoolctl enter < | ||
+ | |||
+ | Перечень запущенных инстансов можно просмотреть в списке процессов ОС: | ||
+ | <code bash># ps -ef | grep tarantoolctl</ | ||
+ | |||
+ | Запуск в докере " | ||
+ | <code bash># docker run -p 3301:3301 -p 8081:8081 tarantool/ | ||
+ | |||
+ | Подключение к консоли по сети (из другой консоли) | ||
+ | <code bash> | ||
+ | # Пока под вопросом. вроде работает но какая то специфика тут есть | ||
+ | tarantool> | ||
+ | tarantool> | ||
+ | |||
+ | # Работает но непонятно с кластером в связке с Докером | ||
+ | $ tarantoolctl connect user: | ||
+ | |||
+ | # Внутри консоли так работает: | ||
+ | tarantool> | ||
+ | tarantool> | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | <code bash># </ | ||
+ | |||
Строка 130: | Строка 165: | ||
Пару примеров: | Пару примеров: | ||
- | <code bash>> | + | <code bash>> |
- | > box.schema.user.grant(' | + | > box.schema.user.grant(' |
- | > box.schema.user.grant(' | + | > box.schema.user.grant(' |
- | > box.schema.user.grant(' | + | > box.schema.user.grant(' |
- | > box.schema.user.grant(' | + | > box.schema.user.grant(' |
- | > box.schema.user.grant(' | + | > box.schema.user.grant(' |
Строка 193: | Строка 228: | ||
-- Даже после связки ролей, изменения применятся | -- Даже после связки ролей, изменения применятся | ||
> box.schema.role.grant(' | > box.schema.role.grant(' | ||
+ | |||
+ | |||
+ | |||
+ | ==== Потоки/ | ||
+ | |||
+ | В консольном режиме " | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ==== Скрипты ==== | ||
+ | |||
+ | Интерпретатор скриптов: | ||
+ | Можно просто дать скрипт аргументом процессу он его выполнить и завершится: | ||
+ | |||
+ | Вызов функции внутри **pcall()**- обеспечивает безопасное поведение в случае ошибки.\\ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ==== Кластер серверов ==== | ||
+ | |||
+ | [[https:// | ||
+ | Ставим Tarantool, Cartridge-Cli, | ||
+ | В кластере есть две служебные роли: | ||
+ | * **Storage** - хранилище данных | ||
+ | * **Router** - посредник между клиентами и хранилищем | ||
+ | |||
+ | Масштабирование кластера собсна и происходит добавлением доп хранилищ (шард), в настройках параметр " | ||
+ | |||
+ | |||
Строка 245: | Строка 314: | ||
Остались вопросы: | Остались вопросы: | ||
- | * перечень запущенных/рабочих инстансов | + | * подключение к консоли кластера |
+ | * либо | ||
- | ===== ===== | + | |
+ | |||
+ | ===== Примеры | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | < | ||
+ | < | ||
+ | Серверное приложение, | ||
+ | |||
+ | Файл конфига сервер-аппа: | ||
+ | <code lua> | ||
+ | box.cfg { | ||
+ | listen = ' | ||
+ | --slab_alloc_arena= 0.2; | ||
+ | |||
+ | io_collect_interval = nil; | ||
+ | readahead = 16320; | ||
+ | memtx_memory = 128 * 1024 * 1024; | ||
+ | memtx_min_tuple_size = 16; | ||
+ | memtx_max_tuple_size = 128 * 1024 * 1024; | ||
+ | vinyl_memory = 128 * 1024 * 1024; | ||
+ | vinyl_cache = 128 * 1024 * 1024; | ||
+ | vinyl_max_tuple_size = 128 * 1024 * 1024; | ||
+ | vinyl_write_threads = 2; | ||
+ | wal_mode = " | ||
+ | wal_max_size = 256 * 1024 * 1024; | ||
+ | checkpoint_interval = 60 * 60; | ||
+ | checkpoint_count = 6; | ||
+ | force_recovery = true; | ||
+ | log_level = 5; | ||
+ | log_nonblock = false; | ||
+ | too_long_threshold = 0.5; | ||
+ | } | ||
+ | |||
+ | local function startbuild() | ||
+ | --local space = box.schema.create_space(' | ||
+ | --space: | ||
+ | |||
+ | -- Создание пользователя | ||
+ | box.schema.user.create(' | ||
+ | box.schema.user.grant(' | ||
+ | |||
+ | --------------------------- | ||
+ | ----- Пространство стикеров | ||
+ | local tester = box.schema.create_space(' | ||
+ | -- Индекс для файла | ||
+ | tester: | ||
+ | end | ||
+ | |||
+ | function string_function() | ||
+ | local random_number | ||
+ | local random_string | ||
+ | random_string = "" | ||
+ | for x = 1,10,1 do | ||
+ | random_number = math.random(65, | ||
+ | random_string = random_string .. string.char(random_number) | ||
+ | end | ||
+ | return random_string | ||
+ | end | ||
+ | |||
+ | function main_function() | ||
+ | local string_value, | ||
+ | for i = 1,1000000,1 do | ||
+ | string_value = string_function() | ||
+ | t = box.tuple.new({i, | ||
+ | box.space.tester: | ||
+ | end | ||
+ | end | ||
+ | |||
+ | -- Создание пространства и привилегий | ||
+ | box.once(' | ||
+ | </ | ||
+ | |||
+ | Использование: | ||
+ | <code lua> | ||
+ | tarantool> | ||
+ | tarantool> | ||
+ | tarantool> | ||
+ | tarantool> | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | < | ||
+ | < | ||
+ | |||
+ | Подсчет происходит в этой функции\\ | ||
+ | " | ||
+ | |||
+ | |||
+ | <code lua> | ||
+ | json= require(' | ||
+ | function sum_json_field(field_name) | ||
+ | local v, t, sum, field_value, | ||
+ | sum= 0 | ||
+ | for v, t in box.space.tester: | ||
+ | is_valid_json, | ||
+ | if is_valid_json then | ||
+ | field_value= lua_table[field_name] | ||
+ | if type(field_value)== " | ||
+ | end | ||
+ | end | ||
+ | return sum | ||
+ | end | ||
+ | </ | ||
+ | |||
+ | В двух записях намерено допущены ошибки, | ||
+ | <code lua> | ||
+ | -- Создание/ | ||
+ | box.space.tester: | ||
+ | box.schema.space.create(' | ||
+ | box.space.tester: | ||
+ | |||
+ | box.space.tester: | ||
+ | box.space.tester: | ||
+ | box.space.tester: | ||
+ | |||
+ | -- Вызов ф-ции | ||
+ | sum_json_field(" | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | < | ||
+ | < | ||
+ | Проверьте наличие пакета " | ||
+ | |||
+ | Создайте и скомпилируйте следующий модуль (easy.c): | ||
+ | <code c> | ||
+ | #include " | ||
+ | int easy(box_function_ctx_t *ctx, const char *args, const char *args_end) | ||
+ | { | ||
+ | printf(" | ||
+ | return 0; | ||
+ | } | ||
+ | |||
+ | int easy2(box_function_ctx_t *ctx, const char *args, const char * args_end) | ||
+ | { | ||
+ | printf(" | ||
+ | return 0; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Скомпилировать можно командой: | ||
+ | <code bash>$ gcc -shared -o easy.so -fPIC easy.c</ | ||
+ | |||
+ | Далее откройте клиент tarantool в интерактивном режиме: | ||
+ | <code bash> | ||
+ | box.cfg{listen=3306} | ||
+ | box.schema.space.create(' | ||
+ | box.space.capi_test: | ||
+ | net_box = require(' | ||
+ | capi_connection = net_box: | ||
+ | |||
+ | box.schema.func.create(' | ||
+ | box.schema.user.grant(' | ||
+ | capi_connection: | ||
+ | </ | ||
+ | |||
+ | Находясь в той же директории где скомпилирован модуль С, тарантул находит указанные файлы.\\ | ||
+ | Если название функции отличается он файла, то нужно указывать его: | ||
+ | <code bash> | ||
+ | box.schema.func.create(' | ||
+ | box.schema.user.grant(' | ||
+ | capi_connection: | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | < | ||
+ | < | ||
+ | |||
+ | В основном используются API функции [[https:// | ||
+ | |||
+ | |||
+ | " | ||
+ | <code c> | ||
+ | #include "/ | ||
+ | #include "/ | ||
+ | |||
+ | int hardest(box_function_ctx_t *ctx, const char *args, const char *args_end) | ||
+ | { | ||
+ | uint32_t space_id= box_space_id_by_name(" | ||
+ | char tuple[1024]; | ||
+ | char *tuple_pointer= tuple; | ||
+ | tuple_pointer= mp_encode_array(tuple_pointer, | ||
+ | tuple_pointer= mp_encode_uint(tuple_pointer, | ||
+ | tuple_pointer= mp_encode_str(tuple_pointer, | ||
+ | int n= box_insert(space_id, | ||
+ | return n; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | После компиляции модуля выполните в терминале тарантула: | ||
+ | <code lua> | ||
+ | box.schema.func.create(' | ||
+ | box.schema.user.grant(' | ||
+ | box.schema.user.grant(' | ||
+ | capi_connection: | ||
+ | |||
+ | -- Выполнение | ||
+ | box.space.capi_test: | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | |||
+ | < | ||
+ | < | ||
+ | |||
+ | Подключаемся к консоли, | ||
+ | <code bash> | ||
+ | tarantool> | ||
+ | tarantool> | ||
+ | </ | ||
+ | |||
+ | Далее выполняем команды в формате SQL | ||
+ | <code sql> | ||
+ | tarantool> | ||
+ | tarantool> | ||
+ | tarantool> | ||
+ | tarantool> | ||
+ | </ | ||
+ | Результат аналогичен использованию команд типа " | ||
+ | Здесь создается пространство " | ||
+ | </ | ||