分布式数据库TiDB的部署
转自:https://my.oschina.net/Kenyon/blog/908370
一、环境
CentOS Linux release 7.3.1611 (Core)
172.26.11.91 pd & tidb
172.26.11.92 tikv
172.26.11.93 tikv
172.26.11.94 tikv
二、安装
分别在4台服务器上上传安装包
wget http://download.pingcap.org/tidb-latest-linux-amd64.tar.gz
tar -xzf tidb-latest-linux-amd64.tar.gz
cd tidb-latest-linux-amd64
mkdir -p /data/tidb/log
ln -s /root/software/tidb/tidb-latest-linux-amd64/bin/pd-tso-bench /usr/bin
ln -s /root/software/tidb/tidb-latest-linux-amd64/bin/tikv-server /usr/bin/
ln -s /root/software/tidb/tidb-latest-linux-amd64/bin/tidb-server /usr/bin/
ln -s /root/software/tidb/tidb-latest-linux-amd64/bin/pd-server /usr/bin/
ln -s /root/software/tidb/tidb-latest-linux-amd64/bin/pd-ctl /usr/bin/
三、配置使用
1.按照顺序启动
在91上启动pd服务
pd-server --name=pd1 --多个pd以不同名字命名
--data-dir=/data/tidb/pd --pd路径
--client-urls="http://172.26.11.91:2379"
--peer-urls="http://172.26.11.91:2380"
--initial-cluster="pd1=http://172.26.11.91:2380" --多个pd以逗号分隔
--log-file=/data/tidb/log/pd.log &
在92,93,94上启动tikv
tikv-server --pd="172.26.11.91:2379" \
--addr="172.26.11.92:20160" \
--data-dir=/data/tidb/tikv \
--log-file=/data/tidb/log/tikv.log
tikv-server --pd="172.26.11.91:2379" \
--addr="172.26.11.93:20160" \
--data-dir=/data/tidb/tikv \
--log-file=/data/tidb/log/tikv.log
tikv-server --pd="172.26.11.91:2379" \
--addr="172.26.11.94:20160" \
--data-dir=/data/tidb/tikv \
--log-file=/data/tidb/log/tikv.log &
在91上启动tipd服务
tidb-server --store=tikv \ --tikv引擎允许分布式存储,其他如LevelDB等是本地存储
--path="172.26.11.91:2379" \
--log-file=/data/tidb/log/tidb.log &
2.登陆使用
[root@test05 ~]# mysql -h 172.26.11.91 -P 4000 -u root -D test
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.7.1-TiDB-1.0 MySQL Community Server (GPL)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> create database db_kenyon;
Query OK, 0 rows affected (2.02 sec)
mysql> use db_kenyon;
Database changed
mysql> create table tbl_kenyon(user_code varchar(64) primary key,user_name varchar(32),ctime timestamp);
Query OK, 0 rows affected (2.03 sec)
mysql> insert into tbl_kenyon values('01','qiaofeng',now()),('02','murong',now());
Query OK, 2 rows affected (0.01 sec)
mysql>
三、高可用
tidb的数据都是保存在tikv节点上面,比如上面配置了3套tikv,每套tikv都是独立的,数据保存的方式和传统关系型不一样的是,在tidb里面或者说tikv里面是映射成kv模式存储的
把92的tikv人为挂掉,此时数据库的使用会受影响,简单的一个查询就会被挂起,直到切换成功
--切换过程
mysql> select * from tbl_kenyon;
+----+-----------+---------------------+
| id | cname | ctime |
+----+-----------+---------------------+
| 1 | qiaofeng | 2017-05-23 10:50:43 |
| 2 | murong | 2017-05-23 10:50:43 |
| 3 | saodiseng | 2017-05-23 10:50:43 |
+----+-----------+---------------------+
3 rows in set (10.24 sec)
--切换以后
mysql> select * from tbl_kenyon;
+----+-----------+---------------------+
| id | cname | ctime |
+----+-----------+---------------------+
| 1 | qiaofeng | 2017-05-23 10:50:43 |
| 2 | murong | 2017-05-23 10:50:43 |
| 3 | saodiseng | 2017-05-23 10:50:43 |
+----+-----------+---------------------+
3 rows in set (0.00 sec)
可以发现经过投票,PD已经连到94上去了(93,92上都能看到),此时读取表数据很快
2017/05/23 17:59:12.151 server.rs:153: [INFO] TiKV is ready to serve
2017/05/23 17:59:12.517 raft.rs:846: [INFO] [region 2] 3 [term: 1487] received a MsgHeartbeat message with higher term from 7 [term: 1488]
2017/05/23 17:59:12.517 raft.rs:681: [INFO] [region 2] 3 became follower at term 1488
2017/05/23 17:59:12.525 server.rs:460: [INFO] resolve store 6 address ok, addr 172.26.11.94:20160
2017/05/23 17:59:13.517 apply.rs:621: [INFO] [region 2] 3 execute admin command cmd_type: CompactLog compact_log {compact_index: 6437 compact_term: 1488} at [term: 1488, index: 6439]
2017/05/23 17:59:13.644 raftlog_gc.rs:117: [INFO] [region 2] collected 225 log entries
2017/05/23 17:59:43.517 apply.rs:621: [INFO] [region 2] 3 execute admin command cmd_type: CompactLog compact_log {compact_index: 6498 compact_term: 1488} at [term: 1488, index: 6500]
2017/05/23 17:59:43.643 raftlog_gc.rs:117: [INFO] [region 2] collected 61 log entries
这是因为92是Region中的leader,假如不是leader的tikv服务器受影响如93,94,数据因为默认做了三个副本(也可以配置5个或者7个副本),服务并不会受影响,但是在日志中会不停地告警
四、水平扩展
其实主要是以上组件模块的扩展,对于tidb来说,本身是无状态的,比较容易扩展,pd也可以部署成集群的模式,通过Haproxy、F5或者其他第三方软件来实现,比较难的Tikv的水平扩展。在每个TiKV的节点里,逻辑上划分了一个或多个store,每个store里又划了一个或多个Region,数据就是存放在Region里面,每个Region的默认值是64M,扩容的过程类似以下细胞分裂的过程,比传统的RDBMS采用的Sharding方式以及中间件模式要透明很多,也许以后市面上的诸多中间件日子要难过了。
1.添加pd
动态添加pd
pd-server --name=pd2 \
--client-urls="http://172.26.11.95:2379" \
--peer-urls="http://172.26.11.95:2380" \
--join="http://172.26.11.91:2379" --要加入的原pd集群
动态删除pd
pd-ctl -u http://172.26.11.91:2379
>> member delete pd2
2.添加tikv
添加tikv,比较简单,直接注册一个新的tikv,剩下的数据迁移工作就交给pd,以下在91上新注册一个tikv
tikv-server --pd="172.26.11.91:2379" \
--addr="172.26.11.91:20160" \
--data-dir=/data/tidb/tikv \
--log-file=/data/tidb/log/tikv.log &
查看store,新增了一个1001的store,另外也能看出当前的leader在93上面
[root@test05 ~]# pd-ctl -u http://172.26.11.91:2379
» store
{
"count": 4,
"stores": [
{
"store": {
"id": 6,
"address": "172.26.11.94:20160",
"state": 0,
"state_name": "Up"
},
"status": {
"store_id": 6,
"capacity": "21 GB",
"available": "21 GB",
"leader_count": 0,
"region_count": 1,
"sending_snap_count": 0,
"receiving_snap_count": 0,
"applying_snap_count": 0,
"is_busy": false,
"start_ts": "2017-05-23T18:05:07+08:00",
"last_heartbeat_ts": "2017-05-24T17:52:03.842239159+08:00",
"uptime": "23h46m56.842239159s"
}
},
{
"store": {
"id": 1001,
"address": "172.26.11.91:20160",
"state": 0,
"state_name": "Up"
},
"status": {
"store_id": 1001,
"capacity": "21 GB",
"available": "15 GB",
"leader_count": 0,
"region_count": 0,
"sending_snap_count": 0,
"receiving_snap_count": 0,
"applying_snap_count": 0,
"is_busy": false,
"start_ts": "2017-05-24T17:50:12+08:00",
"last_heartbeat_ts": "2017-05-24T17:52:03.290658649+08:00",
"uptime": "1m51.290658649s"
}
},
{
"store": {
"id": 1,
"address": "172.26.11.92:20160",
"state": 0,
"state_name": "Up"
},
"status": {
"store_id": 1,
"capacity": "21 GB",
"available": "21 GB",
"leader_count": 0,
"region_count": 1,
"sending_snap_count": 0,
"receiving_snap_count": 0,
"applying_snap_count": 0,
"is_busy": false,
"start_ts": "2017-05-23T17:59:12+08:00",
"last_heartbeat_ts": "2017-05-24T17:52:06.843194072+08:00",
"uptime": "23h52m54.843194072s"
}
},
{
"store": {
"id": 4,
"address": "172.26.11.93:20160",
"state": 0,
"state_name": "Up"
},
"status": {
"store_id": 4,
"capacity": "21 GB",
"available": "21 GB",
"leader_count": 1,
"region_count": 1,
"sending_snap_count": 0,
"receiving_snap_count": 0,
"applying_snap_count": 0,
"is_busy": false,
"start_ts": "2017-05-23T17:22:48+08:00",
"last_heartbeat_ts": "2017-05-24T17:52:09.766282426+08:00",
"uptime": "24h29m21.766282426s"
}
}
]
}
3.删除tikv
查看1001的store状态是0,也就是up
» store 1001
{
"store": {
"id": 1001,
"address": "172.26.11.91:20160",
"state": 0,
"state_name": "Up"
},
"status": {
"store_id": 1001,
"capacity": "21 GB",
"available": "15 GB",
"leader_count": 0,
"region_count": 0,
"sending_snap_count": 0,
"receiving_snap_count": 0,
"applying_snap_count": 0,
"is_busy": false,
"start_ts": "2017-05-24T17:50:12+08:00",
"last_heartbeat_ts": "2017-05-24T17:58:57.490156968+08:00",
"uptime": "8m45.490156968s"
}
}
--删除过程,state=1表示正在下线
» store delete 1001
Success!
» store 1001
{
"store": {
"id": 1001,
"address": "172.26.11.91:20160",
"state": 1,
"state_name": "Offline"
},
"status": {
"store_id": 1001,
"capacity": "21 GB",
"available": "15 GB",
"leader_count": 0,
"region_count": 0,
"sending_snap_count": 0,
"receiving_snap_count": 0,
"applying_snap_count": 0,
"is_busy": false,
"start_ts": "2017-05-24T17:50:12+08:00",
"last_heartbeat_ts": "2017-05-24T17:59:17.690136502+08:00",
"uptime": "9m5.690136502s"
}
}
--state=2表示数据已经清理,可以关闭
» store 1001
{
"store": {
"id": 1001,
"address": "172.26.11.91:20160",
"state": 2,
"state_name": "Tombstone"
},
"status": {
"store_id": 0,
"capacity": "0 B",
"available": "0 B",
"leader_count": 0,
"region_count": 0,
"sending_snap_count": 0,
"receiving_snap_count": 0,
"applying_snap_count": 0,
"is_busy": false,
"start_ts": "1970-01-01T08:00:00+08:00",
"last_heartbeat_ts": "0001-01-01T00:00:00Z",
"uptime": "0s"
}
}
»
五、总结:
1.维护相对很简单,官方文档是有中英文版本,资料更新相对及时,但是实际使用者提供的资料较少
2.Scale Out相比较传统的RDBMS方案上来看简化很多,特别是可以摒弃五花八门的中间件
3.从架构上来看,小数据量的性能应该一般,不建议使用,大数据量理论上会较好
4.期待GA版本
分布式数据库TiDB的部署的更多相关文章
- (一)分布式数据库tidb-简介
因为数据磁盘问题,最近进行了更换库,所以决定写关于这方面的专题的博客,博客信息参考的官方文档. 一.分布式数据库使用背景 随着互联网的飞速发展,业务量可能在短短的时间内爆发式地增长,对应的数据量可能快 ...
- NewSQL分布式数据库,例如TIDB用K/V的底层逻辑
内容参考 对分布式对定义参考这篇文章: 微服务都想用,先把分布式和微服务之间的关系说清楚 对分布式架构中心或无中心对比参考这篇文章: 分布式存储单主.多主和无中心架构的特征与趋势 对HDFS对内部机制 ...
- 新一代数据库TiDB在美团的实践
1. 背景和现状 近几年,基于MySQL构建的传统关系型数据库服务,已经很难支撑美团业务的爆发式增长,这就促使我们去探索更合理的数据存储方案和实践新的运维方式.而随着分布式数据库大放异彩,美团DBA团 ...
- Distributed4:SQL Server 分布式数据库性能测试
我使用三台SQL Server 2012 搭建分布式数据库,将一年的1.4亿条数据大致均匀存储在这三台Server中,每台Server 存储4个月的数据,Physical Server的配置基本相同, ...
- 怎样打造一个分布式数据库——rocksDB, raft, mvcc,本质上是为了解决跨数据中心的复制
摘自:http://www.infoq.com/cn/articles/how-to-build-a-distributed-database?utm_campaign=rightbar_v2& ...
- 分布式数据库Google Spanner原理分析
Spanner 是Google的全球级的分布式数据库 (Globally-Distributed Database) .Spanner的扩展性达到了令人咋舌的全球级,可以扩展到数百万的机器,数已百计的 ...
- 全球分布式数据库:Google Spanner(论文翻译)
本文由厦门大学计算机系教师林子雨翻译,翻译质量很高,本人只对极少数翻译得不太恰当的地方进行了修改. [摘要]:Spanner 是谷歌公司研发的.可扩展的.多版本.全球分布式.同步复制数据库.它是第一个 ...
- 一文搞定FastDFS分布式文件系统配置与部署
Ubuntu下FastDFS分布式文件系统配置与部署 白宁超 2017年4月15日09:11:52 摘要: FastDFS是一个开源的轻量级分布式文件系统,功能包括:文件存储.文件同步.文件访问(文件 ...
- 在分布式数据库中CAP原理CAP+BASE
本篇博文的内容均来源于网络,本人只是整理,仅供学习! 一.关系型数据库 关系型数据库遵循ACID规则 事务在英文中是transaction,和现实世界中的交易很类似,它有如下四个特性: 1.A (At ...
随机推荐
- 我的Spring学习记录(一)
spring是一个框架,一个我理解为对象的大熔炉,它生产着各种bean,还可以对生产的对象进行加工. 这里有些概念需要理解一下,就是IOC和DI以及AOP,接下来,我们进入主题. spring简介 上 ...
- 与 Hadoop 对比,如何看待 Spark 技术?
主要是先看MapReduce模型有什么问题? 第一:需要写很多底层的代码不够高效,第二:所有的事情必须要转化成两个操作Map/Reduce,这本身就很奇怪,也不能解决所有的情况. 其实Spark出现就 ...
- JS之脚本延迟
自从开了博客,我就一下班回来匆匆吃完饭门一关等一开电脑一打开匆匆的研究东西,以至于朋友们都怀疑我是不是都得了自闭症 其实因为我有恐惧心理怕自己的技术哪天跟不上社会了,说到技术我觉得技术不求越新越好,但 ...
- PHP中public、protected、private权限修饰符
PHP中有三种访问修饰符 默认是public public(公共的.默认) protected(受保护的) private(私有的) 访问权限 public protected private 类内 ...
- Java并发/多线程系列——线程安全篇(1)
创建和启动Java线程 Java线程是个对象,和其他任何的Java对象一样.线程是类的实例java.lang.Thread,或该类的子类的实例.除了对象之外,java线程还可以执行代码. 创建和启动线 ...
- httpd2.2配置文件详解
httpd2.2官方配置手册:http://httpd.apache.org/docs/2.2/ 注意:关闭防火墙,iptables规则 vim /etc/sysconfig/selinux SELI ...
- 2013 ACM/ICPC Asia Regional Hangzhou Online hdu4739 Zhuge Liang's Mines
Zhuge Liang's Mines Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- 关于离线底图和离线shp文件的加载
首先底图是我自己用百度地图18级别的瓦片图在armap中制作的TPK文件,shp图层是我用同样的百度地图18级别的瓦片图矢量化的,二者在arcmap中的空间参考是一致的,所以我以为在移动端加入的时候二 ...
- 手动添加 Git bash 到鼠标右键
由于不知原因,右键没有了Git Bash Here,没有这个右键菜单导致获取Git仓库中的代码很不方便,所以决定通过注册表的方式将这个菜单加出来. 1.win + R,输入"regedit& ...
- Crossin 8-3;8-4
8-3文件打开模式:r:只读模式.默认w:只写模式.会先清空文件a:追加写入模式,在文件末尾写入,不可读r+:打开一个文件用于读写.文件指针将会放在文件的开头,原文件内容不会清空b:二进制模式,与前面 ...