Replicação Master-Master do MySQL de TODOS os bancos de dados. Quão?

16

Antecedentes : Eu tenho dois servidores MySQL 5.1 configurados na RBR (Master-Master-Based-Replication), seguindo este excelente guia . Desejo que todos os bancos de dados sejam replicados e adicionarei novos bancos de dados regularmente.

Objetivo : gostaria de poder adicionar novos bancos de dados à replicação apenas adicionando o banco de dados a um dos servidores; sem precisar parar os dois escravos, altere os arquivos de configuração, reinicie os servidores MySQL e inicie os escravos novamente.

Pergunta : Pelo que tenho lido, eu acho que posso fazer isso simplesmente omitindo nenhum binlog-do-db, binlog-ignore-db, replicate-do-db, e replicate-ignore-dbajustes na configuração de cada servidor, mas não posso ter certeza. Os documentos do MySQL sobre como as opções de replicação em nível de banco de dados e tabela são avaliadas me fazem pensar que pode não haver maneira de fazer isso.

Partes relevantes dos meus /etc/mysql/my.cnfarquivos são copiadas abaixo. Estou no caminho certo? O que eu quero é possível?

Mestre 1 :

[mysqld]
binlog-format = row
server-id = 1
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 1

master-host = <master2_ip>
master-user = slave_user
master-password = <password>
master-connect-retry = 60

log-bin = /var/log/mysql/mysql-bin.log
relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index
expire_logs_days = 14
max_binlog_size = 2048M

Mestre 2 :

[mysqld]
binlog-format = row
server-id = 2
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 2

master-host = <master1_ip>
master-user = slave_user
master-password = <password>
master-connect-retry = 60

log-bin = /var/log/mysql/mysql-bin.log
relay-log = /var/lib/mysql/slave-relay.log
relay-log-index = /var/lib/mysql/slave-relay-log.index
expire_logs_days = 14
max_binlog_size = 2048M
Andrew Ensley
fonte
11
Crie o banco de dados na máquina para a qual você está dirigindo as gravações.
Martin
qual é a sua configuração completa? Tento teses resposta abaixo, não funcionou :-(
zx1986

Respostas:

17

Foi assim que fiz para os dois mestres

log-bin = mysqld-bin
binlog-ignore-db=test
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
log-slave-updates
replicate-ignore-db=test
replicate-ignore-db=information_schema
replicate-ignore-db=mysql
relay-log=mysqld-relay-bin
Mike
fonte
Você pode adicionar bancos de dados a um dos mestres e replicá-los automaticamente para o outro?
Andrew Ensley
sim eles fizeram .. eu apenas configurar quais ignorar
Mike
11
Duas perguntas: eu só preciso ter certeza de que estamos dizendo a mesma coisa. # 1 Você pode adicionar um banco de dados a um dos dois mestres e ele é criado automaticamente no outro e, em seguida, todos os dados inseridos no novo banco de dados são replicados sem alterar a configuração ou reiniciar os servidores? # 2 Você está usando replicação baseada em instrução ou em linha? Eu preciso de todas as alterações em todos os bancos de dados replicados; mesmo aqueles executados sem a instrução "use" anteriormente. Essas configurações funcionarão bem com replicação baseada em linha?
Andrew Ensley
3
sim sim sim sim sim :)
Mike
11
Ok, acabei de configurar meus servidores usando essas configurações ontem à noite. Ignorei a log-slave-updatesconfiguração porque não via necessidade. Tudo funciona perfeitamente. Sou capaz de adicionar e soltar bancos de dados e as alterações são replicadas. Obrigado! Recompensa concedida.
Andrew Ensley
4

Com relação à criação de bancos de dados, ainda existem relatórios de erros sobre o uso de CREATE DATABASE com replicação baseada em linhas.

Este relatório está fechado, mas o bug apareceu novamente no MySQL 5.1.47.
Este relatório é baseado no MySQL Cluster (mecanismo de armazenamento NDB).
Este relatório é baseado na tabela replicate-wild-ignore-table que ainda está replicando.

A replicação baseada em linha faz com que os logs binários cresçam a uma taxa extraordinária, o que pode aumentar o tráfego da rede, enviando dados binários de log para os logs de retransmissão do escravo.

@ Mike diz que conseguiu a criação do banco de dados para funcionar e replicar muito bem. Eu não duvido disso. O que eu sou é um pouco de aprendizado do MySQL (eh Oracle), que não obteve todas as distorções da replicação baseada em linhas, uma vez que o banco de dados é instanciado.

Você pode mudar para row_format MIXED se ainda desejar entradas baseadas em linha nos logs binários. Internamente, o formato do log binário tende a flutuar entre a instrução e a correção de qualquer maneira: (Consulte http://bugs.mysql.com/bug.php?id=40146 ). Mais relatórios de bugs são fechados usando mistos e ocultando os baseados em linhas ( http://bugs.mysql.com/bug.php?id=39701 ), mas ainda assim os problemas persistem intermitentemente.

NOTA FINAL

Para sua própria sanidade, volte à replicação baseada em instruções e, assim, torne CREATE DATABASE (que é uma instrução SQL) estável e consistente para SQL subsequente no banco de dados criado. De fato, o relatório de erro mais recente mostra que é melhor usar a replicação baseada em instruções, independentemente do que a documentação diz sobre as opções no nível do banco de dados e no nível da tabela.

RolandoMySQLDBA
fonte
Obrigado por toda essa informação. Meu único problema com a replicação baseada em instruções é que as alterações que especificam o banco de dados (por exemplo, "INSERT INTO db1.table1 (col1) VALUES ('oi');") não funcionarão, a menos que o banco de dados seja o banco de dados atual em uso. Acho que talvez seja hora de mudar para baseada em declaração-replicação e limpar algum código ...
Andrew Ensley
Acontece que não foi tão difícil corrigir o código necessário. Estou usando a replicação baseada em instruções agora. Obrigado pelo conselho.
Andrew Ensley
0

Hmm ... Você também precisará descobrir uma maneira de manipular / diferenciar campos e chaves incrementadas automaticamente. Isso parece interessante .. http://mysql-mmm.org/

Nandhini Anand
fonte
Isso é tratado nas configurações auto-increment-incremente auto-increment-offsetnos meus arquivos de configuração. Veja esta página: dev.mysql.com/doc/refman/5.1/en/…
Andrew Ensley
Eu acho que você não entendeu. @ Andrew está falando sobre adicionar novos bancos de dados, não adicionar novos servidores de banco de dados. Se o @Andrew estivesse introduzindo novos servidores de banco de dados, poderia haver colisões de chaves ao redistribuir os dados entre três ou mais servidores de banco de dados, aos quais sua resposta seria direcionada. +1 por seu esforço, mas leia todas as perguntas com atenção. Fui queimado da mesma maneira também.
RolandoMySQLDBA
@all: Opa .. Desculpe. Eu poderia jurar que eu lê-lo completo, mas não deve ter desnatado em vez ...
Nandhini Anand
-1

cmiiw Eu pensei que você deveria ser capaz de criar banco de dados em master1 e master2 sem alterar o conf ou parar o slave, mas verifique se a replicação master - master está em execução. porque você não define qual banco de dados precisa replicar, significa que todo o banco de dados será replicado se você não o definir em my.cnf.

chocripple
fonte
É exatamente o que estou perguntando aqui. Não consigo encontrar uma resposta definitiva sobre isso até agora.
Andrew Ensley