我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MariaDB Galera Cluster应用实践

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MariaDB Galera Cluster应用实践

数据是互联网公司的核心资产,所以好多公司在架构设计上不仅要保证业务系统的高可用,同时还要考虑数据存储的高可用以及安全性。在职公司是一家创业型公司,之前的应用系统是由.Net 和SQLserver组合的架构,由于存在业务量的增长,技术部门采用Java重构整个应用系统。数据库选择开源数据库MYSQL,从刚开始都现在踩了相当多的坑,在此给大家分享一下。

环境介绍

服务器:阿里云主机

磁盘类型:SSD

操作系统:CentOS6.5 64位

软件版本:5.5.50-MariaDB-wsrep

1、数据库高可用方案选型

目前针对mysql的高可用方案还是比较多,例如主从、MMM或者MHA等 ,我们初期考虑使用Keepalived+Mysql(双主热备)方案,但是由于阿里云不能很好的支持虚拟IP,所以想着使用其他方案,最好有集群解决方案,最后选用MariaDBGalera Cluster。3个节点组成一个集群,前端使用阿里云SLB实现负载均衡,减轻数据库压力。

MariaDB Galera Cluster主要功能

  • 同步复制

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

  • 自动的节点成员控制,失效节点自动被清除

  • 新节点加入数据自动复制

  • 真正的并行复制,行级

  • 用户可以直接连接集群,使用感受上与MySQL完全一致

优势:

  • 因为是多主,所以不存在Slavelag(延迟)

  • 不存在丢失事务的情况

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

  • 更小的客户端延迟

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

线上环境数据库架构图


MariaDB Galera Cluster应用实践



1、cluster1与cluster2由SLB调度,实现数据库负载均衡,应用程序可以连接cluster1和cluster2写入和读取。Slave3主要实现数据校验和备份。

踩过的坑:

1、数据容量规划严重不合理

   由于是创业公司,研发人员和运维人员经验不足,在整个系统设计服务器采购时磁盘容量规划不合理,数据增长迅速,容量不足,最后采取添加硬盘,由于服务器是使用的阿里云主机,所以想着磁盘扩容比较简单,从阿里云控制台购买磁盘容量后,重启主机(远程连接reboot重启),用fdisk等命令检查磁盘,发现扩容的部分没有生效,折腾好久,最后给阿里云售后打电话解决,更改硬件配置需要在阿里云控制台重启。

2、mysql独立表空间和共享表空间

这个坑也是在上面容量使用上发现的,因为部分mysql默认使用独立表空间,而5.5.50-MariaDB-wsrep是默认使用共享表空间,由于前期经验不足,没有更改这些,每天业务量比较大,所以数据量增长比较快,有一天发现mysql目录下. Ibdata文件已经是80多G,查找相关资料是独立表空间以及共享表空间问题,里面包含redo log以及每个表的数据和索引等。由于我们的数据存在时效性,所以超过一个月的就转移到历史库,然后将主库相关表删除,而共享表空间对这种大量删除的支持不是很好,所以我们将整个数据库的表空间进行转换。下面简单介绍一下独立表空间和共享表空间,

共享表空间: 某一个数据库的所有的表数据,索引文件全部放在一个文件中,默认这个共享表空间的文件路径在data目录下。默认的文件名为:ibdata1 初始化为10M。
独立表空间: 每一个表都将会生成以独立的文件方式来进行存储,每一个表都有一个.frm表描述文件,还有一个.ibd文件。其中这个文件包括了单独一个表的数据内容以及索引内容,默认情况下它的存储位置也是在表的位置之中。
两者之间的优缺点
共享表空间:
优点:
可以放表空间分成多个文件存放到各个磁盘上(表空间文件大小不受表大小的限制,如一个表可以分布在不同步的文件上)。数据和文件放在一起方便管理。
缺点:
 所有的数据和索引存放到一个文件中以为着将有一个很常大的文件,虽然可以把一个大文件分成多个小文件,但是多个表及索引在表空间中混合存储,这样对于一个表做了大量删除操作后表空间中将会有大量的空隙,特别是对于统计分析,日值系统这类应用最不适合用共享表空间。

独立表空间:在配置文件(my.cnf)中设置:innodb_file_per_table

innodb_file_per_table=1  为使用独占表空间
innodb_file_per_table=0   为使用共享表空间

独立表空间优点:
1.每个表都有自已独立的表空间。
2.每个表的数据和索引都会存在自已的表空间中。
3.可以实现单表在不同的数据库中移动。
4.空间可以回收(除drop table操作处,表空不能自已回收)
a) Drop table操作自动回收表空间,如果对于统计分析或是日值表,删除大量数据后可以通过:alter table TableNameengine=innodb;回缩不用的空间。
b) 对于使innodb-plugin的Innodb使用turncate table也会使空间收缩。
c) 对于使用独立表空间的表,不管怎么删除,表空间的碎片不会太严重的影响性能,而且还有机会处理。
缺点:
单表增加过大,如超过100个G。

3、  共享表空间向独立表空间的转换

由于我们的数据有时效性,所以需要数据转移和对原来库的表删除,需要将

默认的共享表空间转换成独立表空间。

转换方案:

1、将数据mysqldump逻辑备份,更改配置文件,重启数据库,将之前的数据库drop掉,导入新的数据。

2、  直接更改配置文件重启数据库。

两者的区别

方案1是比较彻底的做法,但是数据量比较大是整个过程就会很慢,因为mysqldump的逻辑备份是备份成SQL整个过程比较费时间。而方案2 是比较折中的解决方案,这样做对已经创建的数据表结构不会有影响,后期创建的表结构才会使用独立表空间。

         对我们来说方案1更彻底,数据量有200多G,由于我们的多数记录表是按月分表,部分数据可以成为冷数据(一般情况下不会更改)。所以我们将这些冷数据先备份出来,导入到其他库检验完整性,然后将部分业务停掉处理那些业务逻辑等数据。

4、  mysqldump数据分库备份

有经验的运维或者DBA肯定不会用mysqldump备份大量的数据因为很慢,但是我们由于经验不足在此又踩了一个坑。用脚本和定时任务的方式实现数据备份,每周6晚上2点备份,前期数据量比较小整个业务系统正常,后面当数据突破100多G后,就出现一个比较奇怪的事情,每周六早上应用系统总是异常,研发人员都很郁闷,感觉跟见鬼一样,经过多次出现该问题后就考虑数据备份,研究任务执行情况,发现确实是数据备份问题,后面就采取xtrabackup备份。

脚本:

#/bin/bash
MYUSER=mysqlback
MYPASS=databack***
#SOCKET=/data/3306/mysql.sock
MYLOGIN="mysql -u$MYUSER -p$MYPASS "
MYDUMP="mysqldump -u$MYUSER -p$MYPASS  -B"
DATABASE="$($MYLOGIN -e "show databases;"|egrep -vi"Data|_schema|mysql")"
for dbname in $DATABASE
  do
   MYDIR=/data/backup/$dbname
   [ ! -d $MYDIR ] &&mkdir -p $MYDIR
 $MYDUMP $dbname|gzip>$MYDIR/${dbname}_$(date +%F).sql.gz
done

5、共享表空间转换独立表空间更改数据库配置报错

配置文件:

[server]

# this is only for the mysqld standalone daemon
[mysqld]
skip-name-resolve
character-set-server=utf8
datadir=/data/mysql
wait_timeout=1800
interactive_timeout = 288000
max_allowed_packet = 1000M
#max_connections=3000
max_connections=3000
character-set-server=utf8
#innodb_buffer_pool_size = 1000M
innodb_additional_mem_pool_size = 200M
innodb_flush_log_at_trx_commit=2
innodb_autoextend_increment=800M
#innodb_log_buffer_size = 200M
innodb_log_file_size = 100M
key_buffer_size=800M
read_buffer_size=600M
thread_cache_size=64
innodb_file_per_table=1 #独立表空间
#innodb_flush_log_at_trx_commit=2
#innodb_log_file_size=1G   #(日志文件)
innodb_buffer_pool_size=6G

为了适当的优化数据库性能,所以将参数做了适当的调整,这时比较坑的问题就出现了,数据库集群只能启动其中的一台,另外的两台都是报错,这时肯定是查看日志解决问题,看下面日志是配置文件参数设置问题导致,将更改配置文件逐个检查,最后发现是有3个innodb_buffer_pool_size参数不一致(3台服务器集群 基本配置差不多,区别就是一台上面还有其他应用程序在运行,所以就将其设置的小一点,导致整个系统启动异常)


部分日志:
InnoDB: Error: log file ./ib_logfile0 is of different size 0 104857600 bytes
InnoDB: than specified in the .cnf file 0 1073741824 bytes!
InnoDB: Possible causes for this error:
 (a) Incorrect log file is used or log file size is changed
 (b) In case default size is used this log file is from 10.0
 (c) Log file is corrupted or there was not enough disk space
 In case (b) you need to set innodb_log_file_size = 48M
170412 23:53:26 [ERROR] Plugin 'InnoDB' init function returned error.
170412 23:53:26 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
170412 23:53:26 [Note] Plugin 'FEEDBACK' is disabled.
170412 23:53:26 [ERROR] Unknown/unsupported storage engine: innodb
170412 23:53:26 [ERROR] Aborting

170412 23:53:28 [Note] WSREP: Closing send monitor...
170412 23:53:28 [Note] WSREP: Closed send monitor.
170412 23:53:28 [Note] WSREP: gcomm: terminating thread
170412 23:53:28 [Note] WSREP: gcomm: joining thread
170412 23:53:28 [Note] WSREP: gcomm: closing backend
170412 23:53:29 [Note] WSREP: view(view_id(NON_PRIM,1d5436dc,2) memb {
        1d5436dc,0
} joined {
} left {
} partitioned {
        effca7a8,0


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MariaDB Galera Cluster应用实践

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Docker Compose、Nginx和MariaDB的最佳实践:高可用PHP应用程序架构设计

引言:在当今的互联网时代,构建高可用的应用程序变得越来越重要。随着互联网用户数量的增加,应用程序的性能、可靠性和可扩展性成为了关键的考虑因素。本文将介绍如何使用Docker Compose、Nginx和MariaDB来设计一种高可用的PHP
2023-10-21

Docker Compose、Nginx和MariaDB的最佳实践:部署PHP应用程序的流程整合

引言:随着云计算和容器化技术的迅速发展,Docker已成为了现代化开发和部署应用程序的一种重要方式。在众多的Docker工具中,Docker Compose作为一个编排容器服务的工具,被广泛应用于多容器应用的部署和管理。而Nginx和Mar
2023-10-21

Docker Compose、Nginx和MariaDB的完美组合:部署PHP应用程序的最佳实践

引言:在现代Web应用程序开发中,使用容器化技术已经成为了一种趋势。容器化技术可以将应用程序及其依赖项打包成一个单独的容器,使得应用程序可以在任何支持容器化技术的环境中运行。而Docker是当下最流行的一种容器化技术,它可以简化应用程序的部
2023-10-21

用于Linux中MySQL/MariaDB安全实践的命令有哪些

这篇文章将为大家详细讲解有关用于Linux中MySQL/MariaDB安全实践的命令有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 MySQL 是世界上最流行的开源数据库系统,MariaDB(一个
2023-06-10

Docker Compose、Nginx和MariaDB的最佳实践:部署PHP应用程序的监控与优化

引言:在现代应用程序开发中,容器化已经成为一种流行的方式,能够帮助我们更好地管理和部署应用程序。而Docker Compose则是一种用于定义和运行多个容器的工具,它能够简化应用程序的部署和管理过程。本文将介绍如何使用Docker Comp
2023-10-21

TiDB 4.0 在 VIPKID 的应用实践

作者介绍:许超,VIPKID 资深 DBA 工程师。本文主要分享 TiDB 4.0 版本在 VIPKID 的一个应用实践。主要涉及两个部分,第一部分是现在 TiDB 在 VIPKID 的一些应用场景,第二部分是介绍一下 TiDB 4.0 给我们带来哪些惊喜和收
TiDB 4.0 在 VIPKID 的应用实践
2018-09-13

Linux平台Ruby应用的DevOps实践

在Linux平台上实践Ruby应用的DevOps,涉及到多个方面,包括操作系统的管理、服务的优化、持续集成与持续部署(CI/CD)流程,以及利用容器化技术来提升应用的可部署性和可维护性。以下是详细的分析和实践指导:Linux平台Ruby应
Linux平台Ruby应用的DevOps实践
2024-09-15

JavaWeb Servlet技术及其应用实践

这篇文章主要介绍了JavaWeb Servlet技术,Servlet指在服务器端执行的一段Java代码,可以接收用户的请求和返回给用户响应结果,感兴趣想要详细了解可以参考下文
2023-05-20

MySQL 锁的原理与应用实践

MySQL 锁的原理与应用实践摘要:MySQL 是一种常用的关系型数据库管理系统,它具有强大的并发处理能力。在多用户同时访问数据库时,为了确保数据的一致性和完整性,MySQL 使用锁机制来控制对共享资源的访问。本文将介绍 MySQL 锁的原
MySQL 锁的原理与应用实践
2023-12-21

Golang Facade模式简介及应用实践

Golang中的Facade模式是一种结构型设计模式,它提供了一个统一的接口,用于访问子系统中的一组接口。Facade模式隐藏了子系统的复杂性,并提供了一个简单的接口,供客户端使用。在Golang中,Facade模式可以通过一个外观对象来实
2023-10-09

Golang 微服务:实现原理与应用实践

《Golang 微服务:实现原理与应用实践》随着云计算和容器化技术的发展,微服务架构越来越被广泛应用于各类软件系统中。而作为一种高效、轻量级的编程语言,Go 语言(Golang)在微服务开发中也表现出色。本文将探讨 Golang 微服务的
Golang 微服务:实现原理与应用实践
2024-02-29

Hadoop在物联网中的应用实践

Hadoop在物联网中的应用实践主要包括以下几个方面:数据存储和处理:物联网设备生成的海量数据需要进行存储和处理,Hadoop分布式存储和计算框架,可以帮助物联网系统有效地存储和处理大规模的数据。数据分析:Hadoop提供了强大的数据分析能
Hadoop在物联网中的应用实践
2024-02-29

PHP Redis 缓存应用与最佳实践

redis 是一个高性能键值对缓存。php redis 扩展提供了一个 api 来与 redis 服务器交互。使用以下步骤与 redis 连接,存储和检索数据:连接:使用 redis 类连接到服务器。存储:使用 set 方法设置键值对。检索
PHP Redis 缓存应用与最佳实践
2024-05-04

PHP设计模式的应用与实践

php 中设计模式是一种可重用的解决方案,用于解决常见的编程问题。它分为三大类:创建型模式、结构型模式和行为型模式。其中应用广泛的创建型模式包括工厂模式,用于创建不同类型的对象;结构型模式包含策略模式,用于根据不同的策略执行不同的行为。PH
PHP设计模式的应用与实践
2024-05-16

编程热搜

目录