加载中…
正文 字体大小:

MySQL的Galera Cluster配置说明

(2014-07-16 23:11:37)
标签:

股票

分类: mysql
MySQL的Galera Cluster配置说明

Galera Cluster介绍

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

MySQL的Galera <wbr><wbr>Cluster配置说明

主要功能:

  • 同步复制
  • 真正的multi-master,即所有节点可以同时读写数据库
  • 自动的节点成员控制,失效节点自动被清除
  • 新节点加入数据自动复制
  • 真正的并行复制,行级
  • 用户可以直接连接集群,使用感受上与MySQL完全一致

 

优势:

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

不存在丢失交易的情况

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

更小的客户端延迟

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

 

技术:

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

MySQL的Galera <wbr><wbr>Cluster配置说明

MySQL的Galera <wbr><wbr>Cluster配置说明 

MySQL的Galera <wbr><wbr>Cluster配置说明 

MariaDB介绍

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

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

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

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

 

方案总览

  • haproxy作为MariaDB Galera Cluster的前端
  • 2haproxykeepalived避免单点故障
  • 3MariaDB和一个garbd仲裁节点组成集群,仲裁节点上无数据
  • Galera的SST采用Percona提供的XtraBackup(防止锁表,非阻塞)

MySQL的Galera <wbr><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

# MariaDB 5.5 CentOS repository list - created 2013-05-16 01:58 UTC

http://mariadb.org/mariadb/repositories/

[mariadb]

name = MariaDB

baseurl = http://yum.mariadb.org/5.5/centos6-amd64

gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB

gpgcheck=1

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

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

[percona]

name = CentOS $releasever - Percona

baseurl=http://repo.percona.com/centos/$releasever/os/$basearch/

enabled = 1

gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-percona

gpgcheck = 1

[root@mdb-01 ~]# wget -O /etc/pki/rpm-gpg/RPM-GPG-KEY-perconahttp://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 3306TCP 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.0:3306                0.0.0.0:*                   LISTEN      8977/mysqld

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

 

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

 

11.为集群增加其他节点

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

MySQL的Galera <wbr><wbr>Cluster配置说明

 

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

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

1.数据一致性:

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

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

2.数据安全性:

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

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

3.高可用

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

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

 

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

1.按照上述1-9的步骤安装MariaDBGalera 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><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.编译haproxykeepalived(过程略,可参考我这篇博文:http://blog.sina.com.cn/s/blog_704836f40101gm11.html)

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:回滚,检测到的冲突数目

参考文档:

MariaDB和Galera Cluster相关文档
http://blog.secaserver.com/2011/07/install-mysql-replication-and-cluster-using-galera/
http://weetinyworld.blogspot.tw/2013/04/setting-up-mariadb-galera-cluster-from.html
http://blog.wu-boy.com/2013/03/galera-cluster-for-mysql-multi-master-replication/
http://www.sebastien-han.fr/blog/2012/08/29/setup-galera-with-sst-xtrabackup-method/
http://blog.secaserver.com/2011/07/install-mysql-replication-and-cluster-using-galera/
http://blog.secaserver.com/2012/02/high-availability-mysql-cluster-galera-haproxy/
http://www.severalnines.com/resources/clustercontrol-mysql-haproxy-load-balancing-tutorial
http://opentodo.net/2012/12/mysql-multi-master-replication-with-galera/
http://www.planetlarg.net/open-source-cookbook/data-storage/replace-mysql-mysql-galera
http://www.sebastien-han.fr/blog/2012/04/08/mysql-galera-cluster-with-haproxy/
http://www.zrwm.com/?cat=130
http://openquery.com/blog/galera-predeployment-check
http://www.percona.com/files/presentations/percona-live/nyc-2012/PLNY12-galera-cluster-best-practices.pdf
https://groups.google.com/forum/#!msg/codership-team/OUxATjcznPI/H8ftsjZwptAJ
http://www.zrwm.com/?p=5844
http://beerpla.net/2008/09/05/mysql-slave-lag-delay-explained-and-7-ways-to-battle-it/
http://wiki.vps.net/vps-net-features/cloud-servers/template-information/galeramysql-recommended-cluster-configuration/
http://haproxy.1wt.eu/download/1.4/doc/configuration.txt

GTID和mysqlfailover相关文档
http://scriptingmysql.wordpress.com/2012/12/06/using-the-mysql-script-mysqlfailover-for-automatic-failover-with-mysql-5-6-gtid-replication/
http://svenmysql.blogspot.se/2012/10/failover-and-flexible-replication.html
http://svenmysql.blogspot.tw/2012/10/advanced-use-of-global-transaction.html
http://svenmysql.blogspot.se/2013/03/flexible-fail-over-policies-using-mysql.html
http://www.percona.com/sites/default/files/presentations/MHA_Toronto_Presentation.pdf
http://hickey.in/?p=78
http://dev.mysql.com/doc/refman/5.6/en/replication-gtids-howto.html
http://huoding.com/2011/04/05/59
http://www.cnblogs.com/hustcat/archive/2009/12/19/1627525.html
http://dev.mysql.com/doc/refman/5.5/en/replication-howto-masterstatus.html

上一篇

0

阅读 评论 收藏 转载 喜欢 打印举报
已投稿到:
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 不良信息反馈 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有