web-dev-qa-db-ja.com

Docker / CoreOS上のGaleraクラスター(MariaDB):2番目のノードが最初の試行で機能しない

CoreOSのDockerコンテナー内で実行される、MariaDBを使用したGaleraClusterの自動デプロイメントを作成しようとしています。

使用するソフトウェア:-MariaDB公式 Dockerイメージ 、バージョン10.1.10-CoreOS 899.5.0、Docker1.9.1

すべてが2つの別々のVMで実行されています:10.2.0.4と10.2.0.5

最初のノード(10.2.0.4)を正常に起動し、bootstrapクラスターを起動できます。

ただし、2番目のノードを起動すると、mysql.time_zone_transition_typeテーブルとmysql.time_zone_nameテーブルのレプリケーションで多くのエラーが発生します。その後、mysqldデーモンはクラッシュしないため、Dockerコンテナーは実行を続けます(問題なく数分間実行されます)が、クラスターに参加していないようです(最初のノードのステータスをクエリすると、 1つのノードが参加しました)、接続を受け入れません(そのノードに接続しようとすると失敗します)。ただし、奇妙なことに、Dockerコンテナーを(データフォルダーを保持して)再起動すると、ノードに参加して問題なく動作します。

これがMySQL構成ファイルです(Dockerコンテナーの/etc/mysql/conf.dに追加されます):

# 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]

最初のノードは次のように開始します。

$ 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

そして2番目のもの:

$ 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

私のレプリケーションエラーはすべて次のようになります。

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)

完全なログは見つけることができます このリンクで (4.2MBです!投稿するには大きすぎます)

繰り返しになりますが、2番目のノードでコンテナを再起動すると(データを保持)、レプリケーションが機能し、正常に機能することに注意してください。しかし、この「奇妙な」起動プロセスは正常ではなく、信頼できません(後で、fleet.dユニットを作成してセットアップ全体をスクリプト化する必要があります)

6
ItalyPaleAle

これと何日も戦った後、私はついにこれを機能させることができました。

重要な問題は、デフォルトのDockerイメージ(おそらくMySQLイメージの機能を模倣している)がデータベースにタイムゾーンデータを追加することであり、何らかの理由で(MyISAMテーブルを使用しているためか?)、このセットアップで大きな問題を引き起こします。

解決策:最初のノードを起動するときに、MYSQL_INITDB_SKIP_TZINFO=yes環境変数をDockerコンテナーに渡します。したがって、最初の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
3
ItalyPaleAle