MariaDB Galera Cluster

MariaDB Galera Cluster是一种同步多主机集群方案,目前它支持XtraDB/ InnoDB存储引擎,为MySQL/MariaDB的高可用架构提供了一种实现基础。

首先引用 《MySQL高可用方案选型参考》 这篇文章中关于Gelera优缺点的分析。

  • 服务高可用;
  • 数据同步复制(并发复制),几乎无延迟;
  • 多个可同时读写节点,可实现写扩展,不过最好事先进行分库分表,让各个节点分别写不同的表或者库,避免让galera解决数据冲突;
  • 新节点可以自动部署,部署操作简单;
  • 数据严格一致性,尤其适合电商类应用;
  • 完全兼容MySQL;
  • 只支持InnoDB引擎;
  • 所有表都要有主键;
  • 不支持LOCK TABLE等显式锁操作;
  • 锁冲突、死锁问题相对更多;
  • 不支持XA;
  • 集群吞吐量/性能取决于短板;
  • 新加入节点采用SST时代价高;
  • 存在写扩大问题;
  • 如果并发事务量很大的话,建议采用InfiniBand网络,降低网络延迟;
  • 接下来动手实践,用虚拟机完成MariaDB Galera Cluster的搭建。

    1.环境准备

    CentOS 7.3
    MariaDB 10.1.23
    host: 192.168.1.103,192.168.1.105,192.168.1.106

    2.修改MariaDB配置文件

    192.168.1.103

    cat << EOF > /etc/my.cnf.d/server.cnf
    [galera]
    # Mandatory settings
    wsrep_on=ON
    wsrep_provider=/usr/lib64/galera/libgalera_smm.so
    wsrep_cluster_address="gcomm://192.168.1.103,192.168.1.105,192.168.1.106"
    wsrep_node_name=node1
    wsrep_node_address=192.168.1.103
    binlog_format=row
    default_storage_engine=InnoDB
    innodb_autoinc_lock_mode=2
    # 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
    

    192.168.1.105

    cat << EOF > /etc/my.cnf.d/server.cnf
    [galera]
    # Mandatory settings
    wsrep_on=ON
    wsrep_provider=/usr/lib64/galera/libgalera_smm.so
    wsrep_cluster_address="gcomm://192.168.1.103,192.168.1.105,192.168.1.106"
    wsrep_node_name=node2
    wsrep_node_address=192.168.1.105
    binlog_format=row
    default_storage_engine=InnoDB
    innodb_autoinc_lock_mode=2
    # 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
    

    192.168.1.106

    cat << EOF > /etc/my.cnf.d/server.cnf
    [galera]
    # Mandatory settings
    wsrep_on=ON
    wsrep_provider=/usr/lib64/galera/libgalera_smm.so
    wsrep_cluster_address="gcomm://192.168.1.103,192.168.1.105,192.168.1.106"
    wsrep_node_name=node3
    wsrep_node_address=192.168.1.106
    binlog_format=row
    default_storage_engine=InnoDB
    innodb_autoinc_lock_mode=2
    # 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
    

    3.初始化集群

    # 在第一个节点上启动galera cluster
    galera_new_cluster
    /usr/sbin/mysqld --wsrep-new-cluster --user=root &
    # 其它节点重启mariadb
    systemctl restart mariadb.service
    # 特别提醒:如果其它节点无法启动,需要关闭selinux
    # /etc/selinux/config中,SELINUX=enforcing改为SELINUX=disabled,重启后永久生效
    

    4.查询集群中的节点

    # 查看节点数量
    MariaDB [(none)]> SHOW STATUS LIKE 'wsrep_cluster_size';
    +--------------------+-------+
    | Variable_name      | Value |
    +--------------------+-------+
    | wsrep_cluster_size | 3     |
    +--------------------+-------+
    # 查看更多信息
    MariaDB [(none)]> SHOW STATUS LIKE 'wsrep%';
    
  • 向任意节点数据库写入数据,无论是对数据库、表还是对表中数据的操作,都会更新到其它节点;
  • 任意使一个节点上的MariaDB下线,集群会自动将该节点从集群中clean up;MariaDB再次上线时,集群又自动将该节点添加进来。
  • 具体的测试过程就不摆出来了,集群搭建好后这些结果是没有什么悬念的。