TiDB(NewSQL)

1. TiDB介紹

TiDB 是分布式關(guān)系型數(shù)據(jù)庫,是一款同時支持在線事務(wù)處理與在線分析處理的融合型分布式數(shù)據(jù)庫產(chǎn)品,具備水平擴容或者縮容、金融級高可用、云原生的分布式數(shù)據(jù)庫、兼容 MySQL 5.7 協(xié)議和 MySQL 生態(tài)等重要特性。目標(biāo)是為用戶提供一站式 OLTP (Online Transactional Processing)、OLAP (Online Analytical Processing)。TiDB 適合高可用、強一致要求較高、數(shù)據(jù)規(guī)模較大等各種應(yīng)用場景。TiBD也是NewSQL的一種。

OLTP:聯(lián)機的事務(wù)處理,特點是在短時間內(nèi)返回查詢結(jié)果,對應(yīng)的是關(guān)系型數(shù)據(jù)庫,例如mysql,sqlserver,oracle等,底層使用的innodb引擎,B+ 樹等數(shù)據(jù)結(jié)構(gòu)。

OLAP:聯(lián)機的分析處理,特點是對歷史數(shù)據(jù)分析,然后產(chǎn)生決策性的影響(大數(shù)據(jù)分析),對應(yīng)的是數(shù)據(jù)庫,例如HIVE(數(shù)據(jù)倉庫),Hbase。

關(guān)系型數(shù)據(jù)庫(SQL):

缺點:

  1. 不支持在線的數(shù)據(jù)庫擴容,縮容。
  2. 大量數(shù)據(jù)查詢非常慢
  3. 并發(fā)能力差(使用集群,分庫,分表,mycat 實現(xiàn)但是成本較大)

優(yōu)點:

  1. 關(guān)系型數(shù)據(jù)庫

非關(guān)系型數(shù)據(jù)庫(NOSQL):

缺點:

  1. 致命缺點丟失數(shù)據(jù)
  2. 不能聯(lián)查

優(yōu)點:

  1. 性能高
  2. 并發(fā)能力強
  3. 支持在線的數(shù)據(jù)庫擴容,縮容

NewSQL:結(jié)合了關(guān)系型和非關(guān)系型數(shù)據(jù)庫的優(yōu)勢可以做到以下

  1. 并發(fā)能力高
  2. 支持在線的數(shù)據(jù)庫擴容,縮容
  3. 支持云原生
  4. 可以聯(lián)查

2. 架構(gòu)解析

20190225192015447.png
  • TiDB Server:SQL 層,對外暴露 MySQL 協(xié)議的連接 endpoint,負(fù)責(zé)接受客戶端的連接,執(zhí)行 SQL 解析和優(yōu)化,最終生成分布式執(zhí)行計劃。TiDB 層本身是無狀態(tài)的,實踐中可以啟動多個 TiDB 實例,通過負(fù)載均衡組件(如 LVS、HAProxy 或 F5)對外提供統(tǒng)一的接入地址,客戶端的連接可以均勻地分?jǐn)傇诙鄠€ TiDB 實例上以達(dá)到負(fù)載均衡的效果。TiDB Server 本身并不存儲數(shù)據(jù),只是解析 SQL,將實際的數(shù)據(jù)讀取請求轉(zhuǎn)發(fā)給底層的存儲節(jié)點 TiKV(或 TiFlash)。
  • PD (Placement Driver) Server:整個 TiDB 集群的元信息管理模塊,負(fù)責(zé)存儲每個 TiKV 節(jié)點實時的數(shù)據(jù)分布情況和集群的整體拓?fù)浣Y(jié)構(gòu),提供 TiDB Dashboard 管控界面,并為分布式事務(wù)分配事務(wù) ID。PD 不僅存儲元信息,同時還會根據(jù) TiKV 節(jié)點實時上報的數(shù)據(jù)分布狀態(tài),下發(fā)數(shù)據(jù)調(diào)度命令給具體的 TiKV 節(jié)點,可以說是整個集群的“大腦”。此外,PD 本身也是由至少 3 個節(jié)點構(gòu)成,擁有高可用的能力。建議部署奇數(shù)個 PD 節(jié)點。
  • 存儲節(jié)點
    • TiKV Server:負(fù)責(zé)存儲數(shù)據(jù),從外部看 TiKV 是一個分布式的提供事務(wù)的 Key-Value 存儲引擎。存儲數(shù)據(jù)的基本單位是 Region,每個 Region 負(fù)責(zé)存儲一個 Key Range(從 StartKey 到 EndKey 的左閉右開區(qū)間)的數(shù)據(jù),每個 TiKV 節(jié)點會負(fù)責(zé)多個 Region。TiKV 的 API 在 KV 鍵值對層面提供對分布式事務(wù)的原生支持,默認(rèn)提供了 SI (Snapshot Isolation) 的隔離級別,這也是 TiDB 在 SQL 層面支持分布式事務(wù)的核心。TiDB 的 SQL 層做完 SQL 解析后,會將 SQL 的執(zhí)行計劃轉(zhuǎn)換為對 TiKV API 的實際調(diào)用。所以,數(shù)據(jù)都存儲在 TiKV 中。另外,TiKV 中的數(shù)據(jù)都會自動維護(hù)多副本(默認(rèn)為三副本),天然支持高可用和自動故障轉(zhuǎn)移。
    • TiFlash:TiFlash 是一類特殊的存儲節(jié)點。和普通 TiKV 節(jié)點不一樣的是,在 TiFlash 內(nèi)部,數(shù)據(jù)是以列式的形式進(jìn)行存儲,主要的功能是為分析型的場景加速。

TiDB的搭建

  1. 操作系統(tǒng)


    8.png
  2. 搭建條件

    TiDB 支持部署和運行在 Intel x86-64 架構(gòu)的 64 位通用硬件服務(wù)器平臺或者 ARM 架構(gòu)的硬件服務(wù)器平臺。對于開發(fā),測試,及生產(chǎn)環(huán)境的服務(wù)器硬件配置(不包含操作系統(tǒng) OS 本身的占用)有以下要求和建議:

7.png
  1. 下載文件
#克隆安裝腳本,或者直接復(fù)制下載好的文件內(nèi)容(下載所有的腳本到,然后把整個復(fù)制到指定的目錄下)
git clone https://github.com/pingcap/tidb-docker-compose.git

#執(zhí)行docker-compose之前先需要清除本機掛載,如果之前安裝過
docker volume rm $(docker volume ls -q)
#安裝
docker-compose up -d


#設(shè)置密碼
set password for 'root'@'%' = '123456';

搭建成功可用mysql工具軟件連接測試,以后就可以如同mysql一樣使用了。

同時可以使用http:IP:3000 查看數(shù)據(jù)庫的狀態(tài)

4. 數(shù)據(jù)的一致性

1. 選舉

節(jié)點是可以自己給自己投票的,啟動的時候獲得了大多數(shù)的票的就會作為leader,當(dāng)出現(xiàn)投票一致的時候,就會進(jìn)行重新的選舉。

2. 日志復(fù)制

從客戶端來的數(shù)據(jù),先是主節(jié)點收到數(shù)據(jù),主節(jié)點把數(shù)據(jù)通過raft協(xié)議把日志發(fā)送到所有的從節(jié)點。當(dāng)超過半數(shù)(包括半數(shù))的從節(jié)點返回ack 后,主節(jié)點認(rèn)為數(shù)據(jù)保存落盤 。然后,繼續(xù)做1.返回給客戶端ack 數(shù)據(jù)收到,當(dāng)返回客戶端成功后,主節(jié)點然后通知從節(jié)點,把上次的數(shù)據(jù)改為提交狀態(tài)(提交狀態(tài)的數(shù)據(jù),才能被查詢到)。至于沒有給主節(jié)點返回ack的從節(jié)點,主節(jié)點會重復(fù)給這些從節(jié)點日志復(fù)制。

如果,主機點和其他的從節(jié)點網(wǎng)絡(luò)斷開,則客戶端會寫入數(shù)據(jù)失敗,其他的從節(jié)點會從新的選舉主節(jié)點,保證后面的數(shù)據(jù)能寫入成功。經(jīng)過一段時間舊的主節(jié)點從新連接上來后,舊 的主節(jié)點會對寫入失敗的數(shù)據(jù)做回滾,然后作為新的主節(jié)點的從節(jié)點,同步新的主節(jié)點的數(shù)據(jù)。

注意:當(dāng)網(wǎng)絡(luò)不是很好的時候,已經(jīng)產(chǎn)生了新的主節(jié)點。新的客戶端對舊的數(shù)據(jù)做修改操作后。會造成舊的客戶端連接舊的主節(jié)點對查出來的數(shù)據(jù)是舊的。

5. 對接Spark引擎大數(shù)據(jù)查詢

1. Spark介紹

Apache Spark是專為大規(guī)模數(shù)據(jù)處理而設(shè)計的快速通用的計算引擎 ?,F(xiàn)在形成一個高速發(fā)展應(yīng)用廣泛的生態(tài)系統(tǒng)。

Spark 主要有三個特點 :

首先,高級 API 剝離了對集群本身的關(guān)注,Spark 應(yīng)用開發(fā)者可以專注于應(yīng)用所要做的計算本身。

其次,Spark 很快,支持交互式計算和復(fù)雜算法。

最后,Spark 是一個通用引擎,可用它來完成各種各樣的運算,包括 SQL 查詢、文本處理、機器學(xué)習(xí)等,而在 Spark 出現(xiàn)之前,我們一般需要學(xué)習(xí)各種各樣的引擎來分別處理這些需求。

  • 更快的速度

內(nèi)存計算下,Spark 比 Hadoop 快100倍。

  • 易用性

Spark 提供了80多個高級運算符。

  • 通用性

Spark 提供了大量的庫,包括Spark Core、Spark SQL、Spark Streaming、MLlib、GraphX。 開發(fā)者可以在同一個應(yīng)用程序中無縫組合使用這些庫。

  • 支持多種資源管理器

Spark 支持 Hadoop YARN,Apache Mesos,及其自帶的獨立集群管理器

  • Spark生態(tài)系統(tǒng)
  • Shark:Shark基本上就是在Spark的框架基礎(chǔ)上提供和Hive一樣的HiveQL命令接口,為了最大程度的保持和Hive的兼容性,Spark使用了Hive的API來實現(xiàn)query Parsing和 Logic Plan generation,最后的PhysicalPlan execution階段用Spark代替HadoopMapReduce。通過配置Shark參數(shù),Shark可以自動在內(nèi)存中緩存特定的RDD,實現(xiàn)數(shù)據(jù)重用,進(jìn)而加快特定數(shù)據(jù)集的檢索。同時,Shark通過UDF用戶自定義函數(shù)實現(xiàn)特定的數(shù)據(jù)分析學(xué)習(xí)算法,使得SQL數(shù)據(jù)查詢和運算分析能結(jié)合在一起,最大化RDD的重復(fù)使用。
  • SparkR:SparkR是一個為R提供了輕量級的Spark前端的R包。 SparkR提供了一個分布式的data frame數(shù)據(jù)結(jié)構(gòu),解決了 R中的data frame只能在單機中使用的瓶頸,它和R中的data frame 一樣支持許多操作,比如select,filter,aggregate等等。(類似dplyr包中的功能)這很好的解決了R的大數(shù)據(jù)級瓶頸問題。 SparkR也支持分布式的機器學(xué)習(xí)算法,比如使用MLib機器學(xué)習(xí)庫。 [4] SparkR為Spark引入了R語言社區(qū)的活力,吸引了大量的數(shù)據(jù)科學(xué)家開始在Spark平臺上直接開始數(shù)據(jù)分析之旅。

Hadoop:核心思想是分而治之。其中有三個組件:

  1. hdfs:分部署的儲存
  2. mapduce:由map 和duce 組成。
  3. 容器,任務(wù)執(zhí)行容器,方便垃圾回收,管理分配所有節(jié)點的資源,也是資源調(diào)度器。

以下是hadoop 下的一個節(jié)點的結(jié)構(gòu):


4.png

Hadoop和數(shù)據(jù)庫結(jié)構(gòu)就變成了以下狀態(tài):


5.png

hadoop 存在的問題就是性能低:主要原因就是原始數(shù)據(jù)通過map從新保存到磁盤中,做排序后reduce又從新的從硬盤讀取從新放入磁盤。

所以現(xiàn)在開發(fā)出了spark在內(nèi)存中對數(shù)據(jù)做匯總以提高它的性能:

以下是結(jié)構(gòu)體


6.png

2. Spark的使用

docker exec -it tidb-docker-compose_tispark-master_1 /bin/bash

cd /opt/spark/data/tispark-sample-data
//插入測試數(shù)據(jù)
mysql --local-infile=1 -h IP -P 4000 -u root -p123456 < dss.ddl

插入數(shù)據(jù)成功:

可以通過mysql 數(shù)據(jù)庫查看到數(shù)據(jù)數(shù)據(jù)庫


1.png

使用shark查詢數(shù)據(jù):

cd /opt/spark/bin
#啟動shell 窗口,會加載一些組件
./spark-shell
#導(dǎo)入組件
import org.apache.spark.sql.TiContext
#定義對象
var ti=new TiContext(spark)
#定義參數(shù)
ti.tidbMapDatabase("TPCH_001")
spark.sql("select count(*) from lineitem").show

 spark.sql(
      """select
        |   l_returnflag,
        |   l_linestatus,
        |   sum(l_quantity) as sum_qty,
        |   sum(l_extendedprice) as sum_base_price,
        |   sum(l_extendedprice * (1 - l_discount)) as sum_disc_price,
        |   sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge,
        |   avg(l_quantity) as avg_qty,
        |   avg(l_extendedprice) as avg_price,
        |   avg(l_discount) as avg_disc,
        |   count(*) as count_order
        |from
        |   lineitem
        |where
        |   l_shipdate <= date '1998-12-01' - interval '90' day
        |group by
        |   l_returnflag,
        |   l_linestatus
        |order by
        |   l_returnflag,
        |   l_linestatus
      """.stripMargin).show

以下是查詢的結(jié)果:


3.png

注意:

  1. spark 現(xiàn)在存在的問題吃內(nèi)存,
  2. 穩(wěn)定性待測試

6. 處理大數(shù)據(jù)

為了提升數(shù)據(jù)的讀寫性能TiDB對硬盤做了分塊,并且分配的磁盤是遞增增加:如下圖:


2.png

數(shù)據(jù)寫入:當(dāng)數(shù)據(jù)寫入時,首先寫入內(nèi)存中,同時追加到日志中,當(dāng)把分配的內(nèi)存寫滿后,把數(shù)據(jù)轉(zhuǎn)移到較小的磁盤中。然后刪除日志文件,當(dāng)較小的磁盤寫滿后轉(zhuǎn)存到較大的磁盤中,以此類推

數(shù)據(jù)修改刪除:刪除的數(shù)據(jù)會記錄版本號,處理還是按照日志追加,同理修改記錄也會進(jìn)入磁盤,LSM樹TiDB的底層會做處理。

數(shù)據(jù)讀?。洪_始先讀取內(nèi)存,如果內(nèi)存沒有就找較小的磁盤,較小的磁盤沒有找較大的磁盤,以此類推。為了提升性能,減少對磁盤的查詢,增加了布隆過濾器。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容