暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

TiDB 介绍及布署

陶老师运维笔记 2020-04-11
759

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内存本地存储实例数量(最低要求)
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.1528core,8GPD-
192.122.64.1438core,16GTiKV-
192.122.64.1448core,16GTiKV-
192.122.64.1458core,16GTiKV-

说明:

  • 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 在中控机上安装依赖包

  1. yum -y install epel-release git curl sshpass && \

  2. yum -y install python2-pip

复制

4.2 创建 tidb 用户

在中控机上创建 tidb 用户,并生成 SSH key。

  1. useradd -m -d /home/tidb tidb

  2. #设置 tidb 用户密码。

  3. echo 'tidb123' | passwd --stdin tidb

  4. #配置 tidb 用户 sudo 免密码,及sudo

  5. echo 'tidb ALL=(ALL) NOPASSWD: ALL'>>/etc/sudoers

  6. #用户切换到 tidb 用户,生成 SSH key。

  7. su - tidb

  8. 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 版本

  1. tag=v4.0.0-rc

  2. git clone -b $tag https://github.com/pingcap/tidb-ansible.git

复制

4.4 安装 TiDB Ansible

在中控机器上安装 TiDB Ansible 及其依赖。以 tidb 用户登录中控机,请务必按以下方式通过 pip 安装 TiDB Ansible 及其相关依赖的指定版本,否则会有兼容问题。

  1. #1.在中控机器上安装 TiDB Ansible 及其依赖

  2. cd /home/tidb/tidb-ansible

  3. sudo pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r ./requirements.txt #用清华源或阿里源加速


  4. # 2.查看 Ansible 的版本。

  5. ansible --version

复制

4.5 配置 SSH 互信及 sudo

在中控机上配置部署机器 SSH 互信及 sudo 规则。

  • 1.将你的部署目标机器 IP 添加到 hosts.ini 文件

  1. cd /home/tidb/tidb-ansible

  2. vi hosts.ini

  3. [servers]

  4. 192.122.64.141

  5. 192.122.64.143

  6. 192.122.64.144

  7. 192.122.64.145

  8. 192.122.65.150

  9. 192.122.65.152

  10. [all:vars]

  11. username = tidb

  12. ntp_server = pool.ntp.org

复制


  • 2.执行以下命令,按提示输入部署目标机器的 root 用户密码 部署目标机器上创建 tidb 用户,并配置 sudo 规则,配置中控机与部署目标机器之间的 SSH 互信。

  1. $ansible-playbook -i hosts.ini create_users.yml -u root -k

复制

create_users.yml:

  1. cat create_users.yml

  2. ---


  3. - hosts: all

  4. tasks:

  5. - name: create user

  6. user: name={{ username }} shell=/bin/bash createhome=yes


  7. - name: set authorized key

  8. authorized_key:

  9. user: "{{ username }}"

  10. key: "{{ lookup('file', lookup('env','HOME')+ '/.ssh/id_rsa.pub') }}"

  11. state: present


  12. - name: update sudoers file

  13. lineinfile:

  14. dest: /etc/sudoers

  15. insertafter: EOF

  16. line: '{{ username }} ALL=(ALL) NOPASSWD: ALL'

  17. regexp: '^{{ username }} .*'

  18. state: present

复制

4.6 目标机安装 NTP 服务

如果你的部署目标机器时间、时区设置一致,已开启 NTP 服务且在正常同步时间,此步骤可忽略。可参考如何检测 NTP 服务是否正常。

以 tidb 用户登录中控机,执行以下命令。在部署目标机器上使用系统自带软件源联网安装并启动 NTP 服务,服务使用安装包默认的 NTP server 列表,见配置文件 etc/ntp.conf 中 server 参数。

  1. cd /home/tidb/tidb-ansible && \

  2. 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 模式。

  1. # 用以下命令在部署目标机器上批量设置。

  2. 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. 1. 查看数据盘。

  2. fdisk -l

  3. 2. 创建分区表。

  4. parted -s -a optimal /dev/sdb mklabel gpt -- mkpart primary ext4 1 -1

  5. 3. 格式化文件系统。

  6. mkfs.ext4 /dev/sdb

  7. 4. 查看数据盘分区 UUID

  8. lsblk -f

  9. 5. 编辑 /etc/fstab 文件,添加 nodelalloc 挂载参数

  10. cat /etc/fstab

  11. UUID=c51eb23b-195c-4061-92a9-3fad812cc12f /data1 ext4 defaults,nodelalloc,noatime 0 2

  12. 6. 挂载数据盘。

  13. mkdir /data1

  14. umout /dev/sdb && mount -a # 根据实际情况修改/dev/sdb

  15. 7. 检查挂载情况

  16. 如果文件系统为 ext4,并且挂载参数中包含 nodelalloc,则表示已生效

  17. mount -t ext4

  18. /dev/sdb on /data1 type ext4 (rw,noatime,nodelalloc,data=ordered)

复制

4.9 编辑 inventory.ini

以 tidb 用户登录中控机,编辑 home/tidb/tidb-ansible/inventory.ini 文件为 TiDB 集群分配机器资源。

  1. cat inventory.ini |grep -v '#' |grep -v '^$'

  2. [tidb_servers]

  3. 192.122.64.141

  4. 192.122.65.150

  5. [tikv_servers]

  6. 192.122.64.143

  7. 192.122.64.144

  8. 192.122.64.145

  9. [pd_servers]

  10. 192.122.64.141

  11. 192.122.65.150

  12. 192.122.65.152

  13. [spark_master]

  14. [spark_slaves]

  15. [lightning_server]

  16. [importer_server]

  17. [monitoring_servers]

  18. 192.122.64.141

  19. [grafana_servers]

  20. 192.122.64.141

  21. [monitored_servers]

  22. 192.122.64.141

  23. 192.122.65.150

  24. 192.122.65.152

  25. 192.122.64.143

  26. 192.122.64.144

  27. 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

  1. ## Global variables

  2. [all:vars]

  3. deploy_dir = /data1/tidb/deploy


  4. ## Connection

  5. # ssh via normal user

  6. ansible_user = tidb

复制

4.11 部署 TiDB 集群

使用 tidb 用户作为服务运行用户:确认inventory.ini中 ansibleuser = tidb。ansibleuser 不要设置成 root 用户,tidb-ansible 限制了服务以普通用户运行。

1.检查SSH 互信

  1. cat inventory.ini | grep ansible_user

  2. ansible -i inventory.ini all -m shell -a 'whoami'

  3. ansible -i inventory.ini all -m shell -a 'whoami' -b

复制

 

2.执行 local_prepare.yml playbook

  1. ansible-playbook local_prepare.yml

复制

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

  1. ansible-playbook bootstrap.yml

复制


4.部署 TiDB 集群软件。

  1. --查看tidb配置要求。可以手动修改

  2. cat ./roles/check_system_optional/defaults/main.yml

  3. -- 部署Tidb

  4. ansible-playbook deploy.yml

复制


5.启动 TiDB 集群

  1. 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。

  1. #安装MySQL Client, 本次安装的mariadb可略

  2. yum install mariadb

  3. #登录

  4. mysql -u root -h 192.122.64.141 -P 4000

  5. MySQL [(none)]> show grants;

  6. +-------------------------------------------------------------+

  7. | Grants for User |

  8. +-------------------------------------------------------------+

  9. | GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION |

  10. +-------------------------------------------------------------+


  11. MySQL [(none)]> use test

  12. Database changed


  13. MySQL [test]> CREATE TABLE person (

  14. number INT(11),

  15. name VARCHAR(255),

  16. birthday DATE

  17. );


  18. MySQL [test]> SHOW TABLES FROM test;

  19. +----------------+

  20. | Tables_in_test |

  21. +----------------+

  22. | person |

  23. +----------------+

  24. 1 row in set (0.00 sec)


  25. MySQL [test]> desc person;

  26. +----------+--------------+------+------+---------+-------+

  27. | Field | Type | Null | Key | Default | Extra |

  28. +----------+--------------+------+------+---------+-------+

  29. | number | int(11) | YES | | NULL | |

  30. | name | varchar(255) | YES | | NULL | |

  31. | birthday | date | YES | | NULL | |

  32. +----------+--------------+------+------+---------+-------+

  33. 3 rows in set (0.00 sec)


  34. MySQL [test]> ALTER TABLE person ADD INDEX person_num (number);

  35. Query OK, 0 rows affected (3.03 sec)


  36. MySQL [test]> SHOW INDEX from person;

  37. +--------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+

  38. | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |

  39. +--------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+

  40. | person | 1 | person_num | 1 | number | A | 0 | NULL | NULL | YES | BTREE | | | YES | NULL |

  41. +--------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+

  42. 1 row in set (0.00 sec)



  43. MySQL [test]> INSERT INTO person VALUES("1","tom","20170912");


  44. -- 创建、授权和删除用户

  45. CREATE USER 'tiuser'@'10.%' IDENTIFIED BY '123456';

  46. 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 步骤时,提示机器内存不足。可以修改系统中模板配置解决。

  1. ansible-playbook bootstrap.yml

  2. 失败信息如下:

  3. : Ansible Failed! ==>

  4. changed=false

  5. msg: This machine does not have sufficient RAM to run TiDB, at least 16000 MB.

复制

问题解决:

修改checksystemoptional/defaults/main.yml模板配置。

  1. $cd tidb-ansible/roles/check_system_optional/defaults

  2. $vim main.yml #将tidb_min_ram值改成小于16000 MB

复制

7.1 操作系统版本低

问题现象:

CentOS7.2安装tidb时 出错epollexclusive is not available。原因是操作系统版本问题,不支持EPOLLEXCLUSIVE,可如下升级CentOS版本。

问题解决:


升级操作系统,升级步骤如下:

  1. 一、检查系统版本

  2. $ cat /etc/redhat-release

  3. CentOS Linux release 7.1.1503 (Core)


  4. 二、备份重要数据(例如/etc, /var,/opt)。


  5. 如果centos是安装在虚拟机上,那么可以使用快照进行备份。像VMware虚拟机可以快照备份,当然更奢侈一点是备份整个虚拟机。也可以针对重要程序数据进行备份,例如MySQL, Appache, Nginx, DNS等等。


  6. 三、运行yum命令升级

  7. $ sudo yum clean all

  8. $ sudo yum update


  9. 四、重启系统

  10. $ sudo reboot


  11. 五、查看现在系统版本

  12. $ cat /etc/redhat-release

  13. 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


文章转载自陶老师运维笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论