浅谈数据库集群方案

单点数据库

数据库往往是系统中的性能瓶颈,所以通常在系统设计中会引入各种各样的缓存机制,以避免频繁访问数据库。另外,数据库由于其重要性,高可用要求也是避免不了的,因为一旦数据库挂了基本上整个系统也就不能使用了。

而以上这些常见问题都是单点数据库带来的限制,为了解决这些问题,达到高性能、高可用的目的,我们就需要在系统架构设计中采用数据库集群方案。

性能测试

既然单点数据库存在性能问题,那么有没有实际数据呢?下面我们就来对单点数据库进行一个性能测试,看看其并发极限大概是多少。我这里使用了一台2核2G的云服务,mysql版本为8.0.18。

mysql自带了一个性能测试工具:mysqlslap,我们可以使用该工具进行测试,具体的测试参数如下:

[[email protected] ~]# mysqlslap -hlocalhost -uroot -pyour_password -P3306 --concurrency=500 --iterations=1 --auto-generate-sql --auto-generate-sql-load-type=mixed --auto-generate-sql-add-autoincrement --engine=innodb --number-of-queries=500
主要参数说明: 参数 说明
--concurrency 并发数量,即模拟的客户端数量
--iterations 执行多少次该测试
--auto-generate-sql 使用系统自己生成的SQL脚本来测
--auto-generate-sql-load-type 要测试的是读还是写还是两者混合的(取值:read, write, update, mixed)
--auto-generate-sql-add-autoincrement 将自增的列添加到自动生成的表中
--engine 要测试的存储引擎
--number-of-queries 每个客户端的访问次数,该数值除以并发数量就是每个客户端的访问次数,在本例中:500 / 500 = 1

这里我分别进行了不同量级的测试,在并发500、1000和5000个连接时,数据库还可以正常处理,没有太大问题:

# 500个并发连接
Benchmark
    Running for engine innodb
    Average number of seconds to run all queries: 0.391 seconds
    Minimum number of seconds to run all queries: 0.391 seconds
    Maximum number of seconds to run all queries: 0.391 seconds
    Number of clients running queries: 500
    Average number of queries per client: 1

# 1000个并发连接
Benchmark
    Running for engine innodb
    Average number of seconds to run all queries: 0.802 seconds
    Minimum number of seconds to run all queries: 0.802 seconds
    Maximum number of seconds to run all queries: 0.802 seconds
    Number of clients running queries: 1000
    Average number of queries per client: 1

# 5000个并发连接
Benchmark
    Running for engine innodb
    Average number of seconds to run all queries: 3.884 seconds
    Minimum number of seconds to run all queries: 3.884 seconds
    Maximum number of seconds to run all queries: 3.884 seconds
    Number of clients running queries: 5000
    Average number of queries per client: 1

但在测试1w个并发连接时,数据库就开始报无法连接的错误了:

由该测试案例可知,普通的单节点数据库性能瓶颈大概在1w个并发连接左右。当然这里的测试结果与机器的硬件差异有关,只是提供一个参考。


PXC集群方案

上一小节介绍了单点数据库存在的问题,以及进行了一个简单的性能测试。为了应对这些问题,我们需要将单点数据库向集群转变。

目前存在许多的数据库集群方案,而这些方案中也没有哪个好那个坏,只有适合的才是好的。本小节则介绍一下主流的方案之一:PXC集群方案,其架构图大致如下:

  • PXC集群最大的特点就是数据读写的强一致性,在图中的任意一个节点写入数据,其他的节点就一定能读到这个数据。不会出现A节点成功写入,而读B节点时读取不到数据。该特性使得PXC集群适合存储高价值重要数据,因为类似于订单、钱有关的数据基本都有强一致性的要求

上图只是PXC集群最基础的架构,所以还有优化的余地。我们都知道mysql的单表数据处理的性能极限在2千万左右,当数据达到这个量级时,mysql的处理性能就会很低下了。而上图中每个PXC节点都会进行数据的同步,所以当每个节点的数据量级都达到2千万时,整个集群的性能就会降低。

这时就需要增加多一个集群,并且这两个集群之间的数据是不进行同步的。为了让不同的集群存储不同的数据,就得引入Mycat这种数据库中间件将数据进行切分,让数据可以在不同的集群上进行读写,分散存储压力。在这个场景下,一个集群称为一个数据分片。如图:

PXC集群工作原理

我们知道数据库数据的一致性和持久性是通过事务来保证的,而PXC集群的强一致性也是采用了事务,只不过这个事务是分布式事务。

客户端在写入数据完成后,同样需要提交一个事务,在事务内节点之间会进行数据的同步复制。该事务会作用到集群内的所有节点上,保证所有节点要么全写入成功,要么全写入失败。这里用一个时序图表达一下大致流程:

搭建PXC集群需要注意的事项:

  • PXC集群中的节点并不是越多越好,节点多并不能提高性能。相反,节点多意味着同步数据所需的耗时就越多,反而会降低性能。通常来讲,一个PXC集群最好是不超过15个节点。若需要更多的节点时,应当搭建一个新的集群,然后用中间件来做分片。
  • PXC集群的性能不取决于配置最好的那个节点,而是取决于配置最差的那个节点,这和电脑硬件是类似的。所以我们应当尽量保证PXC集群内的节点配置都趋于一致,避免某个节点配置太差而拖慢了集群的整体性能。

PXC简介

说了那么多,我们还没介绍PXC是个啥玩意呢。PXC是Percona XtraDB Cluster的缩写,PXC是基于mysql自带的Galera集群技术,将不同的mysql实例连接起来,实现的多主集群。在PXC集群中每个mysql节点都是可读可写的,也就是主从概念中的主节点,不存在只读的节点。

PXC可以集群任何mysql的衍生版本,例如MariaDB和Percona Server。由于Percona Server的性能最接近于mysql企业版,性能相对于标准版的mysql有显著的提升,并且对mysql基本兼容。所以在搭建PXC集群时,通常建议基于Percona Server进行搭建。


Replication集群方案

PXC集群的数据强一致性是以牺牲性能为代价的,因为客户端需要等待所有的节点写入数据。而与之相反的一种集群方案就是本小节要介绍的Replication集群。该方案不牺牲性能,但不具有数据强一致性,正可谓鱼和熊掌不可兼得。

所谓读写非强一致的意思就是在A节点成功写入数据,并提交了事务。但在B节点上进行读取时,可能会读取不到写入的数据。

因为这里提交的事务只是该节点的本地事务,只能保证数据成功写入了该节点,而不保证数据成功写入整个集群内的节点。当该节点与其他节点进行数据同步时,可能会由于种种原因没有成功同步数据,从而导致在其他节点上读不到该数据。

所以该集群方案就不适合保存高价值的数据,但对于非高价值的数据,又对读写性能要求高的,就适合采用该集群方案。例如,用户行为日志、操作日志及商品描述等这类非重要的数据。

同样的,上图只是Replication集群最基础的架构,也需要在数据量达到一定规模时采用Mycat对数据进行分片处理。如图:

实际上,在大型的系统架构中,往往不是单独采用某一种特定的集群方案,而是多种方案进行结合。例如,PXC集群和Replication集群就可以结合使用,让PXC集群存储高价值数据,Replication集群存储低价值数据。然后采用Mycat等数据库中间件来完成集群之间的数据分片及管理,如图:


总结

  • PXC集群采用同步复制,事务在所有的集群节点要么同时提交,要么不提交,能够保证集群中的数据强一致性。但性能相对较低,客户端需等待所有节点同步复制完成
  • Replication集群采用异步复制,无法保证数据的强一致性。性能相对较高,客户端只需要等待目标节点的本地事务提交成功即可,而不需要等待所有节点成功复制完数据
  • PXC和Replication集群都只实现了数据的同步,没有数据切分功能。当数据量大时,需要引入Mycat等数据库中间件来做数据的切分及管理
  • PXC和Replication集群方案并不排他,且各有优劣,可以结合一起使用,以达到取长补短的效果。高价值数据存储至PXC集群,低价值数据存储至Replication集群

原文地址:https://blog.51cto.com/zero01/2464498

时间: 2024-11-05 18:02:40

浅谈数据库集群方案的相关文章

浅谈数据库集群(一)

现在,随着上网人数的激增,一些大型的网站开始使用数据库集群来提高数据库的可靠性和数据库的性能.那么在介绍数据库集群之前首先需要弄清楚几个问题. 1.为什么要用数据库集群 (1)通过使用数据库集群可以使读写分离,提高数据库的系统性能. 大家都知道,mysql是支持分布式的.MySQL Proxy最强大的一项功能是实现"读写分离(Read/Write Splitting)".基本的原理是让主数据库处理事务性查询,而从数据库处 理SELECT查询.数据库复制被用来把事务性查询导致的变更同步到

架构设计之「数据库集群方案」

在之前的文章中,我们知道数据库服务可能已经成为了很多系统的性能关键点,甚至是瓶颈了.也给大家介绍了数据库服务器从主备架构.到主从架构.再到主主架构的基础方案.但如果单台机器已经不能满足完整业务数据存储的时候,我们就需要考虑采用多机甚至多中心的部署方案了. 今天我们就再来聊一聊,在多机环境下,数据库集群的架构方案. 同样,这里先不看细节,不管底层数据源是什么数据库,我们先谈架构方案.因为无论底层是 Mysql 还是 Redis.MongoDB,我们在架构设计上都是相通的. 针对多机的架构,常见有如

浅谈分布式集群管理的原理,看看集群究竟是做什么的

本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是分布式专题的第11篇文章,我们一起来聊聊分布式集群资源管理. 在开始文章之前,我们先来问一个问题,为什么是国际上是亚马逊,国内是阿里这两家公司云计算搞得最好呢?这两家公司之间有一个巨大的共同点,就是它们都是电商公司.电商公司的特点很明显,就是流量不是固定的,往往会受到大促.节日的影响.像是国内的双十一和美国的黑色星期五就是典型的大促.在大促的时候的流量会是平常的十倍甚至更多,这么大的流量必须要有更多的机器去应对.但问题是如果去买这

浅谈Linux集群

集群听起来好像就是一个很高端很的技术,其实不是的,那么集群其实就是一堆计算机的集合,给用户提供同一个服务的一组计算机,就称之为集群,对于用户而言好像就是一台计算机提供的服务,集群主要分为三大类, LB 负载均衡集群 负载均衡集群主要是提高服务的响应能力的,比如说某服务器的并发响应能力是100个,这个时候经常有人反映说连不上服务器,这个时候解决方案一般有 两种,一,升级硬件,升级硬件显然不是很好的解决方案,假如说升级硬件之后过了一段时间由于业务量的加大,服务器又负载不起了怎么办呢, 二,将现有空闲

mysql高可用集群方案

这里有一篇关于Mysql高可用方案的干货文章:[干货分享] 一文了解数据库高可用容灾方案的设计与实现 网友们公司中的使用方案讨论:想问各位大大 MySQL 是怎么做高可用的? 一.Mysql高可用解决方案 方案一:共享存储 一般共享存储采用比较多的是 SAN/NAS 方案. 方案二:操作系统实时数据块复制 这个方案的典型场景是 DRBD,DRBD架构(MySQL+DRBD+Heartbeat) 方案三:主从复制架构 主从复制(一主多从) MMM架构(双主多从) MHA架构(多主多从) 方案四:数

浅谈高性能数据库集群——读写分离

本文主要介绍高性能数据库集群读写分离相关理论,基本架构,涉及的复杂度问题以及常见解决方案. 1 读写分离概述 基本架构图: 2 适用场景 读写分离不是银弹,并不是一有性能问题就上读写分离,而是应该先优化,例如优化慢查询,调整不合理的业务逻辑,引入缓存查询等只有确定系统没有优化空间后才考虑读写分离集群 3 引入的系统复杂度问题 问题一 主从复制延迟 问题二 分配机制 如何将读写操作区分开来,然后访问不同的数据库服务器? 解决方案1 客户端程序代码封装实现 基本架构图 业界开源实现 Sharding

MySQL数据库集群-PXC方案

第1章 课程摘要课程内容的概要介绍,包括课程目标,面向用户,预备知识,课程大纲,软件与硬件环境等. 1-1 课程导学1-2 开发环境要求 第2章 创建PXC集群学习安装与创建PXC集群,为了搭建三高特点的数据库集群,我们将把两组PXC集群组建成分片,由MyCat做数据切分与读写分离,然后对MyCat做集群,用Keepalived+Haproxy实现双机热备.了解数据库的基准测试与压力测试,掌握PXC的实际性能.... 2-1 CentOS安装PerconaServer数据库2-2 安装PXC组建

数据库集群技术漫谈

转自:http://www.51testing.com/html/69/n-867469-2.html 简介 当今世界是一个信息化的世界,我们的生活中无论是生活.工作.学习都离不开信息系统的支撑.而信息系统的背后用于保存和处理最终结果的地方就是数据库.因此数据库系统就变得尤为重要,这意味着如果数据库如果面临问题,则意味着整个应用系统也会面临挑战,从而带来严重的损失和后果. 如今“大数据”这个词已经变得非常流行,虽然这个概念如何落地不得而知.但可以确定的是,随着物联网.移动应用的兴起,数据量相比过

浅谈数据库设计技巧(转)

说到数据库,我认为不能不先谈数据结构.1996年,在我初入大学学习计算机编程时,当时的老师就告诉我们说:计算机程序=数据结构+算法.尽管现在的程序开发已由面向过程为主逐步过渡到面向对象为主,但我还是深深赞同8年前老师的告诉我们的公式:计算机程序=数据结构+算法.面向对象的程序开发,要做的第一件事就是,先分析整个程序中需处理的数据,从中提取出抽象模板,以这个抽象模板设计类,再在其中逐步添加处理其数据的函数(即算法),最后,再给类中的数据成员和函数划分访问权限,从而实现封装. 数据库的最初雏形据说源