2021年5月31日 星期一

MySQL NDB Cluster 設定/資源/啟動

Data node 記憶體需求計算

Ndb cluster是把資料、索引全部放記憶體,所以記憶體需求很高。

(SizeofDatabase × NumberOfReplicas × 1.1 ) / NumberOfDataNodes

範例:
(200G * 2 *1.1)/ 2 =220G

Node Group 數量計算

每個節點組,要有相同的 data node 數量

Node group = Data nodes / NoOfReplicas
假設有4個 data node
config.ini中
NoOfReplicas=1,4/1=4,有4個節點組,每個節點組1個副本
NoOfReplicas=2,4/2=2,有2個節點組,每個節點組2個副本
NoOfReplicas=4,4/4=1,有1個節點組,有4個副本

NDB cluster 的重點是 data node,
以 data node 為中心。

SQL 語法不同

CREATE TABLE 要加上 ENGING=NDBCluster

CREATE TABLE tbl_name (col_name column_definitions) ENGINE=NDBCLUSTER;

每个NDBCLUSTERtable 都有一个主键。
如果在创建 table 时用户未定义主键,
则NDBCLUSTER存储引擎会自动生成一个隐藏的主键

ALTER TABLE 要加上 ENGING=NDBCluster

ALTER TABLE tbl_name ENGINE=NDBCLUSTER;

Cluster Online 開關測試

ndb_mgm> 1 stop 	// stop data node id 4
shell> ndbd 	//在 data node id 4 啟動 ndbd
//可正常關閉、啟動
  
ndb_mgm> 1 stop
shell> ndbd --initial //用 initial option 啟動
//可正常、關閉啟動,資料無影響
  
ndb_mgm> 1 stop
shell> ndbd
ndb_mgm> exit 	//ndb 啟動中, mgm exit
//可正常、關閉啟動
  
ndb_mgm> 1 stop
shell> ndbd 
ndb_mgm> exit     //ndb 啟動中, mgm exit
//可正常、關閉啟動
  
ndb_mgm> 1 stop
shell> ndbd --initial
ndb_mgm> exit 	//ndb initial 啟動中, mgm exit
//可正常、關閉啟動

關全部 ndb_mgmd

shell> kill 全部 ndb_mgmd
shell> 啟動第一台 ndb_mgmd -f /var/lib/mysql-cluster/config.ini --reload
shell> 啟動第二台 ndb_mgmd -f /var/lib/mysql-cluster/config.ini
ndb_mgm> 1 stop //依序關閉,啟動 ndbd

先關data,再關全部 ndb_mgmd

ndb_mgm> 1 stop
shell> kill 全部 ndb_mgmdpid
shell> 啟動第一台 ndb_mgmd -f /var/lib/mysql-cluster/config.ini --reload
shell> 啟動第二台 ndb_mgmd -f /var/lib/mysql-cluster/config.ini
shell> ndbd (node 1)
shell> ndbd --initial (node 2) //第二台需要initial

啟動各node

首次啟動

 啟動順序:
1 shell>sudo ndb_mgmd --initial -f /var/lib/mysql-cluster/config.ini --reload
有更改 config.ini ,重新啟動 mgmd 要加 --reload,沒更改不需加。

2 shell>sudo ndbd(data node全部) 
3 shell>sudo systemctl start mysqld(sql node全部)

一般啟動

 啟動順序:
1 shell>sudo ndb_mgmd  -f /var/lib/mysql-cluster/config.ini --reload
2 shell>sudo ndbd(data node全部) 
帶c參數  shell> sudo ndbd -c 10.10.100.100  //指定 mgm 位址
帶initial參數 shell>sudo ndbd --initial  ////會重整這台ndbd的文件,只有第一次需要,每次都下initial 也沒關係
--initial 會清掉這台ndb 的file system,並且從其他node 載入data 及 metadata.

3 shell>sudo systemctl start mysqld(sql node全部)

一般關閉

關閉順序:
1 shell>sudo systemctl stop mysqld
2 ndb_mgm> node_id stop
3 kill ndb_mgm_pid(kill mgm process)

關閉重啟某個 data node

關閉順序:
1 ndb_mgm> node_id stop
2 等關閉完成
3 shell > ndbd / ndbd --initial

Rolling Restart (依序重啟cluster mgm/data node)

有幾種情況需要重啟

1 改 config.ini
2 增加 data node
3 改 node host
4 cluster重啟

流程:
1 關掉全部 ndb_mgmd,改全部 config.ini,全部重啟,reload config。
shell>ndb_mgmd -f /var/lib/mysql-cluster/config.ini --reload //第一個 ndb_mgmd
shell>ndb_mgmd	//其餘的 ndb_mgmd
  如果有某個 ndb_mgmd 在執行,那麼啟動的ndb_mgmd,會使用該程式的設定,
  所以要全部關閉才會生效。只有第一個ndb_mgmd --reload,後續的不需要 reload。
  
2 依序關閉 ndbd,改config, 重啟。可依序 node 處理。
3 依序關閉 mysql,改 config,重啟。可依序處理。

實務開關經驗

備份某個200G的線上 data node,要5小時

啟動某個200G的線上 data node,要3.5小時

關閉某個200G的線上 data node,要 ? 小時

設定檔

ndb_mgmd 設定檔 config.ini

/var/lib/mysql-cluster/confing.ini
[ndb_mgmd]
#Management Node 1
HostName=10.10.100.157
DataDir=/var/lib/mysql-cluster

[ndb_mgmd]
#Management Node 2
HostName=10.10.100.199
DataDir=/var/lib/mysql-cluster

[ndbd default]
NoOfReplicas=2 	# Number of replicas
DataMemory=912G # Memory allocate for data storage
IndexMemory = 48G
DataDir=/var/lib/mysql-cluster
MaxNoOfTables = 1024
MaxNoOfAttributes = 5000000
MaxNoOfOrderedIndexes = 100000
FragmentLogFileSize=256M
MaxNoOfConcurrentOperations=400000
MaxNoOfLocalOperations=440000

//配置多少記憶體給string,例如table name
//defalut 25 = 25% 最大 25
//超過 100,ndbd會解釋為設定多少 bytes
#StringMemory=25	



[ndbd]
HostName=10.10.100.157
NodeId=3

[ndbd]
HostName=10.10.100.199
NodeId=4

[mysqld]
#Node 5
HostName=10.10.100.165

[mysqld]
#Node 6
HostName=10.10.100.166

[mysqld]
#Node 7
HostName=10.10.100.200

[mysqld]
#Node 8
HostName=10.10.100.201

ndbd 設定檔

/etc/my.cnf
[mysqld]
ndbcluster
ndb-connectstring=10.10.100.157
ndb-connectstring=10.10.100.199

[MYSQL_CLUSTER]
ndb-connectstring=10.10.100.157
ndb-connectstring=10.10.100.199

mysql node設定檔

/etc/my.cnf
[mysqld]
ndbcluster
ndb-connectstring=10.10.100.157
ndb-connectstring=10.10.100.199

default-storage-engine=NDBCLUSTER

validate_password_length=6
validate_password_policy=LOW

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

max_connections=5000
max_connect_errors=1844674407370954751
connect_timeout=15
default-time-zone='+07:00'
max_user_connections=4900

#slow query
slow_query_log=1
slow_query_log_file=/var/lib/mysql/slow-query.log
long_query_time=1

max_heap_table_size=1024M
tmp_table_size=1024M

[MYSQL_CLUSTER]
ndb-connectstring=10.10.100.157
ndb-connectstring=10.10.100.199

沒有留言:

張貼留言