/ 中存储网

MySQL Galera Cluster数据库集群配置教程

2014-07-13 16:14:19 来源:中存储网

Galera Cluster介绍

Galera是一个MySQL(也支持MariaDB,Percona)的同步多主集群软件,目前只支持InnoDB引擎。

MySQL的Galera <wbr>Cluster配置说明

主要功能:

同步复制

真正的multi-master,即所有节点可以同时读写数据库

自动的节点成员控制,失效节点自动被清除

新节点加入数据自动复制

真正的并行复制,行级

用户可以直接连接集群,使用感受上与MySQL完全一致

 

优势:

因为是多主,所以不存在Slave lag(延迟)

不存在丢失交易的情况

同时具有读和写的扩展能力

更小的客户端延迟

节点间数据是同步的,而Master/Slave模式是异步的,不同slave上的binlog可能是不同的

 

技术:

Galera集群的复制功能基于Galera library实现,为了让MySQL与Galera library通讯,特别针对MySQL开发了wsrep API。

MySQL的Galera <wbr>Cluster配置说明

MySQL的Galera <wbr>Cluster配置说明

MySQL的Galera <wbr>Cluster配置说明

MariaDB介绍

MariaDB是MySQL的一个分支,由MySQL的创始人Michael Widenius主导开发,采用GPL授权许可。

开发这个分支的原因之一是Oracle公司收购了MySQL后,有将MySQL闭源的潜在风险,因此社区采用分支的方式来避开这个风险。

MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。

在存储引擎方面,使用XtraDB来代替MySQL的InnoDB。

 

方案总览

haproxy作为MariaDB Galera Cluster的前端

2台haproxy用keepalived避免单点故障

3台MariaDB和一个garbd仲裁节点组成集群,仲裁节点上无数据

Galera的SST采用Percona提供的XtraBackup(防止锁表,非阻塞)

MySQL的Galera <wbr>Cluster配置说明
 

环境描述

OS: CentOS 6.0 64bit

MariaDB server1:

192.168.0.171

MariaDB server2:

192.168.0.172

MariaDB server3:

192.168.0.173

HAProxy server1:

192.168.0.151

HAProxy server2:

192.168.0.152

HAProxy共享的VIP:

192.168.0.170

 

MySQL root password:

q1w2e3!@#

Cluster root username:

clusteroot

Cluster root password:

q1w2e3!@#

Galera SST user:

sst

Galera SST password:

sstpass123

 

环境准备

以下操作以MariaDB server1为示例。

 

1.准备hosts文件

编辑上述每台服务器的/etc/hosts,添加如下内容:

192.168.0.151 haproxy1.cluster.local haproxy1

192.168.0.152 haproxy2.cluster.local haproxy2

192.168.0.171 galera1.cluster.local galera1

192.168.0.172 galera2.cluster.local galera2

127.0.0.1     localhost.localdomain localhost

::1           localhost6 localhost6.localdomain

 

2.安装163,epel,Percona,MariaDB的YUM源

[root@mdb-01 ~]# wget http://mirrors.163.com/.help/CentOS6-Base-163.repo

[root@mdb-01 ~]# rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

[root@mdb-01 ~]# cat CentOS6-Base-163.repo > /etc/yum.repos.d/CentOS-Base.repo

[root@mdb-01 ~]# vi /etc/yum.repos.d/MariaDB.repo

[root@mdb-01 ~]# rpm --import https://yum.mariadb.org/RPM-GPG-KEY-MariaDB

[root@mdb-01 ~]# vi /etc/yum.repos.d/Percona.repo

[root@mdb-01 ~]# wget -O /etc/pki/rpm-gpg/RPM-GPG-KEY-percona http://www.percona.com/downloads/RPM-GPG-KEY-percona

[root@mdb-01 ~]# yum makecache

 

Galera Cluster的配置

1.安装MariaDB、galera、xtrabackup

[root@mdb-01 ~]#  rpm -e --nodeps mysql-libs

[root@mdb-01 ~]#  yum install MariaDB-Galera-server galera MariaDB-client xtrabackup

 

2.设置开机启动MariaDB

[root@mdb-01 ~]#  chkconfig mysql on

[root@mdb-01 ~]#  service mysql start

 

3.设置MariaDB的root密码,并做安全加固

[root@mdb-01 ~]#  /usr/bin/mysql_secure_installation

 

4.确认MariaDB已正确安装并处于运行状态

[root@mdb-01 ~]#  mysql -u root -p

Enter password:

Welcome to the MariaDB monitor.  Commands end with ; or g.

Your MariaDB connection id is 11

Server version: 5.5.29-MariaDB MariaDB Server, wsrep_23.7.3.rXXXX

Copyright (c) 2000, 2013, Oracle, Monty Program Ab and others.

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

MariaDB [(none)]>

注意查看是否有"wsrep_23.7.3.rXXXX"的输出。

 

5.创建用于同步数据库的SST帐号

[root@mdb-01 ~]#  mysql -u root -p

mysql> GRANT USAGE ON *.* to sst@'%' IDENTIFIED BY 'sstpass123';

mysql> GRANT ALL PRIVILEGES on *.* to sst@'%';

mysql> FLUSH PRIVILEGES;

mysql> quit

 

6.创建wsrep.cnf文件

[root@mdb-01 ~]#  cp /usr/share/mysql/wsrep.cnf /etc/my.cnf.d/

[root@mdb-01 ~]#  vi /etc/my.cnf.d/wsrep.cnf

只需要修改如下4行:

wsrep_provider=/usr/lib64/galera/libgalera_smm.so

wsrep_cluster_address="gcomm://"

wsrep_sst_auth=sst:sstpass123

wsrep_sst_method=xtrabackup

 

注意:

"gcomm://" 是特殊的地址,仅仅是Galera cluster初始化启动时候使用。

如果集群启动以后,我们关闭了第一个节点,那么再次启动的时候必须先修改

"gcomm://"为其他节点的集群地址,例如

wsrep_cluster_address="gcomm://192.168.0.172:4567"

 

7.在/etc/my.cnf中加入如下一行

!includedir /etc/my.cnf.d/

 

8.确认本机防火墙上开放了所需TCP 3306和TCP 4567的端口

[root@mdb-01 ~]#  iptables -A INPUT -i eth0 -p tcp --dport 3306 -j ACCEPT

[root@mdb-01 ~]#  iptables -A INPUT -i eth0 -p tcp --dport 4567 -j ACCEPT

 

9.重起MariaDB服务

[root@mdb-01 ~]#  /etc/init.d/mysql restart

 

10.确认MySQL的3306端口和wsrep的4567端口处于监听状态

[root@mdb-01 ~]#  netstat -tulpn | grep -e 4567 -e 3306

tcp            0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      8977/mysqld

tcp            0 0.0.0.0:4567                0.0.0.0:*                   LISTEN      8977/mysqld

 

至此,集群的第一个节点配置完毕。

 

11.为集群增加其他节点

在Galera Cluster中,新接入的节点叫Joiner,给joiner提供复制的节点叫Donor。

MySQL的Galera <wbr>Cluster配置说明

 

对于生产环境使用,建议设立一个专用的"参考节点",这个"参考节点"不执行任何客户端的SQL请求。

MySQL的Galera <wbr>Cluster配置说明
上图中红色的NODE A即为"参考节点",这样做的好处有如下几条:

1.数据一致性:

因为"参考节点"本身不执行任何客户端SQL,所以在这个节点上发生transaction冲突的可能性最小。

因此如果发现集群有数据不一致的时候,"参考节点"上的数据应该是集群中最准确的。

2.数据安全性:

因为"参考节点"本身不执行任何客户端SQL,所以在这个节点上发生灾难事件的可能性最小。

因此当整个集群宕掉的时候,"参考节点"应该是恢复集群的最佳节点。

3.高可用

"参考节点"可以作为专门state snapshot donor。

因为"参考节点"不服务于客户端,因此当使用此节点进行SST的时候,不会影响用户体验,并且前端的负载均衡设备也不需要重新配置。

 

构造如上图的结构,新节点的操作步骤如下:

1.按照上述1-9的步骤安装MariaDB和Galera library

2.除了第5步wsrep_cluster_address的配置稍有不同:

wsrep_cluster_address="gcomm://Node-A-IP:4567"

3.重起MariaDB

4.按上述步骤配置下一个节点,将其wsrep_cluster_address指向其前一个节点,例如:

Node C -> Node B, Node D -> Node C, … , Node N -> …

5.配置Node A重新加入集群,修改/etc/my.cnf.d/wsrep.cnf中的wsrep_cluster_address地址指向Node N。

wsrep_cluster_address="gcomm://Node-N-IP:4567"

 

修改节点的wsrep_cluster_address有两种方式:

1)修改配置文件中的wsrep_cluster_address,然后重启MySQL

2)直接修改MySQL全局变量

mysql> SHOW VARIABLES LIKE 'wsrep_cluster_address';

+-----------------------+----------------------------+

| Variable_name         | Value                           |

+-----------------------+----------------------------+

| wsrep_cluster_address | gcomm://192.168.0.172:4567 |

+-----------------------+----------------------------+

1 row in set (0.00 sec)

 

mysql> set global wsrep_cluster_address="gcomm://192.168.0.172:4567,192.168.0.173:4567";

Query OK, 0 rows affected (2.20 sec)

 

mysql> SHOW VARIABLES LIKE 'wsrep_cluster_address';

+-----------------------+-------------------------------------------------------+

| Variable_name         | Value                                                 |

+-----------------------+-------------------------------------------------------+

| wsrep_cluster_address | gcomm://192.168.0.172:4567,192.168.0.173:4567         |

+-----------------------+-------------------------------------------------------+

1 row in set (0.00 sec)

 

12.确认galera集群正确安装和运行

[root@mdb-01 ~]#  mysql -u root -p

MySQL的Galera <wbr>Cluster配置说明
wsrep_ready 为ON,则说明MariaDB Galera集群已经正确运行了。

wsrep_cluster_size 标明了组成集群的节点个数。

 

13.给集群加入Galera arbitrator

对于只有2个节点的Galera Cluster和其他集群软件一样,需要面对极端情况下的"脑裂"状态。

为了避免这种问题,Galera引入了"arbitrator(仲裁人)"。

"仲裁人"节点上没有数据,它在集群中的作用就是在集群发生分裂时进行仲裁,集群中可以有多个"仲裁人"节点。

"仲裁人"节点加入集群的方法很简单,运行如下命令即可:

[root@arbt ~]# garbd -a gcomm://192.168.0.171:4567 -g my_wsrep_cluster -d

 

参数说明:

-d 以daemon模式运行

-a 集群地址

-g 集群名称

 

Haproxy的相关配置

1.创建用于后端MySQL服务器健康检查的数据库帐号

haproxy现在支持option mysql-check,这个检查会向后端服务器发送2个包,一个用于客户端认证,一个用于关闭连接。这个检查需要在每个节点上都需要创建一个无密码的MySQL帐号。

[root@mdb-01 ~]#  mysql -u root -p

Enter password:

mysql> INSERT INTO mysql.user (host,user) values ('%','haproxy');

mysql> FLUSH PRIVILEGES;

mysql> quit

 

2.编译haproxy和keepalived(过程略)

3.配置keepalived(此处只列出Master的配置)

vrrp_script chk_haproxy {
        script "killall -0 haproxy" # verify the pid is exist or not
        interval 2                      # check every 2 seconds
        weight 2                        # add 2 points of prio if OK
}
 
vrrp_instance VI_1 {
        interface eth0                        # interface to monitor
        state MASTER
        virtual_router_id 51                # Assign one ID for this route
        priority 101                    # 101 on master, 100 on backup
        virtual_ipaddress {
            192.168.0.170                # the virtual IP
        }
        track_script {
            chk_haproxy
        }
}

4.配置haproxy

defaults
        log global
        mode http
        retries 3
        option redispatch
        maxconn 4096
        contimeout 50000
        clitimeout 50000
        srvtimeout 50000
 
listen mysql_proxy 0.0.0.0:3306
        mode tcp
        balance roundrobin
        option tcpka
        option httpchk
        option mysql-check user haproxy
        server galera1 192.168.0.171:3306 weight 1
        server galera2 192.168.0.172:3306 weight 1

 

其他相关

1.Galera Cluster部署的前置检查

在要转成Galera Cluster的数据库上执行如下SQL语句:

SELECT DISTINCT
       CONCAT(t.table_schema,'.',t.table_name) as tbl,
       t.engine,
       IF(ISNULL(c.constraint_name),'NOPK','') AS nopk,
       IF(s.index_type = 'FULLTEXT','FULLTEXT','') as ftidx,
       IF(s.index_type = 'SPATIAL','SPATIAL','') as gisidx
  FROM information_schema.tables AS t
  LEFT JOIN information_schema.key_column_usage AS c
    ON (t.table_schema = c.constraint_schema AND t.table_name = c.table_name
        AND c.constraint_name = 'PRIMARY')
  LEFT JOIN information_schema.statistics AS s
    ON (t.table_schema = s.table_schema AND t.table_name = s.table_name
        AND s.index_type IN ('FULLTEXT','SPATIAL'))
  WHERE t.table_schema NOT IN ('information_schema','performance_schema','mysql')
    AND t.table_type = 'BASE TABLE'
    AND (t.engine <> 'InnoDB' OR c.constraint_name IS NULL OR s.index_type IN ('FULLTEXT','SPATIAL'))
  ORDER BY t.table_schema,t.table_name;

 

上述SQL检索数据库,输出不符合使用Galera的表的信息,对应的5个字段顺序为:表,表引擎,是否无主键,是否有全文索引,是否有空间索引。

找到不符合的原因,对应修改即可。

 

2.MySQL Galera监控

    查看MySQL版本:   mysql> SHOW GLOBAL VARIABLES LIKE 'version';

    查看wsrep版本: mysql> SHOW GLOBAL STATUS LIKE 'wsrep_provider_version';

    查看wsrep有关的所有变量: mysql> SHOW VARIABLES LIKE 'wsrep%' G

    查看Galera集群状态: mysql> show status like 'wsrep%';

 

监控状态参数说明:

        集群完整性检查:

            wsrep_cluster_state_uuid:在集群所有节点的值应该是相同的,有不同值的节点,说明其没有连接入集群.

            wsrep_cluster_conf_id:正常情况下所有节点上该值是一样的.如果值不同,说明该节点被临时"分区"了.当节点之间网络连接恢复的时候应该会恢复一样的值.

            wsrep_cluster_size:如果这个值跟预期的节点数一致,则所有的集群节点已经连接.

            wsrep_cluster_status:集群组成的状态.如果不为"Primary",说明出现"分区"或是"split-brain"状况.

        节点状态检查:

            wsrep_ready: 该值为ON,则说明可以接受SQL负载.如果为Off,则需要检查wsrep_connected.

            wsrep_connected: 如果该值为Off,且wsrep_ready的值也为Off,则说明该节点没有连接到集群.(可能是wsrep_cluster_address或wsrep_cluster_name等配置错造成的.具体错误需要查看错误日志)

            wsrep_local_state_comment:如果wsrep_connected为On,但wsrep_ready为OFF,则可以从该项查看原因.

        复制健康检查:

            wsrep_flow_control_paused:表示复制停止了多长时间.即表明集群因为Slave延迟而慢的程度.值为0~1,越靠近0越好,值为1表示复制完全停止.可优化wsrep_slave_threads的值来改善.

            wsrep_cert_deps_distance:有多少事务可以并行应用处理.wsrep_slave_threads设置的值不应该高出该值太多.

            wsrep_flow_control_sent:表示该节点已经停止复制了多少次.

            wsrep_local_recv_queue_avg:表示slave事务队列的平均长度.slave瓶颈的预兆.

 

        最慢的节点的wsrep_flow_control_sent和wsrep_local_recv_queue_avg这两个值最高.这两个值较低的话,相对更好.

        检测慢网络问题:

            wsrep_local_send_queue_avg:网络瓶颈的预兆.如果这个值比较高的话,可能存在网络瓶

        冲突或死锁的数目:

            wsrep_last_committed:最后提交的事务数目

            wsrep_local_cert_failures和wsrep_local_bf_aborts:回滚,检测到的冲突数目