【问题标题】:Galera cluster nodes do not trigger wsrep_notify_cmd and wsrep_sst_methodGalera 集群节点不触发 wsrep_notify_cmd 和 wsrep_sst_method
【发布时间】:2018-03-18 15:05:42
【问题描述】:

我确实使用 3 个 docker containers 设置了具有 3 个节点的 Galera cluster。有一个要求,当数据从donor节点同步到其他节点时,基于同步节点的wsrep_notify_cmd触发器或wsrep_sst_method触发器,数据也需要填充到相应的Redis队列中节点。 问题是这两个触发器仅在我启动集群时被调用。有日志说当一个节点加入集群时调用了这两个触发器。但是,当我尝试在一个节点中修改架构或执行 CUD 操作时,其他节点并未触发触发器。 我不知道我是否错误地进行了配置,或者这不是这些触发器的工作方式。

以下是我用来使集群工作的文件

  • docker-compose.yml

    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
    
  • 用于构建 3 个 galera 集群节点的 Dockerfile

    # 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 文件

    [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
    
  • 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"
    
  • 这是3个节点的日志文件

节点1:

https://drive.google.com/file/d/0B2q2F62RQxVjbkRaQlFrV2NyYnc/view?usp=sharing

节点2:

https://drive.google.com/file/d/0B2q2F62RQxVjX3hYZHBpQ2FRV0U/view?usp=sharing

节点3:

https://drive.google.com/file/d/0B2q2F62RQxVjelZHQTN3ZDRNZ0k/view?usp=sharing

我一直在谷歌上搜索这个问题,但没有运气。我希望任何有过 Galera Cluster 设置经验的人都可以帮助我解决这个问题。或者还有另一种解决要求的方法,请告诉我。非常感谢

【问题讨论】:

    标签: mysql docker mariadb synchronized galera


    【解决方案1】:

    wsrep_notify_cmd

    定义节点运行的命令,无论何时集群成员资格或 节点状态发生变化。

    因此,如果脚本将下面列表中描述的状态更改为任何其他状态,则脚本将在节点上启动:

    可能的状态是:

    未定义节点刚刚启动,没有连接到任何Primary Component。

    Joiner 节点已连接到主组件,现在正在接收状态快照。

    Donor 节点连接到主组件,现在正在发送状态快照。

    Joined 节点处于完整状态,现在正在追赶集群。

    已同步节点已与集群同步。

    错误(如果可用>)节点处于错误状态。

    当节点启动并更改其状态时,您会看到脚本通知。当数据刚刚在 galera 集群节点之间同步时,它不会通知。

    【讨论】:

    • 在这种情况下,我们应该使用哪个状态变量来检查数据是否在一个节点上同步?我想知道我使用mariadb.com/kb/en/library/galera-cluster-status-variables/… 是否正确。
    • 我还考虑了触发器,我将为那些将数据填充到 Redis 的表创建插入/更新/删除触发器。这是一个好方法吗?是否有任何性能问题需要注意?
    猜你喜欢
    • 2019-03-05
    • 2015-04-17
    • 2016-07-11
    • 2018-11-04
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多