天天看點

MySQL Cluster 資料分布(分區、分組)

資料分布

1、MySQL Cluster自動分區資料表(也可能使用使用者自定義分區),将資料分布到分區中;

2、一個資料表被劃分到多個Data Node分區中,資料在分區中被”striped”;

3、主鍵的 hashing 決定哪個分區擁有資料(自動分布);

4、對主鍵的一部分進行hashing也是可能的(适合sharding和資料局部性);

分區和資料分布

1、如果有兩個資料節點(DATA NODE 1和DATA NODE 2),每個資料表都被分到兩個分區中。

2、subid是主鍵,對主鍵subid進行的hashing決定分區。當然對主鍵的一分部分(part of PK)進行hashing也是可能的。

  • -奇數主鍵(綠色部分)
  • -偶數主鍵(紅色部分)
MySQL Cluster 資料分布(分區、分組)

副本(Replicas)

1、為了提供備援和快速故障轉移,分區之間是同步複制的;

2、最常用的是用兩個副本(兩份資料):

  • - 使用1個,2個,3個,4個副本也都是可能的
  • - NoOfReplicas=2
MySQL Cluster 資料分布(分區、分組)
MySQL Cluster 資料分布(分區、分組)

3、分區間的同步複制是從主分區(PRIMARY)到輔助分區(SECONDARY)

  • - 當有一個變更(下圖實體圓心表示變更)發生在P0的時候,它将同步複制到S0
  • - 這個變更在事務commit的時候被持久化
  • - P0或S0将被更新,或什麼都不做
MySQL Cluster 資料分布(分區、分組)

資料分布 – 磁盤日志記錄(disk logging)

1、資料在commit之後會在主記憶體中(main memory)

(1).但是改變(changes)是REDO日志記錄的(REDO LOGGED),而REDO日志是每N毫秒(推薦1000ms)重新整理到磁盤

  由TimeBetweenGlobalCheckpoints參數控制

  類似innodb-flush-log-at-trx_commit=2

(2).資料同時被checkpoint到磁盤

2、磁盤日志記錄使得恢複一個完全失敗的cluster成為可能

節點組(Node groups)

1、共享同樣資料的節點屬于同一個節點組

2、一個節點組包含節點數等于副本數。(下圖使用NoOfReplicas=2)

MySQL Cluster 資料分布(分區、分組)

3、兩個副本-四個資料節點

(1).四個資料節點-四個分區-兩個副本

(2).四個節點和兩個副本–>兩個節點組

   - 節點組數目 = 總節點數 / 副本數

MySQL Cluster 資料分布(分區、分組)

4、三個副本-三個資料節點

(1).三個資料節點-三個分區

- 更多的副本,“寫”更慢

(2).三個節點和三個副本–>一個節點組(這種方式不常用)

- 兩個副本是慣例

MySQL Cluster 資料分布(分區、分組)

5、副本使用建議

(1).推薦使用兩個副本- 性能和可用性是最好的折衷

(2).三個或四個副本寫比較慢,使用這種方式部署相對更少

(3).“寫”成本

   - 1個副本(沒備援): cost X

   - 2個副本: cost 2X

   - 三個副本: cost 3X

驗證資料分布

用法:

ndb_desc -c connect_string tbl_name -d db_name [-p]
mysql> select * from ndbtest.tbl;
+---+
| a |
+---+
| 3 |
| 6 |
| 5 |
| 1 |
| 2 |
| 4 |
+---+
6 rows in set (0.01 sec)

mysql>      
MySQL Cluster 資料分布(分區、分組)