Galera cluster
を3ノードで設定しました(3 docker containers
)。 donor
ノードから他のノードにデータを同期させるときは、同期ノードでトリガーwsrep_sst_method
トリガーwsrep_notify_cmd
トリガーに基づいて、そのノードの対応するRedisキューにデータを取り込む必要があります。 これらの2つのトリガーは、クラスターを開始したときにのみ呼び出されるという問題があります。これらの2つのトリガーは、1つのノードがクラスターに参加したときに呼び出されるというログがあります。しかし、あるノードでスキーマを修正しようとしたり、CUDアクションを実行しようとしたとき、トリガーは他のノードでは発生しませんでした。 設定が正しく行われなかったか、これらのトリガが動作していないかはわかりません。以下は Galeraクラスタノードはwsrep_notify_cmdとwsrep_sst_methodを起動しません
Dockerfileは3ガレラクラスタノードを構築するために使用
version: '3' services: node1: build: ./galera/ image: galera_mariadb:latest container_name: "galera_cluster_node1" hostname: node1 ports: - 13306:3306 networks: - galera_cluster volumes: - ./galera/conf.d/galera.cnf:/etc/mysql/conf.d/galera.cnf - /var/data/galera/mysql/node1:/var/lib/mysql/ # ./galera/scripts contains the bash script which is executed by wsrep_notify_cmd trigger - ./galera/scripts/:/etc/mysql/scripts/ environment: - MYSQL_ROOT_PASSWORD=123 - REPLICATION_PASSWORD=123 - MYSQL_DATABASE=test_db - MYSQL_USER=maria - MYSQL_PASSWORD=123 - GALERA=On - NODE_NAME=node1 - CLUSTER_NAME=maria_cluster - CLUSTER_ADDRESS=gcomm:// command: --wsrep-new-cluster node2: image: galera_mariadb:latest container_name: "galera_cluster_node2" hostname: node2 links: - node1 ports: - 23306:3306 networks: - galera_cluster volumes: - ./galera/conf.d/galera.cnf:/etc/mysql/conf.d/galera.cnf - /var/data/galera/mysql/node2:/var/lib/mysql/ - ./galera/scripts/:/etc/mysql/scripts/ environment: - REPLICATION_PASSWORD=123 - GALERA=On - NODE_NAME=node2 - CLUSTER_NAME=maria_cluster - CLUSTER_ADDRESS=gcomm://node1 node3: image: galera_mariadb:latest container_name: "galera_cluster_node3" hostname: node3 links: - node1 ports: - 33306:3306 networks: - galera_cluster volumes: - ./galera/conf.d/galera.cnf:/etc/mysql/conf.d/galera.cnf - /var/data/galera/mysql/node3:/var/lib/mysql/ - ./galera/scripts/:/etc/mysql/scripts/ environment: - REPLICATION_PASSWORD=123 - GALERA=On - NODE_NAME=node3 - CLUSTER_NAME=maria_cluster - CLUSTER_ADDRESS=gcomm://node1 networks: galera_cluster: driver: bridge
ドッキングウィンドウ-compose.yml
# Galera Cluster Dockerfile FROM hauptmedia/mariadb:10.1 RUN apt-get update \ && apt-get -y install \ vim \ python \ redis-tools # remove the default galera.cnf in the original image RUN rm -rf /etc/mysql/conf.d/galera.cnf # add the custom galera.cnf COPY ./conf.d/galera.cnf /etc/mysql/conf.d/galera.cnf # grant access and execution right RUN chmod 755 /etc/mysql/conf.d/galera.cnf
galera.cnfファイル
https://drive.google.com/file/d/0B2q2F62RQxVjbkRaQlFrV2NyYnc/view?usp=sharing
#!/bin/sh -eu wsrep_log() { # echo everything to stderr so that it gets into common error log # deliberately made to look different from the rest of the log local readonly tst="$(date +%Y%m%d\ %H:%M:%S.%N | cut -b -21)" echo "WSREP_SST: $* ($tst)" >&2 } wsrep_log_info() { wsrep_log "[INFO] $*" } STATUS="" CLUSTER_UUID="" PRIMARY="" MEMBERS="" INDEX="" while [ $# -gt 0 ] do case $1 in --status) STATUS=$2 shift ;; --uuid) CLUSTER_UUID=$2 shift ;; --primary) PRIMARY=$2 shift ;; --index) INDEX=$2 shift ;; --members) MEMBERS=$2 shift ;; esac shift done wsrep_log_info "--status $STATUS --uuid $CLUSTER_UUID --primary $PRIMARY --members $MEMBERS --index $INDEX"
-
[galera] wsrep_on=ON # wsrep only supports binlog_format='ROW' and storage-engine=innodb binlog_format=row default_storage_engine=InnoDB # to avoid issues with 'bulk mode inserts' using autoinc innodb_autoinc_lock_mode=2 bind-address=0.0.0.0 # relax flushing logs when running in galera mode innodb_flush_log_at_trx_commit=0 sync_binlog=0 # Query Cache is supported since version 10.0.14 with wsrep query_cache_size=8000000 query_cache_type=1 wsrep_provider=/usr/lib/galera/libgalera_smm.so # use the built-in method to manage State Snapshot Transfers # we can customize this script to perform a specific logic wsrep_sst_method=xtrabackup-v2 # This bash is volumed from the host which is used to populate synchronized data to the Redis queue wsrep_notify_cmd=/etc/mysql/scripts/wsrep_notify.sh # force transaction level to be read commited #transaction-isolation = READ-COMMITTED
は、3つのノード
ノード1のログファイルでありますの
ノード2:
https://drive.google.com/file/d/0B2q2F62RQxVjX3hYZHBpQ2FRV0U/view?usp=sharing
ノード3:私はこの問題についてグーグルでてきたが、運がなかった
https://drive.google.com/file/d/0B2q2F62RQxVjelZHQTN3ZDRNZ0k/view?usp=sharing
。 Galeraクラスタの設定を経験している人なら誰でもこの問題の解決に役立つことを願っています。または、要件を解決するための別のアプローチがあります。
この場合、データが1つのノードで同期されているかどうかを確認するためにどのステータス変数を使用すべきですか?私がhttps://mariadb.com/kb/en/library/galera-cluster-status-variables/#wsrep_local_commitsを使用するのが正しいかどうか疑問に思っています。 – tilonthuduc
また、データがRedisに移入されるテーブルの挿入/更新/削除トリガーを作成するトリガーについて考えます。これは良いアプローチですか、それに気づく必要のあるパフォーマンス上の問題はありますか? – tilonthuduc