TiDB 初体验
其实从2017年就打算测试下TiDB了,因为工作安排的关系,这个事情在年后才开始计划来做。
而根据时间线来看,2015年的那个时候,我正和老杨张罗DBAplus的事情,而东旭已经在构思TiDB的雏形了,几年过去了,TiDB已经很火热,发展势头很不错,难得有这样一批热爱技术的人通过自己的行动来助力开源社区。
其实一直以来,我感觉国内的很多开源产品,开源项目发展大多都很尴尬。一来大家迫切需要一个开源的好产品,但是在支持的力度上却差强人意,因为各种各样的原因,很多开源项目维护一段时间就放弃了,而有些则是在原来的基础上开一个分支继续定制改进。做开源这个事情,要落地一个开源产品,复杂度真是超出想象。
所以说这一点上PingCAP的模式还是很难效仿的,开发团队的规模增长很快,同时开发版本迭代也很快,单打独斗肯定是跟不上这个节奏的。
关于TiDB的一些设计思想,强烈推荐大家看看东旭分享的内容,对于理解TiDB还是大有帮助的。
报道|TiDB 架构的演进和开发哲学:http://mp.weixin.qq.com/s?__biz=MzI3NDIxNTQyOQ==&mid=2247484474&idx=1&sn=0d9a5ab3beb2783cfca3d3b22a567dfc&chksm=eb162350dc61aa46dfc8156b5b92d404d0785b5dff60bd1e6bca42a60109cf1dc30857f1e811&scene=21
TiDB的架构图如下:
所以一套集群是又这样的3类角色共同组建而成。每个部分的解释如下:
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 是一个集群,需要部署奇数个节点,一般线上推荐至少部署 3 个节点。
TiKV Server
TiKV Server 负责存储数据,从外部看 TiKV 是一个分布式的提供事务的 Key-Value 存储引擎。存储数据的基本单位是 Region,每个 Region 负责存储一个 Key Range (从 StartKey 到 EndKey 的左闭右开区间)的数据,每个 TiKV 节点会负责多个 Region 。TiKV 使用 Raft 协议做复制,保持数据的一致性和容灾。副本以 Region 为单位进行管理,不同节点上的多个 Region 构成一个 Raft Group,互为副本。数据在多个 TiKV 之间的负载均衡由 PD 调度,这里也是以 Region 为单位进行调度。
当然做这件事情,我是认真的,而不是简单试一下就完事了。我列了一个基本的计划,来看看是否能够满足一些痛点,改进一些情况。
部署TiDB就是摆在我们面前的第一节课,其实有很多的部署方式,限于环境,我先开始琢磨单机版如何部署。
在Centos 6的版本中如果要部署,这个难度还是比较大的,而且会有很多未知的坑,根据官方的建议,是需要在Centos 7以上的版本中,否则glibc的版本问题会很快碰到。
我们安装一套Centos7,采用快速的单机部署的方式来尝鲜。
得到二进制的包,大概是100多M.
[root@localhost ~]# wget http://download.pingcap.org/tidb-latest-linux-amd64.tar.gz
[root@localhost tidb]# wget http://download.pingcap.org/tidb-latest-linux-amd64.sha256
做信息匹配,查看文件的校验是否正确。
sha256sum -c tidb-latest-linux-amd64.sha256
解压文件。
tar -xzf tidb-latest-linux-amd64.tar.gz
[root@localhost tidb]# cd tidb-latest-linux-amd64
启动PD
[root@localhost tidb-latest-linux-amd64]# ./bin/pd-server --data-dir=pd --log-file=pd.log &
关键的步骤来了,启动tikv,绝大多数的部署都是在这个步骤失败。
[root@localhost tidb-latest-linux-amd64]# ./bin/tikv-server --pd="127.0.0.1:2379" --data-dir=tikv --log-file=tikv.log &
启动tidb-server
[root@localhost tidb-latest-linux-amd64]# ./bin/tidb-server --store=tikv --path="127.0.0.1:2379" --log-file=tidb.log &
使用mysql的方式来登录:
[root@localhost tidb-latest-linux-amd64]# mysql -h 127.0.0.1 -P 4000 -u root -D test
Welcome to the MariaDB monitor. Commands end with ; or g.
Your MySQL connection id is 1
Server version: 5.7.1-TiDB-v2.0.0-rc.1-6-ge38f406 MySQL Community Server (Apache License 2.0)
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
开始体验一把
MySQL [test]> s
--------------
mysql Ver 15.1 Distrib 5.5.56-MariaDB, for Linux (x86_64) using readline 5.1
Connection id: 2
Current database: test
Current user: root@127.0.0.1
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server: MySQL
Server version: 5.7.1-TiDB-v2.0.0-rc.1-6-ge38f406 MySQL Community Server (Apache License 2.0)
Protocol version: 10
Connection: 127.0.0.1 via TCP/IP
Server characterset: latin1
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
TCP port: 4000
--------------
查看对应的数据库列表。
MySQL [test]> show databases;
+--------------------+
| Database |
+--------------------+
| INFORMATION_SCHEMA |
| PERFORMANCE_SCHEMA |
| mysql |
| test |
+--------------------+
4 rows in set (0.00 sec)
MySQL [test]> select tidb_version();
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tidb_version() |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Release Version: v2.0.0-rc.1-6-ge38f406
Git Commit Hash: e38f4067569152dd0acb233b4a8e0cc05644dee1
Git Branch: master
UTC Build Time: 2018-03-11 08:28:59
GoVersion: go version go1.10 linux/amd64
TiKV Min Version: 1.1.0-dev.2 |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.04 sec)
MySQL [test]> select version();
+-----------------------------------+
| version() |
+-----------------------------------+
| 5.7.1-TiDB-v2.0.0-rc.1-6-ge38f406 |
+-----------------------------------+
1 row in set (0.00 sec)
MySQL [test]> select user,host from mysql.user;
+------+------+
| user | host |
+------+------+
| root | % |
+------+------+
1 row in set (0.00 sec)
MySQL [test]> show master statusG
ERROR 1105 (HY000): line 1 column 11 near " status" (total length 18)
MySQL [test]> show slave statusG
ERROR 1105 (HY000): line 1 column 10 near " status" (total length 17)
MySQL [test]>
MySQL [test]> show binary logs;
ERROR 1105 (HY000): line 1 column 11 near " logs" (total length 16)
MySQL [test]> show variables like '%innodb%';
+------------------------------------------+------------------------+
| Variable_name | Value |
+------------------------------------------+------------------------+
| innodb_locks_unsafe_for_binlog | OFF |
| innodb_api_enable_mdl | OFF |
| innodb_use_native_aio | OFF |
- silverlight 相册雏型
- Mysql优化系列(1)--Innodb引擎下mysql自身配置优化
- 一台服务器多实例mysql做主从复制
- spring AOP日志管理
- vue-route+webpack部署单页路由项目,访问刷新出现404问题
- UNIX 高手的 10 个习惯
- linux下截取给定路径中的目录部分
- 一年坎坷也曾怀疑自己,如今五冠在手的柯洁将再战AI
- 从MapX到MapXtreme2004[3]-搜索图元Feature
- git push上传代码到gitlab上,报错401/403(或需要输入用户名和密码)
- mysql下mysqladmin日常管理命令总结
- Ubuntu下SVN安装和配置
- mysql表名忽略大小写问题记录
- 当wcf遇到JSON ?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- AI树莓派——构建树莓派大脑(NCNN环境搭建)
- PC人脸识别登录,出乎意料的简单
- TensorLayer学习之简介与安装
- JVM系列之:String.intern的性能
- 神经网络架构搜索——可微分搜索(DARTS)
- 神经网络架构搜索——可微分搜索(P-DARTS)
- 神经网络架构搜索——可微分搜索(PC-DARTS)
- 反编译小程序记录
- 使用Selenium WebDriver,Python和Chrome编写您的第一个Web测试
- 神经网络架构搜索——可微分搜索(SGAS)
- 神经网络架构搜索——可微分搜索(Fair-DARTS)
- 一帧图像的Android之旅 :应用的首个绘制请求
- Mac免密码登录linux服务器
- 目标检测算法YOLO-V2详解
- 神经网络架构搜索——可微分搜索(Noisy DARTS)