TiDB 初体验

Easter79
• 阅读 600

其实从2017年就打算测试下TiDB了,因为工作安排的关系,这个事情在年后才开始计划来做。

而根据时间线来看,2015年的那个时候,我正和老杨张罗DBAplus的事情,而东旭已经在构思TiDB的雏形了,几年过去了,TiDB已经很火热,发展势头很不错,难得有这样一批热爱技术的人通过自己的行动来助力开源社区。

其实一直以来,我感觉国内的很多开源产品,开源项目发展大多都很尴尬。一来大家迫切需要一个开源的好产品,但是在支持的力度上却差强人意,因为各种各样的原因,很多开源项目维护一段时间就放弃了,而有些则是在原来的基础上开一个分支继续定制改进。做开源这个事情,要落地一个开源产品,复杂度真是超出想象。

所以说这一点上PingCAP的模式还是很难效仿的,开发团队的规模增长很快,同时开发版本迭代也很快,单打独斗肯定是跟不上这个节奏的。

关于TiDB的一些设计思想,强烈推荐大家看看东旭分享的内容,对于理解TiDB还是大有帮助的。

报道|TiDB 架构的演进和开发哲学

TiDB的架构图如下:

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 初体验

部署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 status\G

ERROR 1105 (HY000): line 1 column 11 near " status" (total length 18)

MySQL [test]> show slave status\G

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                    |

本文分享自微信公众号 - 杨建荣的学习笔记(jianrong-notes)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k