Назад | Перейти на главную страницу

Как выполнить горизонтальное масштабирование путем перехода от разделов базы данных к сегментированию?

Скажем, у меня есть таблица MySQL:

CREATE TABLE tweets (
tweet_id INT NOT NULL AUTO_INCREMENT,
author_id INT NOT NULL,
text CHAR(140) NOT NULL,
PRIMARY KEY (tweet_id)
)
PARTITION BY HASH(tweet_id)
PARTITIONS 12;

Все хорошо. Таблица живет на одном сервере - Server1. Но в конце концов я, возможно, захочу масштабироваться. Поэтому я хотел бы разбить таблицу и переместить 6 из 12 разделов на новый сервер - Server2.

1) Есть ли быстрый и простой способ переместить эти разделы с Server1 на Server2?

2) Теперь, когда у меня есть 2 сервера, как мне убедиться, что автоматически увеличивающиеся tweet_id, сгенерированные двумя серверами, не имеют одинакового значения? Мне также нужно убедиться, что tweet_id на каждом разделе остается согласованным, то есть на разделе k каждый tweet_id по модулю 12 равен k.

3) В идеале я хотел бы продолжить этот процесс масштабирования. Позже я хочу добавить третий сервер - Server3. Я бы хотел перебалансировать разделы, чтобы на каждом сервере было по 4 раздела. Опять же, как мне убедиться, что автоматически увеличивающиеся tweet_id, сгенерированные тремя серверами, различны и что хэш tweet_id остается согласованным в каждом разделе?

я не могу комментировать "РАЗДЕЛЕНИЕ ПО ХЭШУ (tweet_id) РАЗДЕЛЫ 12;" часть ... но обычный трюк с автоинкрементами, когда вы разбиваете разделы, выполняется на уровне приложения, заключается в использовании

auto_increment_increment={numberOfShars}
auto_increment_offset={numberOfShars+serverNumber}

в моем cnf. Итак, если у вас есть 4 машины и присвоите им номера от 0 до 3, ваша машина № 3 будет иметь:

auto_increment_increment=4
auto_increment_offset=7

это гарантирует, что ваши идентификаторы будут уникальными для всех шардов.