Инструменты пользователя

Инструменты сайта


databases:tarantool

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
databases:tarantool [2021/12/23 13:09]
admin
databases:tarantool [2021/12/29 10:52] (текущий)
admin [Примеры]
Строка 107: Строка 107:
  
 Подключение к консоли по сети (из другой консоли) Подключение к консоли по сети (из другой консоли)
-<code bash>tarantool> net_box = require('net.box'+<code bash> 
-tarantool> conn = net_box.connect(3301)</code>+# Пока под вопросом. вроде работает но какая то специфика тут есть 
 +tarantool> net_box = require('net.box'
 +tarantool> conn = net_box.connect(3301) 
 + 
 +# Работает но непонятно с кластером в связке с Докером 
 +$ tarantoolctl connect user:passwd@host:port 
 + 
 +# Внутри консоли так работает: 
 +tarantool> console = require('console'
 +tarantool> console.connect('user:passwd@host:port'
 +</code> 
 + 
 + 
 + 
  
  
Строка 229: Строка 243:
 Интерпретатор скриптов: "/usr/bin/evn tarantool", с помощью его можно иcполнить любой скрипт на lua.\\ Интерпретатор скриптов: "/usr/bin/evn tarantool", с помощью его можно иcполнить любой скрипт на lua.\\
 Можно просто дать скрипт аргументом процессу он его выполнить и завершится: "tarantool my-script.lua"\\ Можно просто дать скрипт аргументом процессу он его выполнить и завершится: "tarantool my-script.lua"\\
 +
 +Вызов функции внутри **pcall()**- обеспечивает безопасное поведение в случае ошибки.\\
 +
 +
 +
 +
 +
 +
 +==== Кластер серверов ====
 +
 +[[https://www.tarantool.io/ru/doc/latest/getting_started/|Оф документация]]\\
 +Ставим Tarantool, Cartridge-Cli, после запуска UI доступен в веб странице по порту 8081.\\
 +В кластере есть две служебные роли:
 +  * **Storage** - хранилище данных
 +  * **Router** - посредник между клиентами и хранилищем
 +
 +Масштабирование кластера собсна и происходит добавлением доп хранилищ (шард), в настройках параметр "Replica set weight" регулирует приоритет использования, по всей видимости, можно вкл/выкл и данные "перетекают" из одного шарда в другой.\\
 +
  
  
Строка 282: Строка 314:
  
 Остались вопросы: Остались вопросы:
-  * перечень запущенных/рабочих инстансов+  * подключение к консоли кластера 
 +  * либо нужно разобраться как поднимать кластер из обычной установки
  
  
-===== =====+ 
 + 
 +===== Примеры ===== 
 + 
 + 
 + 
 + 
 +<details> 
 +<summary> :!: "**Вставка 1 млн кортежей** с помощью хранимой процедуры" </summary> 
 +Серверное приложение, создание одного спейса, пара функций, генерация рандомной символьной строки, вставка таких строк в цикле, + показан пример замера времени работы скрипта 
 + 
 +Файл конфига сервер-аппа: 
 +<code lua> 
 +box.cfg { 
 +        listen = '*:3311'; 
 +        --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 = "none"; 
 +        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('example'
 +        --space:create_index('primary'
 + 
 +        -- Создание пользователя 
 +        box.schema.user.create('user2', {password = 'user2'}) 
 +        box.schema.user.grant('user2', 'read,write,execute,create,session', 'universe'
 + 
 +        --------------------------- 
 +        ----- Пространство стикеров 
 +        local tester = box.schema.create_space('tester'
 +                -- Индекс для файла 
 +                tester:create_index('primary', {type= 'TREE', parts= {1, 'unsigned'}}) 
 +end 
 + 
 +function string_function() 
 +        local random_number 
 +        local random_string 
 +        random_string = "" 
 +        for x = 1,10,1 do 
 +                random_number = math.random(65, 90) 
 +                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,string_value}) 
 +                box.space.tester:replace(t) 
 +        end 
 +end 
 + 
 +-- Создание пространства и привилегий 
 +box.once('wtf', startbuild) 
 +</code> 
 + 
 +Использование: 
 +<code lua>tarantool> start_time = os.clock() 
 +tarantool> main_function() 
 +tarantool> end_time = os.clock() 
 +tarantool> 'insert done in ' .. end_time - start_time .. ' seconds' 
 +tarantool> box.space.tester:select{1}</code> 
 +</details> 
 + 
 + 
 + 
 +<details> 
 +<summary> :!: **Подсчет значений поля** в пространстве </summary> 
 + 
 +Подсчет происходит в этой функции\\ 
 +"Pairs()" типа массив всех строк, по которым и делаем цикл\\ 
 + 
 + 
 +<code lua> 
 +json= require('json'
 +function sum_json_field(field_name) 
 +        local v, t, sum, field_value, is_valid_json, lua_table 
 +        sum= 0 
 +        for v, t in box.space.tester:pairs() do 
 +                is_valid_json, lua_table= pcall(json.decode, t[2]) 
 +                if is_valid_json then 
 +                        field_value= lua_table[field_name] 
 +                        if type(field_value)== "number" then sum= sum + field_value end 
 +                end 
 +        end 
 +        return sum 
 +end 
 +</code> 
 + 
 +В двух записях намерено допущены ошибки, эти строки пропускаются 
 +<code lua> 
 +-- Создание/Заполнение пространства 
 +box.space.tester:drop() 
 +box.schema.space.create('tester'
 +box.space.tester:create_index('primary', {parts = {1, 'unsigned'}}) 
 + 
 +box.space.tester:insert{445, '{"Item": "widget", "Quantity": 7}'} 
 +box.space.tester:insert{446, '{"Item": "golf club", "Quantity": "sunshine"}'
 +box.space.tester:insert{447, '{"Item": "waffle iron", "Quantit": 3}'} 
 + 
 +-- Вызов ф-ции 
 +sum_json_field("Quantity"
 +</code> 
 +</details> 
 + 
 + 
 + 
 +<details> 
 +<summary> :!: **Хранимые процедуры на С** </summary> 
 +Проверьте наличие пакета "tarantool-dev"\\ 
 + 
 +Создайте и скомпилируйте следующий модуль (easy.c): 
 +<code c> 
 +#include "module.h" 
 +int easy(box_function_ctx_t *ctx, const char *args, const char *args_end) 
 +
 +        printf("hello world\n"); 
 +        return 0; 
 +
 + 
 +int easy2(box_function_ctx_t *ctx, const char *args, const char * args_end) 
 +
 +        printf("hello world -- easy2\n"); 
 +        return 0; 
 +
 +</code> 
 + 
 +Скомпилировать можно командой: 
 +<code bash>$ gcc -shared -o easy.so -fPIC easy.c</code> 
 + 
 +Далее откройте клиент tarantool в интерактивном режиме: 
 +<code bash> 
 +box.cfg{listen=3306} 
 +box.schema.space.create('capi_test'
 +box.space.capi_test:create_index('primary'
 +net_box = require('net.box'
 +capi_connection = net_box:new(3306) 
 + 
 +box.schema.func.create('easy', {language = 'C'}) 
 +box.schema.user.grant('guest', 'execute', 'function', 'easy'
 +capi_connection:call('easy'
 +</code> 
 + 
 +Находясь в той же директории где скомпилирован модуль С, тарантул находит указанные файлы.\\ 
 +Если название функции отличается он файла, то нужно указывать его: 
 +<code bash> 
 +box.schema.func.create('easy.easy2', {language = 'C'}) 
 +box.schema.user.grant('guest', 'execute', 'function', 'easy.easy2'
 +capi_connection:call('easy.easy2'
 +</code> 
 +</details> 
 + 
 + 
 + 
 +<details> 
 +<summary> :!: **Еще пример использования С** </summary> 
 + 
 +В основном используются API функции [[https://github.com/tarantool/msgpuck|модуля msgpuck]]\\ 
 + 
 + 
 +"hardest.c" 
 +<code c> 
 +#include "/usr/include/tarantool/module.h" 
 +#include "/var/msgpuck/msgpuck.h" 
 + 
 +int hardest(box_function_ctx_t *ctx, const char *args, const char *args_end) 
 +
 +        uint32_t space_id= box_space_id_by_name("capi_test", strlen("capi_test")); 
 +        char tuple[1024]; 
 +        char *tuple_pointer= tuple; 
 +        tuple_pointer= mp_encode_array(tuple_pointer, 2); 
 +        tuple_pointer= mp_encode_uint(tuple_pointer, 10000); 
 +        tuple_pointer= mp_encode_str(tuple_pointer, "String 2", 8); 
 +        int n= box_insert(space_id, tuple, tuple_pointer, NULL); 
 +        return n; 
 +
 +</code> 
 + 
 +После компиляции модуля выполните в терминале тарантула: 
 +<code lua> 
 +box.schema.func.create('hardest', {language = "C"}) 
 +box.schema.user.grant('guest', 'execute', 'function', 'hardest'
 +box.schema.user.grant('guest', 'read,write', 'space', 'capi_test'
 +capi_connection:call('hardest'
 + 
 +-- Выполнение 
 +box.space.capi_test:select() 
 +</code> 
 +</details> 
 + 
 + 
 +<details> 
 +<summary> :!: **Использование SQL** </summary> 
 + 
 +Подключаемся к консоли, двумя командами задаем язык и разделитель команд:\\ 
 +<code bash> 
 +tarantool> \set language sql 
 +tarantool> \set delimiter ; 
 +</code> 
 + 
 +Далее выполняем команды в формате SQL 
 +<code sql> 
 +tarantool> create table table1 (column1 integer primary key, column2 varchar(100)); 
 +tarantool> insert into table1 values (1, 'A'); insert into table1 values (2, 'B');  
 +tarantool> update table1 set column2='AB' where column1='2'; 
 +tarantool> select * from table1; 
 +</code> 
 +Результат аналогичен использованию команд типа "box.space..."\\ 
 +Здесь создается пространство "table1", и вставка пары кортежей (записей).\\ 
 +</details> 
  
  
databases/tarantool.1640264956.txt.gz · Последнее изменение: 2021/12/23 13:09 — admin