ααααΆαααααΆααα»ααααα»αααΆαααααΆααΆαααααΎααΆαααΆαα½α Tarantool ααα»αααααααααΆααααααΆαα·αααααΎαααΆααααααΆαααααα»αααα ααα»ααααααααΈαααααααα»αααΆαααααΎαα·ααααΆααΆααΆααΎαααααΆααα½αααααααα»αααΆααα·ααΆαα’αααΈ Hadoop α’αααΈααααααα MapReduce ααααΎαααΆαα αα ααΈααααααα»αααααΌαααΆααααα½ααααα½α - "α ααα»α’αααΈαα·αααααΎ Tarantool αααααΆαααα·α αα ααΆαααα?" α
αααααΆααααΆααααααααααααΆαα ααααΉαα ααααΎα αααα»αααΆααααααα α α·ααααααα‘αααα ααΆαα·α ααΆαααααααααα α»αααααααααα»α - α αΎαααΎαααααααα»ααα·αααΆα αΌαα α·ααααααααααααα α₯α‘αΌαααααααα»αααΉααααα αΆαααΈααααααααααααααα·ααΈααΆαααααα½ααα αααα»α Tarantool αααα»αααΆ α αΎααα·αα·αααααΎαααΆαα’αα»αααα α αΎαα’αααααΉαααΎαααΈαααααααααΆααααα½α αα·ααααααΆααααααααααΆααα ααΈαααα
ααΎα’αααΈαα ααΆ Tarantool
Tarantool αααααααΈααΆαααααα½αααΆααΆααΌαααααΆααα·ααααααααΏααααα»αα α’αααα’αΆα ααΆαααα·ααααααααΆαα½ααααα’αααα ααααΆααα ααΈαααα ααΎαααΈααα α αααααα½αααΆα‘αΎααα·α shard - αααααΊαααααααα·ααΆααααααααα·ααααααααααααΆαααααΆαααΈαααααΆα αααΎα α αΎααααα αΌαααααΆααΌαααααααααΈαα½ααα - αααααΎααααααααΆαααααααα’ααα±ααααααα α»αα
ααΈααΈαααΆααΊααΆαααΆαααΈααααααααα·ααΈα α’αααα’αΆα ααααααααααα·ααΈααααα’ααααα ααΎααΆ ααααΎααΆαααΆαα½ααα·αααααα α§ααΆα ααα αα»αααΆαα»α αΆαααα αααα»αααααααΆαααααααααααααα ααΆαα αααΆααααΆααααΆααα α’αααα’αΆα ααααααααΆαααΈααα Http αααααααΆαααα αααα»α Tarantula αααααΉαααααΎααΆαααΆαα½ααα·ααααααα αααααααααααααα½ααα ααααααα·ααααααααααΈαα ααΈααα α αΎαααΆαααααααααΆααΆααα’αααα ααΆααα
αααα»αααΆαα’αΆαα’ααααααα½αα’αααΈααααααααα»αααααααΎααα½αααΆαα ααα½α 300 αα½α αααααααΆαααααααααααΉαααααα α αΎααα½αααααΆαααααΎαααΆαα’αααααααΆ 20 ααΆααααα»ααα½ααα·ααΆααΈα αα ααΈαααα’ααααα·αααΆα’αΆα αααααα αα·αααααααααααα·ααΈααααααΆααααΆαα α αΎααααααα·ααΈααΆαααααααΉααα·αααααΌαααΆααααααΆαα»αααΌα αα αααα»α PostgreS ααα
αααα ααααΆαααΆαααΈααααααααα ααΆαααααΆαααααα αααα»αααΉαααααΆααΆααααααΆαααααα»αα’ααααααααα
ααΆαααααα
αααααΆααααΆαααααΎαααααααα αααα»αααΆαα αΆααααααΎααααΆαααΈααα·αααα·ααααααααΆαα ααα½αααΈ - ααΆαααΉα 20 ααΈα αααΆαα α’ααΌααα»αααΌ 18.04 α αααΈααΈααΌαα·αααα·α 2 αα·αα’αααα αα αΆα 4 ααΈα αααΆααα
ααΎαααα‘αΎα Tarantool - ααααΎαααΆαααααααΈα bash α¬ααααααααααΆααα αΎαααααΎ apt ααα‘αΎα Tarantool α ααααΆαααα
ααααααΈα - (curl -L
tarantoolctl ααΊβααΆβααΆαααβαααααΆβα
ααααβαααααΆααβααΆαβαααααβααααβααααΈ Tarantula α
/etc/tarantool - αααααΊααΆααΆαααααααα
ααΆααααααααααΆααααΌαα
var/log/tarantool - αααααΊααΆαααααα ααα»α
var/lib/tarantool - αα
ααΈααααα»α ααα·αααααα α αΎααααααΆαααααα½αααΆααααΌαααΆααααα
αααα
ααΆα§ααΆα αααα
ααΆα instance-available and instance-enable folders - ααΆαααα»αααΌαα’αααΈαααααΉαααααΌαααΆαααΆααα±ααααααΎαααΆα - α―αααΆαααααααα ααΆαααααααα instance ααΆαα½α lua code ααααααααΆα’αααΈ ports αααααΆααααΆαα ααΆααΎ memory ααΆααΆααααααΆααααΆ ααΆαααααααααΆαααΈα Vinyl ααΌααααααααΎαααΆααα αααα αΆααααααΎα servers, sharding, αα½α, αα»ααα·ααααααααααααααααΎ α αΎαααΌα αααααα ααΎα
α§ααΆα αααααααΎαααΆαααΌα αα αααα»α PostgreS α α§ααΆα ααα α’αααα ααααααΎαααΆαα αααΆααα ααααααΆα αααΎαααααΌαααααΆααα·ααααααααααααα½ααα ααΎα αααααααααααααΆα ααΆααααααΆα§ααΆα αααααΌαααααΆααα·ααααααααΆα αααΎαααααΌαααΆαααΎαααααΎαααΆααα ααΎαααΆαααΈααααααα½α ααααααα½ααα ααΎα αααααααααααααΆα αα½αααα’αΆα ααΆαααΆαααααααα»αααααΆααΆαααααα»α - α§ααΆα ααααα½αα’αα»αααααααααα·ααααΆαα½α ααΈααΈα - αα½αααααααααα
ααΆααααααααααααααα»
ααΎαααΆαααΆααααααααΆ tarantoolctl αααα’αα»ααααΆαα±ααααΎααααααααααααααΈ Tarantula α α§ααΆα ααα tarantoolctl check example ααΉααα·αα·αααα―αααΆαααααααα ααΆαααααααα α αΎααα·ααΆαααΆα―αααΆααα·αα’αΈαα ααααα·αααΎαα·αααΆαααα α»αααΆαααααααααααα
α’αααα’αΆα ααΎαααααΆαααΆαααααααα» - α§ααΆα αααααααΆαααΆα tarantoolctl α αα αααα»ααα·ααΈααΌα ααααΆααααααα’αααα’αΆα α αΆααααααΎα, αααααα, α αΆααααααΎαα‘αΎααα·αα
αα αααααα instance αααα»αααααΎαααΆα ααΆααα·ααΈααΈααααΆαααΎααααΈααααΆαααα ααΆα
1. αα»αααΌαααααααΆα
ααΆαααααΆαααΎα Tarantool ααΎααααααα½α α αΎαααααΎα’ααααα ASCII ααααααΆ ααΎααααΈααααααααα Tarantula α ααΆαααααΆαααα αα»αααΌααααααααΎαα‘αΎααα αααααα’αααααααΎααααΆααα’αααααααααααα αα·αααΆαααΆααααααααααΆαααα ααΌα ααααα’ααααα·αα αΆαααΆα αααα ααααα»αααΌαααΎααααΈααααααααα Tarantula αα ααΆααααα αααααα
ααΎααααΈααααΆααααΆααα·ααΈααα α’αααααααΌααααα αΌα Tarantoolctl αααα αΌααααααα§ααΆα αααα ααΆααααααααΆααΉαα αΆααααααΎααα»αααΌα α αΎαααααΆααααΆα’αααααααΎααααΆααα’ααααααααααααα αα»ααααα ααα ααααα»αααΌααα ααΆααααα - ααΆααΆααΆααααααΎααααα»αααΆααα»αααΆααΆααααα―αααΆα αααααΆααααααΆαααα’ααααααααΆααα·αααα·ααααααα ααΆααααααααΉαα’αΆα ααααΆαααα Tarantula ααΆαα
αα·ααΈααΆααααααααααΊα αΆαααΆα ααααααΆαααα·α αα ααΆαααααααΆαα ααΎααααΈααααΎααΆαααΆαα½ααα·αααααα ααΌαααααΎαα·ααΈααΈααΈα - αα·ααΈααΆααααααααααααααΈαα
2. ααΆαααααΎααααΆαααα·ααΈααΆααααααααααααααΈαααΎααααΈααααΆαααα ααΆααα αααααΆααααΆαααα½αα
ααΆαααΆαααααΆαααααΆαααα αααα»αααΆαααααααααααΎαα ααααααααΆααααααΆααααααααΆααααα α α ααααααααααΌαααΆαααααΎααΆαα½ααα·ααΈααΆααααααααααααααΈα α αΎαααΆααααααααααΆααααααΌαααΆαααΎααα ααΈαααα
αααααΆααααΆααααααΆααααα tarantoolctl αααααΆαααα αααα αααααααΌαααΆαααααΎα αααααααΎααΆ α’αααα’αΆα ααααΆαααα αααΆαααΈαααααΈα ααααΆα ααααΎααΆααααααααααΆαα αα·αααααααα·αααα·α αΌαααααΎααααΆααααααααα
ααΆααααααααΆαα·αααααα αα·ααααΌαα»ααααα’αα
αααααΆα Tarantool ααΊααΆααΌαααααΆααα·αααααα αα·αααΆαααΆαααΈααααααΎαααααα·ααΈ ααΆααΆααααΌαα»αααααααα ααΎαα αΆααα’αΆααααααααΎαααΌαα»ααααα’αα - ααΆα’αα»ααααααααΎααΆαααΆαα½ααα·ααααααα αα αααα’ααααααααα’αααΈαα½ααα αααα’αααα½α Tarantool ααααααα·αααααααα αααα»αααΆα αααααΆαα»αααΆαααα»αα’αααα αα αΆα α¬ααααΎα’αααΈααααααααααΆαα½αααΆα
ααΆααααααααΆ
α§ααΆα ααα ααΎαα αΌααα αααα»ααααα’αααααΌαα»α α αΎαα α αα»αααΆα box.once α ααΆααΉααααααα±αα Tarantool ααααΎαααΆαααΌαααααααΎααα αααααααααΆαααΈαααααααΌαααΆαα αΆααααααΎαα ααΎααααααΎααααααααα½αααααα·ααααααααααααΎαααΉαααααΌαααΆααααααΆαα»αα
local function bootstrap()
local space = box.schema.create_space('example')
space:create_index('primary')
box.schema.user.grant('guest', 'read,write,execute', 'universe')
-- Keep things safe by default
-- box.schema.user.create('example', { password = 'secret' })
-- box.schema.user.grant('example', 'replication')
-- box.schema.user.grant('example', 'read,write,execute', 'space', 'example')
end
αααααΆααααΈαααααΎααααααΎααα·αα·ααααααα - ααα - αααααΎαα’αΆα ααααααααα·ααααααα ααΆαααααΆαααΎα ααααα·αααΎααααΆααααΆαααΆααααααααααΌαααΆααααααΆαααα ααΆαααΈαα½ααααα»αααΆαα»ααΈαα½αααααααΆααααααααααααααααΉαααααΌαααΆαααααΎα
αααααΆααβααβααΎαβααααΎβααΆαβαααααβαααα½αβαααβα’αααβααααΎβααΆβααααα αααβααΎαβααααΆααβααΆαβαααβαα·ααΈααΆαβαααααΈαα ααΎαα’αα»ααααΆαα±ααα’αΆα ααααα αα·αααααα·ααααα·αααα»αα§ααΆα αααααΆααααΌαα
ααΎαααααααααα ααΉαααΌαααααΆααα·ααααααααααααΆ α’αααΈααααααααΆαααΊααΆααααααΆαααα ααΈαααα ααΎαααΆαααααααααααα - ααΆαααααααααα·ααααααααααααΎαααααΌαααΆααααααΆαα»ααααΆαααΆααααα ααΆαα»ααΈαα½ααααααΌαααΆαααα α ααΆ tuple α ααΆααααΌαααΆαααα αααα αααα»α MessagePack α αααααΊααΆαααααααααααααΆαααααα»α - ααΆααΆαααααααααααααΈα α αΎαααααΎααα ααα·α ααΆααα»α - 18 αααααααΉα 27 α
ααΆααΆααααα½αααΆαααααα»αααΆαααααΎααΆαααΆαα½αααΆααα ααααΎαααααααααααααΆαα ααΆααααΆααααα
αΌααα·ααααααα’αΆα
ααΆααα½ααααα»αααααΆααΆαααααα»αα
ααΎαα’αΆα ααΎαα αααααααΆααα’αααααααααΎααΆααααααααΆ Box.space α ααΎααααΈααααΎαααΎαα§ααΆα αααααΆααααΆαααα½α ααΎααααααα§ααΆα ααα box.space α αΎαααα½αααΆαααααααΆααααααααα ααΎααΆα
ααΆααααΆαααΈαααΈααααααααααααααΌαααΆααααααΎαα‘αΎααα αααα»α Tarantool: Memory αα·α Vinyl α α’αααα αα αΆααααα»ααα·ααααααααΆααα’αααα αααα»αα’αααα αα αΆαα ααΌα ααααα’αααΈαααααΎαααΆααααΆαααΆαααα αα·ααα ααα αα·ααααααβααααΌαβααΆαβαααα ααβαα βαααα»αβααΆα α αΎαβααΆβααβααΆαβααααααΆαβαααααβαα»αβαα»αβααβααα ααΌα ααααβααΎαβααΉαβαα·αβααΆαααααβα’αααΈβααβααααα·αβααΎβαααΆαααΈαβααβααΆααα
Vinyl αααααΆαα»ααα·αααααααα ααΎααΆααααα»ααααααααααααααΆααααααΆαα - αααααΊα’αααα’αΆα αααα»ααα·ααααααα αααΎαααΆαααΎαααΆαα’αααα αα αΆα α αΎα Tarantula ααΉαα’αΆαααΆααΈααΆαα
α₯α‘αΌααααααΎαααΉαααααΎα’αααα αα αΆαα
unix/:/var/run/tarantool/example.control> box.space.example
---
- engine: memtx
before_replace: 'function: 0x41eb02c8'
on_replace: 'function: 0x41eb0568'
ck_constraint: []
field_count: 0
temporary: false
index:
0: &0
unique: true
parts:
- type: unsigned
is_nullable: false
fieldno: 1
id: 0
space_id: 512
type: TREE
name: primary
primary: *0
is_local: false
enabled: true
name: example
id: 512
...
unix/:/var/run/tarantool/example.control>
αααααααααα
αα·αα·ααααα ααααααααΌααααααααΎααααααΆααα αααααααΆαα½α ααΈαααααααααΆαα’αααΈααΉαααααΎαααΆααααααααΆαααΆααα ααΌα αα αααα»αααΌαααααΆααα·ααααααααΆαα½α ααΎααααααΎαααΆαααααΌα - ααααααααΆαααααααααααΆα
αααααα
αααααΊααΆαααααααααααΎααααααΆααααΈα’αααΈααααααααααααααααααΎαααΆαα ααΆααΆαααααααα½α - ααΆαααααΌααααααΎαααΉαααααΎ ααΆα unsigned - α ααα½αααααα·αααααΆαα ααΆααααα»αα αΆαααΈα―αααΆα αααα’αα·ααααΆαααα’αΆα ααΆαααΊ 18 quintillionα α’ααα αΆαααααΆααα
αααααΆααααααΎαα’αΆα αααα αΌααα·αααααααααααααΎααΆααααααααΆαααα αΌαα
unix/:/var/run/tarantool/example.control> box.space.example:insert{1, 'test1', 'test2'}
---
- [1, 'test1', 'test2']
...
unix/:/var/run/tarantool/example.control> box.space.example:insert{2, 'test2', 'test3', 'test4'}
---
- [2, 'test2', 'test3', 'test4']
...
unix/:/var/run/tarantool/example.control> box.space.example:insert{3, 'test3'}
---
- [3, 'test3']
...
unix/:/var/run/tarantool/example.control> box.space.example:insert{4, 'test4'}
---
- [4, 'test4']
...
unix/:/var/run/tarantool/example.control>
ααΆαααΈαα½αααααΌαααΆαααααΎααΆααα αααα ααΌα ααααααΆααααΌαααααΆααααα½ααααα ααΎααα·αααααααααα ααα½ααα½ααααα ααΌα ααααααΎαα’αΆα αααα αΌααα·ααααααααΆαα αααΎαααΆααααααΎαα αΌαα α·ααααα ααΈαααα αα½αααΆααααΌαααΆααααααΆαααααα»ααααααα MessagePack ααααααα»αααΆααα·αααααΆααΆαααΎα
αα·ααααααα·αααααα
αααααΆααααααΎαα’αΆα αααα αΆααα·αααααααααααααΎααΆααααααααΆααααΎαααΎαα
Box.example.select αααβα α»α {1} ααΉαβαααα αΆαβααΆαα»βαααβα ααβααΆαα ααααα·αααΎααΎααα»αααααα ααΎαααΉαααΎααααααααααΆααΆααα’αααααααΎαααΆαα αα½αααΆααΆααα’ααααΆαααΆααα»ααααααααααΆαα αααα»αα ααα½ααα½ααα ααα»αααααα ααΈαααααΆαααααΆααααα·αααΆααααα·ααααα½ααααα - ααΆααααααΆαα
α’αΆα ααΆααα·ααααααα αααΎαααΆααααα’αααα ααααΆαα α αΎαα§ααΆα αααααΎαααααΌαααααααααα½αααΆαα αααα»αααΆαααΈααΈαα ααΎααααΈααααΎααΌα αααααΎααααααΎαααααααααααααααΆαααααααααααΈα
box.space.example:create_index( βsecondaryβ, { type = βTREEβ, unique = false, parts = {{field = 2, type =βstringβ} }})
ααΎαααααΎααΆααααααααΆ Create_index α
ααΎαα α
ααΆααΆα’αα»αα·ααααΆαααα
αααααΆααααΈαααα’αααααααΌααααααΆαααααΆαααΆααααααα αααααααααααααααααΊ TREE α ααΆαααα ααααΆαα·αααΆααααα½ααα ααΌα ααααααΎααααα αΌα Unique = false α
αααααΆααβααβααΎαβαααα αΆαβααΈβαααααβααΆβαααβαααααααααβααααβααΎαβααΆαα ααΆαααΊααΆα ααα½αααααΆααααααΎαα αααααααααα α αΎααααααΆααααααααααααα’ααααα α αΎαααΌα ααααααΆααααΌαααΆααααααΎαα‘αΎαα
unix/:/var/run/tarantool/example.control> box.space.example:create_index('secondary', { type = 'TREE', unique = false, parts = {{field = 2, type = 'string'}}})
---
- unique: false
parts:
- type: string
is_nullable: false
fieldno: 2
id: 1
space_id: 512
type: TREE
name: secondary
...
unix/:/var/run/tarantool/example.control>
α₯α‘αΌαααααααααΆαααααααααΎαα’αΆα α α ααΆααΆ:
unix/:/var/run/tarantool/example.control> box.space.example.index.secondary:select('test1')
---
- - [1, 'test1', 'test2']
...
αααα»ααααααΆαα»α
ααααα·αααΎααΎαα αΆααααααΎα instance α‘αΎααα·α α αΎαααααΆααΆαα α αα·ααααααααααααα ααΎαααΉαααΎαααΆαα½ααααα·ααα ααΈααααα - α’αααΈααααααααΆαααΊαααα ααΆααΎαα‘αΎααααααΆααα Tarantool αααααΎαααα»αααα·ααααα½ααα·αα·ααα αα·ααααααΆαα»ααα·αααααααα αααα»αααΆα ααα»ααααααααα·αααΎααΎααααααααΎαααΆααα»ααααααΆααααααΆαα»ααααααΆαα ααΎαααΉαααΆαααααααααα·ααααα·ααΆαααΆααα’αα αααααΆαααΎαααΉαααΎαα‘αΎααα·αααΈα ααα»α αααα½ααα·αα·αααα α»αααααα αααααΆα§ααΆα αααααΆαααΈααΈααααααα»αα
ααΆααααααααΆαααα·ααΆααΈααααΉααα·αααααΎαααΆαααα - αααααΆαααααΆααααα αα 20 GB αα αααα»αααΈαα₯ααααααααΊααΆαααα·αααΌα ααααα
α αααααααα αΆααα αααα·ααααααααα ααα»ααααααα»αααααΌαααΆααααααΎα αα·αα’αα»ααααα αααααΆααααα½αααααααΆ αααααΆααααΆαααααΆααααααΌαααΈαα½αααα αααα»ααα·αααααα αααααααααΆαα½αααααΌαααΆααααααΎααα αααα»αα―αααΆααααααα ααα»ααΌα αα½αααααααααααΆαα»αα
ααΆαα»ααΈαα½αααα αΌααααααα»αααα·ααααα½ααα·αα·αααααααΌαααΆααααααΆαα»ααα αααα»ααα½αααα αααααΆααα―αααΆαααΆαααααααΎααααααααα α - α§ααΆα ααα 64 mb α αα ααααααααΆαααααα‘αΎα ααΆαααααΉαα αΆααααααΎααα ααΆααα―αααΆαααΈααΈαα α αΎααααααΆααααΈααΆαα αΆααααααΎαα‘αΎααα·α Tarantool ααΎαα‘αΎααα·αααΈα ααα»α αααα½ααα·αα·αααα α»ααααααα αΎααααααΆαααααααα·αααΎααααα·ααααα·ααΆαααααααααααα αΌααααααΆαααα
ααΎααααΈα’αα»ααααααΆααααααααα α’αααααααΌααααααΆαααααααΎααα½ααα
αααα»αααΆαααααα box.cfg (αααα»αα―αααΆα example.lua)α
wal_mode = βwriteβ;
ααΆαααααΎααααΆαααα·αααααα
ααΆαα½αααΉαα’αααΈαααααΎαααΆαααααααα αααααα α’αααα’αΆα ααααΎ Tarantula ααΎααααΈαααααΆαα»ααα·αααααα α αΎαααΆααΉαααααΎαααΆαααΏαααΆααααΆαααα·ααααααα α αΎαα₯α‘αΌαααα cherry αα ααΎαα - ααΎα’αααα’αΆα ααααΎα’αααΈααΆαααΆαα½αααΆααΆααα’ααα
ααΆαααααααααααα·ααΈ
ααΆα§ααΆα ααα α αΌαααΎαααααααααααα·ααΈαααααααααααΆαα Tarantula
ααΌαααΎααααααα·ααΈαα ααααα spoiler
box.cfg {
listen = '0.0.0.0:3301';
io_collect_interval = nil;
readahead = 16320;
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 = "write";
wal_max_size = 256 * 1024 * 1024;
checkpoint_interval = 60 * 60; -- one hour
checkpoint_count = 6;
force_recovery = true;
log_level = 5;
log_nonblock = false;
too_long_threshold = 0.5;
read_only = false
}
local function bootstrap()
local space = box.schema.create_space('example')
space:create_index('primary')
box.schema.user.create('example', { password = 'secret' })
box.schema.user.grant('example', 'read,write,execute', 'space', 'example')
box.schema.user.create('repl', { password = 'replication' })
box.schema.user.grant('repl', 'replication')
end
-- for first run create a space and add set up grants
box.once('replica', bootstrap)
-- enabling console access
console = require('console')
console.listen('127.0.0.1:3302')
-- http config
local charset = {} do -- [0-9a-zA-Z]
for c = 48, 57 do table.insert(charset, string.char(c)) end
for c = 65, 90 do table.insert(charset, string.char(c)) end
for c = 97, 122 do table.insert(charset, string.char(c)) end
end
local function randomString(length)
if not length or length <= 0 then return '' end
math.randomseed(os.clock()^5)
return randomString(length - 1) .. charset[math.random(1, #charset)]
end
local http_router = require('http.router')
local http_server = require('http.server')
local json = require('json')
local httpd = http_server.new('0.0.0.0', 8080, {
log_requests = true,
log_errors = true
})
local router = http_router.new()
local function get_count()
local cnt = box.space.example:len()
return cnt
end
router:route({method = 'GET', path = '/count'}, function()
return {status = 200, body = json.encode({count = get_count()})}
end)
router:route({method = 'GET', path = '/token'}, function()
local token = randomString(32)
local last = box.space.example:len()
box.space.example:insert{ last + 1, token }
return {status = 200, body = json.encode({token = token})}
end)
prometheus = require('prometheus')
fiber = require('fiber')
tokens_count = prometheus.gauge("tarantool_tokens_count",
"API Tokens Count")
function monitor_tokens_count()
while true do
tokens_count:set(get_count())
fiber.sleep(5)
end
end
fiber.create(monitor_tokens_count)
router:route( { method = 'GET', path = '/metrics' }, prometheus.collect_http)
httpd:set_router(router)
httpd:start()
ααΎααααααΆαααΆααΆααα½αα ααα½ααα αααα»α lua αααααααααα·αα·ααααααααΆα ααΆααΆααααααααΌαααΆαααΆα αΆαααΆα αααΎααααΈαααααΎαααααα’ααααα αααααα
local charset = {} do -- [0-9a-zA-Z]
for c = 48, 57 do table.insert(charset, string.char(c)) end
for c = 65, 90 do table.insert(charset, string.char(c)) end
for c = 97, 122 do table.insert(charset, string.char(c)) end
end
αααααΆααααΈααα ααΎααααααΆααα»αααΆααα½α - randomString α αΎααααααααααααααααααααα»αααααααα
local function randomString(length)
if not length or length <= 0 then return '' end
math.randomseed(os.clock()^5)
return randomString(length - 1) .. charset[math.random(1, #charset)]
end
αααααΆααααααΎαααααΆααααααααα http αα·ααααΆαααΈααα http αα αααΆαααΈααα Tarantula ααααααΎα JSON αααααΎαααΉααααααα±αααα α’αα·αα·ααα
local http_router = require('http.router')
local http_server = require('http.server')
local json = require('json')
αααααΆααααΈααα ααΎαα αΆααααααΎααα ααΎα ααα 8080 αα ααΎα ααα»α αααααΆαααααΆαααΈααα http ααΆααα’αα αααααΉααααααααΆααΆααααααΎ αα·αααα α»αααΆααα’ααα
local httpd = http_server.new('0.0.0.0', 8080, {
log_requests = true,
log_errors = true
})
αααααΆααααΎααααααΆαααααΌαααΆααααα·αααΎααααΎααΆαα½ααα·ααΈααΆααααα GET αααααα ααα 8080 / ααΆαααααααΆααααααΎαα α αα»αααΆαααΈαααααΆαααα½αα ααΆαααα‘ααααααΆαααΆα - 200, 404, 403 α¬α’αααΈααααααααααΎααααααΆααα
router:route({method = 'GET', path = '/count'}, function()
return {status = 200, body = json.encode({count = get_count()})}
end)
αα αααα»ααα½ ααΎααααα‘αα json.encode ααΎααααααΆααααΆαα αα·αααα½αααΆαααααα»αααΆ αααααααΌαααΆαα α αα·ααααα αΆαα ααα½ααααααααααΆαα αααα»αααΌαααααΆααα·ααααααααααααΎαα
αα·ααΈααΆαααααααΈααΈα
router:route({method = 'GET', path = '/token'}, function()
local token = randomString(32)
local last = box.space.example:len()
box.space.example:insert{ last + 1, token }
return {status = 200, body = json.encode({token = token})}
end)
ααααααααΆαα αααα»ααα½α router:route({method = 'GET', path = '/token'}, function() ααΎαα α αα»αααΆα αα·ααααααΎααααααΆαααααΆααα
αααααΆαα αα·αα·ααααααααΆααΌαααααΆα = randomString(32) ααΊααΆααααα’ααααα
ααααααα 32 αα½α’ααααα
αα
αααα»ααα½α local last = box.space.example:len() ααΎαααααΆαα»α
α»ααααααα
ααα
α αΎααα
αααα»ααααααΆαα box.space.example:insert{ last +1, token } ααΎαααααααα·αααααααα
αααα»αααΌαααααΆααα·ααααααααααααΎα αααααΊααΎαααααΆαααααααααΎαααααααααΆααααα 1 α αααα’αΆα
ααααΌαααΆαααααΎααααα·ααΈααα αα·αααααΉαααααΆααααααααα
ααααΌαα
ααααααααααα Tarantula ααΆαααααΆαααααααΆααααααΈαααα
ααΎαααααααα·αα·ααααααααΆαα ααΈαααα
ααΌα αααα ααΎαβααΆαβαααααβαααααα·ααΈβαααα»αβα―αααΆαβαα½αα α’αααα’αΆα α αΌαααααΎαα·ααααααααΆαααααΆαα α αΎααααΌαα»ααααα’ααααΉαααααΎααΆαααΆαααααααααΆααα’αααααααΆααα’αααα
ααΆααααΆαα http αα·αααααΎααΆαααΆαα½ααα·αααααα α’αααΈααααααααΆαααΊαα αααα»αα§ααΆα ααααααα½α - ααΆαααααααα·ααΈ αα·ααα·ααααααα ααΌα ααααα αΎα α’αααΈαααΎαα‘αΎααααΆαααΏαα
ααΎααααΈααααΎαααΆα ααΎαααα‘αΎααααΌαα»α httpα
αααααααααΎαααααΎααΆααΌαααΎααα ααααα spoiler
root@test2:/# tarantoolctl rocks install http
Installing http://rocks.tarantool.org/http-scm-1.src.rock
Missing dependencies for http scm-1:
checks >= 3.0.1 (not installed)
http scm-1 depends on checks >= 3.0.1 (not installed)
Installing http://rocks.tarantool.org/checks-3.0.1-1.rockspec
Cloning into 'checks'...
remote: Enumerating objects: 28, done.
remote: Counting objects: 100% (28/28), done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 28 (delta 1), reused 16 (delta 1), pack-reused 0
Receiving objects: 100% (28/28), 12.69 KiB | 12.69 MiB/s, done.
Resolving deltas: 100% (1/1), done.
Note: checking out '580388773ef11085015b5a06fe52d61acf16b201'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b <new-branch-name>
No existing manifest. Attempting to rebuild...
checks 3.0.1-1 is now installed in /.rocks (license: BSD)
-- The C compiler identification is GNU 7.5.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Found TARANTOOL: /usr/include (found version "2.4.2-80-g18f2bc82d")
-- Tarantool LUADIR is /.rocks/share/tarantool/rocks/http/scm-1/lua
-- Tarantool LIBDIR is /.rocks/share/tarantool/rocks/http/scm-1/lib
-- Configuring done
-- Generating done
CMake Warning:
Manually-specified variables were not used by the project:
version
-- Build files have been written to: /tmp/luarocks_http-scm-1-V4P9SM/http/build.luarocks
Scanning dependencies of target httpd
[ 50%] Building C object http/CMakeFiles/httpd.dir/lib.c.o
In file included from /tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:32:0:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c: In function βtpl_termβ:
/usr/include/tarantool/lauxlib.h:144:15: warning: this statement may fall through [-Wimplicit-fallthrough=]
(*(B)->p++ = (char)(c)))
~~~~~~~~~~~^~~~~~~~~~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:62:7: note: in expansion of macro βluaL_addcharβ
luaL_addchar(b, '\');
^~~~~~~~~~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:63:6: note: here
default:
^~~~~~~
In file included from /tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:39:0:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/tpleval.h: In function βtpe_parseβ:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/tpleval.h:147:9: warning: this statement may fall through [-Wimplicit-fallthrough=]
type = TPE_TEXT;
~~~~~^~~~~~~~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/tpleval.h:149:3: note: here
case TPE_LINECODE:
^~~~
In file included from /tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:40:0:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h: In function βhttpfast_parseβ:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h:372:22: warning: this statement may fall through [-Wimplicit-fallthrough=]
code = 0;
~~~~~^~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h:374:13: note: here
case status:
^~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h:393:23: warning: this statement may fall through [-Wimplicit-fallthrough=]
state = message;
~~~~~~^~~~~~~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h:395:13: note: here
case message:
^~~~
[100%] Linking C shared library lib.so
[100%] Built target httpd
[100%] Built target httpd
Install the project...
-- Install configuration: "Debug"
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/VERSION.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lib/http/lib.so
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/server/init.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/server/tsgi_adapter.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/nginx_server/init.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/init.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/fs.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/matching.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/middleware.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/request.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/response.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/tsgi.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/utils.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/mime_types.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/codes.lua
http scm-1 is now installed in /.rocks (license: BSD)
root@test2:/#
ααΎαααααααΌαααΆα prometheus ααΎααααΈααααΎαααΆαα
root@test2:/# tarantoolctl rocks install prometheus
Installing http://rocks.tarantool.org/prometheus-scm-1.rockspec
Cloning into 'prometheus'...
remote: Enumerating objects: 19, done.
remote: Counting objects: 100% (19/19), done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 19 (delta 2), reused 5 (delta 0), pack-reused 0
Receiving objects: 100% (19/19), 10.73 KiB | 10.73 MiB/s, done.
Resolving deltas: 100% (2/2), done.
prometheus scm-1 is now installed in /.rocks (license: BSD)
root@test2:/#
ααΎαα αΆααααααΎα αα·αα’αΆα α αΌαααααΎαααΌαα»α
root@test2:/# curl -D - -s http://127.0.0.1:8080/token
HTTP/1.1 200 Ok
Content-length: 44
Server: Tarantool http (tarantool v2.4.2-80-g18f2bc82d)
Connection: keep-alive
{"token":"e2tPq9l5Z3QZrewRf6uuoJUl3lJgSLOI"}
root@test2:/# curl -D - -s http://127.0.0.1:8080/token
HTTP/1.1 200 Ok
Content-length: 44
Server: Tarantool http (tarantool v2.4.2-80-g18f2bc82d)
Connection: keep-alive
{"token":"fR5aCA84gj9eZI3gJcV0LEDl9XZAG2Iu"}
root@test2:/# curl -D - -s http://127.0.0.1:8080/count
HTTP/1.1 200 Ok
Content-length: 11
Server: Tarantool http (tarantool v2.4.2-80-g18f2bc82d)
Connection: keep-alive
{"count":2}root@test2:/#
/ ααΆαααααααα±ααααΎαααΌαααααΆαααΆα 200 α
/token α
αα token α αΎαααααα token ααααα
ααΆαα databaseα
ααααΏαααΆααααα
α αΌαααααΎαααΆααααααααΆααααααΆααααααΎ 50 α ααααΎααααα½αααααααααΉαααΆα 000 α
root@test2:/# ab -c 500 -n 50000 http://127.0.0.1:8080/token
This is ApacheBench, Version 2.3 <$Revision: 1807734 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 127.0.0.1 (be patient)
Completed 5000 requests
Completed 10000 requests
Completed 15000 requests
Completed 20000 requests
Completed 25000 requests
Completed 30000 requests
Completed 35000 requests
Completed 40000 requests
Completed 45000 requests
Completed 50000 requests
Finished 50000 requests
Server Software: Tarantool
Server Hostname: 127.0.0.1
Server Port: 8080
Document Path: /token
Document Length: 44 bytes
Concurrency Level: 500
Time taken for tests: 14.578 seconds
Complete requests: 50000
Failed requests: 0
Total transferred: 7950000 bytes
HTML transferred: 2200000 bytes
Requests per second: 3429.87 [#/sec] (mean)
Time per request: 145.778 [ms] (mean)
Time per request: 0.292 [ms] (mean, across all concurrent requests)
Transfer rate: 532.57 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 10 103.2 0 3048
Processing: 12 69 685.1 15 13538
Waiting: 12 69 685.1 15 13538
Total: 12 78 768.2 15 14573
Percentage of the requests served within a certain time (ms)
50% 15
66% 15
75% 16
80% 16
90% 16
95% 16
98% 21
99% 42
100% 14573 (longest request)
root@test2:/#
αααααΆαααααΆααααααΌαααΆαα ααα α αΎαααΎααααα»ααααααααΆαα·ααααααα₯ααααααα 99% ααααααΎααααΌαααΆααααα αααααα»ααααααα 42 αα·ααααΈαα·ααΆααΈα ααΌα ααααα αΎα ααΎαααΆαααααΎαααα αα 3500 αααα»ααα½ααα·ααΆααΈαα ααΎαααΆαααΈαααΌα αα½α αααααΆαααααΌα 2 αα·αα’αααα αα αΆα 4 ααΈα αααΆααα
α’αααααα’αΆα ααααΎαααΎααα·αα·ααααααααΆ 50000 α αΎαααΎααααααααααααΆα
α’αααα’αΆα ααααΎαα·αααααΉααα http ααααΎαααΆααα»αααΆαααααααΆαααααααααααααΎαααΆααα·ααααααααααα’αααα ααΎαααΈααα ααΆαααΆααααααααααα α§ααΆα αααα’αααα’αΆα α α αα»αααΆααα ααΎααΆαα’αΆααααααα·αα·αααααΎαα’αααΈαα½α - αα½ααα»αααΆααααααααα·α α
α’αααα’αΆα ααααααααααα·ααΈααααααΈααααααααΆαααα αααα»ααααΆαααΈαααααΌαααααΆααα·ααααααααααααα½αα―α αα·ααα·αααααΌαααΆαααααααααα’αααΈααΆααα’αα ααααΆαααααΌαα»αααΆαα½α αα·αα’αα»αααααααααα·ααααΆααΆαα½αα
αααΆαααΈααααααααα·ααΈα’αΆα α αΌαααααΎαααΆαααΈαααααΆααααα αααααΌααα·αααααα αα·αααααααααΆαα αααα»αααΌαααααΆααα·ααααααααααααΆα αα·ααααααααΈααΌαααααΆααα·αααααααααααΉαααααΌαααΆαααααΎααααΆααααααααααα·ααΈααααααααα
αααααΉαααααΌαααΆαααααΎα‘αΎαααα Tarantula αααα½αα―αα αΎααα·αα αΆαααΆα αααααααααααα·ααΈααΆα ααααα‘ααααα
αα αααα»αααα ααααΈααααα·ααααΆα
αααααααΆααααααΆαααααααααΌαααααΆαααΆαααααα»αααααα α’αααααααΈααΈαααΉαααααΌαααΆαααααα»αααααΆαααααααα ααΎαααα»α Mail.ru Group α αΎαααΎαααΉααααααααααααααΆαααα ααΆαα αααα»αα’ααααααααα
ααααα·αααΎα’αααα
αΆααα’αΆαααααααααα»αααΆαα
αΌααα½ααααα»αααααΉαααα·ααΆααααααααΎααααααΎαααΏαααΆαααααααΆαα’ααΈαααΊαα·α αα·ααα½ααααα½ααααα»ααααααΆααααααα ααΌαααααΆαααα
ααααα·αααΎα’αααααααΌαααΆαααααΆααααΈαα
ααα α¬ααΆααααα½αα’αααΈα αααααΆαα
ααΆααααααααααααα’ααα
PS ααΎαααΆααααααααα₯ααα·αααααα
ααα½α 2 αααα»ααα½ααα αααα ααααΆααααααααααα’αααααΉαααααΆαααΆαα½ααααα»αα
αααααα½αααα
ααααα: www.habr.com