Ключи шардирования
Шардирование — это принцип горизонтального масштабирования распределенных баз данных, при котором база данных разбивается на части — шарды. В Managed Service for Sharded PostgreSQL каждый шард является отдельным кластером Managed Service for PostgreSQL, который хранит часть данных всей системы.
Подробнее о шардировании в Managed Service for Sharded PostgreSQL.
Ключ шардирования — это один или несколько столбцов таблицы, по которым система определяет, в какой шард будет помещена строка. Если ключ состоит из нескольких столбцов, он называется составным.
Столбцы ключа могут быть следующих типов данных:
- целые числа
intиbigint; - строки
varchar; - уникальные идентификаторы
UUID; - хеш-функции
CITYиMURMUR(только для целых чисел).
Стратегии шардирования
Строки распределяются по шардам в зависимости от выбранной стратегии:
-
Range-стратегия — для выбора шарда используется диапазон значений. Строка помещается в шард, если значение ее ключа попадает в диапазон значений шарда. При этом строки с близкими значениями ключа будут находиться на одном шарде.
Например, на одном шарде будут храниться строки со значением ключа от
1до1000, на другом — от1001до2000и т. д.Недостаток такой стратегии в том, что данные могут распределяться неравномерно.
-
Hash-стратегия — для выбора шарда используется хеш-функция, которая применяется к значению ключа. Полученное хеш-значение определяет шард, в который будет помещена строка. Эта стратегия обеспечивает более равномерное распределение данных между шардами, чем range-стратегия. Однако выборка по диапазону значений усложняется, так как строки с близкими значениями могут находиться на разных шардах.
Составные ключи шардирования
Для составного ключа используется несколько столбцов. При этом их порядок учитывается при шардировании.
Составные ключи применяются при шардировании данных, уникальность которых определяется сочетанием нескольких столбцов. Например, такими данными могут быть:
- временные ряды;
- географические данные, которые представлены несколькими связанными столбцами.
При использовании составного ключа шард, в который будет помещена строка, определяется следующим образом:
-
Для range-стратегии перечисляются все комбинации значений столбцов.
Пример настройки правил шардирования для range-стратегии:
CREATE DISTRIBUTION ds1 COLUMN TYPES integer, integer; CREATE KEY RANGE FROM 100,100 ROUTE TO sh4 FOR DISTRIBUTION ds1; CREATE KEY RANGE FROM 100,0 ROUTE TO sh3 FOR DISTRIBUTION ds1; CREATE KEY RANGE FROM 0,100 ROUTE TO sh2 FOR DISTRIBUTION ds1; CREATE KEY RANGE FROM 0,0 ROUTE TO sh1 FOR DISTRIBUTION ds1; -
Для hash-стратегии хеш-функция применяется к каждому столбцу ключа отдельно. Полученные числа суммируются и к сумме применяется хеш-функция.
Пример настройки правил шардирования для hash-стратегии:
CREATE RELATION tr(MURMUR [id1 INT HASH, id2 VARCHAR HASH]); CREATE KEY RANGE FROM 3221225472 ROUTE TO sh4; CREATE KEY RANGE FROM 2147483648 ROUTE TO sh3; CREATE KEY RANGE FROM 1073741824 ROUTE TO sh2; CREATE KEY RANGE FROM 0 ROUTE TO sh1;Использование hash-стратегии упрощает настройку правил шардирования, особенно для составных ключей из трех и более столбцов.
Подробнее о составных ключах шардирования в Sharded PostgreSQL
Рекомендации по использованию составных ключей
- Первым указывайте столбец, который чаще всего используется в запросах. При этом, если вы используете range-стратегию, первым указывайте столбец, который часто встречается в запросах и имеет как можно меньше уникальных значений.
- Убедитесь, что условия
WHEREвключают все столбцы составного ключа. Если в запросе указаны не все столбцы и настройка query_routing.default_route_behaviour установлена вBLOCK, то такие запросы будут отклонены.