数科院博客园 - TiDB
type: channel
link: https://blog.icsc.vip/index.php/tag/TiDB/
items: 基于云原生技术的分布式newsql数据库 ——TIDB
items: 使用docker部署tidb集群

基于云原生技术的分布式newsql数据库 ——TIDB
type: item
date: 2019-10-28T12:22:00+00:00
description: 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 …

使用docker部署tidb集群
type: item
date: 2019-09-04T06:26:00+00:00
description: 在安装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/local…