不可不知的分布式数据库-TiDB

不可不知的分布式数据库-TiDB

    • 介绍
    • TiDb架构
    • TiDb与Mysql的区别
      • 功能特性
      • 性能表现
      • 数据可靠性
      • 运维管理
      • 成本
    • Docker部署TiDB
      • 1. 获取 TiDB 配置文件
      • 2. 启动 TiDB 集群
      • 3. 连接到 TiDB
      • 4. 停止和清理 TiDB 集群
      • 注意事项
    • 实用案例
      • TiDB实现分布式事务
        • 实现原理
        • 实现方式
          • SQL 方式
          • 编程方式
        • 注意事项
      • 分库分表
        • 原理
        • 操作步骤
          • 1. 安装与启动 TiDB 集群
          • 2. 创建数据库和表
          • 3. 选择分区方式
        • 示例代码
          • 范围分区示例
          • 哈希分区示例
        • 后续操作

介绍

TiDB是一款由中国公司PingCAP开发的开源分布式关系型数据库。它具有以下特点和优势:

  • 分布式架构:采用分布式架构,能够水平扩展,支持海量数据存储和高并发读写。通过将数据分散存储在多个节点上,实现了高可用性和容错机制,确保系统在部分节点出现故障时仍能正常运行。
  • 支持事务:支持分布式事务,保证数据的一致性和完整性。这使得TiDB能够适用于各种对数据一致性要求较高的应用场景,如金融、电商等领域的核心业务系统。
  • SQL兼容性:与传统的关系型数据库一样,TiDB支持标准的SQL语言,开发人员可以使用熟悉的SQL语句进行数据操作,无需学习新的查询语言。这使得TiDB易于与现有的应用系统集成,降低了开发和迁移成本。
  • 自动数据分布与均衡:能够自动将数据分布在不同的节点上,并根据数据的访问频率和节点的负载情况自动进行数据均衡。这有助于提高系统的性能和资源利用率,避免数据热点问题。
  • 云原生支持:具备良好的云原生特性,能够方便地部署在各种云平台上,支持容器化部署和自动化运维。这使得TiDB能够充分利用云平台的弹性和灵活性,为用户提供高效、便捷的数据库服务。

TiDB适用于多种场景,包括但不限于电商、金融、互联网、物联网等领域中对海量数据存储高并发读写数据一致性有较高要求的应用系统。

TiDb架构

TiDB架构主要由以下几个核心组件构成:

  • TiDB Server
    • 是TiDB的计算节点,负责接收客户端的连接和SQL请求,并进行SQL解析、优化和执行。
    • 它会将SQL语句转化为分布式的执行计划,然后分发到各个TiKV节点上执行,并汇总结果返回给客户端。
    • 支持MySQL协议,能与现有的MySQL客户端和应用程序无缝兼容。
  • TiKV Server
    • 是TiDB的存储节点,基于RocksDB存储引擎,负责存储数据。
    • 数据以键值对的形式存储在TiKV中,并且会自动进行数据的分片和复制,以实现数据的分布式存储和高可用性。
    • 每个数据分片(Region)会有多个副本,通过Raft协议来保证数据的一致性和容错性。
  • PD Server
    • 即Placement Driver,是TiDB的集群管理和调度中心。
    • 负责管理TiDB集群中的所有节点,包括TiDB Server和TiKV Server,监控它们的状态,并进行自动的故障检测和恢复。
    • 同时,PD Server还负责数据的分布和调度,根据数据的负载情况和节点的状态,自动调整数据分片(Region)在各个TiKV节点上的分布,以实现负载均衡。
  • TiFlash(可选组件):
    • 是TiDB的列存存储引擎,主要用于加速分析型查询。
    • 它可以与TiKV共存于同一节点,也可以单独部署在其他节点上。
    • TiFlash通过异步复制的方式从TiKV获取数据,并进行列存格式的转换和存储。在查询时,TiFlash可以利用列存的优势,如高效的压缩和快速的过滤,来提高查询性能。

在整个架构中,TiDB Server、TiKV Server和PD Server相互协作,共同实现了TiDB的分布式数据库功能。客户端通过连接TiDB Server来访问数据库,TiDB Server根据PD Server提供的元数据信息,将SQL请求路由到相应的TiKV Server上进行数据读写操作。PD Server则负责整个集群的管理和调度,确保集群的高可用性和性能优化。TiFlash作为可选组件,为分析型工作负载提供了更高效的支持。

TiDb与Mysql的区别

功能特性

  • TiDB
    • 分布式架构:支持自动水平扩展,能处理海量数据和高并发请求,轻松应对大规模业务增长。
    • 强一致性:采用分布式事务处理机制,确保数据在分布式环境下的强一致性。
    • SQL兼容性:高度兼容MySQL的SQL语法,方便MySQL用户迁移和使用。
  • MySQL
    • 功能成熟:拥有丰富的功能和特性,如存储过程、视图、触发器等,能满足各种复杂的业务需求。
    • 存储引擎多样:提供多种存储引擎,如InnoDB、MyISAM等,可根据不同的应用场景选择合适的存储引擎。

性能表现

  • TiDB
    • 高并发读写:在分布式架构下,可通过增加节点来提高并发处理能力,性能随节点数量增加而线性增长。
    • 分布式查询:对分布式数据的查询优化能力较强,能高效处理跨节点的数据查询。
  • MySQL
    • 单机性能优:在单机环境下,对于中小规模数据和并发量,MySQL具有出色的性能表现,响应速度快。
    • 索引优化:索引机制成熟,查询优化器能高效利用索引来提高查询性能。

数据可靠性

  • TiDB
    • 多副本冗余:数据自动复制到多个节点,形成多副本,确保数据的高可用性和容错能力。
    • 分布式事务:通过分布式事务保证数据在多个节点之间的一致性,即使部分节点出现故障,也能保证数据的完整性。
  • MySQL
    • 事务支持:InnoDB存储引擎支持事务,通过事务日志和回滚机制保证数据的一致性。
    • 备份恢复:有成熟的备份和恢复工具,可定期备份数据,在出现故障时进行恢复。

运维管理

  • TiDB
    • 自动化运维:提供自动化的运维工具,如TiDB Ansible、TiDB Operator等,方便进行集群的部署、扩容、缩容等操作。
    • 监控告警:有完善的监控和告警体系,能实时监控集群的性能指标,及时发现和解决问题。
  • MySQL
    • 运维经验丰富:经过多年发展,有大量的运维经验和成熟的运维工具,DBA容易上手。
    • 单机管理简单:单机部署的MySQL管理相对简单,配置参数较少,容易进行日常维护。

成本

  • TiDB
    • 硬件要求高:由于采用分布式架构,需要多个节点组成集群,硬件成本相对较高。
  • MySQL
    • 硬件灵活:可根据业务需求选择不同配置的硬件,单机部署时对硬件要求较低,成本可控。

总的来说,TiDB在处理海量数据、高并发和分布式场景方面具有明显优势;MySQL则在单机性能、功能成熟度和运维经验方面表现出色。选择哪种数据库取决于具体的业务需求、数据规模、并发量以及预算等因素。

Docker部署TiDB

1. 获取 TiDB 配置文件

你可以从 TiDB 的官方 GitHub 仓库获取 Docker Compose 配置文件,命令如下:

git clone https://github.com/pingcap/tidb-docker-compose.git
cd tidb-docker-compose

2. 启动 TiDB 集群

tidb-docker-compose 目录下,使用 Docker Compose 启动 TiDB 集群:

docker-compose up -d

此命令会在后台启动 TiDB 集群,包含 TiDB Server、TiKV Server、PD Server 等组件。你可以通过以下命令查看容器的运行状态:

docker-compose ps

3. 连接到 TiDB

当 TiDB 集群启动成功后,你可以使用 MySQL 客户端连接到 TiDB。默认情况下,TiDB 的连接地址是 127.0.0.1,端口是 4000,用户名为 root,无密码。你可以使用以下命令连接:

mysql -h 127.0.0.1 -P 4000 -u root

连接成功后,你就可以执行 SQL 语句对 TiDB 进行操作了。

4. 停止和清理 TiDB 集群

如果你想停止 TiDB 集群,可以在 tidb-docker-compose 目录下执行以下命令:

docker-compose down

此命令会停止并移除所有相关的 Docker 容器。

注意事项

  • 资源需求:TiDB 是一个分布式数据库,对系统资源有一定要求。在部署之前,请确保你的服务器有足够的 CPU、内存和磁盘空间。
  • 配置调整docker-compose.yml 文件中包含了 TiDB 集群的配置信息,你可以根据实际需求进行调整,例如修改节点数量、内存分配等。
  • 数据持久化:默认情况下,TiDB 数据存储在 Docker 容器内部,容器删除后数据会丢失。如果你需要持久化数据,可以通过挂载数据卷的方式将数据存储在宿主机上。

实用案例

TiDB实现分布式事务

TiDB 是一款分布式关系型数据库,支持分布式事务。以下为你介绍 TiDB 实现分布式事务的相关内容,包括原理、实现方式、示例代码等。

实现原理

TiDB 的分布式事务实现基于 Google 的 Percolator 模型,并进行了优化,主要采用两阶段提交(2PC)的变种方案,具体步骤如下:

  1. 事务开始:客户端发起一个事务,TiDB 会为该事务分配一个全局唯一的事务 ID。
  2. 写入阶段:客户端在事务中执行一系列的读写操作。TiDB 会将这些操作记录在本地的事务日志中,并在写入数据时,为每个修改的数据项添加一个锁,以防止其他事务同时修改。
  3. 预提交阶段:当客户端发起提交事务的请求时,TiDB 会进入预提交阶段。在这个阶段,TiDB 会选择一个主锁(Primary Lock),并尝试对所有涉及的数据项进行预提交操作。如果所有预提交操作都成功,事务进入提交阶段;如果有任何一个预提交操作失败,事务将被回滚。
  4. 提交阶段:在预提交阶段成功后,TiDB 会对所有涉及的数据项进行提交操作,释放所有的锁,并将修改的数据持久化到磁盘。
实现方式
SQL 方式

在 SQL 层面,TiDB 支持标准的 SQL 事务语法,你可以使用 START TRANSACTIONCOMMITROLLBACK 来手动控制事务的开始、提交和回滚。

START TRANSACTION;
-- 执行一系列 SQL 语句
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;
编程方式

如果你使用编程语言(如 Java)与 TiDB 交互,可以通过相应的数据库驱动来实现分布式事务。以下是一个使用 Java 和 JDBC 实现分布式事务的示例:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;public class TidbDistributedTransactionExample {public static void main(String[] args) {String url = "jdbc:mysql://localhost:4000/test";String username = "root";String password = "";try (Connection connection = DriverManager.getConnection(url, username, password)) {// 关闭自动提交,开启事务connection.setAutoCommit(false);try (Statement statement = connection.createStatement()) {// 执行 SQL 语句statement.executeUpdate("UPDATE accounts SET balance = balance - 100 WHERE id = 1");statement.executeUpdate("UPDATE accounts SET balance = balance + 100 WHERE id = 2");// 提交事务connection.commit();System.out.println("Transaction committed successfully.");} catch (SQLException e) {// 回滚事务connection.rollback();System.err.println("Transaction rolled back due to error: " + e.getMessage());}} catch (SQLException e) {e.printStackTrace();}}
} 
注意事项
  • 事务超时:TiDB 支持设置事务的超时时间,以避免长时间占用锁资源。你可以通过 tidb_constraint_check_in_placetidb_wait_for_lock_timeout 等参数来调整事务的超时行为。
  • 锁冲突:在高并发场景下,可能会出现锁冲突的情况。TiDB 会自动处理一些简单的锁冲突,但在复杂场景下,可能需要优化业务逻辑或调整事务的隔离级别来减少锁冲突。
  • 数据一致性:TiDB 支持多种事务隔离级别,如 READ COMMITTEDREPEATABLE READ 等。你可以根据业务需求选择合适的隔离级别来保证数据的一致性。

分库分表

在 TiDB 里,分库分表是应对海量数据存储与高并发访问的有效手段。TiDB 凭借自身分布式架构,能自动完成数据的分区和分布,达成类似分库分表的效果。下面从原理、操作步骤、示例代码等方面详细介绍 TiDB 实现分库分表的方法。

原理

TiDB 把数据拆分成多个 Region(数据分片),每个 Region 存有一部分数据。这些 Region 会自动分布于多个 TiKV 节点上。TiDB 会借助 PD(Placement Driver)来管理 Region 的分布和调度,保证数据均匀分布,同时具备高可用性与容错能力。

操作步骤
1. 安装与启动 TiDB 集群

你可以通过官方文档的指引,采用 Docker、Ansible 或者 TiUP 等方式来安装和启动 TiDB 集群。

2. 创建数据库和表

使用 SQL 语句创建数据库和表。TiDB 支持多种分区方式,例如范围分区、哈希分区等。

3. 选择分区方式
  • 范围分区:按照某个字段的值范围对数据进行分区。
  • 哈希分区:依据某个字段的哈希值对数据进行分区。
示例代码
范围分区示例

下面的 SQL 语句展示了如何创建一个按日期范围分区的表:

-- 创建数据库
CREATE DATABASE IF NOT EXISTS test_db;
USE test_db;-- 创建按日期范围分区的表
CREATE TABLE orders (id INT NOT NULL AUTO_INCREMENT,order_date DATE NOT NULL,amount DECIMAL(10, 2) NOT NULL,PRIMARY KEY (id, order_date)
)
PARTITION BY RANGE (YEAR(order_date)) (PARTITION p2023 VALUES LESS THAN (2024),PARTITION p2024 VALUES LESS THAN (2025),PARTITION p2025 VALUES LESS THAN (2026)
);    

在这个示例中,orders 表按照 order_date 字段的年份进行范围分区,数据会依据订单日期被分配到不同的分区。

哈希分区示例

以下 SQL 语句展示了如何创建一个按 id 字段哈希分区的表:

-- 创建数据库
CREATE DATABASE IF NOT EXISTS test_db;
USE test_db;-- 创建按 id 字段哈希分区的表
CREATE TABLE products (id INT NOT NULL AUTO_INCREMENT,name VARCHAR(100) NOT NULL,price DECIMAL(10, 2) NOT NULL,PRIMARY KEY (id)
)
PARTITION BY HASH(id)
PARTITIONS 4;   

在这个示例中,products 表按照 id 字段的哈希值进行分区,数据会被均匀分配到 4 个分区中。

后续操作
  • 数据插入:插入数据时,TiDB 会自动把数据路由到对应的分区。
INSERT INTO orders (order_date, amount) VALUES ('2024-01-01', 100.00);
  • 数据查询:查询数据时,TiDB 会依据查询条件自动定位到相应的分区进行查询。
SELECT * FROM orders WHERE order_date BETWEEN '2024-01-01' AND '2024-12-31';

通过上述步骤和示例,你可以在 TiDB 中实现分库分表,从而有效处理海量数据和高并发访问。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20242817李臻《Linux⾼级编程实践》第四周

20242817李臻《Linux⾼级编程实践》第4周 一、AI对学习内容的总结 第5章 Linux进程管理 5.1 进程基本概念 进程与程序的区别 程序:静态的二进制文件(如/bin/ls),存储在磁盘中,不占用运行资源。进程:程…

基于 Prometheus + Grafana 监控微服务和数据库

以下是基于 Prometheus Grafana 监控微服务和数据库的详细指南&#xff0c;包含架构设计、安装配置及验证步骤&#xff1a; 一、整体架构设计 二、监控微服务 1. 微服务指标暴露 Spring Boot 应用&#xff1a; xml <!-- 添加 Micrometer 依赖 --> <dependency>…

使用GoogleNet实现对花数据集的分类预测

使用GoogleNet实现对花数据集的分类预测 1.作者介绍2.关于理论方面的知识介绍2.1GooLeNet的知识介绍2.2CNN发展阶段2.2GooLeNet创新模块 3.关于实验过程的介绍&#xff0c;完整实验代码&#xff0c;测试结果3.1数据集介绍3.2实验过程3.3实验结果 1.作者介绍 王海博, 男 , 西安…

流量密码破解:eBay店铺首页改版后的黄金展示位

流量密码破解&#xff1a;eBay店铺首页改版后的黄金展示位 近年来&#xff0c;跨境电商行业竞争日趋激烈&#xff0c;流量分配机制的调整成为平台卖家最为关注的核心议题之一。作为全球领先的在线电商平台&#xff0c;eBay的每一次页面优化都可能对卖家的经营策略产生深远影响…

从0到1彻底掌握Trae:手把手带你实战开发AI Chatbot,提升开发效率的必备指南!

我正在参加Trae「超级体验官」创意实践征文&#xff0c; 本文所使用的 Trae 免费下载链接&#xff1a; www.trae.ai/?utm_source… 前言 大家好&#xff0c;我是小Q&#xff0c;字节跳动近期推出了一款 AI IDE—— Trae&#xff0c;由国人团队开发&#xff0c;并且限时免费体…

Netty:java高性能网络编程的基石(下)

一、Netty是什么&#xff1f;为什么需要它&#xff1f; Netty是一个异步事件驱动的网络应用框架&#xff0c;基于Java NIO技术封装&#xff0c;用于快速开发高性能、高可靠性的网络服务器和客户端程序。作为当前最流行的NIO框架之一&#xff0c;支撑着Dubbo、RocketMQ、Elasti…

leetcode-47.全排列II

如何在有重复值的时候节省时间是优化重点。 基础写法肯定是按无重复值时的全排列写&#xff0c;在其中要加上防止走重复路径的分支。 能防止的也只有同层&#xff0c;如果同层走一个值&#xff0c;但是该值重复&#xff0c;且走过了&#xff0c;则放弃走该分支。所以设layer_u…

函数(函数的概念、库函数、自定义函数、形参和实参、return语句、数组做函数参数、嵌套调用和链式访问、函数的声明和定义、static和extern)

一、函数的概念 •C语⾔中的函数&#xff1a;⼀个完成某项特定的任务的⼀⼩段代码 •函数又被翻译为子函数&#xff08;更准确&#xff09; •在C语⾔中我们⼀般会⻅到两类函数&#xff1a;库函数 ⾃定义函数 二、库函数 1 .标准库和头文件 •C语⾔的国际标准ANSIC规定了⼀…

孜然SEO静态页面生成系统V1.0

孜然SEO静态页面生成系统&#xff0c;1秒生成上万个不同的静态单页系统&#xff0c;支持URL裂变采集&#xff0c;采集的内容不会重复&#xff0c;因为程序系统自带AI重写算法&#xff0c;AI扩写算法&#xff0c;可视化的蜘蛛池系统让您更清楚的获取到信息&#xff01; 可插入二…

Secs/Gem第一讲 · 总结精华版(基于secs4net项目的ChatGpt介绍)

好的&#xff01;这就是《第一讲 总结精华版》——为背诵准备的口述速成稿&#xff0c;适合面试前复习答题用。我们会分为两个部分&#xff1a; 第一部分&#xff1a;一整段口述稿&#xff0c;可以当成面试时开口自我介绍用&#xff1b;第二部分&#xff1a;要点清单关键词串…

预处理指令中#if 和 #endif的用法

在 C 语言中&#xff0c;#if 和 #endif 是预处理指令&#xff0c;用于条件编译。它们的核心作用是&#xff1a;根据预处理器能够识别的条件&#xff08;通常是宏定义或常量表达式&#xff09;&#xff0c;决定某段代码是否参与编译。 — 基本功能 #if 用于开启一个条件编译块…

【数据库】掌握MySQL事务与锁机制-数据一致性的关键

在数据库的世界里&#xff0c;数据就是一切。而确保数据的准确性和一致性&#xff0c;则是数据库系统的核心任务之一。想象一下&#xff0c;如果没有合适的机制&#xff0c;当多个用户同时试图修改同一条数据时&#xff0c;会发生什么&#xff1f; chaos&#xff08;混乱&#…

linux 基础网络配置文件

使用“ifconfig”命令查看网络接口地址 直接执行“iconfg”命令后可以看到ens33、10、virbr0这3个网络接口的信息&#xff0c;具体命令如下 ifconfig ##查看网络接口地址 ens33:第一块以太网卡的名称 lo:“回环”网络接口 virbr0:虚拟网桥的连接接口 查看指…

OpenCV特征提取与深度学习CNN特征提取差异

一、特征生成方式 ‌OpenCV传统方法‌ ‌手工设计特征‌&#xff1a;依赖人工设计的算法&#xff08;如SIFT、FAST、BRIEF&#xff09;提取图像中的角点、边缘等低层次特征&#xff0c;需手动调整参数以适应不同场景‌。‌数学驱动‌&#xff1a;基于梯度变化、几何变换等数学规…

五种方案实现双链路可靠数据传输

本文介绍五种双链路数据传输方案,目标是利用设备的多个传输通道,(如双有线网口,网口+wifi, 网口+5G等场景 , 网口+ 自组网, 自组网 + 5G等),将数据复制后分流、分路同时传输,以期提高数据传输可靠性,满足高可靠性传输的应用场景需求。部分方案给出了实际验证结果 。 …

【备赛】遇到的小问题-1

问题描述-1 想实现的功能是&#xff0c;通过ADC实时测量某引脚的电压及其占空比。 可以通过旋转电位器&#xff0c;更改其电压。 首先我定义了这几个变量 uint32_t adc_value;//HAL库函数里面得出的采样值(实时更新) uint32_t percentage6;//占空比&#xff0c;随着adc_val…

最大公约数

4.最大公约数 - 蓝桥云课 最大公约数 题目描述 给定两个正整数 A,B&#xff0c;求它们的最大公约数。 输入描述 第1行为一个整数 T&#xff0c;表示测试数据数量。 接下来的 T 行每行包含两个正整数 A,B。 1≤T≤105&#xff0c;1≤A,B≤109。 输出描述 输出共 T 行&…

TMHMM2.0-蛋白跨膜螺旋预测工具-centos-安装+配置+排错

参考&#xff1a; A. Krogh, B. Larsson, G. von Heijne, and E. L. L. Sonnhammer. Predicting transmembrane protein topology with a hidden Markov model: Application to complete genomes. Journal of Molecular Biology, 305(3):567-580, January 2001. centos&#x…

docker run 命令常用参数

docker run 命令 用于从镜像创建并启动一个新的容器。 基本语法&#xff1a; docker run [OPTIONS] IMAGE [COMMAND] [ARG...]常用选项分类说明 容器配置 --name 为容器指定名称&#xff08;默认随机生成&#xff09;。 示例&#xff1a; docker run --name my_container …

Zbrush插件安装

安装目录在: ...\Zbrush2022\ZStartup\ZPlugs64