diff --git a/docs/sharding.md b/docs/sharding.md new file mode 100644 index 0000000000000000000000000000000000000000..13793539760c076ed87f91c39ab543833c404b7f --- /dev/null +++ b/docs/sharding.md @@ -0,0 +1,89 @@ +# Шардирование данных в клаÑтере + +Ð’ данном разделе раÑÑматриваетÑÑ Ð¿Ñ€Ð¸Ð¼ÐµÑ€ ÑˆÐ°Ñ€Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… в клаÑтере 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 + ``` +1. Создадим шардированную таблицу + + Ключевым моментом ÑвлÑетÑÑ Ñоздание индекÑа `bucket_id` в ÑпейÑе (его наличие помечает ÑÐ¿ÐµÐ¹Ñ ÐºÐ°Ðº шардированный). + ```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) + ``` + Ðа текущий момент в Picodata иÑпользуетÑÑ Ð¿Ñ€ÐµÐ´Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð½Ð¾Ðµ количеÑтво бакетов - 3000. +1. Заполним шардированный ÑÐ¿ÐµÐ¹Ñ Ñ‚ÐµÑтовыми данными + ```lua + for i=1,3000 do vshard.router.callrw(i, 'box.space.T2:insert', {{i, i}}) end + ``` +1. Проверим, что данные поровну раÑпределилиÑÑŒ между ÑкземплÑрами. + Ðа каждом из них (`i1`, `i2`) выполним запроÑ: + ```lua + vshard.storage.info().bucket + ``` + Ð’ результате мы получим по 1500 бакетов на каждом ÑкземплÑре: + ``` + --- + - receiving: 0 + active: 1500 + total: 1500 + garbage: 0 + pinned: 0 + sending: 0 + ... + ``` +1. Добавим еще один ÑкземплÑÑ€ + ```sh + picodata run --listen localhost:3303 --instance-id i3 --cluster-id c1 --peer localhost:3301,localhost:3302,localhost:3303 + ``` +1. ЗапуÑтим ребаланÑировку данных + + Важный момент, что ребаланÑер бакетов работает на ÑкземплÑре Ñ Ð½Ð°Ð¸Ð¼ÐµÐ½ÑŒÑˆÐ¸Ð¼ занчением `instance_uuid` из ÑпейÑа `_picodata_instance`. + ```sql + \set language sql + + select "instance_uuid", "instance_id" from "_picodata_instance" + + \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 + ``` + Ð’ результате мы получим по 1000 бакетов на каждом ÑкземплÑре: + ``` + --- + - receiving: 0 + active: 1000 + total: 1000 + garbage: 0 + pinned: 0 + sending: 0 + ... + ```