Скажем, у меня есть таблица 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
это гарантирует, что ваши идентификаторы будут уникальными для всех шардов.