TiDB 介绍及布署
Github https://github.com/pingcap/tidb
官网文档 https://pingcap.com/docs-cn/stable/
1. TiDB介绍
1.1 简介
TiDB 是 PingCAP 公司设计的开源分布式 HTAP (Hybrid Transactional and Analytical Processing) 数据库,结合了传统的 RDBMS 和 NoSQL 的特性。TiDB 兼容 MySQL,支持无限的水平扩展,具备强一致性和高可用性。 TiDB 的目标是为 OLTP (Online Transactional Processing) 和 OLAP (Online Analytical Processing) 场景提供一站式的解决方案。
1.2 特性
高度兼容 MySQL : TiDB 支持 MySQL 绝大多数语法。兼容性对比
水平弹性扩展 : 简单地增加新节点即可实现 TiDB 的水平扩展。
分布式事务: TiDB 100% 支持标准的 ACID 事务。
金融级高可用: 基于 Raft 的多数派选举协议提供数据强一致性。
一站式 HTAP 解决方案:同时支持OLTP +OLAP,配合 TiSpark,可提供一站式 HTAP解决方案。
云原生 SQL 数据库 : TiDB 支持公有云、私有云和混合云布署。
2. TiDB架构
https://pingcap.com/docs-cn/stable/architecture/
2.1 架构
TiDB 集群主要包括三个核心组件:TiDB Server,PD Server 和 TiKV Server。 此外,还有用于解决用户复杂 OLAP 需求的 TiSpark 组件和简化云上部署管理的 TiDB Operator 组件。
TiDB Server:
TiDB Server 负责接收 SQL 请求,处理 SQL 相关的逻辑,并通过 PD 找到存储计算所需数据的 TiKV 地址,与 TiKV 交互获取数据,最终返回结果。TiDB Server 是无状态的,其本身并不存储数据,只负责计算,可以无限水平扩展,可以通过负载均衡组件(如LVS、HAProxy 或 F5)对外提供统一的接入地址。
PD Server:
Placement Driver (简称 PD) 是整个集群的管理模块,其主要工作有三个:一是存储集群的元信息(某个 Key 存储在哪个 TiKV 节点);二是对 TiKV 集群进行调度和负载均衡(如数据的迁移、Raft group leader 的迁移等);三是分配全局唯一且递增的事务 ID。
PD 通过 Raft 协议保证数据的安全性。Raft 的 leader server 负责处理所有操作,其余的 PD server 仅用于保证高可用。建议部署奇数个 PD 节点。
TiKV Server:
TiKV Server 负责存储数据,从外部看 TiKV 是一个分布式的提供事务的 Key-Value 存储引擎。存储数据的基本单位是 Region,每个 Region 负责存储一个 Key Range的数据,每个 TiKV 节点会负责多个 Region。TiKV 使用 Raft 协议做复制,保持数据的一致性和容灾。不同节点上的多个 Region 构成一个 Raft Group,互为副本。数据在多个 TiKV 之间的负载均衡由 PD 调度,这里也是以 Region 为单位进行调度。
TiSpark:
TiSpark 作为 TiDB 中解决用户复杂 OLAP 需求的主要组件,将 Spark SQL 直接运行在 TiDB 存储层上。故TiDB 可以通过一套系统,同时支持 OLTP 与 OLAP,免除用户数据同步的烦恼。
TiDB Operator:
TiDB Operator 提供在主流云基础设施(Kubernetes)上部署管理 TiDB 集群的能力。它结合云原生社区的容器编排最佳实践与 TiDB 的专业运维知识,集成一键部署、多集群混部、自动运维、故障自愈等能力,极大地降低了用户使用和管理 TiDB 的门槛与成本。
2.2 原理篇
三篇文章了解 TiDB 技术内幕:
说存储 https://pingcap.com/blog-cn/tidb-internal-1/
说计算 https://pingcap.com/blog-cn/tidb-internal-2/
谈调度 https://pingcap.com/blog-cn/tidb-internal-3/
3. 环境规划
配置建议 https://pingcap.com/docs-cn/stable/how-to/deploy/hardware-recommendations/
部署目标机器若干:
建议 4 台及以上,TiKV 至少 3 实例,线上 TiDB、PD 模块不位于同一主机。
建议使用CentOS 7.3 及以上版本 Linux 操作系统。
机器之间内网互通。
部署中控机一台:
中控机可以是部署目标机器中的某一台。
推荐安装 CentOS 7.3 及以上版本 Linux 操作系统。
该机器需开放外网访问,用于下载 TiDB 及相关软件安装包。
服务器建议配置:
组件 | CPU | 内存 | 本地存储 | 实例数量(最低要求) |
---|---|---|---|---|
TiDB | 8核+ | 16 GB+ | 无特殊要求 | 1(可与 PD 同机器) |
PD | 4核+ | 8 GB+ | SAS, 200 GB+ | 1(可与 TiDB 同机器) |
TiKV | 8核+ | 32 GB+ | SSD, 200 GB+ | 3 |
布署规划:
IP | 机器 | 角色 | 备注 |
---|---|---|---|
192.122.64.141 | 8core,8G | 中控机,TiDB,PD | - |
192.122.65.150 | 8core,8G | TiDB,PD | - |
192.122.65.152 | 8core,8G | PD | - |
192.122.64.143 | 8core,16G | TiKV | - |
192.122.64.144 | 8core,16G | TiKV | - |
192.122.64.145 | 8core,16G | TiKV | - |
说明:
Tidb机器配置,系统环境请依官方建议,否则易遇到问题。
4. Tidb布署
Ansible布署 https://pingcap.com/docs-cn/stable/how-to/deploy/orchestrated/ansible/
Docker布署 https://pingcap.com/docs-cn/stable/how-to/deploy/orchestrated/docker/
可以使用Ansible也可使用Docker布署TiDB测试环境,本文使用Ansible布署TiDB。
4.1 在中控机上安装依赖包
yum -y install epel-release git curl sshpass && \
yum -y install python2-pip
复制
4.2 创建 tidb 用户
在中控机上创建 tidb 用户,并生成 SSH key。
useradd -m -d /home/tidb tidb
#设置 tidb 用户密码。
echo 'tidb123' | passwd --stdin tidb
#配置 tidb 用户 sudo 免密码,及sudo
echo 'tidb ALL=(ALL) NOPASSWD: ALL'>>/etc/sudoers
#用户切换到 tidb 用户,生成 SSH key。
su - tidb
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
复制
4.3 中控机下载 TiDB Ansible
中控机器上下载 TiDB Ansible。以 tidb
用户登录中控机并进入 /home/tidb
目录。使用以下命令从 TiDB Ansible 项目上下载 TiDB Ansible 4.0 相应 TAG 版本
tag=v4.0.0-rc
git clone -b $tag https://github.com/pingcap/tidb-ansible.git
复制
4.4 安装 TiDB Ansible
在中控机器上安装 TiDB Ansible 及其依赖。以 tidb 用户登录中控机,请务必按以下方式通过 pip 安装 TiDB Ansible 及其相关依赖的指定版本,否则会有兼容问题。
#1.在中控机器上安装 TiDB Ansible 及其依赖
cd /home/tidb/tidb-ansible
sudo pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r ./requirements.txt #用清华源或阿里源加速
# 2.查看 Ansible 的版本。
ansible --version
复制
4.5 配置 SSH 互信及 sudo
在中控机上配置部署机器 SSH 互信及 sudo 规则。
1.将你的部署目标机器 IP 添加到 hosts.ini 文件
cd /home/tidb/tidb-ansible
vi hosts.ini
[servers]
192.122.64.141
192.122.64.143
192.122.64.144
192.122.64.145
192.122.65.150
192.122.65.152
[all:vars]
username = tidb
ntp_server = pool.ntp.org
复制
2.执行以下命令,按提示输入部署目标机器的 root 用户密码 部署目标机器上创建 tidb 用户,并配置 sudo 规则,配置中控机与部署目标机器之间的 SSH 互信。
$ansible-playbook -i hosts.ini create_users.yml -u root -k
复制
create_users.yml:
cat create_users.yml
---
- hosts: all
tasks:
- name: create user
user: name={{ username }} shell=/bin/bash createhome=yes
- name: set authorized key
authorized_key:
user: "{{ username }}"
key: "{{ lookup('file', lookup('env','HOME')+ '/.ssh/id_rsa.pub') }}"
state: present
- name: update sudoers file
lineinfile:
dest: /etc/sudoers
insertafter: EOF
line: '{{ username }} ALL=(ALL) NOPASSWD: ALL'
regexp: '^{{ username }} .*'
state: present
复制
4.6 目标机安装 NTP 服务
如果你的部署目标机器时间、时区设置一致,已开启 NTP 服务且在正常同步时间,此步骤可忽略。可参考如何检测 NTP 服务是否正常。
以 tidb 用户登录中控机,执行以下命令。在部署目标机器上使用系统自带软件源联网安装并启动 NTP 服务,服务使用安装包默认的 NTP server 列表,见配置文件 etc/ntp.conf 中 server 参数。
cd /home/tidb/tidb-ansible && \
ansible-playbook -i hosts.ini deploy_ntp.yml -u tidb -b
复制
为了让 NTP 尽快开始同步,启动 NTP 服务前,系统会执行 ntpdate 命令,与用户在 hosts.ini 文件中指定的 ntp_server 同步日期与时间。默认的服务器为 pool.ntp.org,也可替换为你的 NTP server。
4.7 目标机配置 CPUfreq
为了让 CPU 发挥最大性能,请将 CPUfreq 调节器模式设置为 performance 模式。
# 用以下命令在部署目标机器上批量设置。
ansible -i hosts.ini all -m shell -a "cpupower frequency-set --governor performance" -u tidb -b
复制
4.8 数据盘修改挂载参数
在部署目标机器上添加数据盘 ext4 文件系统挂载参数。使用 root 用户登录目标机器,将部署目标机器数据盘格式化成 ext4 文件系统,挂载时添加 nodelalloc 和 noatime 挂载参数。nodelalloc 是必选参数,否则 Ansible 安装时检测无法通过;noatime 是可选建议参数。
说明:若数据盘已ext4,只需要从step5开始,修改下mount参数,重新挂载。
1. 查看数据盘。
fdisk -l
2. 创建分区表。
parted -s -a optimal /dev/sdb mklabel gpt -- mkpart primary ext4 1 -1
3. 格式化文件系统。
mkfs.ext4 /dev/sdb
4. 查看数据盘分区 UUID。
lsblk -f
5. 编辑 /etc/fstab 文件,添加 nodelalloc 挂载参数
cat /etc/fstab
UUID=c51eb23b-195c-4061-92a9-3fad812cc12f /data1 ext4 defaults,nodelalloc,noatime 0 2
6. 挂载数据盘。
mkdir /data1
umout /dev/sdb && mount -a # 根据实际情况修改/dev/sdb
7. 检查挂载情况
如果文件系统为 ext4,并且挂载参数中包含 nodelalloc,则表示已生效
mount -t ext4
/dev/sdb on /data1 type ext4 (rw,noatime,nodelalloc,data=ordered)
复制
4.9 编辑 inventory.ini
以 tidb 用户登录中控机,编辑 home/tidb/tidb-ansible/inventory.ini 文件为 TiDB 集群分配机器资源。
cat inventory.ini |grep -v '#' |grep -v '^$'
[tidb_servers]
192.122.64.141
192.122.65.150
[tikv_servers]
192.122.64.143
192.122.64.144
192.122.64.145
[pd_servers]
192.122.64.141
192.122.65.150
192.122.65.152
[spark_master]
[spark_slaves]
[lightning_server]
[importer_server]
[monitoring_servers]
192.122.64.141
[grafana_servers]
192.122.64.141
[monitored_servers]
192.122.64.141
192.122.65.150
192.122.65.152
192.122.64.143
192.122.64.144
192.122.64.145
复制
4.10 inventory.ini 变量说明
https://pingcap.com/docs-cn/stable/how-to/deploy/orchestrated/ansible/
默认全局变量已设置为 home/tidb/deploy,可改为 data1/tidb/deploy
## Global variables
[all:vars]
deploy_dir = /data1/tidb/deploy
## Connection
# ssh via normal user
ansible_user = tidb
复制
4.11 部署 TiDB 集群
使用 tidb 用户作为服务运行用户:确认inventory.ini中 ansibleuser = tidb。ansibleuser 不要设置成 root 用户,tidb-ansible 限制了服务以普通用户运行。
1.检查SSH 互信
cat inventory.ini | grep ansible_user
ansible -i inventory.ini all -m shell -a 'whoami'
ansible -i inventory.ini all -m shell -a 'whoami' -b
复制
2.执行 local_prepare.yml playbook
ansible-playbook local_prepare.yml
复制
3.初始化系统环境,修改内核参数
ansible-playbook bootstrap.yml
复制
4.部署 TiDB 集群软件。
--查看tidb配置要求。可以手动修改
cat ./roles/check_system_optional/defaults/main.yml
-- 部署Tidb
ansible-playbook deploy.yml
复制
5.启动 TiDB 集群
ansible-playbook start.yml
复制
说明:
机器配置及安装步骤尽量依官方,以免遇到问题。
5. 测试TiDB
基本 SQL 操作 https://pingcap.com/docs-cn/stable/how-to/get-started/explore-sql/
兼容性对比 https://pingcap.com/docs-cn/stable/reference/mysql-compatibility/
5.1 测试TiDB
TiDB 兼容 MySQL,因此可使用 MySQL 客户端直接连接 TiDB。TiDB 服务的默认端口为 4000。
#安装MySQL Client, 本次安装的mariadb可略
yum install mariadb
#登录
mysql -u root -h 192.122.64.141 -P 4000
MySQL [(none)]> show grants;
+-------------------------------------------------------------+
| Grants for User |
+-------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION |
+-------------------------------------------------------------+
MySQL [(none)]> use test
Database changed
MySQL [test]> CREATE TABLE person (
number INT(11),
name VARCHAR(255),
birthday DATE
);
MySQL [test]> SHOW TABLES FROM test;
+----------------+
| Tables_in_test |
+----------------+
| person |
+----------------+
1 row in set (0.00 sec)
MySQL [test]> desc person;
+----------+--------------+------+------+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+------+---------+-------+
| number | int(11) | YES | | NULL | |
| name | varchar(255) | YES | | NULL | |
| birthday | date | YES | | NULL | |
+----------+--------------+------+------+---------+-------+
3 rows in set (0.00 sec)
MySQL [test]> ALTER TABLE person ADD INDEX person_num (number);
Query OK, 0 rows affected (3.03 sec)
MySQL [test]> SHOW INDEX from person;
+--------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+--------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| person | 1 | person_num | 1 | number | A | 0 | NULL | NULL | YES | BTREE | | | YES | NULL |
+--------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
1 row in set (0.00 sec)
MySQL [test]> INSERT INTO person VALUES("1","tom","20170912");
-- 创建、授权和删除用户
CREATE USER 'tiuser'@'10.%' IDENTIFIED BY '123456';
GRANT SELECT ON test.* TO 'tiuser'@'localhost';
复制
6. TiDB监控
TiDB 集群监控 https://pingcap.com/docs-cn/stable/how-to/monitor/monitor-a-cluster/
通过浏览器可访问监控平台。地址:http://192.122.64.141:3000 默认帐号与密码:admin;admin
7. 安装问题
安装Tidb遇到机器配置较低,及操作系统版本低的问题。解决方法如下。
7.1 内存不足
问题现象:
ansible-playbook bootstrap.yml 步骤时,提示机器内存不足。可以修改系统中模板配置解决。
ansible-playbook bootstrap.yml
失败信息如下:
: Ansible Failed! ==>
changed=false
msg: This machine does not have sufficient RAM to run TiDB, at least 16000 MB.
复制
问题解决:
修改checksystemoptional/defaults/main.yml模板配置。
$cd tidb-ansible/roles/check_system_optional/defaults
$vim main.yml #将tidb_min_ram值改成小于16000 MB
复制
7.1 操作系统版本低
问题现象:
CentOS7.2安装tidb时 出错epollexclusive is not available。原因是操作系统版本问题,不支持EPOLLEXCLUSIVE,可如下升级CentOS版本。
问题解决:
升级操作系统,升级步骤如下:
一、检查系统版本
$ cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)
二、备份重要数据(例如/etc, /var,/opt)。
如果centos是安装在虚拟机上,那么可以使用快照进行备份。像VMware虚拟机可以快照备份,当然更奢侈一点是备份整个虚拟机。也可以针对重要程序数据进行备份,例如MySQL, Appache, Nginx, DNS等等。
三、运行yum命令升级
$ sudo yum clean all
$ sudo yum update
四、重启系统
$ sudo reboot
五、查看现在系统版本
$ cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
复制
参考:
https://pingcap.com/docs-cn/stable/
https://pingcap.com/docs-cn/stable/architecture/
https://pingcap.com/docs-cn/stable/reference/mysql-compatibility/
https://blog.csdn.net/D_Guco/article/details/80641236
https://blog.csdn.net/zhongyi_yang/article/details/84899518
https://asktug.com/t/topic/1921/3
https://www.jianshu.com/p/21dc274fe5ad