## MongoDB Sharded Cluster 原理
如果你還不了解 MongoDB Sharded cluster,可以先看文檔認識一下
* 中文簡介:[MongoDB Sharded cluster架構原理](https://yq.aliyun.com/articles/32434?spm=5176.8091938.0.0.myHNU1)
* 英文匯總:[https://docs.mongodb.com/manual/sharding/](https://docs.mongodb.com/manual/sharding/)

## 什么時候考慮用 Sharded cluster?
當你考慮使用 Sharded cluster 時,通常是要解決如下2個問題
1. 存儲容量受單機限制,即磁盤資源遭遇瓶頸。
2. 讀寫能力受單機限制(讀能力也可以在復制集里加 secondary 節點來擴展),可能是 CPU、內存或者網卡等資源遭遇瓶頸,導致讀寫能力無法擴展。
如果你沒有遇到上述問題,使用 MongoDB 復制集就足夠了,管理維護上比 Sharded cluster 要簡單很多。
## 如何確定 shard、mongos 數量?
當你決定要使用 Sharded cluster 時,問題來了,應該部署多少個 shard、多少個 mongos?這個問題首富已經指點過我們,『先定一個小目標,比如先部署上1000個 shard』,然后根據需求逐步擴展。
回到正題,shard、mongos 的數量歸根結底是由應用需求決定,如果你使用 sharding 只是解決 『海量數據存儲』的問題,訪問并不多,那么很簡單,假設你單個 shard 能存儲 M, 需要的存儲總量是 N。
~~~
numberOfShards = N / M / 0.75 (假設容量水位線為75%)
numberOfMongos = 2+ (因為對訪問要求不高,至少部署2個 mongos 做高可用即可)
~~~
如果你使用 sharding 是解決高并發寫入(或讀取)數據的問題,總的數據量其實很小,這時你部署的 shard、mongos 要能滿足讀寫性能需求,而容量上則不是考量的重點。假設單個 shard 最大 qps 為 M,單個 mongos 最大 qps 為 Ms,需要總的 qps 為 N。 (注:mongos、mongod 的服務能力,需要用戶根據訪問特性來實測得出)
~~~
numberOfShards = Q * / M * / 0.75 (假設負載水位線為75%)
numberOfMongos = Q * / Ms / 0.75
~~~
如果sharding 要解決上述2個問題,則按需求更高的指標來預估;以上估算是基于sharded cluster 里數據及請求都均勻分布的理想情況,但實際情況下,分布可能并不均衡,這里引入一個『不均衡系數 D』的概念(個人 YY 的,非通用概念),意思是系統里『數據(或請求)分布最多的 shard 是平均值的 D 倍』,實際需要的 shard、mongos 數量,在上述預估上再乘上『不均衡系數 D』。
而為了讓系統的負載分布盡量均勻,就需要合理的選擇 shard key。
## 如何選擇shard key ?
MongoDB Sharded cluster 支持2種分片方式,各有優劣
* [范圍分片](https://docs.mongodb.com/manual/core/ranged-sharding/),通常能很好的支持基于 shard key的范圍查詢
* [Hash 分片](https://docs.mongodb.com/manual/core/hashed-sharding/),通常能將寫入均衡分布到各個 shard
上述2種分片策略都不能解決的問題包括
1. shard key 取值范圍太小(low cardinality),比如將數據中心作為 shard key,而數據中心通常不會很多,分片的效果肯定不好。
2. shard key 某個值的文檔特別多,這樣導致單個 chunk 特別大(及 jumbo chunk),會影響chunk 遷移及負載均衡。
3. 根據非 shard key 進行查詢、更新操作都會變成 scatter-gather 查詢,影響效率。
好的 shard key 應該擁有如下特性:
* key 分布足夠離散 (sufficient cardinality)
* 寫請求均勻分布 (evenly distributed write)
* 盡量避免 scatter-gather 查詢 (targeted read)
舉個例子,某物聯網應用使用 MongoDB Sharded cluster 存儲『海量設備』的『工作日志』,假設設備數量在百萬級別,設備每10s向 MongoDB匯報一次日志數據,日志包含deviceId,timestamp 信息,應用最常見的查詢請求是『查詢某個設備某個時間內的日志信息』。(讀者可以自行預估下,這個量級,無論從寫入還是數據量上看,都應該使用 Sharding,以便能水平擴張)。
* 方案1: 時間戳作為 shard key,范圍分片
* Bad
* 新的寫入都是連續的時間戳,都會請求到同一個 shard,寫分布不均
* 根據 deviceId 的查詢會分散到所有 shard 上查詢,效率低
* 方案2: 時間戳作為 shard key,hash 分片
* Bad
* 寫入能均分到多個 shard
* 根據 deviceId 的查詢會分散到所有 shard 上查詢,效率低
* 方案3:deviceId 作為 shardKey,hash分片(如果 id 沒有明顯的規則,范圍分片也一樣)
* Bad
* 寫入能均分到多個 shard
* 同一個 deviceId 對應的數據無法進一步細分,只能分散到同一個 chunk,會造成 jumbo chunk
* 根據 deviceId的查詢只請求到單個 shard,不足的時,請求路由到單個 shard 后,根據時間戳的范圍查詢需要全表掃描并排序
* 方案4:(deviceId, 時間戳)組合起來作為 shardKey,范圍分片(Better)
* Good
* 寫入能均分到多個 shard
* 同一個 deviceId 的數據能根據時間戳進一步分散到多個chunk
* 根據 deviceId 查詢時間范圍的數據,能直接利用(deviceId, 時間戳)復合索引來完成。
## 關于jumbo chunk及 chunk size
jumbo chunk 的意思是chunk『太大或者文檔太多』 且無法分裂。
~~~
If MongoDB cannot split a chunk that exceeds the specified chunk size or contains a number of documents that exceeds the max, MongoDB labels the chunk as jumbo.
~~~
MongoDB 默認的 chunk size 為64MB,如果 chunk 超過64MB 并且不能分裂(比如所有文檔 的 shard key 都相同),則會被標記為jumbo chunk ,balancer 不會遷移這樣的 chunk,從而可能導致負載不均衡,應盡量避免。
一旦出現了 jumbo chunk,如果對負載均衡要求不高,不去關注也沒啥影響,并不會影響到數據的讀寫訪問。如果一定要處理,可以嘗試[如下方法](https://docs.mongodb.com/manual/tutorial/clear-jumbo-flag/)
1. 對 jumbo chunk 進行 split,一旦 split 成功,mongos 會自動清除 jumbo 標記。
2. 對于不可再分的 chunk,如果該 chunk 已不再是 jumbo chunk,可以嘗試手動清除chunk 的 jumbo 標記(注意先備份下 config 數據庫,以免誤操作導致 config 庫損壞)。
3. 最后的辦法,調大 chunk size,當 chunk 大小不再超過 chunk size 時,jumbo 標記最終會被清理,但這個是治標不治本的方法,隨著數據的寫入仍然會再出現 jumbo chunk,根本的解決辦法還是合理的規劃 shard key。
關于 chunk size 如何設置的問題,絕大部分情況下,請直接使用默認 chunk size ,以下場景可能需要調整 chunk size(取值在1-1024之間)。
* 遷移時 IO 負載太大,可以嘗試設置更小的 chunk size
* 測試時,為了方便驗證效果,設置較小的 chunk size
* 初始 chunk size 設置不合適,導致出現大量 jumbo chunk,影響負載均衡,此時可以嘗試調大 chunk size
* 將『未分片的集合』轉換為『分片集合』,如果集合容量太大,可能需要(數據量達到T 級別才有可能遇到)調大 chunk size 才能轉換成功。參考[Sharding Existing Collection Data Size](https://docs.mongodb.com/manual/core/sharded-cluster-requirements/)
## Tag aware sharding
[Tag aware sharding](https://docs.mongodb.com/manual/core/tag-aware-sharding/)?是 Sharded cluster 很有用的一個特性,允許用戶自定義一些 chunk 的分布規則。Tag aware sharding 原理如下
1. sh.addShardTag() 給shard 設置標簽 A
2. sh.addTagRange() 給集合的某個 chunk 范圍設置標簽 A,最終 MongoDB 會保證設置標簽 A 的 chunk 范圍(或該范圍的超集)分布設置了標簽 A 的 shard 上。
Tag aware sharding可應用在如下場景
* 將部署在不同機房的 shard 設置『機房標簽』,將不同 chunk 范圍的數據分布到指定的機房
* 將服務能力不通的 shard 設置『服務等級標簽』,將更多的 chunk分散到服務能力更前的 shard 上去。
* …
使用 Tag aware sharding 需要注意是, chunk 分配到對應標簽的 shard 上『不是立即完成,而是在不斷 insert、update 后觸發 split、moveChunk后逐步完成的,并且需要保證 balancer 是開啟的』。所以你可能會觀察到,在設置了 tag range 后一段時間后,寫入仍然沒有分布到tag 相同的 shard 上去。
## 關于負載均衡
MongoDB Sharded cluster 的自動負載均衡目前是由 mongos 的后臺線程來做的,并且每個集合同一時刻只能有一個遷移任務,負載均衡主要根據集合在各個 shard 上 chunk 的數量來決定的,相差超過一定閾值(跟 chunk 總數量相關)就會觸發chunk遷移。
負載均衡默認是開啟的,為了避免 chunk 遷移影響到線上業務,可以通過設置遷移執行窗口,比如只允許凌晨`2:00-6:00`期間進行遷移。
~~~
use config
db.settings.update(
{ _id: "balancer" },
{ $set: { activeWindow : { start : "02:00", stop : "06:00" } } },
{ upsert: true }
)
~~~
另外,在進行?[sharding 備份](https://docs.mongodb.com/manual/tutorial/backup-sharded-cluster-with-database-dumps/)時(通過 mongos 或者單獨備份config server 和所有 shard),需要停止負載均衡,以免備份出來的數據出現狀態不一致問題。
~~~
sh.stopBalancer()
~~~
## moveChunk 歸檔設置
使用3.0及以前版本的 Sharded cluster 可能會遇到一個問題,停止寫入數據后,數據目錄里的磁盤空間占用還會一直增加。
上述行為是由`sharding.archiveMovedChunks`配置項決定的,該配置項在3.0及以前的版本默認為 true,即在move chunk 時,源 shard 會將遷移的 chunk 數據歸檔一份在數據目錄里,當出現問題時,可用于恢復。也就是說,chunk 發生遷移時,源節點上的空間并沒有釋放出來,而目標節點又占用了新的空間。
在3.2版本,該配置項默認值也被設置為 false,默認不會對 moveChunk 的數據在源 shard 上歸檔。
## recoverShardingState 設置
使用 MongoDB Sharded cluster 時,還可能遇到一個問題,就是啟動 shard后,shard 不能正常服務,『Primary 上調用 ismaster 時,結果卻為 true,也無法正常執行其他命令』,其狀態類似如下:
~~~
mongo-9003:PRIMARY> db.isMaster()
{
"hosts" : [
"host1:9003",
"host2:9003",
"host3:9003"
],
"setName" : "mongo-9003",
"setVersion" : 9,
"ismaster" : false, // primary 的 ismaster 為 false???
"secondary" : true,
"primary" : "host1:9003",
"me" : "host1:9003",
"electionId" : ObjectId("57c7e62d218e9216c70aa3cf"),
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2016-09-01T12:29:27.113Z"),
"maxWireVersion" : 4,
"minWireVersion" : 0,
"ok" : 1
}
~~~
查看其錯誤日志,會發現 shard 一直無法連接上 config server,上述行為是由 sharding.recoverShardingState 選項決定,默認為 true,也就是說,shard 啟動時,其會連接 config server 進行 sharding 狀態的一些初始化,而如果 config server 連不上,初始化工作就一直無法完成,導致 shard 狀態不正常。
有同學在將 Sharded cluster 所有節點都遷移到新的主機上時遇到了上述問題,因為 config server 的信息發生變化了,而 shard 啟動時還會連接之前的 config server,通過在啟動命令行加上?`--setParameter recoverShardingState=false`來啟動 shard 就能恢復正常了。
上述默認設計的確有些不合理,config server 的異常不應該去影響 shard,而且最終的問題的表象也很不明確,在3.4大版本里,MongoDB 也會對這塊進行修改,去掉這個參數,默認不會有 recoverShardingState 的邏輯,具體參考?[SERVER-24465](https://jira.mongodb.org/browse/SERVER-24465)。
## 要關注的問題好多,hold 不住怎么破?
阿里云已經推出了[MongoDB 云數據庫](https://www.aliyun.com/product/mongodb)服務,幫助廣大開發者解決 MongoDB 運維管理的所有問題,讓開發者專注于業務開發。[MongoDB 云數據庫](https://www.aliyun.com/product/mongodb)?目前已支持三節點高可用復制集,Sharded cluster 的功能正在緊鑼密鼓的研發中,敬請關注。
使用 MongoDB sharding 遇到問題歡迎到?[云棲社區](https://yq.aliyun.com/users/1134812/own?spm=5176.100238.headermenu.5.LiI3la#information)?或[MongoDB 中文社區](http://www.mongoing.com/)?一塊交流探討。
## 參考資料
* [Everything You Need to Know About Sharding](https://www.mongodb.com/presentations/webinar-everything-you-need-know-about-sharding?jmp=docs&_ga=1.113926660.2005306875.1453858874)
* [MongoDB for Time Series Data: Sharding](https://www.mongodb.com/presentations/mongodb-time-series-data-part-3-sharding?jmp=docs&_ga=1.136350259.2005306875.1453858874)
* [Hashed Sharding](https://docs.mongodb.com/manual/core/hashed-sharding/)
* [Ranged Sharding](https://docs.mongodb.com/manual/core/ranged-sharding/)
* [Dealing with Jumbo Chunks in MongoDB](https://www.percona.com/blog/2016/04/11/dealing-with-jumbo-chunks-in-mongodb/)
* [Tag aware sharding](https://docs.mongodb.com/manual/core/tag-aware-sharding/)
* [Sharding backup](https://docs.mongodb.com/manual/tutorial/backup-sharded-cluster-with-database-dumps/)
- 數據庫內核月報目錄
- 數據庫內核月報 - 2016/09
- MySQL · 社區貢獻 · AliSQL那些事兒
- PetaData · 架構體系 · PetaData第二代低成本存儲體系
- MySQL · 社區動態 · MariaDB 10.2 前瞻
- MySQL · 特性分析 · 執行計劃緩存設計與實現
- PgSQL · 最佳實踐 · pg_rman源碼淺析與使用
- MySQL · 捉蟲狀態 · bug分析兩例
- PgSQL · 源碼分析 · PG優化器淺析
- MongoDB · 特性分析· Sharding原理與應用
- PgSQL · 源碼分析 · PG中的無鎖算法和原子操作應用一則
- SQLServer · 最佳實踐 · TEMPDB的設計
- 數據庫內核月報 - 2016/08
- MySQL · 特性分析 ·MySQL 5.7新特性系列四
- PgSQL · PostgreSQL 邏輯流復制技術的秘密
- MySQL · 特性分析 · MyRocks簡介
- GPDB · 特性分析· Greenplum 備份架構
- SQLServer · 最佳實踐 · RDS for SQLServer 2012權限限制提升與改善
- TokuDB · 引擎特性 · REPLACE 語句優化
- MySQL · 專家投稿 · InnoDB物理行中null值的存儲的推斷與驗證
- PgSQL · 實戰經驗 · 旋轉門壓縮算法在PostgreSQL中的實現
- MySQL · 源碼分析 · Query Cache并發處理
- PgSQL · 源碼分析· pg_dump分析
- 數據庫內核月報 - 2016/07
- MySQL · 特性分析 ·MySQL 5.7新特性系列三
- MySQL · 特性分析 · 5.7 代價模型淺析
- PgSQL · 實戰經驗 · 分組TOP性能提升44倍
- MySQL · 源碼分析 · 網絡通信模塊淺析
- MongoDB · 特性分析 · 索引原理
- SQLServer · 特性分析 · XML與JSON應用比較
- MySQL · 最佳實戰 · 審計日志實用案例分析
- MySQL · 性能優化 · 條件下推到物化表
- MySQL · 源碼分析 · Query Cache內部剖析
- MySQL · 捉蟲動態 · 備庫1206錯誤問題說明
- 數據庫內核月報 - 2016/06
- MySQL · 特性分析 · innodb 鎖分裂繼承與遷移
- MySQL · 特性分析 ·MySQL 5.7新特性系列二
- PgSQL · 實戰經驗 · 如何預測Freeze IO風暴
- GPDB · 特性分析· Filespace和Tablespace
- MariaDB · 新特性 · 窗口函數
- MySQL · TokuDB · checkpoint過程
- MySQL · 特性分析 · 內部臨時表
- MySQL · 最佳實踐 · 空間優化
- SQLServer · 最佳實踐 · 數據庫實現大容量插入的幾種方式
- 數據庫內核月報 - 2016/05
- MySQL · 引擎特性 · 基于InnoDB的物理復制實現
- MySQL · 特性分析 · MySQL 5.7新特性系列一
- PostgreSQL · 特性分析 · 邏輯結構和權限體系
- MySQL · 特性分析 · innodb buffer pool相關特性
- PG&GP · 特性分析 · 外部數據導入接口實現分析
- SQLServer · 最佳實踐 · 透明數據加密在SQLServer的應用
- MySQL · TokuDB · 日志子系統和崩潰恢復過程
- MongoDB · 特性分析 · Sharded cluster架構原理
- PostgreSQL · 特性分析 · 統計信息計算方法
- MySQL · 捉蟲動態 · left-join多表導致crash
- 數據庫內核月報 - 2016/04
- MySQL · 參數故事 · innodb_additional_mem_pool_size
- GPDB · 特性分析 · Segment事務一致性與異常處理
- GPDB · 特性分析 · Segment 修復指南
- MySQL · 捉蟲動態 · 并行復制外鍵約束問題二
- PgSQL · 性能優化 · 如何瀟灑的處理每天上百TB的數據增量
- Memcached · 最佳實踐 · 熱點 Key 問題解決方案
- MongoDB · 最佳實踐 · 短連接Auth性能優化
- MySQL · 最佳實踐 · RDS 只讀實例延遲分析
- MySQL · TokuDB · TokuDB索引結構--Fractal Tree
- MySQL · TokuDB · Savepoint漫談
- 數據庫內核月報 - 2016/03
- MySQL · TokuDB · 事務子系統和 MVCC 實現
- MongoDB · 特性分析 · MMAPv1 存儲引擎原理
- PgSQL · 源碼分析 · 優化器邏輯推理
- SQLServer · BUG分析 · Agent 鏈接泄露分析
- Redis · 特性分析 · AOF Rewrite 分析
- MySQL · BUG分析 · Rename table 死鎖分析
- MySQL · 物理備份 · Percona XtraBackup 備份原理
- GPDB · 特性分析· GreenPlum FTS 機制
- MySQL · 答疑解惑 · 備庫Seconds_Behind_Master計算
- MySQL · 答疑解惑 · MySQL 鎖問題最佳實踐
- 數據庫內核月報 - 2016/02
- MySQL · 引擎特性 · InnoDB 文件系統之文件物理結構
- MySQL · 引擎特性 · InnoDB 文件系統之IO系統和內存管理
- MySQL · 特性分析 · InnoDB transaction history
- PgSQL · 會議見聞 · PgConf.Russia 2016 大會總結
- PgSQL · 答疑解惑 · PostgreSQL 9.6 并行查詢實現分析
- MySQL · TokuDB · TokuDB之黑科技工具
- PgSQL · 性能優化 · PostgreSQL TPC-C極限優化玩法
- MariaDB · 版本特性 · MariaDB 的 GTID 介紹
- MySQL · 特性分析 · 線程池
- MySQL · 答疑解惑 · mysqldump tips 兩則
- 數據庫內核月報 - 2016/01
- MySQL · 引擎特性 · InnoDB 事務鎖系統簡介
- GPDB · 特性分析· GreenPlum Primary/Mirror 同步機制
- MySQL · 專家投稿 · MySQL5.7 的 JSON 實現
- MySQL · 特性分析 · 優化器 MRR & BKA
- MySQL · 答疑解惑 · 物理備份死鎖分析
- MySQL · TokuDB · Cachetable 的工作線程和線程池
- MySQL · 特性分析 · drop table的優化
- MySQL · 答疑解惑 · GTID不一致分析
- PgSQL · 特性分析 · Plan Hint
- MariaDB · 社區動態 · MariaDB on Power8 (下)
- 數據庫內核月報 - 2015/12
- MySQL · 引擎特性 · InnoDB 事務子系統介紹
- PgSQL · 特性介紹 · 全文搜索介紹
- MongoDB · 捉蟲動態 · Kill Hang問題排查記錄
- MySQL · 參數優化 ·RDS MySQL參數調優最佳實踐
- PgSQL · 特性分析 · 備庫激活過程分析
- MySQL · TokuDB · 讓Hot Backup更完美
- PgSQL · 答疑解惑 · 表膨脹
- MySQL · 特性分析 · Index Condition Pushdown (ICP)
- MariaDB · 社區動態 · MariaDB on Power8
- MySQL · 特性分析 · 企業版特性一覽
- 數據庫內核月報 - 2015/11
- MySQL · 社區見聞 · OOW 2015 總結 MySQL 篇
- MySQL · 特性分析 · Statement Digest
- PgSQL · 答疑解惑 · PostgreSQL 用戶組權限管理
- MySQL · 特性分析 · MDL 實現分析
- PgSQL · 特性分析 · full page write 機制
- MySQL · 捉蟲動態 · MySQL 外鍵異常分析
- MySQL · 答疑解惑 · MySQL 優化器 range 的代價計算
- MySQL · 捉蟲動態 · ORDER/GROUP BY 導致 mysqld crash
- MySQL · TokuDB · TokuDB 中的行鎖
- MySQL · 捉蟲動態 · order by limit 造成優化器選擇索引錯誤
- 數據庫內核月報 - 2015/10
- MySQL · 引擎特性 · InnoDB 全文索引簡介
- MySQL · 特性分析 · 跟蹤Metadata lock
- MySQL · 答疑解惑 · 索引過濾性太差引起CPU飆高分析
- PgSQL · 特性分析 · PG主備流復制機制
- MySQL · 捉蟲動態 · start slave crash 診斷分析
- MySQL · 捉蟲動態 · 刪除索引導致表無法打開
- PgSQL · 特性分析 · PostgreSQL Aurora方案與DEMO
- TokuDB · 捉蟲動態 · CREATE DATABASE 導致crash問題
- PgSQL · 特性分析 · pg_receivexlog工具解析
- MySQL · 特性分析 · MySQL權限存儲與管理
- 數據庫內核月報 - 2015/09
- MySQL · 引擎特性 · InnoDB Adaptive hash index介紹
- PgSQL · 特性分析 · clog異步提交一致性、原子操作與fsync
- MySQL · 捉蟲動態 · BUG 幾例
- PgSQL · 答疑解惑 · 詭異的函數返回值
- MySQL · 捉蟲動態 · 建表過程中crash造成重建表失敗
- PgSQL · 特性分析 · 談談checkpoint的調度
- MySQL · 特性分析 · 5.6 并行復制恢復實現
- MySQL · 備庫優化 · relay fetch 備庫優化
- MySQL · 特性分析 · 5.6并行復制事件分發機制
- MySQL · TokuDB · 文件目錄談
- 數據庫內核月報 - 2015/08
- MySQL · 社區動態 · InnoDB Page Compression
- PgSQL · 答疑解惑 · RDS中的PostgreSQL備庫延遲原因分析
- MySQL · 社區動態 · MySQL5.6.26 Release Note解讀
- PgSQL · 捉蟲動態 · 執行大SQL語句提示無效的內存申請大小
- MySQL · 社區動態 · MariaDB InnoDB表空間碎片整理
- PgSQL · 答疑解惑 · 歸檔進程cp命令的core文件追查
- MySQL · 答疑解惑 · open file limits
- MySQL · TokuDB · 瘋狂的 filenum++
- MySQL · 功能分析 · 5.6 并行復制實現分析
- MySQL · 功能分析 · MySQL表定義緩存
- 數據庫內核月報 - 2015/07
- MySQL · 引擎特性 · Innodb change buffer介紹
- MySQL · TokuDB · TokuDB Checkpoint機制
- PgSQL · 特性分析 · 時間線解析
- PgSQL · 功能分析 · PostGIS 在 O2O應用中的優勢
- MySQL · 引擎特性 · InnoDB index lock前世今生
- MySQL · 社區動態 · MySQL內存分配支持NUMA
- MySQL · 答疑解惑 · 外鍵刪除bug分析
- MySQL · 引擎特性 · MySQL logical read-ahead
- MySQL · 功能介紹 · binlog拉取速度的控制
- MySQL · 答疑解惑 · 浮點型的顯示問題
- 數據庫內核月報 - 2015/06
- MySQL · 引擎特性 · InnoDB 崩潰恢復過程
- MySQL · 捉蟲動態 · 唯一鍵約束失效
- MySQL · 捉蟲動態 · ALTER IGNORE TABLE導致主備不一致
- MySQL · 答疑解惑 · MySQL Sort 分頁
- MySQL · 答疑解惑 · binlog event 中的 error code
- PgSQL · 功能分析 · Listen/Notify 功能
- MySQL · 捉蟲動態 · 任性的 normal shutdown
- PgSQL · 追根究底 · WAL日志空間的意外增長
- MySQL · 社區動態 · MariaDB Role 體系
- MySQL · TokuDB · TokuDB數據文件大小計算
- 數據庫內核月報 - 2015/05
- MySQL · 引擎特性 · InnoDB redo log漫游
- MySQL · 專家投稿 · MySQL數據庫SYS CPU高的可能性分析
- MySQL · 捉蟲動態 · 5.6 與 5.5 InnoDB 不兼容導致 crash
- MySQL · 答疑解惑 · InnoDB 預讀 VS Oracle 多塊讀
- PgSQL · 社區動態 · 9.5 新功能BRIN索引
- MySQL · 捉蟲動態 · MySQL DDL BUG
- MySQL · 答疑解惑 · set names 都做了什么
- MySQL · 捉蟲動態 · 臨時表操作導致主備不一致
- TokuDB · 引擎特性 · zstd壓縮算法
- MySQL · 答疑解惑 · binlog 位點刷新策略
- 數據庫內核月報 - 2015/04
- MySQL · 引擎特性 · InnoDB undo log 漫游
- TokuDB · 產品新聞 · RDS TokuDB小手冊
- PgSQL · 社區動態 · 說一說PgSQL 9.4.1中的那些安全補丁
- MySQL · 捉蟲動態 · 連接斷開導致XA事務丟失
- MySQL · 捉蟲動態 · GTID下slave_net_timeout值太小問題
- MySQL · 捉蟲動態 · Relay log 中 GTID group 完整性檢測
- MySQL · 答疑釋惑 · UPDATE交換列單表和多表的區別
- MySQL · 捉蟲動態 · 刪被引用索引導致crash
- MySQL · 答疑釋惑 · GTID下auto_position=0時數據不一致
- 數據庫內核月報 - 2015/03
- MySQL · 答疑釋惑· 并發Replace into導致的死鎖分析
- MySQL · 性能優化· 5.7.6 InnoDB page flush 優化
- MySQL · 捉蟲動態· pid file丟失問題分析
- MySQL · 答疑釋惑· using filesort VS using temporary
- MySQL · 優化限制· MySQL index_condition_pushdown
- MySQL · 捉蟲動態·DROP DATABASE外鍵約束的GTID BUG
- MySQL · 答疑釋惑· lower_case_table_names 使用問題
- PgSQL · 特性分析· Logical Decoding探索
- PgSQL · 特性分析· jsonb類型解析
- TokuDB ·引擎機制· TokuDB線程池
- 數據庫內核月報 - 2015/02
- MySQL · 性能優化· InnoDB buffer pool flush策略漫談
- MySQL · 社區動態· 5.6.23 InnoDB相關Bugfix
- PgSQL · 特性分析· Replication Slot
- PgSQL · 特性分析· pg_prewarm
- MySQL · 答疑釋惑· InnoDB丟失自增值
- MySQL · 答疑釋惑· 5.5 和 5.6 時間類型兼容問題
- MySQL · 捉蟲動態· 變量修改導致binlog錯誤
- MariaDB · 特性分析· 表/表空間加密
- MariaDB · 特性分析· Per-query variables
- TokuDB · 特性分析· 日志詳解
- 數據庫內核月報 - 2015/01
- MySQL · 性能優化· Group Commit優化
- MySQL · 新增特性· DDL fast fail
- MySQL · 性能優化· 啟用GTID場景的性能問題及優化
- MySQL · 捉蟲動態· InnoDB自增列重復值問題
- MySQL · 優化改進· 復制性能改進過程
- MySQL · 談古論今· key分區算法演變分析
- MySQL · 捉蟲動態· mysql client crash一例
- MySQL · 捉蟲動態· 設置 gtid_purged 破壞AUTO_POSITION復制協議
- MySQL · 捉蟲動態· replicate filter 和 GTID 一起使用的問題
- TokuDB·特性分析· Optimize Table
- 數據庫內核月報 - 2014/12
- MySQL· 性能優化·5.7 Innodb事務系統
- MySQL· 踩過的坑·5.6 GTID 和存儲引擎那會事
- MySQL· 性能優化·thread pool 原理分析
- MySQL· 性能優化·并行復制外建約束問題
- MySQL· 答疑釋惑·binlog event有序性
- MySQL· 答疑釋惑·server_id為0的Rotate
- MySQL· 性能優化·Bulk Load for CREATE INDEX
- MySQL· 捉蟲動態·Opened tables block read only
- MySQL· 優化改進· GTID啟動優化
- TokuDB· Binary Log Group Commit with TokuDB
- 數據庫內核月報 - 2014/11
- MySQL· 捉蟲動態·OPTIMIZE 不存在的表
- MySQL· 捉蟲動態·SIGHUP 導致 binlog 寫錯
- MySQL· 5.7改進·Recovery改進
- MySQL· 5.7特性·高可用支持
- MySQL· 5.7優化·Metadata Lock子系統的優化
- MySQL· 5.7特性·在線Truncate undo log 表空間
- MySQL· 性能優化·hash_scan 算法的實現解析
- TokuDB· 版本優化· 7.5.0
- TokuDB· 引擎特性· FAST UPDATES
- MariaDB· 性能優化·filesort with small LIMIT optimization
- 數據庫內核月報 - 2014/10
- MySQL· 5.7重構·Optimizer Cost Model
- MySQL· 系統限制·text字段數
- MySQL· 捉蟲動態·binlog重放失敗
- MySQL· 捉蟲動態·從庫OOM
- MySQL· 捉蟲動態·崩潰恢復失敗
- MySQL· 功能改進·InnoDB Warmup特性
- MySQL· 文件結構·告別frm文件
- MariaDB· 新鮮特性·ANALYZE statement 語法
- TokuDB· 主備復制·Read Free Replication
- TokuDB· 引擎特性·壓縮
- 數據庫內核月報 - 2014/09
- MySQL· 捉蟲動態·GTID 和 DELAYED
- MySQL· 限制改進·GTID和升級
- MySQL· 捉蟲動態·GTID 和 binlog_checksum
- MySQL· 引擎差異·create_time in status
- MySQL· 參數故事·thread_concurrency
- MySQL· 捉蟲動態·auto_increment
- MariaDB· 性能優化·Extended Keys
- MariaDB·主備復制·CREATE OR REPLACE
- TokuDB· 參數故事·數據安全和性能
- TokuDB· HA方案·TokuDB熱備
- 數據庫內核月報 - 2014/08
- MySQL· 參數故事·timed_mutexes
- MySQL· 參數故事·innodb_flush_log_at_trx_commit
- MySQL· 捉蟲動態·Count(Distinct) ERROR
- MySQL· 捉蟲動態·mysqldump BUFFER OVERFLOW
- MySQL· 捉蟲動態·long semaphore waits
- MariaDB·分支特性·支持大于16K的InnoDB Page Size
- MariaDB·分支特性·FusionIO特性支持
- TokuDB· 性能優化·Bulk Fetch
- TokuDB· 數據結構·Fractal-Trees與LSM-Trees對比
- TokuDB·社區八卦·TokuDB團隊