Я высказал некоторые идеи по поводу рекомендуемого размера и количества планшетов в Distributed SQL Sharding: How Many Tablets, and at What Size? Вы можете определить начальное количество таблиц при создании таблицы или индекса с помощью SPLIT INTO для хэш-шардинга или SPLIT AT для шардинга диапазонов. Но если вы этого не сделаете, начальное количество табличек зависит от нескольких параметров.
yb-master
или yb-tserver
.
Первый из параметров — --enable_automatic_tablet_splitting
устанавливается на yb-master
, который запускает эту задачу авторазделения, а остальные — на yb-tserver
(значения берутся из того, к которому вы подключены при создании таблицы).
Параметр yb-master
: автосплиттинг или нет
При включенном авторазделении (--enable_automatic_tablet_splitting=true
) все CREATE без SPLIT будут начинаться с одного планшета. Это позволяет YugabyteDB увеличивать количество табличек в зависимости от их размера. Для больших таблиц и индексов, размер которых известен заранее, следует разделить их вручную во время создания для более быстрой загрузки. Остальные будут начинаться с одной таблицы и разделяться при росте.
Без включенного автоматического разделения (--enable_automatic_tablet_splitting=false
) таблицы, созданные без условия SPLIT, будут иметь:
- одна табличка для разделения диапазона (потому что система не может угадать точку разделения, не имея данных)
- рассчитанное системой количество таблиц для хэш-шаринга (это не касается колокаций или групп таблиц, которые разделяют одну таблицу).
Этот пост посвящен последнему варианту (без условия SPLIT, без авто-разделения), потому что количество табличек по умолчанию зависит от многих параметров, от того, какой API (YSQL или YCQL), сколько серверов и количество CPU на сервере.
yb-tserver
параметры
Я пишу это по состоянию на 2.15, и код находится здесь. Вот визуализация ветвей:
https://app.code2flow.com/NyrSNBP9i5F3.png
Вы можете видеть, что это зависит от многих параметров, установлены ли они (>0
) или нет, и я подробно опишу их позже. Если ни один из параметров не задан, то количество создаваемых планшетов зависит от:
- количества серверов в кластере (
tserver_count
) - количества CPU на сервер (
yb_num_shard_per_server
).
Параметр yb_num_shard_per_server
связан с количеством CPU, поскольку, если он не задан явно, то вычисляется из него, поэтому начнем с него.
Размер экземпляра: количество vCPU
Код находится в GetYCQLNumShardsPerTServer() и GetYSQLNumShardsPerTServer(), и вот краткое описание:
Таблички YSQL | YCQL-таблетки | |
---|---|---|
авторазделение включено | 1 | 1 |
Дезинфектор резьбы | 2 | 2 |
1 vCPU | 2 | 4 |
2 vCPU | 2 | 4 |
3 vCPU | 4 | 8 |
4 vCPU | 4 | 8 |
5 vCPU | 8 | 8 |
6 vCPU | 8 | 8 |
7 vCPU | 8 | 8 |
8 vCPU | 8 | 8 |
>= 8 vCPUs | 8 | 8 |
В принципе, по умолчанию используется 8 планшетов на сервер, если серверы имеют более 4 vCPU, что является вашим случаем, если вы следуете лучшим практикам. Для небольших сред (labs, dev, test) количество планшетов меньше, и даже в два раза меньше для YSQL, так как каждый планшет — это фактически два RocksDB (обычный для зафиксированных изменений и intents для предварительных записей).
Количество vCPU определяется системой. Однако это определение может быть неверным при некоторых контейнеризациях, и вы можете установить его с помощью --num_cpus
. Например, наши чарты Helm для установки на Kubernetes устанавливают его в соответствии с объявлением ресурса.
num_cpus
был введен в версии 2.2, по умолчанию равен нулю (обнаружение в системе) и описывается как: Количество ядер процессора, используемых в вычислениях.
Однако вы видите, что значение по умолчанию 8 таблиц на сервер может быть не лучшим для всех развертываний. Ваше приложение может иметь 5 активных таблиц или сотни таблиц с множеством вторичных индексов. Как описано на диаграмме выше, есть два параметра для установки количества таблиц на сервер или общего количества таблиц на кластер. Эти два параметра имеют настройки для таблиц YSQL и для таблиц YCQL:
YSQL таблица | таблица YCQL | |
---|---|---|
планшетов на таблицу на сервер | --ysql_num_shards_per_tserver |
--yb_num_shards_per_tserver |
планшеты на таблицу на кластер | --ysql_num_tablets |
--ycql_num_tablets |
Если задано количество таблиц на кластер, оно имеет приоритет над таблицами на сервер. Если в операторе CREATE упоминается SPLIT, то он имеет приоритет над этими параметрами. Я расскажу об этих параметрах подробнее.
YSQL
ysql_num_shards_per_tserver
по умолчанию было 8
в версии 2.2 и затем -1
с версии 2.6, когда был реализован алгоритм выше (по количеству CPU). Описание: Количество шардов по умолчанию для одной таблицы YSQL на сервере планшета при создании таблицы. Если значение равно -1, система устанавливает количество шардов на один сервер в 1, если enable_automatic_tablet_splitting true, и в противном случае автоматически определяет соответствующее значение, основываясь на количестве ядер процессора.
ysql_num_tablets
по умолчанию равно -1
, поэтому используется ysql_num_shards_per_tserver
, описанный выше. Он был введен в версии 2.7 и описывается как Количество табличек на одну таблицу YSQL. Значение по умолчанию равно -1. Если значение не задано, то значение ysql_num_shards_per_tserver используется вместе с количеством серверов для определения количества табличек. Если пользователь явно указывает значение количества таблиц в операторе Create Table DDL (синтаксис split into x tablets), то оно имеет приоритет над значением этого флага. Должен быть установлен на сервере.
YCQL
Я упоминал SPLIT для YSQL, но эквивалентом является WITH TABLETS= для YCQL. В отсутствие этого параметра и при выключенном автоматическом разделении используются следующие параметры.
yb_num_shards_per_tserver
по умолчанию -1
и используется для таблиц YCQL так же, как ysql_num_shards_per_tserver
для YSQL. Он описывается как Число осколков по умолчанию для каждой таблицы на сервере таблиц при создании таблицы. Если значение равно -1, система устанавливает количество шардов на сервер 1, если enable_automatic_tablet_splitting true, и в противном случае автоматически определяет соответствующее значение на основе количества ядер процессора.
ycql_num_tablets
по умолчанию -1
и используется для таблиц YCQL так же, как ysql_num_tablets
для YSQL. Он описывается как Количество таблиц для каждой таблицы YCQL. Значение по умолчанию равно -1. На колоцированные таблицы не влияет. Если значение не задано, то значение yb_num_shards_per_tserver используется вместе с количеством серверов для определения количества табличек. Если пользователь явно указывает значение количества планшетов в операторе Create Table DDL (с синтаксисом tablets = x), то оно имеет приоритет над значением этого флага. Должен быть установлен на сервере tserver.
По умолчанию
Если вы оставите все значения по умолчанию и не будете использовать условия разбиения, то таблица или индекс при создании будет иметь
- один планшет, если включена автоматическая разбивка (
--enable_automatic_tablet_splitting
) (пока данные не загружены) - до (количество серверов) * 8 планшетов, если авторазделение выключено. Например, создание 30 SQL таблиц с 2 вторичными индексами каждая, на кластере с 10 серверами, имеющими 4 vCPU, создаст 30*80 = 2400 табличек. Если фактор репликации RF=3 (минимальный для HA), это означает 7200 распределенных на 10 серверов = 720 планшетов peer на сервер. Каждый используемый планшет выделяет MemTable, размер которой может достигать 128MB (
--memstore_size_mb
). Это может достигать 90 ГБ (максимум — выделяется по мере использования). И вам все еще нужна свободная память для кэша.
Полная документация находится на https://docs.yugabyte.com/preview/architecture/docdb-sharding/tablet-splitting/#approaches-to-tablet-splitting. Значение по умолчанию для enable_automatic_tablet_splitting
, пожалуйста, проверьте. В настоящее время оно отключено в стабильной версии (2.14), но включено в предварительной версии (2.15).