Шардинг: что это такое и как используется
Шардинг (sharding) - это технология горизонтального масштабирования баз данных, при которой данные разбиваются на несколько фрагментов (шардов) и распределяются между несколькими серверами (нодами). Таким образом, каждый сервер обрабатывает только определенный набор данных, что позволяет снизить нагрузку на каждый узел и увеличить производительность системы в целом.
К примеру, предположим, что у нас есть база данных, хранящая информацию о клиентах онлайн-магазина. Представим, что количество клиентов из-за быстрого темпа роста бизнеса увеличилось настолько, что работа даже с использованием кластера баз данных стала неэффективной. Этот случай и делает возможным использование шардинга.
Разбиваем базу на 3 основных шарда, каждый из которых будет отвечать за клиентов с определенными идентификаторами:
- Шард #1: клиенты с ID от 1 до 1000000;
- Шард #2: клиенты с ID от 1000001 до 2000000;
- Шард #3: клиенты с ID от 2000001 до 3000000.
Каждый шард размещается на своем сервере с отдельным набором ресурсов (процессор, оперативная память, дисковое пространство).
Далее, при поступлении запроса на получение данных о клиенте, система определяет, в каком шарде находится данный клиент, и направляет запрос на соответствующий сервер.
Ниже приведен пример кода на Python с использованием библиотеки PyMongo для работы с MongoDB, который демонстрирует, как осуществляется шардинг в данной СУБД:
python
from pymongo import MongoClient
# Подключение к координатору (mongos)
client = MongoClient('mongodb://localhost:27017')
# Получение коллекции
db = client['test_db']
collection = db['clients']
# Настройка шардинга
shard_key = [('client_id', 1)]
client.admin.command('shardCollection', 'test_db.clients', key=shard_key)
# Добавление клиентов
clients = [
{'client_id': 1, 'name': 'John', 'email': 'john@gmail.com'},
{'client_id': 2, 'name': 'Kate', 'email': 'kate@gmail.com'},
{'client_id': 3, 'name': 'Bob', 'email': 'bob@gmail.com'},
...
]
result = collection.insert_many(clients)
# Получение клиента по ID
client_id = 2
client_query = {'client_id': client_id}
shard_query = {'$query': client_query, '$readPreference': {'mode': 'primary'}}
client_data = collection.find_one(shard_query)
print(client_data)
Здесь видно, что при добавлении новых клиентов мы указываем класс поля 'client_id' как ключ для шардинга. Далее мы отправляем команду настройки шардинга на координатор (mongos).
При запросе на получение клиента по ID мы передаем запрос на чтение всем шардам (задается параметр readPreference), но фильтруем по полю 'client_id'. Монгос на свою очередь направляет запрос только на один шард в зависимости от значения этого поля.