国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

TiDB 官方設(shè)計文檔翻譯(三)

2024-07-21 02:52:56
字體:
供稿:網(wǎng)友

這個系列共三篇譯文: TiDB 官方設(shè)計文檔翻譯(一) TiDB 官方設(shè)計文檔翻譯(二) TiDB 官方設(shè)計文檔翻譯(三)

原文: https://pingcap.github.io/blog/2016/10/17/how-we-build-tidb/

5.3 TiDB核心技術(shù)

讓我們繼續(xù)討論TiDB。TiDB有一個與MySQL兼容的協(xié)議層,有以下功能:

將表數(shù)據(jù)映射到鍵值存儲,從而連接到鍵值存儲引擎。謂詞下推(譯者注:將外層查詢塊的 WHERE 子句中的謂詞移入所包含的較低層查詢塊,不理解的可以搜索一下這個名詞),以加速查詢在線DDL

5.3.1 將表數(shù)據(jù)映射到鍵值存儲

讓我們使用一個例子來展示SQL表如何映射到鍵值對。

如果我們在數(shù)據(jù)庫中有一個簡單的用戶表。 它有2行3列:用戶ID,名稱和電子郵件,其中用戶id是主鍵。

INSERT INTO user VALUES (1, "bob", "huang@pingcap.com");INSERT INTO user VALUES (2, "tom", "tom@pingcap.com");

如果我們將此表映射到鍵值對,則應(yīng)按以下方式進(jìn)行。

這里寫圖片描述

當(dāng)然,TiDB支持二級索引。 它是一個全局索引。 TiDB將數(shù)據(jù)和索引更新放在同一個事務(wù)中,因此TiDB中的所有索引都是事務(wù)性的和完全一致的。 整個過程對用戶是透明的。

索引只是值指向行鍵的鍵值對。 在為用戶名創(chuàng)建索引之后,鍵值存儲如下所示:

這里寫圖片描述

索引的鍵由兩部分組成:人名加后綴用戶ID。比如這里“bob”是人名,1是用戶id,值指向行鍵。

5.3.2 謂詞下推

對于一些操作,如計算表中的一些列,TiDB將這些操作下推到相應(yīng)的TiKV節(jié)點(diǎn),由TiKV節(jié)點(diǎn)進(jìn)行計算,然后TiDB合并最終結(jié)果。 下圖展示了謂詞下推的過程。

這里寫圖片描述

5.3.3 Schema更改

這部分關(guān)于Schema更改(譯者注:Schema是數(shù)據(jù)庫對象的集合,一個用戶一般對應(yīng)一個schema)。 為什么在線Schema更改是必備功能? 這是因為我們需要一直有完整的數(shù)據(jù)可用性,以及最小的性能影響,使運(yùn)維人員睡得安穩(wěn)。 與Google F1相同的部分 影響Schema更改的TiDB的主要功能有:

分布式——TiDB的實(shí)例由許多單獨(dú)的TiDB服務(wù)器組成關(guān)系Schema——每個TiDB服務(wù)器都有一個描述表,列,索引和約束的關(guān)系Schema的副本。對Schema的任何修改都應(yīng)該是分布式的,以更新所有服務(wù)器。共享數(shù)據(jù)存儲——所有數(shù)據(jù)中心中的所有TiDB服務(wù)器都可以訪問存儲在TiKV中的所有數(shù)據(jù)。在TiDB服務(wù)器之間沒有數(shù)據(jù)分區(qū)。沒有全局會員——因為TiDB服務(wù)器是無狀態(tài)的,所以不需要TiDB實(shí)現(xiàn)全局成員協(xié)議。這意味著沒有可靠的機(jī)制來確定當(dāng)前運(yùn)行的TiDB服務(wù)器,并且顯式全局同步是不可能的。 與Google F1不同的部分TiDB使用MySQL協(xié)議單個事務(wù)中的語句不能跨越不同的TiDB服務(wù)器 關(guān)于Schema更改的補(bǔ)充說明 Schema更改之前,讓我們看看下圖展示的TiDB中的SQL

這里寫圖片描述

下面是Schema更改期間TiDB實(shí)例的概述:

這里寫圖片描述 Schema更改: 增加索引 接下來,讓我們看看在添加索引時Schema是如何變化的。如果我們不小心,使用不同Schema版本的服務(wù)器可能會損壞數(shù)據(jù)庫。

考慮從Schema S1到Schema S2的變更,其將索引 I 添加到表T上。假設(shè)兩個不同的服務(wù)器M1和M2執(zhí)行下列操作:

服務(wù)器M2使用Schema S2向表T插入新行r。由于S2包含索引 I ,所以服務(wù)器M2還向鍵值存儲添加對應(yīng) r 的新索引條目。服務(wù)器M1使用Schema S1刪除r。 因為S1不包含 I,M1從鍵值存儲中刪除r,但無法刪除 I 中的相應(yīng)索引條目。

第二次刪除會破壞數(shù)據(jù)庫。 例如,僅針對索引的掃描將返回不正確的結(jié)果,包括已刪除行r的列值。 Schema 狀態(tài) 通常情況下,Schema 更改是一個多狀態(tài)多階段協(xié)議。 有兩種狀態(tài),我們認(rèn)為是非中間的:absent和public。有兩個內(nèi)部、中間狀態(tài):delete-only和write-only

delete-only:一個僅刪除的表、列或索引不能由用戶事務(wù)讀取其鍵值對,并且

如果E是表或列,則只能通過刪除操作進(jìn)行修改。如果E是一個索引,它只被刪除和更新操作修改。 此外,更新操作可以刪除與更新的索引鍵相對應(yīng)的鍵值對,但是它們不能創(chuàng)建任何新的鍵值對。

對于write-only狀態(tài),它這樣定義列和索引: write-only列或索引可以通過插入,刪除和更新操作修改其鍵/值對,但不能通過用戶事務(wù)讀取它們的鍵值對。 Schema 更改流程:添加索引 添加索引需要4個步驟。

步驟1,我們將狀態(tài)標(biāo)記為delete-only,等待一個Schema 租用,在所有TiDB服務(wù)器達(dá)到相同狀態(tài)后,到第二步

步驟2,將狀態(tài)標(biāo)記為write-only,等待一個Schema 租用,

步驟3,將狀態(tài)標(biāo)記為填充索引,并開始maPReduce作業(yè)。 在完成索引填充作業(yè)后,我們等待一個Schema 租用,

步驟4,切換到最終狀態(tài),所有新查詢可以使用新添加的索引。 TiDB:添加索引的狀態(tài)(delete-only) 以下是添加索引的屏幕截圖之一。

這里寫圖片描述

我們可以使用任何MySQL客戶端查詢在線DDL作業(yè)的狀態(tài)。 只是簡單地運(yùn)行“show status”語句,我們可以看到高亮部分,當(dāng)前狀態(tài)是“delete-only”,并且操作是“添加索引”。 還有一些其他信息,如誰在做DDL作業(yè),當(dāng)前作業(yè)的狀態(tài)和當(dāng)前schema 版本。 TiDB:添加索引的狀態(tài)(添加索引) 如紅筆所示,此屏幕截圖顯示當(dāng)前狀態(tài)是“write reorganization”。

這里寫圖片描述

6 如何測試?

在本節(jié)中,我將介紹如何測試系統(tǒng)。

測試用例來自社區(qū)。 在MySQL驅(qū)動程序/連接器,ORM和應(yīng)用程序中有很多測試用例。在硬件和軟件上執(zhí)行故障注入以增加測試覆蓋。關(guān)于網(wǎng)絡(luò),我們模擬延遲,故障,分區(qū),以檢測當(dāng)網(wǎng)絡(luò)不可靠時我們的數(shù)據(jù)庫中是否有bug。我們使用Jepsen和Namazu進(jìn)行分布式測試。

7 未來計劃

這是我們的未來計劃: - 我們計劃在未來使用GPS和原子鐘。 - 我們正在改進(jìn)我們的查詢優(yōu)化器以獲得更好更快的查詢結(jié)果。 - 我們將進(jìn)一步提高與MySQL的兼容性。 - JSON和文檔存儲類型的支持也在我們的規(guī)劃中。 - 我們計劃支持推動更多的聚合和內(nèi)置功能。 - 在將來,我們將使用gRPC替換自定義的RPC實(shí)現(xiàn)。

說明 如有轉(zhuǎn)載,請務(wù)必注明出處: http://blog.csdn.net/antony9118/article/details/60479063


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 明溪县| 巴马| 北宁市| 濮阳县| 客服| 大名县| 邵阳县| 博客| 肇源县| 大连市| 即墨市| 四会市| 水城县| 丽江市| 思茅市| 普安县| 呼玛县| 台湾省| 石渠县| 张家川| 天峻县| 永兴县| 盘锦市| 巩义市| 夏河县| 榆树市| 孝感市| 洱源县| 南溪县| 嘉黎县| 江孜县| 星子县| 岳西县| 儋州市| 乐山市| 锡林浩特市| 乐陵市| 江油市| 尚义县| 沧源| 台东县|