Há muitos ótimos pedaços aqui. No entanto, todo mundo está complicando demais as diferentes peças do quebra-cabeça.
mroe said:
...the slave seems to hold the connection open (even after calling "SLAVE STOP"), meaning the tunnel is always open...
1.
Não é a função do mysqld slave terminar uma sessão SSH de entrada. (Isso é mais parecido com o funcionamento do tunelamento com o netcat, mas este não é o lugar para isso, então não vamos confundir o problema.) O mestre deve terminar a conexão porque [a] o originou [b] é o único dentro da rede você deseja proteger. Se você quiser encerrar a conexão para a chamada secundária " kill -s HUP $pid_of_the_sshd_owned_by_mysqlmaster
". Eu direi novamente, eu não vejo o uso.
2.
Por que você chamaria " SLAVE STOP
"? O escravo é um escravo. Já que estamos no assunto ... O escravo nunca deve se parar. Se o escravo for parado, o servidor mestre (veja o ponto 4.
) ou o administrador deve fazê-lo.
mroe said:
Updates from master to slave need to be near-real time (i.e. a couple of minutes latency is acceptable, but not more).
Você não pode ter as duas coisas. Você quer ter o escravo IO thread em execução ou está desatualizado.
3.
Não se preocupe com a 'posição do log binário do mestre' que é o que faz a replicação.
4.
Se você realmente se empenha em desconectar e reconectar a cada minuto, escreva um script cron no master. Deve fazer o seguinte:
- Teste um arquivo de bloqueio e saia ou crie-o.
- Crie seu túnel assim
ssh -N -R 3333:127.0.0.1:3306 [email protected] &
-
mysql -hslave.server -e 'SLAVE START'
- Agora você tem que fazer uma escolha:
- Mantenha-se ligado até que o escravo seja apanhado pelo mestre. Você pode testar "0" na saída do seguinte (uma linha, ignorar a quebra):
mysql -hslave.server -e 'show slave status\G'|awk '/Seconds_Behind_Master/{print $2}'
- Permaneça conectado por um determinado período de tempo. Talvez você tenha
sleep
para isso. Pesquise sobre o seu sistema para garantir que ele não consuma nenhuma CPU.
- O MySQL lida com conexões descartadas normalmente, então isso é opcional:
mysql -hslave.server -e 'SLAVE STOP'
(infact, o SLAVE START
é opcional se você usar MASTER_CONNECT_RETRY )
-
kill
o pid do cliente ssh da segunda bala.
Isso deve ser feito. Agora lembre-se de que você precisa preparar o escravo para replicar antes que isso funcione. Como você mencionou a emissão de um SLAVE STOP
, considero que foi possível obter um backup consistente do mestre para o escravo e obter a posição do log para o comando CHANGE MASTER
. Vou apenas adicionar que você precisa especificar MASTER_HOST='127.0.0.1, MASTER_PORT=3333
Obviamente, não tenho problema algum em pesquisar e explicar em detalhes. Eu também estou tentando não insultar ninguém, explicando muito. Se você quiser mais detalhes, é só me perguntar.