TiDB 是 PingCAP 公司设计的开源分布式 HTAP (Hybrid Transactional and Analytical Processing) 数据库，结合了传统的 RDBMS 和 NoSQL 的最佳特性。TiDB 兼容 MySQL，支持无限的水平扩展，具备强一致性和高可用性。TiDB 的目标是为 OLTP (Online Transactional Processing) 和 OLAP (Online Analytical Processing) 场景提供一站式的解决方案。如果你此前一直使用MySQL集群，那么TIDB的使用也会变得很容易，因为TIDB高度兼容MySQL,大多数情况下，无需修改代码即可从 MySQL 轻松迁移至 TiDB，分库分表后的 MySQL 集群亦可通过 TiDB 工具进行实时迁移。而且TIDB可以提供金融级的 100% 数据强一致性保证，它是真正金融级高可用数据库，相比于传统主从 (M-S) 复制方案，基于 Raft 的多数派选举协议可以提供金融级的 100% 数据强一致性保证，且在不丢失大多数副本的前提下，可以实现故障的自动恢复 (auto-failover)，无需人工介入。TiDB 是为云而设计的数据库，支持公有云、私有云和混合云，配合 TiDB Operator 项目 可实现自动化运维，使部署、配置和维护变得十分简单。要深入了解 TiDB 的水平扩展和高可用特点，首先需要了解 TiDB 的整体架构。TiDB 集群主要包括三个核心组件：TiDB Server，PD Server 和 TiKV Server。TiDB ServerTiDB Server 负责接收 SQL 请求，处理 SQL 相关的逻辑，并通过 PD 找到存储计算所需数据的 TiKV 地址，与 TiKV 交互获取数据，最终返回结果。TiDB Server 是无状态的，其本身并不存储数据，只负责计算，可以无限水平扩展，可以通过负载均衡组件（如LVS、HAProxy 或 F5）对外提供统一的接入地址。PD ServerPlacement Driver (简称 PD) 是整个集群的管理模块，其主要工作有三个：一是存储集群的元信息（某个 Key 存储在哪个 TiKV 节点）；二是对 TiKV 集群进行调度和负载均衡（如数据的迁移、Raft group leader 的迁移等）；三是分配全局唯一且递增的事务 ID。PD 通过 Raft 协议保证数据的安全性。Raft 的 leader server 负责处理所有操作，其余的 PD server 仅用于保证高可用。建议部署奇数个 PD 节点。TiKV ServerTiKV Server 负责存储数据，从外部看 TiKV 是一个分布式的提供事务的 Key-Value 存储引擎。存储数据的基本单位是 Region，每个 Region 负责存储一个 Key Range（从 StartKey 到 EndKey 的左闭右开区间）的数据，每个 TiKV 节点会负责多个 Region。TiKV 使用 Raft 协议做复制，保持数据的一致性和容灾。副本以 Region 为单位进行管理，不同节点上的多个 Region 构成一个 Raft Group，互为副本。数据在多个 TiKV 之间的负载均衡由 PD 调度，这里也是以 Region 为单位进行调度高可用是 TiDB 的另一大特点，TiDB/TiKV/PD 这三个组件都能容忍部分实例失效，不影响整个集群的可用性。下面分别说明这三个组件的可用性、单个实例失效后的后果以及如何恢复。TiDBTiDB 是无状态的，推荐至少部署两个实例，前端通过负载均衡组件对外提供服务。当单个实例失效时，会影响正在这个实例上进行的 Session，从应用的角度看，会出现单次请求失败的情况，重新连接后即可继续获得服务。单个实例失效后，可以重启这个实例或者部署一个新的实例。PDPD 是一个集群，通过 Raft 协议保持数据的一致性，单个实例失效时，如果这个实例不是 Raft 的 leader，那么服务完全不受影响；如果这个实例是 Raft 的 leader，会重新选出新的 Raft leader，自动恢复服务。PD 在选举的过程中无法对外提供服务，这个时间大约是3秒钟。推荐至少部署三个 PD 实例，单个实例失效后，重启这个实例或者添加新的实例。TiKVTiKV 是一个集群，通过 Raft 协议保持数据的一致性（副本数量可配置，默认保存三副本并通过 PD 做负载均衡调度。单个节点失效时，会影响这个节点上存储的所有 Region。对于 Region 中的 Leader 节点，会中断服务，等待重新选举；对于 Region 中的 Follower 节点，不会影响服务。当某个 TiKV 节点失效，并且在一段时间内（默认 30 分钟）无法恢复，PD 会将其上的数据迁移到其他的 TiKV 节点上。部署方式TiDB 可以部署在本地和云平台上，支持公有云、私有云和混合云。你可以根据实际场景或需求，选择相应的方式来部署 TiDB 集群：使用 Ansible 部署：如果用于生产环境，推荐使用 Ansible 部署 TiDB 集群。使用 Ansible 离线部署：如果部署环境无法访问网络，可使用 Ansible 进行离线部署。使用 TiDB Operator 部署：使用 TiDB Operator 在 Kubernetes 集群上部署生产就绪的 TiDB 集群，支持部署到 AWS EKS、部署到谷歌云 GKE (beta)、部署到阿里云 ACK 等。使用 Docker Compose 部署：如果你只是想测试 TiDB、体验 TiDB 的特性，或者用于开发环境，可以使用 Docker Compose 在本地快速部署 TiDB 集群。该部署方式不适用于生产环境。使用 Docker 部署：你可以使用 Docker 部署 TiDB 集群，但该部署方式不适用于生产环境。使用 TiDB Operator 部署到 Minikube：你可以使用 TiDB Opeartor 将 TiDB 集群部署到本地 Minikube 启动的 Kubernetes 集群中。该部署方式不适用于生产环境。使用 TiDB Operator 部署到 DinD：你可以使用 TiDB Operator 将 TiDB 集群部署到本地以 DinD 方式启动的 Kubernetes 集群中。该部署方式不适用于生产环境。在生产环境下部署TIDB集群1、Ansible使用 TiDB Ansible 部署 TiDB 集群 是一款自动化运维工具，TiDB Ansible 是 PingCAP 基于 Ansible playbook 功能编写的集群部署工具。注意：使用 Ansible 方式部署时，TiKV 及 PD 节点数据目录所在磁盘请使用 SSD 磁盘，否则无法通过检测。2、TIDB in kubernetesTiDB Operator 是 Kubernetes 上的 TiDB 集群自动运维系统，提供包括部署、升级、扩缩容、备份恢复、配置变更的 TiDB 全生命周期管理。借助 TiDB Operator，TiDB 可以无缝运行在公有云或私有部署的 Kubernetes 集群此外，TiDB Operator 还提供了命令行接口 tkctl 用于运维集群和诊断集群问题TiDB Operator 提供了多种方式来部署 Kubernetes 上的 TiDB 集群：生产环境：公有云：参考 AWS 部署文档，GKE 部署文档 (beta)，或阿里云部署文档在对应的公有云上一键部署生产可用的 TiDB 集群并进行后续的运维管理；现有 Kubernetes 集群：首先按照部署 TiDB Operator在集群中安装 TiDB Operator，再根据在标准 Kubernetes 集群上部署 TiDB 集群来部署你的 TiDB 集群。对于生产级 TiDB 集群，你还需要参考 TiDB 集群环境要求调整 Kubernetes 集群配置并根据本地 PV 配置为你的 Kubernetes 集群配置本地 PV，以满足 TiKV 的低延迟本地存储需求。在任何环境上部署前，都可以参考 TiDB 集群配置来自定义 TiDB 配置。参考资料：https://pingcap.com/docs-cn/
在安装tidb集群时我使用docker进行部署，当然我只是测试一下数据，当我们在生产环境下我们不要使用docker进行部署，我们应该使用Ansible进行部署，因为我的虚拟机之前安装docker，首先我们吧linux自带的docker卸掉(如果系统没有的话请忽略这步) 1.我们在命令行输入： yum remove -y docker docker-common docker-selinux docker-engine。 然后我们安装yum-utils，device-mapper-persistent，lvm2 yum install -y yum-utils device-mapper-persistent-data lvm2 添加yum源配置，系统自带的库可能没有我们所需的软件，所以我们自行添加yum源 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 接下来我们就可以开始安装docker并设置开机自行启动。 yum install docker-ce -y systemctl start docker systemctl enable docker 2.安装完之后我们还需要安装mysql，因为当我们配置好tidb集群的时候，我们需要使用mysql进行连接， 下载并安装mysql官方yum reoisitory wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm 然后直接yum进行安装 yum -y install mysql57-community-release-el7-10.noarch.rpm 然后安装mysql服务器 yum -y install mysql-community-server 可以测试一下mysql是否安装成功 mysql -version 测试一下是否可以登陆,首先我们先找到数据库密码 grep "password" /var/log/mysqld.log root@localhost：后面跟的就是密码， mysql -uroot -p 然后输入密码 进去之后必需的修改一个新的密码 ALTER USER 'root'@'localhost' IDENTIFIED BY 'new password'; 3.部署tidb集群 我们采用两个主机，一个pd，一个kv，pb这台主机主要是负责运算，而kv这台主机主要负责的是存储，pd的ip: 192.168.10.140，kv的ip:192.168.24.144 然后登陆pd主机创建并运行一个容器： docker run -d --name pd1 \ -p 2579:2579 \ //开放的端口 -p 2382:2382 \ -v /etc/localtime:/etc/localtime:ro \ //挂载目录 -v /data:/data \ pingcap/pd:latest \ --name="pd1" \ //指定容器名称 --data-dir="/data/pd1" \ //所存放数据的目录 --client-urls="http://0.0.0.0:2579" \ //客户端地址 --advertise-client-urls="http://192.168.10.140:2579" \ --peer-urls="http://0.0.0.0:2382" \ --advertise-peer-urls="http://192.168.10.140:2382" \ --initial-cluster="pd1=http://192.168.10.140:2382" 然后登陆kv，创建并运行另一个容器 docker run -d --name tikv1 \ -p 20160:20160 \ --ulimit nofile=1000000:1000000 \ -v /etc/localtime:/etc/localtime:ro \ -v /data:/data \ pingcap/tikv:latest \ --addr="0.0.0.0:20160" \ --advertise-addr="192.168.24.143:20160" \ --data-dir="/data/tikv1" \ --pd="192.168.10.140:2579" 然后我们登陆pd这台主机执行 docker run -d --name tidb \ -p 4000:4000 \ -p 10080:10080 \ -v /etc/localtime:/etc/localtime:ro \ pingcap/tidb:latest \ --store=tikv \ --path="192.168.10.140:2579,192.168.24.143:2579" 配置完之后我们就可以使用mysql进行连接了 mysql -h 192.168.10.140 -P 4000 -u root -D mysql -p 然后输入我们提前修改过的密码即可 问题：在其中可能会出现的问题，我们启动容器的时候名字输入错误，或其他因素，导致容器启动失败，这时如果要重新启动的话需要提前删除容器中的失败品，docker rm 容器id再用mysql链接tidb集群时会报错，会说连接失败，无法连接，这个问题我上网搜了一下，修改了很多地方，最后我将192.168.10.140换成localhost就可以成功的链接上了。