原理
官方地址:http://galeracluster.com/documentation-webpages/index.html
Galera Cluster与传统的复制方式不同,不通过I/O_thread和sql_thread进行同步,而是在更底层通过wsrep实现文件系统级别的同步,可以做到几乎实时同步,而其上的MySQL对此一无所知这就要求MySQL能够调用wsrep提供的API来完成,在Mariadb10.1之前的版本,支持Galera Cluster的版本是与Mariadb分开发行的,其版本名称就成为Mariadb-Galera,Mariadb10.1以后的版本中MariaDB Galera Cluste不再单独发行,而是以galera-25.3.12-2.el7.x86_64包的形式出现
MariaDB Galera Cluster主要功能: 同步复制 真正的multi-master,即所有节点可以同时读写数据库 自动的节点成员控制,失效节点自动被清除 新节点加入数据自动复制 真正的并行复制,行级 用户可以直接连接集群,使用感受上与MySQL完全一致
同步流程:
当client端执行dml操作时,将操作发给server,server将数据库所做的更改收集到一个写集中发给group(cluster),
cluster中每个动作对应一个GTID,其它server接收到并通过验证(合并数据)后,执行appyl_cb动作和commit_cb动作,若验证没通过,则会退出处理
当前server节点验证通过后,执行commit_cb,并返回,若没通过,执行rollback_cb。
只要当前节点执行了commit_cb和其它节点验证通过后就可返回。
集群安装
说明:Galera集群至少需要三个节点的服务器硬件,以下操作在三个节点执行。
1、主机名、hosts文件修改
10.17.12.98 node1 10.17.12.99 node2 10.17.12.101 node3
2、防火墙、selinux关闭等
setenforce 0 sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config systemctl disable firewalld.service systemctl stop firewalld.service
3、配置yum源
more mariadb.repo [mariadb] name = mariadb baseurl = http://yum.mariadb.org/10.0/centos7-amd64 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1
换成国内的镜像,可能速度会好很多
[mariadb] name = mariadb baseurl = http://mirrors.ustc.edu.cn/mariadb/yum/10.0/centos7-amd64/ gpgkey=http://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB gpgcheck=1
4、安装软件
yum install MariaDB-Galera-server MariaDB-client galera -y
5、启动数据库
/etc/init.d/mysql start
6、设置密码
mysqladmin -u root password 12345678
7、添加集群认证用户
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'galera'@'%' IDENTIFIED BY 'galera' WITH GRANT OPTION; MariaDB [(none)]> flush privileges;
8、关闭所有数据库
/etc/init.d/mysql stop
配置修改
编辑/etc/my.cnf,添加如下配置
[mariadb] query_cache_size=0 # 关闭查询缓存 binlog_format=ROW # binlog文件格式:行 default_storage_engine=innodb # Mariadb 存储引擎 innodb_autoinc_lock_mode=2 #主键自增模式修改为交叉模式 wsrep_provider=/usr/lib64/galera/libgalera_smm.so #galera 库文件 wsrep_cluster_address=gcomm://10.17.12.101,10.17.12.99,10.17.12.98 # galera集群url wsrep_cluster_name='openstack' # galera集群名称 wsrep_node_address='10.17.12.98' # 该节点的地址 wsrep_node_name='node3' # 该节点的主机名 wsrep_sst_method=xtrabackup-v2 # 拷贝模式 wsrep_sst_auth=galera:galera # galera集群认证用户:密码
其他节点的参数需要修改/etc/my.cnf中相应部分与每个节点对应
如果启动其他节点数据库有问题,建议改成rsync模式试试,但是最终我们建议使用xtrabackup-v2
将集群中的数据复制到某个节点上实现备份,或者节点新加入集群需要同步数据。
Galera Cluster有两种数据复制方式:
State Snapshot Transfers (SST):全量同步
Incremental State Transfers (IST):增量同步
简单来讲。SST就是同步整个数据库,IST是同步一个库与另一个库相差的部分事务。
启动集群
#启动第一个节点 /etc/init.d/mysql bootstrap 10.1以上的好像是galera_new_cluster命令启动 #启动其余节点 /etc/init.d/mysql start
启动数据库服务后,登录mysql数据库库,通过wsrep_cluster_size参数来判断启动是否成功。
SHOW STATUS LIKE 'wsrep_cluster_size';
运维常用命令
查看集群状态
show status like 'ws%'; 注释: wsrep_cluster_status为Primary,表示节点为主节点,正常读写。 wsrep_ready为ON,表示集群正常运行。 wsrep_connected: 如果该值为Off,且wsrep_ready的值也为Off,则说明该节点没有连接到集群 wsrep_cluster_size为3,表示集群有三个节点。 wsrep_cluster_state_uuid:在集群所有节点的值应该是相同的,有不同值的节点,说明其没有连接入集群。 wsrep_cluster_conf_id:正常情况下所有节点上该值是一样的.如果值不同,说明该节点被临时”分区”了.当节点之间网络连接恢复的时候应该会恢复一样的值。 wsrep_flow_control_paused:表示复制停止了多长时间.即表明集群因为Slave延迟而慢的程度.值为0~1,越靠近0越好,值为1表示复制完全停止.可优化wsrep_slave_threads的值来改善. wsrep_flow_control_sent:表示该节点已经停止复制了多少次.
查看复制模式
show variables like "wsrep_sst_method";
wsrep_local_state_comment 状态对照表
文件理解
grastate.dat 默认路径为:/var/lib/docker/volumes/mariadb/_data/grastate.dat 可以通过该文件查看到该节点记录的uuid和seqno,当节点正常退出Galera集群时,会将GTID的值更新到该文件中。 如果该节点数据库服务正在运行,则seqno的值是-1的 在断电的情况下,所有节点的seqno值可能都相同,此时需根 gvwstate.dat判断启动节点 gvwstate.dat 默认路径为:/var/lib/docker/volumes/mariadb/_data/grastate.dat 此文件保存了集群状态信息,如果集群正常关闭的话,这个文件会自动删除掉。
查看节点状态
wsrep_local_state: 节点的状态,取值1-6。 取值1:The node starts and establishes a connection to the Primary Component. 取值2:When the node succeeds with a state transfer request, it begins to cache write-sets. 取值3:The node receives a State Snapshot Transfer. It now has all cluster data and begins to apply the cached write-sets. Here the node enables Flow Control to ensure an eventual decrease in the slave queue. 取值4:The node finishes catching up with the cluster. Its slave queue is now empty and it enables Flow Control to keep it empty. The node sets the MySQL status variable wsrep_ready to the value 1. The node is now allowed to process transactions. 取值5:The node receives a state transfer request. Flow Control relaxes to DONOR. The node caches all write-sets it cannot apply. 取值6:The node completes the state transfer to joiner node.
这是官方的,除此之外还有一个0状态initialized,初始化状态。
浅谈
1、感觉性能逊色于主从架构
2、一个事物提交,在节点配置不同的情况下,会等待性能最差的节点结束,才能保持数据一致。
3、涉及到的端口
4444:请求SST(全量同步),在新节点加入时起作用
4568:传输IST(增量同步),节点下线,重启加入时起作用
4567:组成员之间沟通的端口
问题
安装
不知道是不是bug先用rsync模式启动一次再改回xt模式就可以了
异常断电
当机房突然停电,所有galera主机都非正常关机,来电后开机,会导致galera集群服务无法正常启动。如何处理? 第1步:开启galera集群的群主主机的mariadb服务。 第2步:开启galera集群的成员主机的mariadb服务。 异常处理:galera集群的群主主机和成员主机的mysql服务无法启动,如何处理? 解决方法一:第1步、删除garlera群主主机的/var/lib/mysql/grastate.dat状态文件 /bin/galera_new_cluster启动服务。启动正常。登录并查看wsrep状态。 第2步:删除galera成员主机中的/var/lib/mysql/grastate.dat状态文件 systemctl restart mariadb重启服务。启动正常。登录并查看wsrep状态。 解决方法二:第1步、修改garlera群主主机的/var/lib/mysql/grastate.dat状态文件中的0为1 /bin/galera_new_cluster启动服务。启动正常。登录并查看wsrep状态。 第2步:修改galera成员主机中的/var/lib/mysql/grastate.dat状态文件中的0为1 systemctl restart mariadb重启服务。启动正常。登录并查看wsrep状态。
脑裂
set global wsrep_provider_options="pc.bootstrap=true"; 通过这个命令来强制恢复出现脑裂的节点。