集群的分裂
当集群由于网络原因分裂为几个单独的组时(一组可能是单节点,也可能是几个互联的节点),数据出现不一致,此时可能产生脑裂及数据不一致。这种情况下,只有一组节点能够继续提供服务,这组节点的状态是primary。当这种状况发生时,galera cluster会启动特别的仲裁算法来选举一个组件作为primary组件。
cluster size决定了quorum仲裁的投票数(因此是单数比较好,避免产生脑裂——这扩展到其他的设备也是适用的,比如交换机、网络、数据中心,至少使用3个),当一个节点不再有响应并被推测不再属于集群的时候,galera就会启动一次仲裁选举。可以使用evs.suspect_timeout来微调这个no response timeout,默认设置是5秒。当galera进行选举时,大部分原来连接保持的节点所在的部分会作为主,但分裂后的节点都还是活着的。当分裂发生后,获得加权仲裁的一组成为主,其他没货的权重的节点状态变为non-primary并尝试去连接主。
加权需要有“绝大部分”因此两个节点不能成为集群,如果一个faliure另一个也会自动成为non-primary状态
脑裂的情况
集群错误导致数据节点之间互相独立的情况称为脑裂。脑裂发生时,数据可能发生无可挽回的损坏,比如两个数据节点各自独立的更新了同一张表的同一行数据。像其他基于权重的系统一样,当仲裁算法失效无法选出主节点时,galera集群也会出现脑裂。这种情况会发生在例如只有两个节点的cluster集群或者在无备份交换机的情况下主交换机坏掉的时候。
为最小化偶数节点集群环境中发生脑裂的风险,要保证集群按照肯定能产生主的方式分开,例如4 node cluster -> 3 (Primary) + 1 (Non-primary)。可以在运行过程中对节点的权重作调整
SET GLOBAL wsrep_provider_options="pc.weight=3";
galera通过分发携带权重的消息来应用新的权重值,但并没有将这一变化通知应用的机制。但是注意!当改变权重消息发送的时刻,集群发生了分裂,就会导致整个集群都变为non-primary。这种情况就只能等待重新合并或者查看那个部分是最新数据,然后把它当做第一个节点来重新启动。
node1: pc.weight = 2
node2: pc.weight = 1
node3: pc.weight = 0
三个节点按以上方法配置权重,如果同时kill节点2和节点3,节点1会成为主,但kill节点1,,2和3会变为non-primary
galera仲裁者Arbitrator
galera仲裁者是集群的一员,参与投票,但不真正参与复制。
galera仲裁者的设立出于以下两个目的:
1、偶数节点时,仲裁者作为一个节点使集群成为奇数,从而避免脑裂
2、它可以请求一个连续的应用状态快照,可用来做备份
尽管仲裁者不存数据,它必须能够流经所有的复制流,所以把仲裁者放在一个和其他节点网络连接差的网络环境里会导致整个cluster的性能变差。仲裁者倒了并不会影响cluster的操作,可以在任何时间挂一个新的节点上去
启动galera仲裁者
Galera Arbitrator是一个与cluster独立的进程,叫做garbd。这意味着必须单独启动它,同时也意味着不能通过my.cnf来配置仲裁者。如何配置仲裁者取决于如何启动它。当仲裁者启动时,脚本在其过程中执行sudo语句作为用户nobody。但在Fedora和其他一些Linux分支版本中,默认的sudo配置阻止了用户非tty连接的操作。为避免这一点,需要在/etc/sudoers文件中去掉Defaults requiretty这一行。
1、用shell启动仲裁者
用shell启动仲裁者,有两个选项来配置。首先可以通过命令行来设置参数
$ garbd --group=example_cluster \ --address="gcomm://192.168.1.1,192.168.1.2,192.168.1.3" \ --option="socket.ssl_key=/etc/ssl/galera/server-key.pem;socket.ssl_cert=/etc/ssl/galera/server-cert.pem;socket.ssl_ca=/etc/ssl/galera/ca-cert.pem;socket.ssl_cipher=AES128-SHA""
如果使用SSL就需要设置密码。如果不想每次用shell启动仲裁者都输出这些项,可以在配置文件中设置想使用的选项
# arbtirator.configgroup = example_cluster
address = gcomm://192.168.1.1,192.168.1.2,192.168.1.3
然后启动仲裁者时使用--cfg
$ garbd --cfg /path/to/arbitrator.config
--help参数获取帮助
$ garbd --helpUsage: garbd [options] [group address]
2、以服务来启动仲裁者
当以服务的方式来启动仲裁者时,不管用init或systemd,和用shell启动的配置文件不同
# Copyright (C) 2013-2015 Codership Oy# This config file is to be sourced by garbd service script.# A space-separated list of node addresses (address[:port]) in the cluster:GALERA_NODES="192.168.1.1:4567 192.168.1.2:4567"# Galera cluster name, should be the same as on the rest of the node.GALERA_GROUP="example_wsrep_cluster"# Optional Galera internal options string (e.g. SSL settings)# see http://galeracluster.com/documentation-webpages/galeraparameters.htmlGALERA_OPTIONS="socket.ssl_cert=/etc/galera/cert/cert.pem;socket.ssl_key=/$"# Log file for garbd. Optional, by default logs to syslogLOG_FILE="/var/log/garbd.log"
这个配置文件需放在系统的服务配置文件目录下,常见的如/etc下。之后可启动garb服务。用init的:# service garb start用systemd的,#systemctl start garb
除了标准配置,cluster集群的所有参数也都适用于仲裁者,除了那些以repl为前缀的。当用shell启动的时候,可以使用--option参数来设置。