【问题描述】
OpenStack云平台上3个控制节点中有1个控制节点上的mariadb 数据产生了大量的gcache.page.xxx文件,造成磁盘空间占满,最后导致数据库不正常,OpenStack控制节点上执行OpenStack先关指令时会报:ERRO(InternalServerError):An unexpected error prevented the server from fulfilling your request.(HTTP 500)
【问题排查】
查看mariadb数据库的版本
mysql --version
5.5版本,属于开源产品bug
【解决方法】
1、分别检查OpenStack的3个控制节点上mariadb的运行状态
systemctl status mariadb.service
2、检查出问题的控制节点3数据库正常,可以先停掉该节点的数据库
systemctl stop mariadb.service
3、因为目前/根目录已块满了,所以先创建一个临时目录
mkdir -v /var/lib/bakmysql
将gcache.page.xxx文件先移动到临时目录下
cd /var/lib/mysql
mv gcache.page.* ../bakmysql
4、启动数据库,查询数据库状态是否正常
systemctl start mariadb.service
systemctl status mariadb.service
5、查询数据库状态,节点数size是否为3
mysql
use mysql;
Show status like “%wsrep%”;
【补充信息】
MariaDB Galera Cluster介绍
Galera Cluster是Codership公司开发的一套免费开源的高可用方案,Galera Cluster即安装了Galera的Mariadb集群。其本身具有multi-master特性,支持多点写入。Galera Cluster的三个(或多个)节点是对等关系,每个节点均支持写入,集群内部会保证写入数据的一致性与完整性。
官网:
http://galeracluster.com
文档:
https://galeracluster.com/library/documentation/index.html
官方给出的特性如下:
真正的多主集群,Active-Active架构,即所有节点可以同时读写数据库
同步复制,没有复制延迟
多线程复制
没有主从切换操作,无需使用虚IP
热备份,单个节点故障期间不会影响数据库业务
支持节点自动加入,无需手动拷贝数据,自动的节点成员控制,失效节点自动被清除;新节点加入数据自动复制
支持InnoDB存储引擎
对应用程序透明,原生MySQL接口
无需做读写分离
部署使用简单
galera集群缺点:
加入新节点时开销大,需要复制完整数据
不能有效地解决写扩展的问题,所有的写操作都发生在所有的节点;
有多少个节点,就有多少份重复的数据
由于事务提交需要跨节点通信,即涉及分布式事务操作,因此写入会比主从复制慢很多,节点越多,写入越慢,死锁和回滚也会更加频繁
对网络要求比较高,如果网络出现波动不稳定,则可能会造成两个节点失联,Galera Cluster集群会发生脑裂,服务将不可用
仅支持InnoDB/XtraDB存储引擎,任何写入其他引擎的表,包括mysql.*表都不会被复制,DDL语句可以复制,但是insert into mysql.user(MyISAM存储引擎)之类的插入数据不会被复制
Delete操作不支持没有主键的表,因为没有主键的表在不同的节点上的顺序不同,如果执行select … limit …将出现不同的结果集
整个集群的写入吞吐量取决于最弱的节点限制,集群要使用同一的配置
基于认证的复制原理:
https://galeracluster.com/library/documentation/tech-desc-introduction.html
Galera集群的复制功能基于Galeralibrary实现,为了让MySQL与Galera library通讯,特别针对MySQL开发了wsrep API。
Galera插件保证集群同步数据,保持数据的一致性,靠的就是可认证的复制
Galera集群的复制功能是基于认证的复制,其流程如下:
当客户端发出一个commit的命令,在事务被提交之前,所有对数据库的更改都会被write-set收集起来,并且将write-set纪录的内容发送给其他节点。
write-set将在每个节点进行认证测试,测试结果决定着节点是否应用write-set更改数据。
如果认证测试失败,节点将丢弃write-set;如果认证测试成功,则事务提交。
mariadb Galera集群部署
安装mariadb
https://mariadb.com/kb/en/yum/#installing-mariadb-galera-cluster-with-yum
配置mariadb-galera-cluste
https://mariadb.com/kb/en/configuring-mariadb-galera-cluster/
https://galeracluster.com/library/training/tutorials/galera-on-aws.html
集群状态监控
SHOW GLOBAL STATUS LIKE 'wsrep_%';
单独查看cluster_status
SHOW STATUS LIKE 'wsrep_cluster_status';
参数说明:
wsrep_local_index = 2 在集群中的索引值
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:表示该节点已经停止复制了多少次
【MariaDB+Galera集群应用场景模拟】
MariaDB+Galera集群应用场景模拟
详情请见,微信公众号:



