2017-10-06 11 views
0

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

    :ここwsrep_notify.sh

    #!/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クラスタの設定を経験している人なら誰でもこの問題の解決に役立つことを願っています。または、要件を解決するための別のアプローチがあります。

答えて

0

多くは

をwsrep_notify_cmdおかげで、ノードがいつでもクラスタメンバーシップまたはノード変更の 状態を実行するコマンドを定義します。だから、

それは他のどの状態に以下のリストに記載し、そのステータスを変更した場合、スクリプトは、ノード上で起動されます。

可能ステータスは、次のとおりです。

未定義ノードが持ちます起動したばかりで、プライマリコンポーネントには接続されていません。

ジョイナーノードがプライマリコンポーネントに接続され、現在状態スナップショットが受信されています。

ドナーノードがプライマリコンポーネントに接続され、現在状態スナップショットが送信されています。

参加済みノードは完全な状態であり、クラスタに追いついています。

同期化ノードがクラスタと同期しています。

エラー(使用可能な場合)ノードはエラー状態です。

ノードが起動し、ステータスが変更されたときにスクリプトに通知されます。 Galeraクラスタノード間でデータが同期するときは通知されません。

+0

この場合、データが1つのノードで同期されているかどうかを確認するためにどのステータス変数を使用すべきですか?私がhttps://mariadb.com/kb/en/library/galera-cluster-status-variables/#wsrep_local_commitsを使用するのが正しいかどうか疑問に思っています。 – tilonthuduc

+0

また、データがRedisに移入されるテーブルの挿入/更新/削除トリガーを作成するトリガーについて考えます。これは良いアプローチですか、それに気づく必要のあるパフォーマンス上の問題はありますか? – tilonthuduc

関連する問題