免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 34891 | 回复: 10
打印 上一主题 下一主题

MySQL的Galera Cluster配置说明 [复制链接]

论坛徽章:
6
CU大牛徽章
日期:2013-03-14 14:14:08CU大牛徽章
日期:2013-03-14 14:14:26CU大牛徽章
日期:2013-03-14 14:14:29处女座
日期:2014-04-21 11:51:59辰龙
日期:2014-05-12 09:15:10NBA常规赛纪念章
日期:2015-05-04 22:32:03
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-30 21:54 |只看该作者 |倒序浏览
Galera Cluster介绍
Galera是一个MySQL(也支持MariaDB,Percona)的同步多主集群软件,目前只支持InnoDB引擎。


主要功能:
  • 同步复制
  • 真正的multi-master,即所有节点可以同时读写数据库
  • 自动的节点成员控制,失效节点自动被清除
  • 新节点加入数据自动复制
  • 真正的并行复制,行级
  • 用户可以直接连接集群,使用感受上与MySQL完全一致
优势:
因为是多主,所以不存在Slavelag(延迟)
不存在丢失交易的情况
同时具有读和写的扩展能力
更小的客户端延迟
节点间数据是同步的,而Master/Slave模式是异步的,不同slave上的binlog可能是不同的
技术:
Galera集群的复制功能基于Galeralibrary实现,为了让MySQL与Galera library通讯,特别针对MySQL开发了wsrep API。






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(防止锁表,非阻塞)

环境描述
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

MySQLroot password:
q1w2e3!@#
Cluster root username:
clusteroot
Cluster root password:
q1w2e3!@#
GaleraSST user:
sst
GaleraSST password:
sstpass123

环境准备
以下操作以MariaDBserver1为示例。
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~]# 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:58UTC
[mariadb]
name =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
enabled = 1
gpgkey= [url=]file:///etc/pki/rpm-gpg/RPM-GPG-KEY-percona[/url]
gpgcheck = 1

[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 --nodepsmysql-libs
[root@mdb-01~]#  yum installMariaDB-Galera-server galera MariaDB-client xtrabackup
2.设置开机启动MariaDB
[root@mdb-01~]#  chkconfig mysqlon
[root@mdb-01~]#  service mysqlstart
3.设置MariaDB的root密码,并做安全加固
[root@mdb-01~]# /usr/bin/mysql_secure_installation
4.确认MariaDB已正确安装并处于运行状态
[root@mdb-01~]#  mysql -u root-p
Enterpassword:
Welcome to the MariaDB monitor.  Commands end with ; or\g.
YourMariaDB connection id is 11
Serverversion: 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 inputstatement.
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"


评分

参与人数 1可用积分 +6 收起 理由
枫影谁用了 + 6 神马都是浮云 图片重新编辑一下吧

查看全部评分

论坛徽章:
6
CU大牛徽章
日期:2013-03-14 14:14:08CU大牛徽章
日期:2013-03-14 14:14:26CU大牛徽章
日期:2013-03-14 14:14:29处女座
日期:2014-04-21 11:51:59辰龙
日期:2014-05-12 09:15:10NBA常规赛纪念章
日期:2015-05-04 22:32:03
2 [报告]
发表于 2013-07-30 21:55 |只看该作者
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.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。


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

上图中红色的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)



论坛徽章:
6
CU大牛徽章
日期:2013-03-14 14:14:08CU大牛徽章
日期:2013-03-14 14:14:26CU大牛徽章
日期:2013-03-14 14:14:29处女座
日期:2014-04-21 11:51:59辰龙
日期:2014-05-12 09:15:10NBA常规赛纪念章
日期:2015-05-04 22:32:03
3 [报告]
发表于 2013-07-30 21:56 |只看该作者
本帖最后由 wang290 于 2013-07-30 22:04 编辑

12.确认galera集群正确安装和运行
[root@mdb-01 ~]#  mysql -u root -p

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(过程略,可参考我这篇博文: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/ ... uster-using-galera/
http://weetinyworld.blogspot.tw/ ... a-cluster-from.html
http://blog.wu-boy.com/2013/03/g ... master-replication/
http://www.sebastien-han.fr/blog ... -xtrabackup-method/
http://blog.secaserver.com/2011/ ... uster-using-galera/
http://blog.secaserver.com/2012/ ... ter-galera-haproxy/
http://www.severalnines.com/reso ... -balancing-tutorial
http://opentodo.net/2012/12/mysq ... cation-with-galera/
http://www.planetlarg.net/open-s ... -mysql-mysql-galera
http://www.sebastien-han.fr/blog ... uster-with-haproxy/
http://www.zrwm.com/?cat=130
http://openquery.com/blog/galera-predeployment-check
http://www.percona.com/files/pre ... -best-practices.pdf
https://groups.google.com/forum/ ... jcznPI/H8ftsjZwptAJ
http://www.zrwm.com/?p=5844
http://beerpla.net/2008/09/05/my ... -ways-to-battle-it/
http://wiki.vps.net/vps-net-feat ... ster-configuration/
http://haproxy.1wt.eu/download/1.4/doc/configuration.txt

GTID和mysqlfailover相关文档
http://scriptingmysql.wordpress. ... 6-gtid-replication/
http://svenmysql.blogspot.se/201 ... le-replication.html
http://svenmysql.blogspot.tw/201 ... al-transaction.html
http://svenmysql.blogspot.se/201 ... es-using-mysql.html
http://www.percona.com/sites/def ... to_Presentation.pdf
http://hickey.in/?p=78
http://dev.mysql.com/doc/refman/ ... on-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/ ... o-masterstatus.html

来源:http://blog.sina.com.cn/s/blog_704836f40101lixp.html

论坛徽章:
2
数据库技术版块每日发帖之星
日期:2015-08-03 06:20:00IT运维版块每日发帖之星
日期:2015-08-07 06:20:00
4 [报告]
发表于 2013-07-31 17:28 |只看该作者
多谢分享      

论坛徽章:
0
5 [报告]
发表于 2013-08-06 09:53 |只看该作者
图片全部裂了

来自sina微博

论坛徽章:
6
CU大牛徽章
日期:2013-03-14 14:14:08CU大牛徽章
日期:2013-03-14 14:14:26CU大牛徽章
日期:2013-03-14 14:14:29处女座
日期:2014-04-21 11:51:59辰龙
日期:2014-05-12 09:15:10NBA常规赛纪念章
日期:2015-05-04 22:32:03
6 [报告]
发表于 2013-08-11 19:25 |只看该作者
zclhard 发表于 2013-08-06 09:53
图片全部裂了

来自sina微博


不好意思,转过来的,图片是在sina的

论坛徽章:
1
双子座
日期:2014-09-02 14:32:18
7 [报告]
发表于 2014-08-22 11:39 |只看该作者
感觉很好,因为使用的是InnoDB,因此可以和已有数据库结合,不像mysql cluster,只能使用ndb存储引擎,有很多的限制问题。

论坛徽章:
1
白银圣斗士
日期:2015-11-23 08:33:04
8 [报告]
发表于 2014-08-22 11:54 |只看该作者
图片都挂了,编辑一直吧。

论坛徽章:
0
9 [报告]
发表于 2015-04-16 14:18 |只看该作者
模拟断电集群都挂掉,应该怎么恢复?官方文档就说了个--wsrep-recover参数,试了下报错,有没有具体用法指点一下?

论坛徽章:
6
CU大牛徽章
日期:2013-03-14 14:14:08CU大牛徽章
日期:2013-03-14 14:14:26CU大牛徽章
日期:2013-03-14 14:14:29处女座
日期:2014-04-21 11:51:59辰龙
日期:2014-05-12 09:15:10NBA常规赛纪念章
日期:2015-05-04 22:32:03
10 [报告]
发表于 2015-04-23 21:36 |只看该作者
shadow_H 发表于 2015-04-16 14:18
模拟断电集群都挂掉,应该怎么恢复?官方文档就说了个--wsrep-recover参数,试了下报错,有没有具体用法指点 ...


不好意思,文字是转过来的,你可以去原文那里,问一下这个文字的作者
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP