• 假设3台数据库服务器(db1为主节点,db2,db3为从节点)

    • Cluster node 1 has hostname db1 and IP address 1.1.1.1
    • Cluster node 2 has hostname db2 and IP address 1.1.1.2
    • Cluster node 3 has hostname db3 and IP address 1.1.1.3
  • 安装MariaDB Galera Cluster

    1
    $ yum install MariaDB-Galera-server galera socat
  • 初始化数据库(只需要主节点执行)

    1
    2
    3
    $ /etc/init.d/mysql start
    $ /usr/bin/mysql_secure_installation
    $ /etc/init.d/mysql stop

    如果安装了MariaDB-server就先删除

    1
    $ yum remove MariaDB-server
  • 登陆数据库,设置用于集群同步的用户和密码(只需要主节点执行)

    1
    2
    3
    4
    5
    $ mysql -uroot -p123456
    MariaDB[] > GRANT USAGE ON *.* to sst@'%' IDENTIFIED BY '123456';
    MariaDB[] > GRANT ALL PRIVILEGES on *.* to sst@'%';
    MariaDB[] > FLUSH PRIVILEGES;
    MariaDB[] > quit
  • 开放系统端口3306,4444和4567

    1
    2
    3
    $ iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
    $ iptables -I INPUT -p tcp --dport 4444 -j ACCEPT
    $ iptables -I INPUT -p tcp --dport 4567 -j ACCEPT

    或者

    1
    $ iptables -F
  • 关闭SELinux

    1
    2
    $ vi /etc/selinux/config
    SELINUX=disabled

    或者

    1
    $ setenforce 0
  • 添加sst同步账号(只需要主节点执行)

    1
    2
    3
    4
    GRANT ALL PRIVILEGES ON *.* TO 'sst'@'1.1.1.1' IDENTIFIED BY '123456';
    GRANT ALL PRIVILEGES ON *.* TO 'sst'@'1.1.1.2' IDENTIFIED BY '123456';
    GRANT ALL PRIVILEGES ON *.* TO 'sst'@'1.1.1.3' IDENTIFIED BY '123456';
    FLUSH PRIVILEGES;
  • 配置MariaDB Galera(三台机器同样配置)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ cp /usr/share/mysql/wsrep.cnf /etc/my.cnf.d/
    $ vi /etc/my.cnf.d/wsrep.cnf
    datadir=/var/lib/mysql
    wsrep_provider=/usr/lib64/galera/libgalera_smm.so
    wsrep_cluster_name="my_wsrep_cluster"
    wsrep_cluster_address="gcomm://1.1.1.1,1.1.1.2,1.1.1.3"
    wsrep_node_name=db1 # 在db2和db3上不要忘记修改名字
    wsrep_node_address=1.1.1.1 # 在db2和db3上不要忘记修改地址
    wsrep_sst_method=rsync # 建议选择xtrabackup或xtrabackup-v2同步方式,xtrabackup方式需要安装percona-xtrabackup
    wsrep_sst_auth=sst:123456
  • 主节点启动

    1
    $ /etc/init.d/mysql start --wsrep-new-cluster
  • 从节点启动

    1
    $ /etc/init.d/mysql start
  • 查看Galera状态

    1
    2
    3
    4
    5
    $ mysql -uroot -p123456 -e"show status like 'wsrep%';"
    wsrep_local_state_comment | Synced <-- cluster is synced
    wsrep_incoming_addresses | 1.1.1.1:3306 <-- node db1 is a provider
    wsrep_cluster_size | 1 <-- cluster consists of 1 node
    wsrep_ready | ON <-- good :)
  • InnoDB 相关参数

    为了降低冲突,下列两项需要设置

    1
    2
    $ vi /etc/my.cnf.d/wsrep.cnf
    innodb_autoinc_lock_mode=2

    选配:(可以提高性能,galera保证不丢数据)

    1
    2
    $ vi /etc/my.cnf.d/wsrep.cnf
    innodb_flush_log_at_trx_commit=2

    如果innodb_flush_log_at_trx_commit设置为0,log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行.该模式下,在事务提交的时候,不会主动触发写入磁盘的操作。

    如果innodb_flush_log_at_trx_commit设置为1,每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去.

    如果innodb_flush_log_at_trx_commit设置为2,每次事务提交时MySQL都会把log buffer的数据写入log file. 但是flush(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作。

    设置binlog刷新

    1
    2
    $ vi /etc/my.cnf.d/wsrep.cnf
    sync_binlog=100

    sync_binlog的默认值是0,像操作系统刷其他文件的机制一样,MySQL不会同步到磁盘中去而是依赖操作系统来刷新binary log。

    当sync_binlog=N (N>0) ,MySQL在每写N次二进制日志binary log时,会使用fdatasync()函数将它的写二进制日志binary log同步到磁盘中去。

  • 判断复制过程是否出现问题

    1
    2
    $ mysql -uroot -p123456 -e"show status like 'wsrep%';"
    wsrep_flow_control_paused

    正常情况下,其取值应该接近于0.0,大于0.0意味着有‘慢节点’影响了集群的速度

    可以尝试通过增大wsrep_slave_threads来解决

  • 找出慢节点

    找出下面两个值最大的节点

    1
    2
    3
    $ mysql -uroot -p123456 -e"show status like 'wsrep%';"
    wsrep_flow_control_sent
    wsrep_local_recv_queue_avg
  • 最后,任意数据库节点宕机(不论主从节点)都以从节点方式重启即可。