Cluster Galera (MariaDB) no Docker / CoreOS: o segundo nó não funciona na primeira tentativa

6

Estou tentando criar uma implantação automática do Galera Cluster com o MariaDB, sendo executado em contêineres do Docker no CoreOS.

Software usado: - MariaDB imagem do Docker , versão 10.1.10 - CoreOS 899.5.0, com Docker 1.9.1

Tudo está sendo executado em duas VMs separadas: 10.2.0.4 e 10.2.0.5

Eu posso iniciar o primeiro nó (10.2.0.4) com sucesso e inicializar o cluster.

No entanto, quando inicio o segundo nó, recebo muitos erros com a replicação da tabela mysql.time_zone_transition_type e mysql.time_zone_name . Depois disso, o daemon mysqld NÃO falha, então meu contêiner Docker continua em execução (ele é executado por minutos sem problemas), mas parece não ter ingressado no cluster (consultar o status no primeiro nó mostra apenas 1 nó unidos) e não aceita nenhuma conexão (tentar se conectar a esse nó falha). Estranhamente, no entanto, se eu reiniciar o contêiner do Docker (mantendo a pasta de dados), ele se unirá ao nó e funcionará perfeitamente.

Aqui está o arquivo de configuração do MySQL (adicionado ao /etc/mysql/conf.d no container do Docker):

# this is read by the standalone daemon and embedded servers
[server]

# this is only for the mysqld standalone daemon
[mysqld]

#
# * Galera-related settings
#
[galera]
# Mandatory settings
wsrep_on=ON
wsrep_provider="/usr/lib/galera/libgalera_smm.so"
wsrep_cluster_address="gcomm://10.2.0.4,10.2.0.5"
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
innodb_locks_unsafe_for_binlog=1
query_cache_size=0
query_cache_type=0
wsrep-sst-method=rsync

#
# Allow server to accept connections on all interfaces.
#
bind-address=0.0.0.0
#
# Optional setting
#wsrep_slave_threads=1
#innodb_flush_log_at_trx_commit=0

# this is only for embedded server
[embedded]

# This group is only read by MariaDB servers, not by MySQL.
# If you use the same .cnf file for MySQL and MariaDB,
# you can put MariaDB-only options here
[mariadb]

# This group is only read by MariaDB-10.1 servers.
# If you use the same .cnf file for MariaDB of different versions,
# use this group for options that older servers don't understand
[mariadb-10.1]

Eu inicio o primeiro nó com:

$ docker rm -f some-mariadb
$ rm -rf /mnt/resource/data/*
# Note: we need to pass the IP of the VM or mysqld will get the IP from the Docker container
$ docker run \
  --name some-mariadb \
  -v /mnt/resource/mysql.conf.d:/etc/mysql/conf.d \
  -v /mnt/resource/data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=my-secret-pw \
  -d \
  -p 3306:3306 \
  -p 4567:4567/udp \
  -p 4567-4568:4567-4568 \
  -p 4444:4444 \
  mariadb:10.1 \
  --wsrep-new-cluster \
  --wsrep_node_address=10.2.0.4

E o segundo com:

$ rm -rf /mnt/resource/data/*
$ docker rm -f some-mariadb
# Create a "/var/lib/mysql/mysql" folder so the Docker container won't initialize the db again (won't re-execute mysql_install_db)
$ mkdir -p /mnt/resource/data/mysql
$ docker run \
  --name some-mariadb \
  -v /mnt/resource/mysql.conf.d:/etc/mysql/conf.d \
  -v /mnt/resource/data:/var/lib/mysql \
  -d \
  -p 3306:3306 \
  -p 4567:4567/udp \
  -p 4567-4568:4567-4568 \
  -p 4444:4444 \
  mariadb:10.1 \
  --wsrep_node_address=10.2.0.5

Todos os meus erros de replicação parecem:

2016-01-23 23:57:52 140131133560576 [ERROR] Slave SQL: Error 'Column 'Time_zone_id' cannot be null' on query. Default database: 'mysql'. Query: 'INSERT INTO time_zone_name (Name, Time_zone_id) VALUES ('Etc/GMT', @time_zone_id)', Internal MariaDB error code: 1048
2016-01-23 23:57:52 140131133560576 [Warning] WSREP: RBR event 1 Query apply warning: 1, 1536
2016-01-23 23:57:52 140131133560576 [Warning] WSREP: Ignoring error for TO isolated action: source: 09357a0e-c22d-11e5-963a-0a6f9b6b61c4 version: 3 local: 0 state: APPLYING flags: 65 conn_id: 5 trx_id: -1 seqnos (l: 1147, g: 1536, s: 1535, d: 1535, ts: 73713003335315)

O registro completo pode ser encontrado neste link (é 4.2MB! muito grande para o post)

Mais uma vez, observe que, quando eu reiniciar o contêiner no segundo nó (preservando os dados), a replicação funcionará - e funcionará bem! Mas esse processo de inicialização "esquisito" não é normal, e não posso confiar nele (preciso roteirizar toda a configuração criando unidades fleet.d depois)

    
por ItalyPaleAle 24.01.2016 / 02:11

1 resposta

3

Depois de dias de luta com isso, finalmente pude fazer isso funcionar.

A questão chave é que a imagem Docker padrão (provavelmente imitando o que a imagem MySQL faz) adiciona dados de fuso horário no banco de dados e por qualquer razão (talvez porque use tabelas MyISAM?) que causa grandes problemas com essa configuração. / p>

Solução: ao ativar o primeiro nó, passe a variável MYSQL_INITDB_SKIP_TZINFO=yes environmental para o contêiner do Docker. Portanto, o comando para iniciar o primeiro contêiner do Docker é:

docker run \
  --name some-mariadb \
  -v /mnt/resource/mysql.conf.d:/etc/mysql/conf.d \
  -v /mnt/resource/data:/var/lib/mysql \
  -e MYSQL_INITDB_SKIP_TZINFO=yes \
  -e MYSQL_ROOT_PASSWORD=my-secret-pw \
  -d \
  -p 3306:3306 \
  -p 4567:4567/udp \
  -p 4567-4568:4567-4568 \
  -p 4444:4444 \
  mariadb:10.1 \
  --wsrep-new-cluster \
  --wsrep_node_address=10.2.0.4
    
por 27.01.2016 / 19:25