แฎแฃแแ แฌแแแก แฌแแ แแชแแแ แแฃแจแแแแ Tarantool-แแแ, แแแแ แแ แจแแแแแ แแก แแ แแแแแแแแแแ. แแแแ แแ แแฎแแแฎแแ แแแแแแ แแ แแแแแแแ แ, แกแแแแช แแแกแแฃแแ แ Hadoop-แแ แแ แ แแแแ แแฃแจแแแแก MapReduce. แแฅ แแแ แแแแแกแแแก แแแแฎแแ: "แ แแขแแ แแ แแแแแแงแแแแ Tarantool แแ แแแแชแแแแกแแแแก?"
แชแแแแแกแแแงแแแ แแแแแก แแแแ แแแแแแฌแงแแแขแ แแแแแ แฃแแแแฃแแแงแแแ, แแแแแแชแแแ แฃแแฎแแแกแ แแแ แกแแ - แแ แแแฏแแ แแ แซแแแแแ แแแแแฌแแแ แแ แแแฅแขแ. แแฎแแ แแ แแแฉแแแแแแ, แแฃ แ แแแแ แฃแแแ แแแฌแแ แแ แแแ แขแแแ แแแแแแแชแแ Tarantool-แจแ, แฉแแขแแแ แแแ แแ แจแแแแแฌแแแ แแแกแ แจแแกแ แฃแแแแ แแ แแแฎแแแ, แ แแแแแแแ แแแ แขแแแ แแ แแแแแ แแ แงแแแแแคแแ แ.
แ แ แแ แแก Tarantool
Tarantool แแแแแชแแแแแ แแแก แ แแแแ แช แฃแแขแ แ แกแฌแ แแคแ แแแแแชแแแแ แแแแ. แแฅแแแ แจแแแแซแแแแ แแแแแแแแกแแ แแแแแกแแแแ แ แแแแแชแแแ, แ แแแแแแช แแกแฃแ แ. แแแ แแ แแแแกแ, แแแแแแแ แแ แแกแแแ, แคแ แแแแแแขแ - แแแฃ, แแแงแแแแ แแแแ แ แแแแแแแแแ แแแแแชแแแแแ แ แแแแแแแแ แกแแ แแแ แแ แแ แแแแแ แแแแแแ แแแแแแ แแแฆแแแฃแแ แจแแแแแแแ - แจแแฅแแแแแ แจแแชแแแแแก แจแแแฌแงแแแ แแแแแแ Master-Master แแแแจแแ แแแ.
แแแแ แแช, แแก แแ แแก แแแแแแแชแแแก แกแแ แแแ แ. แจแแแแซแแแแ แแแกแแ แแแฌแแ แแ แแฅแแแแ แแแแแแแชแแแแ, แแแฃแจแแแ แแแแแชแแแแแแแ, แแแแแแแแแ, แฌแแจแแแแ แซแแแแ แฉแแแแฌแแ แแแ แคแแแแ แแแ แแแแฃแแ แฌแแกแแแแก แแแฎแแแแแ. แแฅแแแ แจแแแแซแแแแ แแแฌแแ แแ Http แกแแ แแแ แ แแแ แแแแแ Tarantula-แจแ, แ แแแแแแช แแแฃแจแแแแแก แแแแแชแแแแแแแ: แแแแแแฅแแแงแแแ แแแแ แ แแแแแแแแ, แฉแแฌแแ แแ แแฎแแแ แแแแแชแแแแแ แแฅ แแ แจแแแแชแแ แแ แแก แงแแแแแคแแ แ แแแกแขแแ แแ.
แฌแแแแแแแฎแ แกแขแแขแแ แแแแก แจแแกแแฎแแ, แแฃ แ แแแแ แจแแฅแแแแก แแแญแแแแ แจแแขแงแแแแแแแแแแก แ แแแก 300 แกแขแ แแฅแแแ, แ แแแแแแช แฃแแ แแแแ แแคแแแฅแแแก แแ แฉแฅแแ แแแก - แแแ แแฅแแ แแแแแแแแฃแ แ แจแแกแ แฃแแแแ 20 แจแแขแงแแแแแแแ แฌแแแจแ. แแฅ แแแแแแแแแ แจแแแแซแแแแ แจแแแแแ แฃแแแแ แแ แแแฌแแ แแ แซแแแแแ แแแแ แแแแแแแชแแ, แแ แแก แแ แแฅแแแแ แจแแแแฎแแ, แ แแแแ แช PostgreS-แจแ.
แแ แจแแแแชแแแแ แแฆแแฌแแ แ แ แแฆแแช แแ แกแแ แแแ แแก แแกแแแแกแ, แแฎแแแแ แแแ แขแแแ, แแ แกแขแแขแแแจแ.
แแแงแแแแแแก
แขแแกแขแแกแแแแก แแแแแฌแงแ แกแแแ แกแขแแแแแ แขแฃแแ แแแ แขแฃแแแฃแ แ แแแแฅแแแ - 20 GB แแงแแ แ แแแกแแ, Ubuntu 18.04. 2 แแแ แขแฃแแแฃแ แ แแ แแชแแกแแ แ แแ 4 แแแแ แแแฎแกแแแ แแแ.
แฉแแแ แแแแแแแกแขแแแแ แแ Tarantool - แแแฃแจแแแ bash แกแแ แแแขแ แแ แแแแแแแขแแ แกแแชแแแ แแ แแแแแแแแ Apt แแแแแแกแขแแแแ แแ Tarantool. แแแฃแแ แกแแ แแแขแแแ - (curl -L
tarantoolctl - แขแแ แแแขแฃแแแก แแแกแขแแแชแแแแแก แแแ แแแแก แแแแแแ แ แแ แซแแแแแ.
/etc/tarantool - แแฅ แแ แแก แแแแแ แแแแคแแแฃแ แแชแแ.
var/log/tarantool - แแ แแแ แแแ.
var/lib/tarantool โ แแแแแชแแแแแ แแฅ แแแแก แแ แจแแแแแ แแงแแคแ แแแกแขแแแชแแแแแ.
แแ แกแแแแแก แกแแฅแแฆแแแแแแแ instance-available แแ instance-enable - แจแแแชแแแก แแก, แ แแช แแแจแแแแฃแแ แแฅแแแแ - แแแกแขแแแชแแแก แแแแคแแแฃแ แแชแแแก แคแแแแ lua แแแแแ, แ แแแแแแช แแฆแฌแแ แก แ แแแแ แแแ แขแแแก แฃแกแแแแก, แ แ แแแฎแกแแแ แแแ แแฅแแก แแแกแแแแก แฎแแแแแกแแฌแแแแแ, แแแแแแแก แซแ แแแแก แแแ แแแแขแ แแแ, แแแแ, แ แแแแแแช แแฃแจแแแแก แแแจแแแแแกแแก. แกแแ แแแ แแแ, แแแจแแ, แ แแแแแ, แแแซแแแแแแฃแแ แแแแแชแแแแแแก แฌแแจแแ แแ แ.แจ.
แแแกแขแแแชแแแแ แแฃแจแแแแก แ แแแแ แช PostgreS-แจแ. แแแแแแแแแ, แแกแฃแ แ แแแฃแจแแแ แแแแแชแแแแ แแแแแก แ แแแแแแแแ แแกแแ, แ แแแแแแช แแแแแแแแฃแแแ แกแฎแแแแแกแฎแแ แแแ แขแแแแ. แแแแแแแก, แ แแ แแ แ แกแแ แแแ แแ แแแจแแแแฃแแแ แแแแแชแแแแ แ แแแแแแแแ แแแกแขแแแชแแ, แ แแแแแแแช แกแฎแแแแแกแฎแแ แแแ แขแแแ แแแแแแแแฃแแ. แแแ แจแแแซแแแแ แฐแฅแแแแแ แกแ แฃแแแแ แแแแกแฎแแแแแแฃแแ แแแ แแแแขแ แแแ - แแ แแ แแแกแขแแแชแแ แแฎแแ แชแแแแแแก แแ แ แแแแแแแก, แแแแ แ - แแแแ แแก.
แแแกแขแแแชแแแก แแแแแฏแแแแขแ
แฉแแแ แแแแฅแแก tarantoolctl แแ แซแแแแแ, แ แแแแแแช แกแแจแฃแแแแแแก แแแซแแแแ แแแ แแแ Tarantula แแแกแขแแแชแแแแ. แแแแแแแแแ, tarantoolctl แจแแแแฌแแแแแก แแแแแแแแ แจแแแแแฌแแแแก แแแแคแแแฃแ แแชแแแก แคแแแแก แแ แแขแงแแแก - แคแแแแ แฌแแกแ แแแจแแ, แแฃ แแฅ แกแแแขแแฅแกแฃแ แ แจแแชแแแแแแ แแ แแ แแก.
แแฅแแแ แจแแแแซแแแแ แแแฎแแ แแแกแขแแแชแแแก แกแขแแขแฃแกแ - tarantoolctl แกแขแแขแฃแกแแก แแแแแแแแ. แแแแแแแแฃแ แแ แจแแแแซแแแแ แแแแแแแแ แแแฌแงแแแ, แแแฉแแ แแแ, แแแแแขแแแ แแแ.
แแแกแขแแแชแแแก แแแจแแแแแก แจแแแแแ, แจแแแแซแแแแ แแแฃแแแแจแแ แแแ แแแก แแ แ แแแแ.
1. แแแแแแแกแขแ แแชแแฃแแ แแแแกแแแ
แแแแฃแแแกแฎแแแแแ, Tarantool แฎแกแแแก แกแแแแขแก, แแแ แแแแฃแ แ ASCII แขแแฅแกแขแ แแแแแแแแแ แแฅ Tarantool-แแก แแแกแแแแแขแ แแแแแแแ. แแแแกแแแแแ แแแแแแจแแ แแแ แงแแแแแแแแก แฎแแแแ แแแแแแแกแขแ แแขแแ แแก แแแแฎแแแ แแแแแก แฅแแแจ, แแ แแ แแก แแแแแแขแแคแแแแชแแ, แแแแขแแ แแ แแ แแก แกแแญแแ แ แแแแกแแแแก แแแ แขแแก แแฅแกแขแแ แแแแแแแแ Tarantula-แก แกแแแแ แแแแแ.
แแ แแแแแแแ แแแกแแแแแจแแ แแแแแ, แแฅแแแ แฃแแแ แจแแแงแแแแแ Tarantoolctl, แจแแแงแแแแแ แแแกแขแแแชแแแก แกแแฎแแแ. แแ แซแแแแแ แแแฃแจแแแแก แแแแกแแแก แแ แแแฃแแแแจแแ แแแแ แ แแแแ แช แแแแแแแกแขแ แแขแแ แ. แแ แแกแแแแก แแแแแแจแแแ แแแแ แแแแกแแแแก แแแ แขแ แแแ แแแแ - แฃแแฏแแแแกแแ แแแขแแแแ แแแ แ แแแแ แช แแ แแแฃแแแก แกแแแแขแ. แแแจแแ แแฎแแแแ แแแ, แแแกแแช แแฅแแก แฌแแแแแ แกแแแแขแแ แฉแแฌแแ แแแ, แจแแซแแแแก แขแแ แแแขแฃแแแกแแแ แแแแแแจแแ แแแแก.
แแก แแแแแแ แกแแญแแ แแ แแแแแแแกแขแ แแชแแฃแแ แกแแฅแแแแแแกแแแแก. แแแแแชแแแแแแแ แแฃแจแแแแแกแแแแก แแแแแแงแแแแ แแแแ แ แแแแแแ - แแแแแ แฃแแ แแ แแขแแแแแ.
2. แแ แแแแแ แแ แแขแแแแแแก แแแแแงแแแแแ แแแแแ แแขแฃแ แแแ แขแแแ แแแกแแแแแจแแ แแแแแ
แแแแคแแแฃแ แแชแแ แจแแแชแแแก แแแกแแแแแก แแแ แแฅแขแแแแก, แ แแแแแแช แฎแกแแแก แแแ แขแก แแแ แ แแแแฃแแแแแชแแแแแกแแแแก. แแก แแแ แขแ แแแแแแงแแแแแ แแ แแแแแ แแ แแขแแแแแแ แแ แแฅ แฉแแ แแฃแแแ แแแแแแขแแคแแแแชแแ.
แแ แแแแจแแ แแกแแแแก แแแแแแงแแแแแ tarantoolctl connect to แแแ แขแแก แแแแแ แ. แแแกแ แแแแแงแแแแแแ แจแแแแซแแแแ แแแฃแแแแจแแ แแแ แแแกแขแแแชแแฃแ แกแแ แแแ แแแก, แแแแแแงแแแแ แแแขแแ แแแแชแแ แแ แแแกแชแแ แกแฎแแแแแกแฎแแ แฌแแแแแแก แฃแคแแแแ.
แแแแแชแแแแ แฉแแฌแแ แแก แแ แงแฃแแแก แแแแฃแแ
แแแแแแแแ Tarantool แแ แแก แแแแแชแแแแ แแแแแช แแ แแแแแแแชแแแก แกแแ แแแ แแช, แแแก แแฅแแก แกแฎแแแแแกแฎแแ แแแแฃแแ. แฉแแแ แแแแแแขแแ แแกแแแก แงแฃแแแก แแแแฃแแ - แแก แแฎแแ แชแแแแแแก แแแแแชแแแแแแแ แแฃแจแแแแแก. แ แแแแกแแช แ แแฆแแชแแก แฌแแ แ แงแฃแแจแ, Tarantool แฌแแ แก แแแแแชแแแแแก แแแกแแแ, แแแแฎแแแก แแแก แแแฎแกแแแ แแแแจแ แแ แแแแแแแก แกแฎแแ แ แแแแก.
แฉแแแแฌแแ แแแแก
แแแแแแแแแ, แฉแแแ แจแแแแแแแ แ box แแแแฃแแจแ แแ แแแแฃแฌแแแแแ box.one แคแฃแแฅแชแแแก. แแก แแแซแฃแแแแก 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
แแแแก แจแแแแแ แแฅแแแแ แแแ แแแแแ แแแแแฅแกแก - แแแ แแแแแแก - แ แแแแแแแช แจแแแแแซแแแ แแแแแชแแแแแแก แแแซแแแแ. แแแแฃแแแกแฎแแแแแ, แแฃ แแ แแแฃแแแแแแ แ แแแแ แแแ แแแแขแ แก, แแแแแแฃแแ แฉแแแแฌแแ แแก แแแ แแแแ แแแแ แแแแแงแแแแแฃแแ แแฅแแแแ แแแ แแแแแแ แแแแแฅแกแแกแแแแก.
แจแแแแแ แกแขแฃแแแ แแแแฎแแแ แแแแแก แแแซแแแแ แแ แแแขแก, แ แแแแแก แแแฎแแแแแแแช แแฃแแแแจแแ แแแแแ แแแแแ แฃแแ แแ แแขแแแแแแก แแแจแแแแแแ. แฉแแแ แแฃแจแแแแ แแแแฎแแแก, แฌแแ แแก แแ แจแแกแ แฃแแแแแก แแแแ แแแกแขแแแชแแแแ.
แฉแแแฃแแแแ แแ แแแแแชแแแแ แแแแแแแแ แจแแแแ แแแแ, แแฅ แงแแแแแคแแ แ แกแแแแแแ แแแ แขแแแแ. แฉแแแ แแแแฅแแก แกแแแ แชแ - แขแแ แแขแแ แแ, แ แแแแแจแแช แฉแแแแ แแแแแชแแแแแ แฃแแ แแแแ แแแแฎแแแ. แแแแแแฃแ แฉแแแแฌแแ แก แขแฃแแแ แแฌแแแแแ. แแก แจแแคแฃแแฃแแแ MessagePack-แจแ. แแก แซแแแแแ แแแแแ แ แคแแ แแแขแแ - แแ แแแแแแ แแ แแแแแแ แแแแแแก แแแแแแแก - 18 แแแแขแ 27-แแก แฌแแแแแฆแแแแ.
แแแกแแแ แแฃแจแแแแ แกแแแแแแ แแแกแแฎแแ แฎแแแแแแ. แแแแฅแแแก แงแแแแ แฎแแแก, แงแแแแ แแแแแชแแแแ แฉแแแแฌแแ แก แจแแแซแแแแ แฐแฅแแแแแก แกแ แฃแแแแ แแแแกแฎแแแแแแฃแแ แกแแแขแแแ.
แฉแแแ แจแแแแแซแแแ แแแแฎแแ แงแแแแ แกแแแ แชแ Box.space แแ แซแแแแแแก แแแแแงแแแแแแ. แแแแแ แแขแฃแแ แแแแแแแแแก แจแแกแแ แฉแแแแ แฉแแฌแแ แแ box.space แแแแแแแแ แแ แแแแฆแแ แกแ แฃแแ แแแคแแ แแแชแแ แแแก แจแแกแแฎแแ.
Tarantool-แก แแฅแแก แแ แ แฉแแจแแแแแฃแแ แซแ แแแ: Memory แแ Vinyl. แแแฎแกแแแ แแแ แแแแฎแแแก แงแแแแ แแแแแชแแแก แแแฎแกแแแ แแแแจแ. แแแแขแแ แงแแแแแคแแ แ แแแ แขแแแแ แแ แกแฌแ แแคแแ แแฃแจแแแแก. แแแแแชแแแแแ แแงแ แแแ แแแกแแแ แแ แแกแแแ แแ แแก แฉแแฌแแ แแก แฌแแแ แแฃแ แแแแแก แแแฅแแแแแแ, แแกแ แ แแ, แฉแแแ แแ แแคแแ แก แแแแแแ แแแแ, แแฃ แกแแ แแแ แ แแแคแฃแญแแ.
แแแแแแ แแแแฎแแแก แแแแแชแแแแแก แแแกแแแ แฉแแแแแแแก แฃแคแ แ แแแชแแแแ แคแแ แแแ - แแแฃ แแฅแแแ แจแแแแซแแแแ แจแแแแแฎแแ แแแขแ แแแแแชแแแ แแแแ แ แฉแแแ แแแแฅแแก แแแฎแกแแแ แแแ แแ แขแแ แแแขแฃแแ แฌแแแแแแฎแแแก แแแก แแแกแแแแแ.
แแฎแแ แฉแแแ แแแแแแแงแแแแแ แแแฎแกแแแ แแแแก.
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>
Index:
แแแ แแแแแแ แแแแแฅแกแ แฃแแแ แจแแแฅแแแแก แแแแแกแแแแ แ แกแแแ แชแแกแแแแก, แ แแแแแ แแแก แแแ แแจแ แแ แแคแแ แ แแแฃแจแแแแแก. แ แแแแ แช แแแแแกแแแแ แแแแแชแแแแ แแแแแจแ, แฉแแแ แแฅแแแแ แแแ แแแ แแแแก - แฉแแแแฌแแ แแก ID.
แแแฌแแแแแ:
แแฅ แฉแแแ แแแแฃแแแแแแ แ แแกแแแ แจแแแแแแ แฉแแแแ แแแแแฅแกแ. แแแ แจแแแแแแ แแ แแ แแแฌแแแแกแแแแ - แแแ แแแแ แแแแ, แ แแแแแกแแช แฉแแแ แแแแแแแงแแแแแ, แแ แแก แขแแแแก unsigned - แแแแแแแแ แแแแแ แ แแชแฎแแ. แ แแแแแแแแแช แแ แแแฎแกแแแก แแแแฃแแแแขแแชแแแแแ, แแแฅแกแแแแแฃแ แ แ แแแแแแแแ, แ แแช แจแแแซแแแแ แแงแแก, แแ แแก 18 แแแแแขแแแแแแ. แฒแก แแแแ แแ.
แจแแแแแ แฉแแแ แจแแแแแซแแแ แฉแแแกแแแ แแแแแชแแแแแ insert แแ แซแแแแแแก แแแแแงแแแแแแ.
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 แคแแ แแแขแจแ, แ แแแแแแช แแแแแ แแฆแแฌแแ แ.
แแแแแชแแแแ แแแแแแแแแแ
แจแแแแแ แฉแแแ แจแแแแแซแแแ แแแแแชแแแแแแก แฉแแแแแแ Select แแ แซแแแแแแก แแแแแงแแแแแแ.
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']
...
แจแแแแฎแแ
แแฃ แฉแแแ แแแแแแขแแแ แแแแ แแแกแขแแแชแแแก แแ แแแแแ แแชแแแแแแ แแแแแชแแแแ แแแแแซแแฎแแแแก, แแแแแแแฎแแแ, แ แแ แแก แแฅ แแ แแ แแก - แงแแแแแคแแ แ แชแแ แแแแแ. แแก แแแแขแแ แฎแแแแ, แ แแ Tarantool แแแแแแแก แกแแแแแขแ แแแ แแฃแแฅแขแแแก แแ แแแแฎแแแก แแแแแชแแแแแก แแแกแแแ, แแแแ แแ แแฃ แแฃแจแแแแแก แจแแแฌแงแแแขแ แแแแแแแแ แจแแแแฎแแแแแ, แฉแแแ แแแแแแ แแแแ แงแแแแ แแแแ แแชแแแก - แแแแขแแ, แ แแ แฉแแแ แแฆแแแแแแแ แแแแ แแแแจแแแ แแฃแแฅแขแก, แ แแแแแแช แแงแ, แแแแแแแแแ, แแ แ แกแแแแแก แฌแแ.
แงแแแแแ แฌแแแแก แแแแแแแแช แแ แแแฃแจแแแแแก, แ แแแแแ 20 GB แแแกแแแ แแฃแแแแแแ แแแแแงแ แ แแ แแ แแก แแแ แแ แแแแ.
แแ แแแแแแ แแแแแแแแแแก แแ แแแแฎแแ แชแแแแแ แฉแแฌแแ แแก แฌแแแ แแฃแ แแแแแก แแแแชแแคแชแแ. แแแกแ แแแฎแแแ แแแแ, แแแแแชแแแแแแก แงแแแแแ แชแแแแแแแแกแแแแก, แฉแแแแฌแแ แ แแฅแแแแแ แแชแแ แ แฉแแฌแแ แแก แแฃแ แแแแแก แคแแแแจแ.
แงแแแแแ แฉแแแแฌแแ แ แกแแแฃแจแแแแแแ แแแแฎแแแ แแแแจแ. แแ แคแแแแแแแกแแแแก แฉแแแ แแแงแแแแแ แแแแแก - แแแแแแแแแ, 64 แแ. แ แแแแกแแช แแก แกแแแกแแ, แฉแแฌแแ แ แแฌแงแแแ แแแแ แ แคแแแแแ แแแแแกแแแ. แแ แแแแแขแแแ แแแแก แจแแแแแ, Tarantool แแฆแแแแแ แแแแ แกแแแฃแจแแแแแแ แแ แจแแแแแ แแแแแแแก แงแแแแ แจแแแแแแ แขแ แแแแแฅแชแแแแ, แกแแแแ แแ แจแแฉแแ แแแแ.
แแกแแแ แฉแแฌแแ แแก แแแแกแแฎแแ แชแแแแแแแแ, แแฅแแแ แฃแแแ แแแฃแแแแแ แแแ แแแแขแ box.cfg แแแ แแแแขแ แแแจแ (แแแแแแแแแ.lua แคแแแแจแ):
wal_mode = โwriteโ;
แแแแแชแแแแแแก แแแแแงแแแแแ
แ แแช แแฎแแ แแแแฌแแ แแ, แจแแแแซแแแแ แแแแแแงแแแแ Tarantula แแแแแชแแแแแแก แจแแกแแแแฎแแ แแ แแก แซแแแแแ แกแฌแ แแคแแ แแแฃแจแแแแแก แ แแแแ แช แแแแแชแแแแ แแแแ. แแฎแแ แแ แแแแชแฎแแแ แ แแ แแก แแก, แ แแกแ แแแแแแแแแช แจแแแแซแแแแ แแ แงแแแแแคแ แแกแแแแก.
แแแแแชแฎแแแแก แแแฌแแ แ
แแแแแแแแแ, แแแแฌแแ แแ แจแแแแแแ แแแแแแแชแแ แขแแ แแแขแฃแแแแ
แแฎแแแแ แแแแแแแชแแ แกแแแแแแ แแก แฅแแแจ
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 /count, แแแจแแ แแแแแแแซแแฎแแแ แคแฃแแฅแชแแแก แแ แแ แฎแแแแแแ. แแก แแแ แฃแแแแก แกแขแแขแฃแกแก - 200, 404, 403 แแ แแแแแกแแแแ แกแฎแแแก, แ แแกแแช แฉแแแ แแแแฃแกแขแแแ.
router:route({method = 'GET', path = '/count'}, function()
return {status = 200, body = json.encode({count = get_count()})}
end)
แกแฎแแฃแแจแ แแแแ แฃแแแแ json.encode-แก, แแแกแจแ แแแแฃแแแแแแ count แแ getcount, แ แแแแแแช แแฌแแแแแ แแ แแฉแแแแแแก แฉแแแแฌแแ แแแแก แ แแแแแแแแแก แฉแแแแก แแแแแชแแแแ แแแแแจแ.
แแแแ แ แแแแแแ
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)
แกแแ แ แแแจแ แ แแฃแขแแ แ:route({method = 'GET', แแแ = '/token'}, แคแฃแแฅแชแแ() แฉแแแ แแฃแฌแแแแแ แคแฃแแฅแชแแแก แแ แแฅแแแแ แแแขแแแก.
แฎแแแ แแแแแแฃแ แ แแแจแแแ = randomString(32) แแ แแก 32 แกแแแแแแแกแแแ แจแแแแแแ แ แจแแแแฎแแแแแแ แกแขแ แแฅแแแ.
แฒฎแแแจแ แแแแแแแแ แแแ แแแแ = box.space.example:len() แฉแแแ แแแแแแฆแแแ แแแแ แแแแแแแขแก.
แแ แฎแแแจแ box.space.example:insert{ last + 1, token } แฉแแแ แแฌแแ แ แแแแแชแแแแแก แฉแแแแก แแแแแชแแแแ แแแแแจแ, แแแฃ แฃแแ แแแแ แแแแแ แแแ ID-แก 1-แแ. แแก แจแแแซแแแแ แแแแแแแแก, แกแฎแแแแ แจแแ แแก, แแ แ แแฎแแแแ แแ แแแฃแฎแแ แฎแแแแแ แแแแ. แขแแ แแแขแฃแแแจแ แแแแกแแแแก แแ แแก แแแแแแแแแแ แแแแแ.
แฉแแแ แแฌแแ แ แแแขแแแก แแฅ.
แแแ แแแแ, แฉแแแ แแแแฌแแ แแ แแแแชแฎแแแแแ แแ แ แคแแแแจแ. แแฅแแแ แจแแแแซแแแแ แแแ แแแแแ แแแแแแฃแแแ แแแ แแฅแแแแแ แแแแแชแแแแแแ แแ แงแฃแแแก แแแแฃแแ แจแแแกแ แฃแแแแก แงแแแแ แแแแซแฃแ แกแแฅแแแก แแฅแแแแแแแก.
แแก แฃแกแแแแก http-แก แแ แแฃแจแแแแก แแแแแชแแแแแแแ, แงแแแแแคแแ แ แแ แ แแแกแขแแแชแแแจแแ - แแแแแแแชแแแช แแ แแแแแชแแแแแแช. แแแแขแแ แงแแแแแคแแ แ แกแแแแแแ แกแฌแ แแคแแ แฎแแแแ.
แแแกแแฌแงแแแแ แฉแแแ แแแแแแแกแขแแแแ แแ http แแแแฃแแ:
แ แแแแ แแแแแแแแ แแแแก, แจแแฎแแแแ แกแแแแแแ แแก แฅแแแจ
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:/#
แฉแแแ แแกแแแ แแแญแแ แแแแ แแ แแแแแ แแแกแแจแแแแแ:
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:/#
/count แแแแซแแแแก แกแขแแขแฃแกแก 200.
/token แแแกแชแแแก แแแขแแแก แแ แฌแแ แก แแ แแแขแแแก แแแแแชแแแแ แแแแแจแ.
แกแแฉแฅแแ แแก แขแแกแขแแ แแแ
แแแแแ แแแแฃแจแแแ แกแแแ แแแแขแแชแแ แแแฉแแแแแแแแ 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, แแ แแแแ แแแฃแจแแแ แคแแแแก แคแฃแแฅแชแแแแ, แ แแแแแแแช แแแฃแจแแแแแแ แแฅแแแแก แแแแแชแแแแแก. แแแ แแ แแแแกแ, แแ แกแแแแแก แกแฎแแแแแกแฎแแ แขแ แแแแ แแแ. แแแแแแแแแ, แจแแแแซแแแแ แแแ แแแแ แคแฃแแฅแชแแแแ แแแแแฎแแแแแแแ, แจแแแแแฌแแแ แ แแแแ - แจแแแกแฌแแ แแ แแแแคแแแฅแขแแแ.
แแฅแแแ แจแแแแซแแแแ แแแฌแแ แแ แกแแ แแแขแแก แแแแแแแชแแแแ แฃแจแฃแแแแ แแแแแชแแแแ แแแแแก แกแแ แแแ แแ แแ แแ แจแแแแแคแแ แแแแ แแ แแคแ แแ, แแแแแแแจแแ แแ แแแแแกแแแแ แ แแแแฃแแ แแ แแแแแฎแแ แชแแแแแ แแแแแกแแแแ แ แแแแแแ.
แแแแแแแชแแแก แกแแ แแแ แก แจแแฃแซแแแ แแแ แ แกแแ แแแ แแแแ แฌแแแแแ, แแแแแชแแแแแแก แแแซแแแแ แแ แแแแแชแแแแ แแแแแจแ แแแแแขแแแ. แแ แแแแแชแแแแ แแแแแก แแแแแชแแแแแก แแแแแแงแแแแแแ แกแฎแแ แแแแแแแชแแแแ.
แขแแ แแแขแฃแแ แแแแก แแแแแ แแแแแแแแแก แแ แแฅแแแ แแ แแแแแฌแแแ แชแแแแ แแแแแชแฎแแแแก แแแฌแแ แ.
แแแกแแกแ แฃแแก
แแก แแแแ แแแฌแแ แแแแแแก แแฎแแแแ แแแ แแแแ แแแฌแแแแ. แแแแ แ แซแแแแแ แแแแ แแแแแฅแแแงแแแแแ Mail.ru Group-แแก แแแแแแ แแ แแ แแแกแแแแจแ แแฃแชแแแแแแแ แแแแแแแขแแแ แแแก แแแฃแแก.
แแฃ แแแแแขแแ แแกแแแ แแแแกแฌแ แแ แฆแแแแกแซแแแแแแก, แกแแแแช แฉแแแ แแแจแแแแแ แแ แแแแแแแก แแแแแแ แแ แแแฃแกแแแ แจแแแแแฎแแแแ แ แแแแฃแ แแ แแจแ, แฉแแแ แแแ
แแฃ แแญแแ แแแแแ แฆแ แฃแแแแแ แแแแแกแแแ แแ แแแฅแแ แจแแแแแฎแแแแ แแฅแแแแ แแแคแ แแกแขแ แฃแฅแขแฃแ แแก แจแแกแแฎแแ,
PS แแแแจแ 2 แฃแคแแกแ แแฃแแแขแ แแแแฅแแก, แแแแแ แแฅแแแแ แแ แแแฅแขแ แแฅแแแแ แแ แ-แแ แแ แแแแแแแ.
แฌแงแแ แ: www.habr.com