广告
返回顶部
首页 > 资讯 > 数据库 >如何使用分库分表中间件
  • 591
分享到

如何使用分库分表中间件

数据库 2022-10-18 21:10:18 591人浏览 独家记忆
摘要

这篇文章主要介绍“如何使用分库分表中间件”,在日常操作中,相信很多人在如何使用分库分表中间件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用分库分表中间件”的疑惑有所帮

这篇文章主要介绍“如何使用分库分表中间件”,在日常操作中,相信很多人在如何使用分库分表中间件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用分库分表中间件”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

如何使用分库分表中间件

哪些高可用的问题

作为一个无状态的中间件,高可用问题并没有那么困难。但是尽量减少不可用期间的流量损失,还是需要一定的工作的。这些流量损失主要分布在:

  • (1)某台中间件所在的物理机突然宕机。

  • (2)中间件的升级和发布。

由于我们的中间件是作为数据库的代理提供给应用的,即应用把我们的中间件当做数据库,如下图所示:

如何使用分库分表中间件

所以出现上述问题后,业务上很难通过重试等操作去屏蔽这些影响。这就势必需要我们在底层做一些操作,能够自动的感知中间件的状态从而有效避免流量的损失。

中间件所在物理机宕机的情况

物理机宕机其实是一种常见现象,这时候应用一瞬间就没了响应。那么跑在上面的sql肯定也是失败了的(准确来说是未知状态,除非重新查询后端数据库,应用无法得知准确的状态)。这部分流量我们肯定是无法挽救。我们所做的是在client端(Druid数据源)能够快速的发现并剔除宕机的中间件节点。

发现并剔除不可用节点

通过心跳去发现不可用节点

自然而然的我们通过心跳来探查后端中间件的存活状态。我们通过定时创建一个新连接ping(Mysql的ping)一下然后立马关闭来做心跳(这种做法便于我们区分正常流量和心跳流量,如果通过保持一个连接然后一直发送类似select  ‘1’的sql这种方式的话区分流量会稍微麻烦点)。

如何使用分库分表中间件

为了防止网络抖动造成的偶发性connect失败,我们在三次connect都失败后才判定某台中间件处于不可用状态。而这三次的探活却延长了错误感知时间,所以我们三次connect的时间间隔是指数级衰减的,如下图所示:

如何使用分库分表中间件

为何不在第一次connect失败后,连续发送两次connect呢?可能考虑到网络的抖动可能会有一个时间窗口,如果在时间窗口内连续发了3次,出了这个时间窗口网络又okay了,那么会错误的发现后端某节点不可用了,所以我们就做了指数级衰减的折衷。

通过错误计数去发现不可用节点

上述的心跳感知始终有一个时间窗口,当流量很大的时候,在这个时间窗口内使用这个不可用节点的都会失败,所以我们可以使用错误计数去辅助不可用节点的感知(当然这个手段的实现还在计划中)。

如何使用分库分表中间件

这边有一个注意的点是,只能通过创建连接异常来计数,并不能通过read timeout之类的来计算。原因是,read  timeout异常可能是慢sql或者后端数据库的问题导致,只有创建连接异常才能确定是中间件的问题(connection  closed也可能是后端关闭了这个连接,并不代表整体不可用),如下图所示:

如何使用分库分表中间件

一个请求使用若干个连接导致的问题

由于我们需要保证事务尽可能小,所以在一个请求里面多条sql并不使用同一个连接。在非事务(auto-commit)情况下,运行多少条sql就从连接池里面取出多少连接,并放回。保证事务小是非常重要的,但是这在中间件宕机的时候会导致一些问题,如下图所示:

如何使用分库分表中间件

如上图所示,在故障发现窗口期中(即还没有确定某台中间件不可用时),数据源是随机选择连接的。而这个连接就有一定1/N(N为中间件个数)的概率命中不可用中间件导致一条sql失败进而导致整个请求失败。我们做一个计算:

假设N为8,一个请求有20条sql,

那么在这个期间每个请求失败的概率就为(1-(7/8)的20次方)=0.93,

即有93%的概率会失败!

更为甚者,整个应用集群都会经历这个阶段,即每台应用都有93%的概率失败。

一台中间件宕机导致整个服务在十几秒内基本所有请求基本都失败,这是不可忍受的。

采用sticky数据源解决问题

由于我们不能瞬间发现并确认中间件不可用,所以这个故障发现窗口肯定存在(当然,错误计数法会在很大程度上缩短发现时间)。但理想状况下,宕机一台,只损失1/N的流量就好了。我们采用了sticky数据源解决了这个问题,使得在概率上大致只损失1/N的流量,如下图所示:

如何使用分库分表中间件

而配合错误计数的话,总流量的损失会更小(因为故障窗口短)

如上图所示,只有在故障时间内随机选择到中间件2(不可用)的请求才会失败,再让我们看下整个应用集群的情况。

如何使用分库分表中间件

只有sticky到中间件2的请求流量才有损失,由于是随机选择,所以这个流量的损失应用在1/N。

中间件升级发布过程中的高可用

分库分表中间件的升级发布不可避免。例如bug  fix以及新功能添加等都需要重启中间件。而重启的时间也会导致不可用,与物理机宕机的情况相比是其不可用的时间点是可知的,重启的动作也是可控的,那么我们就可以利用这些信息去做到流量的平滑无损。

让client端感知即将下线

在笔者所知的很多做法中,让client端感知下线是引入一个第三方协调者(例如ZooKeeper/etcd)。而我们并不想引入第三方的组件去做这个操作,因为这又会引入zookeeper的高可用问题,而且会让client端的配置更加复杂。平滑无损的大致思路(状态机)如下图所示:

如何使用分库分表中间件

让心跳流量感知下线而正常流量保持

我们可以复用之前client端检测不可用的逻辑,即让心跳的新建连接失败,而正常请求的新建连接成功。这样,client端就会认为Server不可用,而在内部剔除调这个server。由于我们只是模拟不可用,所以已经建立的连接和正常新建的连接(非心跳)都是正常可用的,如下图所示:

如何使用分库分表中间件

心跳连接的创建在server端可以通过其第一条执行的是mysql的ping而正常流量第一条执行的是一条sql来区分(当然我们采用的Druid连接池在新建连接成功以后也会ping一下,所以采用了另一种方式区分,这个细节在这里就不阐述了)。

三次心跳失败后,client端判定Server1失败,需要将连接到server1的连接销毁。其思路是,业务层用完连接返回连接池的时候,直接给close掉(当然这个是简单的描述,实际操作到Druid数据源也是有细微的差别的)。

如何使用分库分表中间件

由于配置了一个connection最长保持时间,所以在这个时间之后肯定会对Server1的连接数为0

由于线上流量也不低,这个收敛时间是比较快的(进一步的做法,其实是主动去销毁,不过我们尚未做这个操作)。

如何判定下线Server再也没有流量

在上述小心翼翼的操作之后,在Server1下线的过程中,是不会有流量损失的。但是我们在Server端还需要判定何时不会再有新的流量,这个判定标准即是Server1没有任何一个client端的连接。

这也是上面我们在执行完sql后销毁连接从而可以让连接数变为0的原因,如下图所示:

如何使用分库分表中间件

当连接数为0后,我们就可以重新发布Server1(分库分表中间件)了。对于这一点,我们写了个脚本,其伪代码如下所示:

while(true){     count =`netstat -anp | grep port | grep ESTABLISHED | wc -l`     if(0 == count){         // 流量已经为0,关掉服务器         kill Server         // 发布升级服务器         public Server         break     }else{         Sleep(30s)     } }

将这个脚本接入发布平台,即可进行滚动式上下线了。

现在可以解释下recover_time为何要较长了,因为新建连接也会导致脚本计算出来的 connection  count数量增加,所以需要一个时间窗口不去建立心跳,从而能让这个脚本顺利运行。

recover_time其实是非必要的

如果我们将心跳创建的端口号和正常流量的端口号分开,是不需要recover_time的,如下图所示:

图片

采用这种方案的话,会在很大程度上降低我们client端代码的复杂度。

但是这样无疑又给client端增加了一个新的配置,对使用人员就又多了一个负担,还得在网络上多一次开墙的操作,所以我们采取了recover_time的方案。

中间件的启动顺序问题

前面的过程是一个优雅下线的过程,但我们发现我们的中间件才上线的时候在某些情况下也不会优雅。即在中间件启动时候,如果对后端数据库刚建立的连接建立上去后由于某些原因断开了,会导致中间件的Reactor线程卡住一分钟左右,这段时间无法服务,造成流量损失。所以我们在后端数据库连接全部创建成功后,再启动reactor的accept线程从而接收新的流量,从而解决这一问题,如下图所示:

如何使用分库分表中间件

到此,关于“如何使用分库分表中间件”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

您可能感兴趣的文档:

--结束END--

本文标题: 如何使用分库分表中间件

本文链接: https://www.lsjlt.com/news/61553.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 如何使用分库分表中间件
    这篇文章主要介绍“如何使用分库分表中间件”,在日常操作中,相信很多人在如何使用分库分表中间件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用分库分表中间件”的疑惑有所帮...
    99+
    2022-10-18
    数据库
  • 怎么用数据库中间件Mycat+SpringBoot完成分库分表
    这篇文章主要讲解了“怎么用数据库中间件Mycat+SpringBoot完成分库分表”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用数据库中间件Mycat+SpringBoot完成分库分表...
    99+
    2023-06-16
  • SpringBoot2如何整合Sharding-Jdbc中间件实现数据分库分表
    小编给大家分享一下SpringBoot2如何整合Sharding-Jdbc中间件实现数据分库分表,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、水平分割1、水平分库1)、概念:以字段为依据,按照一定策略,将一个库中的数据...
    99+
    2023-06-02
  • 如何使用MyCat分表分库原理分析
    这篇文章给大家分享的是有关如何使用MyCat分表分库原理分析的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。MyCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务...
    99+
    2022-10-18
    mycat 分表分库
  • 如何在mysql中切分分库分表
    本篇文章为大家展示了如何在mysql中切分分库分表,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1、水平切分水平切分又称Sharding,是将同一表中的记录分割成多个结构相同的表中。Sharding...
    99+
    2023-06-15
  • Docker搭建MySQL读写分离主从模式 & 分布式数据库中间件Mycat分库分表应用
    一、MySQL读写分离主从模式 1. 下载镜像 docker pull mysql 当前最新版本:mysql Ver 8.0.19 for Linux on x86_64 (MySQL Community Server - GPL) 2....
    99+
    2016-10-09
    Docker搭建MySQL读写分离主从模式 & 分布式数据库中间件Mycat分库分表应用
  • MySQL如何分库分表
    1. 我们为什么需要分库分表 在分库分表之前,就需要考虑为什么需要拆分。我们做一件事,肯定是有充分理由的。所以得想好分库分表的理由是什么。我们现在就从两个维度去思考它,为什么要分库?为什么要分表? 1.1 为什么要分库 如果业务量剧增,数...
    99+
    2023-08-17
    mysql 数据库
  • 数据库中如何实现分库分表
    这篇文章将为大家详细讲解有关数据库中如何实现分库分表,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 分片是解决数据库存储容量限制的直接途径。分片包括垂直分片与水平分片两...
    99+
    2022-10-18
    数据库
  • MySQL中如何实现分库分表
    本篇文章为大家展示了MySQL中如何实现分库分表,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、    背景介绍1.大数据...
    99+
    2022-10-18
    mysql
  • SpringBoot 如何使用sharding jdbc进行分库分表
    目录基于4.0版本,Springboot2.1在pom里确保有如下引用里面我profiles.active了另一个之后手工把表都建好写个测试代码需要注意一个坑基于4.0版本,Spri...
    99+
    2022-11-13
    SpringBoot分库分表 使用sharding jdbc jdbc分库分表
  • MySQL怎么使用分库分表
    本篇内容介绍了“MySQL怎么使用分库分表”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!MySQL使用分库...
    99+
    2022-10-18
    mysql
  • 使用ShardingSphere-Proxy实现分表分库
    目录1. 环境准备2. 数据库脚本准备3. 配置 ShardingSphere-Proxy分表原理解析参考:Sharding-Proxy的基本功能使用 1. 环境准备 MySql 5...
    99+
    2022-11-13
    ShardingSphere-Proxy 分表分库
  • MySQL分库分表的使用方法
    下文给大家带来有关MySQL分库分表的使用方法内容,相信大家一定看过类似的文章。我们给大家带来的有何不同呢?一起来看看正文部分吧,相信看完MySQL分库分表的使用方法你一定会有所收获。MySQL使用分库分表...
    99+
    2022-10-18
    数据库 分库 分表
  • mysql分库分表如何实现
    MySQL分库分表可以通过以下几个步骤实现: 水平分库:将原始的单个数据库分成多个独立的数据库。每个数据库可以独立运行在不同的服务...
    99+
    2023-10-27
    mysql
  • Java如何实现分库分表
    一、为啥要分库分表 在大型互联网系统中,大部分都会选择mysql作为业务数据存储。一般来说,mysql单表行数超过500万行或者单表容量超过2GB,查询效率就会随着数据量的增长而下降。这个时候,就需要对表进行拆分。 那么应该怎么拆分呢? 通...
    99+
    2023-08-31
    java 开发语言
  • nodejs中间件使用实例分析
    这篇文章主要介绍了nodejs中间件使用实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇nodejs中间件使用实例分析文章都会有所收获,下面我们一起来看看吧。 ...
    99+
    2022-10-19
    nodejs
  • 怎么在springboot中使用shardingjdbc实现分库分表
    这篇文章给大家介绍怎么在springboot中使用shardingjdbc实现分库分表,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、概览1.1 简介ShardingSphere-JDBC定位为轻量级 Java 框架...
    99+
    2023-06-15
  • .Net如何使用分表分库框架ShardingCore实现多字段分片
    小编给大家分享一下.Net如何使用分表分库框架ShardingCore实现多字段分片,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!原理我们现在假定一个很简单的场景,依然是订单时间按月分片,查询进行如下语句//这边演示不使用...
    99+
    2023-06-22
  • 如何使用sharding-jdbc实现水平分库+水平分表
    这篇文章给大家分享的是有关如何使用sharding-jdbc实现水平分库+水平分表的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。分库分表策略:将id为偶数的存入到库1中,奇数存入到库2中,在每个库中,再根据学生的...
    99+
    2023-06-22
  • DDM实践系列丨分布式数据库中间件使用经验分享
    最近公司新项目使用了华为云的DDM分布式数据库中间件服务,通过一段的时间的使用感觉还不错。近段时间发现有许多小伙伴也准备去使用这个服务,所以为大家分享一下使用创建DDM服务的经验,帮助小伙伴们少走弯路。 首先在使用创建DDM实例的时候小伙...
    99+
    2021-05-23
    DDM实践系列丨分布式数据库中间件使用经验分享 数据库入门 数据库基础教程 数据库 mysql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作