Como escalar, passando de partições de banco de dados para sharding?

2

Digamos que eu tenha uma tabela 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;

Tudo está bem. A tabela vive em um único servidor - Server1. Mas eventualmente eu posso querer expandir. Então, eu quero dividir a tabela e mover 6 das 12 partições para um novo servidor - Server2.

1) Existe alguma rápida & maneira fácil de mover essas partições de Server1 para Server2?

2) Agora que tenho dois servidores, como posso ter certeza de que os tweet_id de incremento automático gerados pelos dois servidores não têm o mesmo valor? Eu também preciso ter certeza de que o tweet_id em cada partição permaneça consistente, ou seja, na Partição k, o módulo 12 de cada tweet_id é igual a k.

3) Idealmente, gostaria de continuar com esse processo de expansão. Então, mais tarde, eu gostaria de adicionar um terceiro servidor - Server3. Eu gostaria de reequilibrar as partições para que haja 4 partições em cada servidor. Novamente, como posso ter certeza de que os tweet_id de incremento automático gerados pelos 3 servidores são distintos e que o hash do tweet_id permanece consistente dentro de cada partição?

    
por Continuation 22.08.2010 / 02:11

1 resposta

2

eu não posso realmente comentar sobre "PARTITION BY HASH (tweet_id) PARTITIONS 12;" parte ... mas truque habitual com autoincrementos quando você está particionando é feito no nível do aplicativo é usar

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

no meu cnf. então se você tem 4 máquinas e atribui números de 0 a 3, sua máquina # 3 teria:

auto_increment_increment=4
auto_increment_offset=7

isso garante que seus IDs sejam exclusivos em todos os fragmentos

    
por 22.08.2010 / 10:21