加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

MySQL的Galera Cluster配置说明

(2013-05-17 15:58:20)
标签:

mysql

集群

多主

galera

mariadb

分类: Web应用

[2017.03.15 修订]   本来作为一篇读书笔记性质写的文章,重新再读,发现疏漏不少,貌似还被不少地方转载了,误人子弟了,修改一下,希望错漏少些,看官们见谅,呵呵。

部分图片引用自《Galera Cluster Best Practices》

--------------------------

一、Galera Cluster介绍

Galera是一个MySQL(也支持MariaDB,Percona)的同步多主集群软件。

从用户视角看,一组Galera集群可以看作一个具有多入口的MySQL库,用户可以同时从多个IP读写这个库。

目前Galera已经得到广泛应用,例如Openstack中,在集群规模不大的情况下,稳定性已经得到了实践考验。


http://s5/mw690/0023u9s8zy79wbYP7HCf4&690Cluster配置说明" TITLE="MySQL的Galera Cluster配置说明" />

主要特点:

 

  • 同步复制

http://s11/bmiddle/0023u9s8zy79wc28POida&690Cluster配置说明" TITLE="MySQL的Galera Cluster配置说明" />


http://s16/mw690/0023u9s8zy79wc2Iz4X7f&690Cluster配置说明" TITLE="MySQL的Galera Cluster配置说明" />


http://s14/mw690/0023u9s8zy79wc3djWt3d&690Cluster配置说明" TITLE="MySQL的Galera Cluster配置说明" />


 

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

http://s13/mw690/0023u9s8zy79wc5fujO1c&690Cluster配置说明" TITLE="MySQL的Galera Cluster配置说明" />


 

  • 自动的节点成员控制,失效节点自动被清除
  • 新节点加入数据自动复制
  • 真正的并行复制,行级
  • 用户可以直接连接集群,使用感受上与MySQL完全一致

 

优势:

因为是多主,所以不存在Slave lag

不存在丢失交易的情况

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

更小的客户端延迟

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

 

技术:

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

http://s8/bmiddle/0023u9s8zy79wcdFnLh57&690Cluster配置说明" TITLE="MySQL的Galera Cluster配置说明" />


http://s6/bmiddle/0023u9s8zy79wceSyVva5&690Cluster配置说明" TITLE="MySQL的Galera Cluster配置说明" />


http://s6/mw690/0023u9s8zy79wcilIwdf5&690Cluster配置说明" TITLE="MySQL的Galera Cluster配置说明" />


[2017.03.15 修订] 

    MySQL官方自5.7版本后推出了Group Replication,同样支持多主写入,功能和Galera类似,"官方控"可以去看看。


    Galera集群中,后加入的节点叫“joiner”,joiner会向之前的节点请求同步数据,接受同步请求的节点叫“donor”,同步可以通过IST: incremental state transfer 和SST: full state transfer两种方式,支持的wsrep_sst_method有mysqldump,rsync,xtrabackup三种。其中xtrabackup锁表的时间最短,同步速度最快,所以一般选择xtrabackup。

    无论采用哪种方法,都会短暂锁表,如果对这个比较敏感,那么可以采用专用的“参考节点”,即该节点不对用户开放,也不执行任何SQL操作。

http://s3/mw690/0023u9s8zy79wQYuZp0d2&690Cluster配置说明" TITLE="MySQL的Galera Cluster配置说明" />


二、Galera安装流水账


2.1 Galera与SElinux

2.1.1 将SElinux置为”permissive“状态
2.1.2 安装好Galera集群,然后做如下各种操作,获取SELinux的events log
启动节点
停止节点服务,在其他节点做插入,删除,更新操作,重启服务
停止节点服务,删除grastate.dat文件,重启服务
直接重启节点
尽量将日常操作都做过一遍。
2.1.3 据SElinux日志来生成policy文件,编译为module后打包,加载
]# fgrep "mysqld" /var/log/audit/audit.log | audit2allow -m MySQL_galera -o galera.te
]# checkmodule -M -m galera.te -o galera.mod
]# semodule_package -m galera.mod -o galera.pp.
]# semodule -I galera.pp
2.1.4 将SElinux恢复为“enforcing”状态


2.2 安装MariaDB

[在每个节点上]

2.2.1 加入MariaDB官方源

]# vim /etc/yum/repos.d/MariaDB.repo

[mariadb]

name = MariaDB

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

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

gpgcheck=1


2.2.2 安装MariaDB,Galera,xtrabackup

]# yum install MariaDB-client MariaDB-Galera-server galera xtrabackup


2.2.3 启动MariaDB,并作安全加固

]# service mysql start

]# /usr/bin/mysql_secure_installation


2.2.4 增加SST用户,用于同步数据

]# mysql -u root -p

mysql> GRANT ALL PRIVILEGES on *.* to sst_user@'%' IDENTIFIED BY 'dbpass';

mysql> FLUSH PRIVILEGES;

mysql> quit

注意:为了安全,尽量不要用‘%’,而是指定的集群节点IP。


2.2.5 停止MariaDB,编辑Galera配置文件

]# service mysql stop

]# vi /etc/my.cnf.d/server.cnf

binlog_format=ROW

default-storage-engine=innodb

innodb_autoinc_lock_mode=2

innodb_locks_unsafe_for_binlog=1

query_cache_size=0

query_cache_type=0

bind-address=0.0.0.0

datadir=/var/lib/mysql

innodb_log_file_size=100M

innodb_file_per_table

innodb_flush_log_at_trx_commit=2


# Galera Provider Configuration

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


# Galera Cluster Configuration

wsrep_cluster_address="gcomm://1.1.1.1,1.1.1.2,1.1.1.3"

wsrep_cluster_name='galera_cluster'


# Galera Node Configuration

wsrep_node_address='1.1.1.1'

wsrep_node_name='db1'


# Galera Synchronization Configuration

wsrep_sst_method=xtrabackup

wsrep_sst_auth=sst_user:dbpass


对于第二、三个节点,不要忘了修改地址:

wsrep_node_address=1.1.1.2

wsrep_node_name='db2'


2.2.6 初始化第一个节点

]# /etc/init.d/mysql start --wsrep-new-cluster


检查集群状态

]# mysql-uroot-p-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 :)


2.2.7 启动第二个节点

]# service mysql start

]# mysql -u root -p -e "show status like 'wsrep%'"

| wsrep_local_state_comment | Synced                    |

| wsrep_incoming_addre sses | 1.1.1.1:3306,1.1.1.2:3306 |

| wsrep_cluster_size        | 2                         |

| wsrep_connected           | ON                        |

| wsrep_ready               | ON                        |


2.2.8 启动第三个节点

| wsrep_local_state_comment | Synced                                 |

| wsrep_incoming_addresses  | 1.1.1.3:3306,1.1.1.1:3306,1.1.1.2:3306 |

| wsrep_cluster_size        | 3                                      |

| wsrep_connected           | ON                                     |

| wsrep_ready               | ON                                     |


2.2.9 检验集群同步是否成功,在第一个节点执行:

]# mysql -u root -p -e 'CREATE DATABASE clustertest;'

]# mysql -u root -p -e 'CREATE TABLE clustertest.mycluster ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(50), ipaddress VARCHAR(20), PRIMARY KEY(id));'

]# mysql -u root -p -e 'INSERT INTO clustertest.mycluster (name, ipaddress) VALUES ("db1", "1.1.1.1");'


分别在3个节点上都执行以下查询:

]# mysql -u root -p -e 'SELECT * FROM clustertest.mycluster;'

Enter password: 

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

| id | name | ipaddress |

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

| 2  | db1  | 1.1.1.1   |

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

如果3个节点都能看到同样的结果,说明集群同步没有问题。


2.2.10 重新启动第一个节点,再次加入集群

]# service mysql stop

]# service mysql start

注意:除了第一次初始化启动集群外,绝对不要再次执行“--wsrep-new-cluster”,第一次初始化的时候也不能在多个节点上执行!!!切记!


三、Galera与haproxy

    在实际应用中,Galera集群常与haproxy配合,haproxy作为单一入口,将SQL流量分配到后端Galera,注意此处是TCP级别的,而不是SQL语句级别。如果需要SQL语句级别的,可以参考看看MaxScale。相比haproxy方案,各有应用,此处不展开。

    实际应用的结构通常如下图所示,haproxy作为Galera Cluster的前端,2台haproxy用keepalived避免单点故障。后端的Galera集群可以是3个节点,也可以是2个节点+1个仲裁节点。

    在我公司的实际使用中,我们采用了2个节点+1个仲裁节点的方式。另外,为了避免Galera写入冲突,在haproxy配置中,实际上只允许一个节点接受写入,另一个节点带有backup参数,只有当前允许写入的节点坏掉,才会自动写入另一个节点。为了充分利用另一个节点,同时做读写分离,在haproxy上监听两个端口,例如:3307用于写入,3308用于读取。

http://s2/mw690/0023u9s8zy79wdKHYYN11&690Cluster配置说明" TITLE="MySQL的Galera Cluster配置说明" />


盗一个别人的图来说明大概意思,这个图本身是说明haproxy配合主从复制的,但我们所用的读写分离意思是一样的。


http://s14/mw690/0023u9s8zy79wiMuXSd5d&690Cluster配置说明" TITLE="MySQL的Galera Cluster配置说明" />

3.1 galera的backend check

    使用haproxy,普通的tcp 3306端口的check不足以保证后端的数据库可用,因为Galera的集群状态有多种。因此必须仔细规划后段Galera状态检查,可以参考下图。

http://s2/mw690/0023u9s8zy79wfhgrfz61&690Cluster配置说明" TITLE="MySQL的Galera Cluster配置说明" />

 percona已经根据上图做好了后端检查的clustercheck脚本,地址为:https://github.com/olafz/percona-clustercheck


3.1.1  从github下载clustercheck脚本到各节点的/usr/bin

3.1.2  编辑xinetd配置文件

]# vi /etc/xinetd.d/mysqlchk:

# default: on

# description: mysqlchk

service mysqlchk

{

        disable = no

        flags = REUSE

        socket_type = stream

        port = 9200

        wait = no

        user = nobody

        server = /usr/bin/clustercheck

        log_on_failure += USERID

        only_from = 0.0.0.0/0

        per_source = UNLIMITED

}

3.1.3  编辑/etc/services

# echo 'mysqlchk      9200/tcp    # MySQL check' >> /etc/services

3.1.4  重启xinetd

 # /etc/init.d/xinetd restart

3.1.5  创建用于执行check的数据库用户,只需要在一个节点操作就好,Galera会自动同步到其他节点。

mysql> GRANT PROCESS ON *.* TO 'clustercheckuser'@'localhost' IDENTIFIED BY 'clustercheckpassword!'

注意:用户名和密码要与clustercheck脚本中的参数一致。

3.1.6  配置haproxy

...

listen percona-cluster 0.0.0.0:3307

  balance leastconn

  option httpchk

  mode tcp

    server node1 1.1.1.1:3306 check port 9200 inter 5000 fastinter 2000 rise 2 fall 2

    server node2 1.1.1.2:3306 check port 9200 inter 5000 fastinter 2000 rise 2 fall 2

    server node3 1.1.1.3:3306 check port 9200 inter 5000 fastinter 2000 rise 2 fall 2 backup


haproxy做backend check的时候,如果后端节点正常,则会返回HTTP code 200 (OK), 否则返回HTTP error 503 (Service Unavailable) ,这样haproxy会自动加载或下线节点。


四、仲裁节点

    为了避免“脑裂”,Galera集群最少需要3个节点,生产环境中最好是3台独立主机,或者位于3个不同IDC的主机。如果觉得3台主机太浪费,也可以2台数据库节点+1个虚拟机仲裁节点。

    仲裁节点是集群的一部分,可以参与投票,但是不参与实际复制。在3个IDC场景下,如果一个IDC自身网络中断,但假如它与仲裁节点可以连通,同时其他节点也与仲裁节点可以连通的话,那仲裁节点就会作为中间人连接另两个节点通信。

    尽管仲裁节点不存储数据,但它必须可以看到所有的流量的传输复制。如果仲裁节点放在一个网络环境较差的地方,那它连接到集群的时候,可能会导致集群性能下降。

   http://s9/bmiddle/0023u9s8zy79wdy7Ausb8&690Cluster配置说明" TITLE="MySQL的Galera Cluster配置说明" />

使用YUM安装的MariaDB带有Galera Arbitrator,在配置文件中写入前边配好的集群节点地址和端口,集群名字,启动grab即可。

]# vi /etc/sysconfig/garb

# Copyright (C) 2012 Codership Oy

# This config file is to be sourced by garb service script.


# A comma-separated list of node addresses (address[:port]) in the cluster

GALERA_NODES="1.1.1.1:4567, 1.1.1.2:4567, 1.1.1.3:4567"


# Galera cluster name, should be the same as on the rest of the nodes.

GALERA_GROUP="galera_cluster"


# Optional Galera internal options string (e.g. SSL settings)

# see http://galeracluster.com/documentation-webpages/galeraparameters.html

# GALERA_OPTIONS=""


# Log file for garbd. Optional, by default logs to syslog

# Deprecated for CentOS7, use journalctl to query the log for garbd

# LOG_FILE=""


]# service garb start

[ ok ] Starting /usr/bin/garbd: :.


]# service garb status

[ ok ] garb is running.


]# mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"

检查集群节点数量,会发现增加了1个节点。


补充下关于如何测试Galera集群的脑裂(两个节点的集群)

1.断开两个节点的网络连接,quorum丢失,所有节点不再接受请求

2.将网络连接恢复,quorum仍然丢失,所有节点仍旧不接受请求。

3.登录其中一个节点,reset quorum:

SET GLOBAL wsrep_provider_options='pc.bootstrap=1';

4.quorum被重置,集群恢复



参考文档:

http://galeracluster.com/documentation-webpages/galerainstallation.html Galera安装文档

https://www.vps.net/community/knowledgebase/display/vpsfeatures/Galera+MySQL+Recommended+Cluster+Configuration 关于参考节点

http://www.tuicool.com/articles/qM3iU3Y  关于仲裁节点

https://www.percona.com/doc/percona-xtradb-cluster/5.6/howtos/garbd_howto.html  配置仲裁节点

https://www.freesoftwareservers.com/wiki/configure-garbd-mariadb-centos-7-10649614.html  配置仲裁节点

http://www.cnblogs.com/itcomputer/articles/5614356.html  关于节点状态检查

https://severalnines.com/resources/tutorials/mysql-load-balancing-haproxy-tutorial 关于节点状态检查

https://severalnines.com/blog/high-availability-read-write-splitting-php-mysqlnd-mysql-replication-and-haproxy  

http://www.th7.cn/db/mysql/201410/74544.shtml  关于读写分离

https://www.percona.com/live/mysql-conference-2013/sites/default/files/slides/PLUC_2013_GCBP.pdf  Galera最佳实践

http://lefred.be/content/mysql-group-replication-as-ha-solution/  MySQL GR与haproxy结合

https://www.percona.com/live/data-performance-conference-2016/sessions/high-availability-using-mysql-group-replication  MySQL GR

http://mysqlhighavailability.com/mysql-group-replication-a-quick-start-guide/ MySQL GR

https://www.digitalocean.com/community/tutorials/how-to-configure-a-galera-cluster-with-mariadb-10-1-on-ubuntu-16-04-servers Galera安装步骤

https://www.percona.com/blog/2014/09/01/galera-replication-how-to-recover-a-pxc-cluster/ 故障恢复


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

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

新浪公司 版权所有