TiDB 介绍及布署

3,731 阅读7分钟

TiDB 介绍及布署

文章来源: 陶老师运维笔记- 微信公众号

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架构

2.1 架构

TiDB 集群主要包括三个核心组件:TiDB Server,PD Server 和 TiKV Server。 此外,还有用于解决用户复杂 OLAP 需求的 TiSpark 组件和简化云上部署管理的 TiDB Operator 组件。

tidb-architecture

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 技术内幕:

3. 环境规划

部署目标机器若干:

  • 建议 4 台及以上,TiKV 至少 3 实例,线上 TiDB、PD 模块不位于同一主机。
  • 建议使用CentOS 7.3 及以上版本 Linux 操作系统。
  • 机器之间内网互通。

部署中控机一台:

  • 中控机可以是部署目标机器中的某一台。
  • 推荐安装 CentOS 7.3 及以上版本 Linux 操作系统。
  • 该机器需开放外网访问,用于下载 TiDB 及相关软件安装包。

服务器建议配置:

组件CPU内存本地存储实例数量(最低要求)
TiDB8核+16 GB+无特殊要求1(可与 PD 同机器)
PD4核+8 GB+SAS, 200 GB+1(可与 TiDB 同机器)
TiKV8核+32 GB+SSD, 200 GB+3

布署规划:

IP机器角色备注
192.122.64.1418core,8G中控机,TiDB,PD-
192.122.65.1508core,8GTiDB,PD-
192.122.65.1529core,8GPD-
192.122.64.1438core,16GTiKV-
192.122.64.1448core,16GTiKV-
192.122.64.1458core,16GTiKV-

说明:

  • Tidb机器配置,系统环境请依官方建议,否则易遇到问题。

4. Tidb布署

可以使用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
    1. 执行以下命令,按提示输入部署目标机器的 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 变量说明

默认全局变量已设置为 /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中 ansible_user = tidb。ansible_user 不要设置成 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
  1. 执行 local_prepare.yml playbook
ansible-playbook local_prepare.yml

3.初始化系统环境,修改内核参数

ansible-playbook bootstrap.yml
  1. 部署 TiDB 集群软件。
--查看tidb配置要求。可以手动修改
cat  ./roles/check_system_optional/defaults/main.yml  
-- 部署Tidb
ansible-playbook deploy.yml
  1. 启动 TiDB 集群
ansible-playbook start.yml

说明:

  • 机器配置及安装步骤尽量依官方,以免遇到问题。

5. 测试TiDB

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监控

通过浏览器可访问监控平台。地址: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.

解决: 修改check_system_optional/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)

参考:


陶老师运维笔记