文档章节

mysql galera cluster集群的分裂与仲裁机制

bupt晶
 bupt晶
发布于 2015/12/21 10:46
字数 1450
阅读 2081
收藏 24

集群的分裂 

当集群由于网络原因分裂为几个单独的组时(一组可能是单节点,也可能是几个互联的节点),数据出现不一致,此时可能产生脑裂及数据不一致。这种情况下,只有一组节点能够继续提供服务,这组节点的状态是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参数来设置。


© 著作权归作者所有

下一篇: CentOS升级Git
bupt晶
粉丝 11
博文 5
码字总数 3816
作品 0
广州
数据库管理员
私信 提问
MySQL的Galera Cluster配置

一、Galera Cluster介绍 Galera是一个MySQL(也支持MariaDB,Percona)的同步多主集群软件。 从用户视角看,一组Galera集群可以看作一个具有多入口的MySQL库,用户可以同时从多个IP读写这个库。...

dodowolf
2017/06/20
0
0
Galera集群---搭建(2个数据节点+1个仲裁)

安装准备 安装包: mariadb-galera-10.0.15-linux-x86_64.tar.gz 测试环境 ip hostname 备注 192.168.1.111 test1 节点1 192.168.1.112 test2 节点2 192.168.1.113 test3 仲裁节点 1,关闭sel......

super李导
2017/06/13
0
0
利用MariaDB Galera Cluster实现mariadb的多主复制

更多博文请关注:没有伞的孩子必须努力奔跑 (www.xuchanggang.cn) 一、MariaDB Galera Cluster概要: 1.简述: MariaDB Galera Cluster 是一套在mysql innodb存储引擎上面实现multi-master及...

xcga_wise
2014/01/09
0
0
Percona XtraDB Cluster集群节点重启及故障转移

一、重新启动集群节点 要重新启动集群节点,请关闭MySQL并重新启动它。该节点将离开集群(并且法定人数的总计数应该减少)。发布命令 systemctl restart mysql 当它重新加入时,节点应该使用...

leshami
2018/04/13
0
0
MariaDB Galera Cluster实现mariadb的多主复制

一、MariaDB Galera Cluster概要: 1.简述: MariaDB Galera Cluster 是一套在mysql innodb存储引擎上面实现multi-master及数据实时同步的系统架构,业务层面无需做读写分离工作,数据库读写...

super李导
2017/12/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

好文:华杉:我等用功,不求日增,但求日减。减一分人欲,则增一分天理,这是何等简易!何等洒脱!

#写在前面1.怎么理解“减一分人欲,则增一分天理,这是何等简易!”?1)华杉提倡 “一劳永逸” 排除浪费,少干活,多赚钱,一战而定,降低作业成本。2)华杉提倡学海无涯,回头是岸...

阿锋zxf
16分钟前
1
0
vue 的bus总线

bus声明 global.bus = new Vue() 事件发送 controlTabbar () {global.bus.$emit('pickUp', 'ddd')}, 事件接收 global.bus.$on('pickUp', (res) => {this.isFocus = true})......

Js_Mei
21分钟前
2
0
大型系统演进之路-负载均衡演进

Nginx做负载均衡 通过Nginx的反向代理将请求分发到tomcat中,如果tomcat支持100并发,Nginx支持50000并发,理论上nginx把请求发送到500个tomcat就可以了。 LVS或F5做多个Nginx负载均衡 Tomc...

春哥大魔王的博客
26分钟前
4
0
Sqlite时间段查询中遇到的问题

问题: 我要查询DateTime时间其中的一段符合时间要求的数据,比如我要查询‘2019-06-06 16:50:00’至‘2019-06-06 16:59:00’这一段的数据 开始用这段代码 strSql= ("select * from Coll...

rainbowcode
30分钟前
2
0
大数据(hadoop-数据入库系统Sqoop原理架构)

Sqoop是什么 Sqoop:SQL-to-Hadoop 连接传统关系型数据库和Hadoop的桥梁 把关系型数据库的数据导入到 Hadoop 系统 ( 如 HDFS、HBase 和 Hive) 中; 把数据从 Hadoop 系统里抽取并导出到关系型...

这很耳东先生
44分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部