TDengine高可用探讨

提到数据库,不可避免的要考虑高可用HA(High Availability)。但是很多人对高可用的理解并不是很透彻。

要搞清高可用需要回答以下几个问题:

  • 什么是高可用?
  • 为什么需要高可用?
  • 高可用需要达到什么样的目标?
  • 如何做到高可用?

什么是高可用?

高可用(HA)

高可用通常是指在单个组件出现故障时,整个系统仍可以对外提供服务。因此高可用主要还是针对一个系统而言,而非单独的一个组件(这点非常重要)。

我们通常用一段时间内系统可用时间占比作为高可用的衡量指标。

计算方式如下:

MTBF(Mean Time Between Failure),系统平均正常运行时间
MTTR(Mean Time to Repair),系统平均恢复时间

可用性的计算公式: AVAILABILITY = MTBF / ( MTBF + MTTR ) × 100%

如可用性 99.9%,就意味着该系统在连续运行1年时间里最多可能的业务中断时间是8.76小时【(1-99.9%) x 365 x 24】。

通常提到的可用性指标与允许业务中断时间(1年)如下:

可用性指标允许中断时间
99%3.65天
99.9%8.76小时
99.99%52.6分钟
99.999%5.26分钟

提到高可用,不可避免要提到RTO和RPO(这两个也是灾备方案的关键指标),高可用方案的选择要基于RTO和RPO。

RTO

RTO,Recovery time objective,恢复时间目标,是指所能容忍的业务系统停止服务的最长时间,也就是灾难发生到业务系统恢复服务功能所需要的最短时间。

RPO

RPO,Recovery point objective,恢复点目标,是指业务系统所能容忍的数据丢失量。

为什么需要高可用?

这个问题最好回答:为了提供持续服务。

但是你的系统真的需要提供持续服务吗?如果服务中断会带来哪些损失呢?

高可用需要达到什么样的目标?

在高可用概念中我们提到了高可用的衡量标准,那么对于一套系统,什么样的标准才是合理的呢?3个9还是4个9?

这需要平衡三个方面:服务中断的损失、方案的预算、技术的可行性。

如何判断标准是否合理?其实只有一个判断条件,预算。

没有预算,什么都是扯淡。

有了预算,那么才能考虑下一步,采用什么高可用方案。

如何做到高可用

在概念中我们提到,高可用是为了保障组件遇到故障时仍可以提供服务。

那么我们需要对故障进行总和分析,对症下药。

数据库故障分类

通常数据库故障可以分为以下几类:

  • 硬件故障
  • 软件故障
  • 误操作
硬件故障

硬件故障时最常见的故障,诸如:网络中断、磁盘损坏、服务器断电等。针对不同的故障,也有成形的解决方案:

  • 网络故障–网络设备冗余、多链路、bond
  • 磁盘损坏–分布式、RAID
  • 服务器断电–UPS、双电源
  • 机房爆炸–异地灾备
  • 世界毁灭–拜菩萨
软件故障

软件故障通常被忽略,但是也是最棘手的。数据库软件遇到bug,很难通过其他手段快速恢复。

误操作

这类故障时最难防范的。通常需要技术外的手段进行防范,如:安全培训、双人操作、方案审核等。

高可用方案

不管多么高大上的高可用方案,归根到底只有一个方法:冗余。

因此高可用方案都绕不过两个问题:

  • 故障发生时,如何快速在冗余系统间切换?切换时间决定了RTO。
  • 冗余系统间数据如何保持一致?数据差异决定了RPO。

常见的数据库高可用方案可以分为四种:

  1. 共享存储
    2个或2个以上服务器使用同一个存储(Oracle就是这样实现的),这样就保证了数据的一致性,但是想保证高可用,需要数据库软件支持两个数据库节点通知读写1个存储,否则只能实现主备,RTO会很长。
  2. 操作系统级别文件复制
    共享存储通常需要磁盘阵列来实现,增加了方案整体成本。如果没有磁盘阵列,可以采用折中的方法,使用复制软件(scp/rsync/bbcp)保证服务器间数据的一致性。但这样带来的问题是无法保证两个服务器之前的数据同步的实时性和一致性(一致性可以通过文件校验来实现,但会降低实时性)。
  3. 数据库级别数据复制
    相较于操作系统基本的文件复制,数据库级别的文件复制(如Oracle ADG)更加安全和高效,能够更好的保证数据的一致性,但是同样实时性是一个挑战。
  4. 数据库集群/分布式数据库
    这种方式是数据库软件自身实现的,在保证数据一致性和实时性方面都较以上方案都更高效。但对数据库软件自身的设计也要求更高。

需要注意的是以上所有方案都是用来应对硬件故障,遇到软件故障或误操作通常无能为力。

TDengine高可用探讨

TDengine 通过多节点和多副本来提供整个数据库系统可用性。这个方案有如下特点:

  • 任何1个节点故障(硬件故障、操作系统故障等非数据库软件故障)时,整个系统仍可以对外提供服务,且数据不会有任何损失。RPO=0
  • 任何1个节点故障时,对客户端几乎时无感知的。RTO=0

以上方案可以应对硬件故障、操作系统故障(也不是绝对),但是当网络故障或数据库软件自身出bug时就无能为力了。

那么应该采用什么方案才能提高可用性呢?

冗余,增加冗余!!
在这里插入图片描述

  1. 部署2套TDengine集群,集群间进行数据同步。
  2. 前端部署负载均衡集群,当节点或集群故障时进行切换。

这个方案存在以下优缺点:

优点:

  1. 同步部署两套集群,可以规避绝大部分硬件故障。如果异地部署,设置可以规避机房级别的故障。
  2. 所有访问通过负载均衡进行反向代理,节点故障/集群切换时,对应用而言无需做任何变更,甚至是无感知的。

缺点:

  1. 目前可以使用订阅来实现数据的单向同步,但无法实现双向。因此当由集群1切换到集群2后,需要手动修改订阅,才能保证两个集群间数据一致。
  2. 集群切换时,Nginx需要手动修改配置。切换过程会造成短时间应用访问异常。
  3. 预算高。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/568932.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【面试经典 150 | 数组】反转字符串中的单词

文章目录 写在前面Tag题目来源解题思路方法一:模拟实现方法二:使用库函数 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附带一些对于本…

公园景区伴随音乐系统-公园景区数字IP广播伴随音乐系统建设指南

公园景区伴随音乐系统-公园景区数字IP广播伴随音乐系统建设指南 由北京海特伟业任洪卓发布于2024年4月23日 随着“互联网”被提升为国家战略,传统行业与互联网的深度融合正在如火如荼地展开。在这一大背景下,海特伟业紧跟时代步伐,凭借其深厚…

Security用户管理(一)

Security初探(三)-CSDN博客 Security的身份验证流程: AuthenticationFilter拦截请求并将身份验证职能委托给AuthticationManager.为了实现身份验证逻辑,AuthticationManager会使用身份验证程序.为了检查用户名和密码,AuthenticationProvider会使用UserDetailsService和Passwor…

爱上JDK源码阅读-枚举类

在日常开发中,经常会用到枚举类。这篇文章主要探讨一下枚举类和普通类有什么区别,以及编译过程中偷偷做了什么事情。 知识点 枚举类的本质编译器对枚举类的改动 先看一段简单的枚举类代码: enum StatusType {ON(1) ,OFF(2);StatusType(int …

mongodb 安装问题

1. mongodb启动时显示 Illegal instruction (core dumped) mongodb 5.0之后(包括5.0) 开始使用需要使用 AVX 指令集 2.启动时报错 ERROR: child process failed, exited with 1 通过指令 bin/mongod --repair 查看报错信息 根据报错信息进行修改 3. 配置服务器添加节点时…

Ubuntu20.04安装redis5.0.7

redis下载命令: wget https://download.redis.io/releases/redis-5.0.7.tar.gz 解压到 opt目录下 tar -zxvf redis-5.0.7.tar.gz -C /opt apt install -y gcc # 安装gccapt install make # 安装make 后面执行make一直报错 make报错后清除: make …

数据结构(Wrong Question)

一、绪论 1.1 数据结构的基本概念 D 因为抽象数据类型(ADT)描述了数据的逻辑结构和抽象运算,通常用(数据对象,数据对象,基本操作集)这样的三元组来表示,从而可构成一个完整的数据结…

Unity 如何制作和发布你的 Package

一、制作你的第一个 Package Unity Package 不做过多赘述,像 URP 本质上也是一个 Package,在 Unity 中可以通过菜单栏 → Window → Package manager 来管理你当前的所有 Package 本篇文章主要介绍:如何制作并发布属于你的 Package 1.1 Pac…

配置网络设备的密码设置以及忘记密码的恢复方式以及实现全网互通

1.实验拓扑图: 2.实验需求: 1.推荐步骤 1.1配置IP: 不过多说了,较为基础(略) 2.推荐步骤 2.所有网络设备配置console接口密码 首先进入全局模式,输入以下代码(进入接口console接口0给其配置密…

在 Windows 系统上彻底卸载 TeamViewer 软件

在 Windows 系统上彻底卸载 TeamViewer 软件 References 免费版仅供个人使用 您的会话将在 5 分钟后终止 Close TeamViewer by locating the TeamViewer icon in the system tray, right click and “Exit TeamViewer”. Right click Windows start menu then Control Panel -…

centos 安装配置文件中心 nacos2.2.3 稳定版

安装mysql 8 参考文章 centos7搭建mysql5.6 && mysql 8.0_centos7 mysql5.6-CSDN博客 安装 jdk 17 官网下载 对应的版本 Java Downloads | Oracle wget https://download.java.net/java/GA/jdk17.0.2/dfd4a8d0985749f896bed50d7138ee7f/8/GPL/openjdk-17.0.2_l…

Swift-27-类的初始化与销毁

Swift的初始化是一个有大量规则的固定过程。初始化是设置类型实例的操作,包括给每个存储属性初始值,以及一些其他准备工作。完成这个过程后,实例就可以使用了。 简单来讲就是类的构造函数,基本语法如下: 注意&#xff…

3 命名实体识别调优化

能走到这里说明你对模型微调有了一个基本的认识。那么开始一段命名实体的任务过程,下面使用huggingface官网的数据。 1 准备模型 下面的模型自己选择一个吧,我的内存太第一个模型跑不了。 https://huggingface.co/ckiplab/bert-base-chinese-ner/tree…

在vscode上面进行分支merge的记录

前言:在我们的项目中,有两个分支:master和liutielong。现在要将liutielong分支的改动merge到master分支中。 如果master分支已经更改了,所以要先pull(这是在git bash里面的命令)。 git pull origin master…

HTML5+CSS3小实例:炫彩荧光线条登录框

实例:炫彩荧光线条登录框 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-sca…

【网络安全】对称加密、非对称加密以及密钥分配

目录 1、对称加密 2、非对称加密 3、如何分配对称密钥&#xff1f; 4、如何分配非对称密钥&#xff1f; 1、对称加密 所谓对称加密&#xff0c;就是指加密密钥与解密密钥都使用相同的密钥。如下图所示&#xff0c;通信双方使用的就是对称加密密钥。//代表&#xff1a;DES和…

【数据库】MongoDB

文章目录 [toc]数据库操作查询数据库切换数据库查询当前数据库删除数据库查询数据库版本 数据集合操作创建数据集合查询数据集合删除数据集合 数据插入插入id重复的数据 数据更新数据更新一条丢失其他字段保留其他字段 数据批量更新 数据删除数据删除一条数据批量删除 数据查询…

如何启用启用WordPress调试模式

最近我们的WordPress网站在访问时&#xff0c;经常出现打不开的现象&#xff0c;我们向主机提供商Hostease咨询后&#xff0c;他们提到这是由于WordPress的某个插件导致的问题&#xff0c;我们在将插件版本升级至最新后&#xff0c;这个问题就消失了。为了方便后续的检查&#…

【VI/VIM】基本操作备忘录

简介 新建/打开文件 工作模式 常用命令 补全命令 命令模式输入&#xff1a;ctrl p 移动命令 文本选中 撤销、删除 复制粘贴 替换 缩排 查找 替换 插入 分屏 练习

react引入iconfont的svg图标

react引入iconfont的svg图标 本文目录 react引入iconfont的svg图标普通图标通过link引入css组件内引入css使用 svg图标通过script引入js组件内引入js使用 通过封装组件自定义封装组件中调用 通过antd封装使用 普通图标 通过link引入css <link rel"stylesheet" h…