Skip to content
Snippets Groups Projects
Commit 1c0d7b56 authored by Yaroslav Dynnikov's avatar Yaroslav Dynnikov
Browse files

doc: advance sharding.md

parent d381dcd1
No related branches found
No related tags found
1 merge request!479doc: sharding example
Pipeline #16727 passed
......@@ -3,87 +3,66 @@
В данном разделе рассматривается пример шардирования данных в кластере Picodata.
1. Запустим кластер из двух экземпляров
```sh
picodata run --listen localhost:3301 --instance-id i1 --cluster-id c1 --peer localhost:3301,localhost:3302,localhost:3303
picodata run --listen localhost:3302 --instance-id i2 --cluster-id c1 --peer localhost:3301,localhost:3302,localhost:3303
```sh
picodata run --data-dir tmp/i1 --listen localhost:3301 --instance-id i1 --peer localhost:3301,localhost:3302
picodata run --data-dir tmp/i2 --listen localhost:3302 --instance-id i2 --peer localhost:3301,localhost:3302
```
1. Создадим шардированную таблицу
Ключевым моментом является создание индекса `bucket_id` в спейсе (его наличие помечает спейс как шардированный).
1. Создадим шардированную таблицу. На любом инстансе выполним команды
```lua
pico.add_migration(1, 'create table t2(a int, "bucket_id" unsigned, primary key (a));')
pico.add_migration(2, 'create index "bucket_id" on t2 ("bucket_id");')
pico.migrate(2)
```
Ключевым моментом является создание индекса `bucket_id` в спейсе
(его наличие помечает спейс как шардированный). Важно не забыть
кавычки, т.к. vshard ожидает увидеть его в нижнем регистре.
На текущий момент в Picodata используется предопределенное количество бакетов - 3000.
1. Заполним шардированный спейс тестовыми данными
1. Заполним шардированный спейс тестовыми данными. На любом инстансе
выполним команды.
```lua
for i=1,3000 do vshard.router.callrw(i, 'box.space.T2:insert', {{i, i}}) end
```
1. Проверим, что данные поровну распределились между экземплярами.
На каждом из них (`i1`, `i2`) выполним запрос:
1. Проверим, что данные поровну распределились между экземплярами. На
каждом из них (`i1`, `i2`) выполним запрос:
```lua
vshard.storage.info().bucket
```
В результате мы получим по 1500 бакетов на каждом экземпляре:
box.space.T2:len()
```
В результате мы получим по 1500 бакетов (и столько же таплов) на
каждом экземпляре:
```yaml
---
- receiving: 0
active: 1500
total: 1500
garbage: 0
pinned: 0
sending: 0
- 1500
...
```
1. Добавим еще один экземпляр
```sh
picodata run --listen localhost:3303 --instance-id i3 --cluster-id c1 --peer localhost:3301,localhost:3302,localhost:3303
picodata run --data-dir tmp/i3 --listen localhost:3303 --instance-id i3 --peer localhost:3301,localhost:3302
```
1. Запустим ребалансировку данных
Важный момент: ребалансер бакетов работает на экземпляре с наименьшим значением `instance_uuid` из спейса `_picodata_instance`.
```sql
\set language sql
select "instance_uuid", "instance_id" from "_picodata_instance"
1. Проверим, что данные перераспределились между тремя экземплярами. На
каждом из них (`i1`, `i2` и `i3`) выполним запрос:
\set language lua
```
В результате получим:
```
---
- metadata:
- name: instance_uuid
type: string
- name: instance_id
type: string
rows:
- ['68d4a766-4144-3248-aeb4-e212356716e4', 'i1']
- ['24c4ac5f-4981-3441-879c-aee1edb608a6', 'i2']
- ['5d7a7353-3e82-30fd-af0d-261436544389', 'i3']
...
```
В данном случае наименьшее значение UUID имеет экземпляр `i2` (т.к. в число `24c4ac5f-4981-3441-879c-aee1edb608a6` в байтовом представлении меньше остальных). Поэтому ребалансировка будет запущена на нем (но мы для примера запустим ее вручную):
```lua
vshard.storage.rebalancer_wakeup()
```
1. Проверим, что данные перераспределились между тремя экземплярами.
На каждом из них (`i1`, `i2` и `i3`) выполним запрос:
```lua
vshard.storage.info().bucket
box.space.T2:len()
```
В результате мы получим по 1000 бакетов на каждом экземпляре:
```
```yaml
---
- receiving: 0
active: 1000
total: 1000
garbage: 0
pinned: 0
sending: 0
- 1000
...
```
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment