MySQL HA 高可用性,MySQL Cluster 叢集
MySQL Cluster,需要的 server 要三台(含)以上,是不需要當心 primary key 重覆的問題,它架構分 Manage Nodes、Data Nodes、SQL Nodes,網路上有很多文章都說 Data Node 是存放資料的地方,明明 SQL Nodes 就存在著 mysql test XXX 等資料庫名稱啊,為何說它是存資料的地方,不會意思是 Data Nodes 是存資料在記憶體的意思吧,是的沒錯,Data Node 確實是儲存資料的地方 (ndbd程序),只是它不是像 /var/lib/mysql 的樣子可以容易被我們看得懂,Data Node 是將資料及index放在記憶體中,且也有存在硬碟裡(停止程序時再啟動資料是還在的),不過當記憶體不足時,它會有錯誤( table XXX is full),新版是有支援寫到硬碟裡。而 SQL Node (mysqld程序) 只是讓我們建立資料庫、表的地方 (看得到/var/lib/mysql/XXX),只是 SQL Node 這邊是看不到實際空間用量的。
環境
manager node: 10.10.10.137
data node1: 10.10.10.135
data node2: 10.10.10.134
data node3: 10.10.10.171
sql node1: 10.10.10.135
sql node2: 10.10.10.134
sql node3: 10.10.10.171
manager node 及所有的 node 都要裝 mysql-cluster (到 mysql 官網下載)
tar zxf mysql-cluster-gpl-7.4.6-linux-glibc2.5-x86_64.tar.gz mv mysql-cluster-gpl-7.4.6-linux-glibc2.5-x86_64 /usr/local/mysql
manager node
mkdir /var/lib/mysql-cluster
cat <<EOF> /var/lib/mysql-cluster/config.ini [ndb_mgmd default] datadir=/var/lib/mysql-cluster [ndbd default] NoOfReplicas=3 DataMemory=80M IndexMemory=18M datadir=/usr/local/mysql/data [ndb_mgmd] NodeId=1 hostname=10.10.10.137 [ndbd] NodeId=2 hostname=10.10.10.135 [ndbd] NodeId=3 hostname=10.10.10.134 [ndbd] NodeId=4 hostname=10.10.10.171 [mysqld] NodeId=5 hostname=10.10.10.135 [mysqld] NodeId=6 hostname=10.10.10.134 [mysqld] NodeId=7 hostname=10.10.10.171 EOF
manager node 設定,它只要 ndb_mgm 與 ndb_mgmd 而已
cp -rp /usr/local/mysql/bin/ndb_mgm* /usr/local/bin/ chmod +x /usr/local/bin/ndb_mgm*
data nodes
cat <<EOF> /etc/my.cnf [mysqld] # enable mysql cluster ndbcluster # 與 manager 連線,default port 是 1186 ndb-connectstring=10.10.10.137:1186 [mysql_cluster] ndb-connectstring=10.10.10.137:1186 EOF
sql nodes
useradd -d /usr/local/mysql mysql cd /usr/local/mysql chown -R root . chown -R mysql data chgrp -R mysql .
cat <<EOF> /etc/my.cnf [mysqld] datadir=/usr/local/mysql/data socket=/usr/local/mysql/data/mysql.sock user=mysql # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 default_storage_engine=ndbcluster # enable mysql cluster ndbcluster # 與 manager 連線,default port 是 1186 ndb-connectstring=10.10.10.137:1186 [mysql_cluster] ndb-connectstring=10.10.10.137:1186 [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid [client] socket=/usr/local/mysql/data/mysql.sock EOF
sql nodes
cd /usr/local/mysql ./scripts/mysql_install_db --user=mysql
yes|cp -rp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql.server chmod +x /etc/init.d/mysql.server
cluster 環境開始執行
manager node
ndb_mgmd --nodaemon -v -f /var/lib/mysql-cluster/config.ini
data nodes
/usr/local/mysql/bin/ndbd --defaults-file=/etc/my.cnf -v --nodaemon --initial
–initial 只能在第一次完全無正式資料時啟用,不然原資料就會毀了
第二次之後要再啟動,只要如此即可
/usr/local/mysql/bin/ndbd --defaults-file=/etc/my.cnf -v --nodaemon
–nodaemon 我只是測試用方便,正式跑時可以省略
sql nodes
/etc/init.d/mysql.server start
匯入已存在的 sql
需要把它們的 engine 都改成 ndbcluster
一定要是 ndb 的 engine,cluster 才會同步
sql nodes 的 mysql 起來後,改一下 root 密碼
/usr/local/mysql/bin/mysqladmin -u root password '123456'
如果有使用 phpmyadmin 遇到無法登入的情況 (錯誤 #2002 無法登入 MySQL 伺服器),那是因為 socket 檔的關系
ln -s /usr/local/mysql/data/mysql.sock /var/lib/mysql/
查看狀態,在 monitor 上
ndb_mgm -e show
Connected to Management Server at: localhost:1186 Cluster Configuration --------------------- [ndbd(NDB)] 3 node(s) id=2 @10.10.10.135 (mysql-5.6.24 ndb-7.4.6, Nodegroup: 0, *) id=3 @10.10.10.134 (mysql-5.6.24 ndb-7.4.6, Nodegroup: 0) id=4 @10.10.10.171 (mysql-5.6.24 ndb-7.4.6, Nodegroup: 0) [ndb_mgmd(MGM)] 1 node(s) id=1 @10.10.10.137 (mysql-5.6.24 ndb-7.4.6) [mysqld(API)] 3 node(s) id=5 @10.10.10.135 (mysql-5.6.24 ndb-7.4.6) id=6 @10.10.10.134 (mysql-5.6.24 ndb-7.4.6) id=7 @10.10.10.171 (mysql-5.6.24 ndb-7.4.6)
我測試時是用 virtualbox 架設環境的
- centos 6.4 x64
- 1 core cpu
- 512MB ram
- 500GB disk
- wordpress 4.2.2
在大量 insert 資料時,我看 data nodes 每台的 ndbd 的 cpu 使用率在 30% 以下
當我真的 insert 資料後,可以發現在 sql nodes 用 phpmyadmin 查看時,大小的欄位是寫未知,也就是無法知道容量用了多少,就算 du -sh /usr/local/mysql/data/DBNAME 也永遠都是 148KB,也就是說 sql node 只是讓你用來連線 3306 用的,真正的資料確實存在於 data nodes (即 ndbd 啟動的地方)。
情境測試
1x manage node + 1x sql node + 3x data nodes 的情況下
only manage node 掛了,服務正常
1x data node 掛了,服務正常
2x data node 掛了,服務正常
1x data node > 1x data node > 1x manage node 依序掛了,服務正常
1x manage node > 1x data node 依序掛了,中斷,因為 manage node 是負責管理掌管者,沒有它就不知道誰掛了後要怎麼處理了
假如其中一台 data node 掛了,要再起來,不過中途是有資料再寫入了,這台 data node 就要 –initial
Q: index 與 data 是存在 memory,那存在 disk 怎麼作 ?
Q: 怎麼查資料用量 ?
Q: 當 ndbd 的 %MEM 100%時 ?
Q: ERROR 1114 (HY000): The table ‘wp_posts’ is full
A: 評估用量,然後用 http://www.severalnines.com/clusterconfigurator 計算
其它 table full 情況
http://blog.snsgou.com/post-132.html DataMemory=15000M IndexMemory=2560M http://www.greensoftcode.net/techntxt/20135434119419995310 1.config.ini [ndbd default] NoOfReplicas=2 MaxNoOfConcurrentOperations=10000 DataMemory=320M IndexMemory=96M TimeBetweenWatchDogCheck=30000 MaxNoOfOrderedIndexes=512 2.my.cnf [mysqld] ndbcluster ndb-connectstring=124.95.137.12 optimizer_switch=engine_condition_pushdown=off http://www.aichengxu.com/view/51918 場景一,數據空間或索引內存空間滿 DataMemory= 80 M IndexMemory= 20 M 場景二,索引數量限制 MaxNoOfTables= 1024 MaxNoOfOrderedIndexes= 10240 MaxNoOfUniqueHashIndexes= 10240 場景三,數據目錄所在的硬盤空間滿了
Q: 假如把全部 ndbd 全停用時,資料還在嗎 ?
A: 在,但不知道怎麼查看內容 (實際存在狀態)
QA: 要完成 MySQL 叢集的運作環境最少需要 3 台伺服器,MySQL 官方建議最少用 4 台
QA: manage node 不要和 data node 同一台
QA: Management 可以跟 SQL node 放同一台
QA: Management 掛了,不影響服務,除了 Data Node 跟著掛了,所以可以配置兩台 Management 防止
以下參考 MySQL Cluster FAQ 截取一些說明
現在的 MySQL Cluster 7.3 版本,已是 MySQL 5.6 了 硬體規格 CPU: Intel/AMD x86, UltraSPARC Memory: Minimum 1GB RAM HDD: 3GB Network: 1+ nodes (Gigabit Ethernet - TCP/IP) 誰適合 High volume OLTP Real time analytics Ecommerce and financial trading with fraud detection Mobile and micro-payments Session management & caching Feed streaming, analysis and recommendations Content management and delivery Massively Multiplayer Online Games Communications and presence services Subscriber/user profile management and entitlements Availability 99.999% (<5 min downtime/year) Performance http://www.mysql.com/why-mysql/benchmarks/mysql-cluster/ 每秒可達 200 萬查詢量 (前提要有好的硬體設備) (http://ssorc.tw/5664) 數量配置 2 x data nodes 2 x SQL/NoSQL Application Nodes 2 x Management Nodes MySQL Cluster 使用是要購買 License 的 MySQL Cluster 記憶體需求的計算公式: (SizeofDatabase × NumberOfReplicas × 1.1 ) / NumberOfDataNodes
* 官方建議叢集伺服器的節點(Node) 硬體配備最低需求: CPU: Intel/AMD x86 Memory: 512MB RAM HDD: 3GB Network: 1+ nodes (Standard Ethernet - TCP/IP) 最佳硬體配備: CPU: 2x Intel Xeon, Intel Itanium, AMD Opteron, Sun SPARC, IBM PowerPC Memory: 16GB RAM HDD: 4x 36GB SCSI (RAID 1 Controller) Network: 1-8 Nodes (Gigabit Ethernet); 8+ Nodes (Dedicated Cluster Interconnect e.g. SCI) 要完成 MySQL 叢集的運作環境最少需要 3 台伺服器,MySQL 官方建議最少用 4 台 Management 可以跟 SQL node 放同一台 Management 不能跟 Data node 放同一台 Management 掛了,不影響服務,除了 Data Node 跟著掛了,所以可以配置兩台 Management 防止 Split-Brain 是叢集應用中常見的問題。簡單的說,當叢集中的兩個節點間斷線時,便會認為對方停止服務,因此認為自己是叢集中唯一的節點,於是開始嘗試取代對方的服務,這種狀況通常稱為 Split-brain。
The post MySQL HA 高可用性,MySQL Cluster 叢集 appeared first on SSORC.tw.