MySQL Cluster是一個高性能、可擴展、集羣化數據庫產品。MySQL Cluster是一個基於NDB Cluster存儲引擎的完整分佈式數據庫系統,採用無共享的數據存儲技術,實時同步且支持快速故障切換、事務。NDB是一種in-memory的存儲引擎,它具備可用性高和數據一致性好的特色。html
MySQL Cluster可由多臺服務器組成的、同時對外提供數據管理服務的分佈式集羣系統。經過合理的配置,能夠將服務請求在多臺物理機上分發實現負載均衡 ;同時內部實現了冗餘機制,在部分服務器宕機的狀況下,整個集羣對外提供的服務不受影響,從而能達到99.999%以上的高可用性。node
MySQL Cluster分爲三類節點:mysql
數據節點(Data Nodes):用於存儲集羣的數據。實現底層數據存儲的功能,保存Cluster 的數據。每個NDB 節點保存完整數據的一部分(或者一份完整的數據,視節點數目和配置而定),在MySQL Cluster 裏面叫作一個fragment。而每個fragment,正常狀況來說都會在其餘的主機上面有一份(或者多分)徹底相同的鏡像存在。這些都是經過配置來完成的,因此只要配置得當,MySQL Cluster 在存儲層不會出現單點的問題。數據節點是用命令ndbd
啓動的。linux
SQL節點(SQL Nodes):向外提供一個標準的SQL語言編程接口。SQL節點負責向數據節點傳送訪問請求,具體集羣過程以及數據庫底層均對外透明。
SQL節點提供用戶SQL指令請求,解析、鏈接管理,query優化和響、cache管理等、數據merge、sort,裁剪等功能,當SQL節點啓動時,將向管理節點同步架構信息,用以數據查詢路由。SQL節點做爲查詢入口,須要消耗大量cpu及內存資源,可以使用分佈式管理節點,並在SQL節點外封裝一層請求分發及HA控制機制可解決單點及性能問題,其提供了線性擴展功能。SQL節點是使用命令mysqld -ndbcluster
啓動的,或將ndbcluster
添加到「my.cnf」後使用「mysqld」啓動。sql
管理節點(NDB Management Server):負責整個Cluster 集羣中各個節點的管理工做,包括集羣的配置,啓動關閉各節點,以及實施數據的備份恢復等。管理節點會獲取整個Cluster 環境中各節點的狀態和錯誤信息,而且將各Cluster 集羣中各個節點的信息反饋給整個集羣中其餘的全部節點。一般只需配置一個管理節點;然而爲了排除單點故障須要,有可能的話,儘可能增長管理節點的數量。MGM節點是用命令ndb_mgm
啓動的。數據庫
環境準備編程
數據節點:192.168.1.5 192.168.1.6
SQL節點:192.168.1.2 192.168.1.11
管理節點:192.168.1.10vim
Mysql集羣軟件:mysql-cluster-gpl-7.2.8-linux2.6-x86_64.tar.gz 下載地址服務器
管理節點配置架構
將MySQL集羣軟件拷貝到管理節點的/usr/local目錄下並解壓爲mysql,MySQLCluster管理節點默認是要安裝在/usr/local下的,不然啓動會報錯
添加用戶及用戶組
# groupadd mysql # useradd -g mysql mysql
更改所屬用戶和組
# chown -R mysql:mysql mysql
拷貝配置文件
# cp mysql-cluster/support-files/ndb-config-2-node.ini /etc/ndb-config.ini
修改配置文件,管理節點的配置文件很是重要,會影響整個集羣
# vim /etc/ndb-config.ini [ndbd default] NoOfReplicas= 2 #定義在Cluster環境中複製份數 DataMemory= 80M #分配的數據內存大小,根據本機服務器內存適量來分配,實際運用中須要分配很大 IndexMemory= 24M #設定用於存放索引(非主鍵)數據的內存段大小 #一個NDB節點能存放的數據量是會受到DataMemory和IndexMemory兩個參數設置的約束,二者任何一個達到限制數量後,都沒法再增長能存儲的數據量。若是繼續存入數據系統會報錯「table is full」。 DataDir= /var/lib/mysql-cluster #用於存放集羣日誌信息 DataMeomory=1400M IndexMemory=600M LockPagesInMainMemory=1 # 會有問題 MaxNoOfConcurrentOperations=500000 TimeBetweenLocalCheckpoints=20 TimeBetweenGlobalCheckpoints=1000 TimeBetweenEpochs=100 TimeBetweenWatchdogCheckInitial=60000 TransactionInactiveTimeout =50000 MaxNoOfExecutionThreads=8 BatchSizePerLocalScan=512 MaxNoOfOrderedIndexes=512 MaxNoOfConcurrentOperations= 10000 [ndb_mgmd] Id=1 Hostname=192.168.1.10 # Hostname or IP address #肯定該目錄存在,並修改所屬用戶爲mysql DataDir= /var/lib/mysql-cluster # Directory for MGM node logfiles [ndbd] Id= 2 HostName= 192.168.1.5 # Hostname or IP address datadir=/usr/local/mysql/data # Directory for this data node's datafiles,數據節點存放數據的目錄 [ndbd] Id= 3 HostName= 192.168.1.6 datadir=/usr/local/mysql/data [mysqld] Id= 4 HostName= 192.168.1.2 #能夠預留一些節點 # choose an unused port number # in this configuration 63132, 63133, and 63134 # will be used [tcp default] PortNumber= 63132
配置完後啓動管理節點
# ./ndb_mgmd --initial -f /etc/ndb-config.ini MySQL Cluster Management Server mysql-5.5.27 ndb-7.2.8 2014-08-29 11:22:04 [MgmtSrvr] WARNING -- at line 31: [MGM] Id is deprecated, use NodeId instead 2014-08-29 11:22:04 [MgmtSrvr] WARNING -- at line 35: [DB] Id is deprecated, use NodeId instead 2014-08-29 11:22:04 [MgmtSrvr] WARNING -- at line 39: [DB] Id is deprecated, use NodeId instead 2014-08-29 11:22:04 [MgmtSrvr] WARNING -- at line 43: [API] Id is deprecated, use NodeId instead 2014-08-29 11:22:04 [MgmtSrvr] WARNING -- at line 50: [tcp] PortNumber is deprecated 2014-08-29 11:22:04 [MgmtSrvr] WARNING -- at line 31: [MGM] Id is deprecated, use NodeId instead 2014-08-29 11:22:04 [MgmtSrvr] WARNING -- at line 35: [DB] Id is deprecated, use NodeId instead 2014-08-29 11:22:04 [MgmtSrvr] WARNING -- at line 39: [DB] Id is deprecated, use NodeId instead 2014-08-29 11:22:04 [MgmtSrvr] WARNING -- at line 43: [API] Id is deprecated, use NodeId instead 2014-08-29 11:22:04 [MgmtSrvr] WARNING -- at line 50: [tcp] PortNumber is deprecated
其中--initial指定初始化加載,每次修改管理節點的配置重啓都須要加上,不然不會生效;-f指定管理節點的參數文件
肯定ndb_mgm進程及端口號
# netstat -langput | grep mgm tcp 0 0 0.0.0.0:1186 0.0.0.0:* LISTEN 3427/ndb_mgmd tcp 0 0 127.0.0.1:45251 127.0.0.1:1186 ESTABLISHED 3427/ndb_mgmd tcp 0 0 127.0.0.1:1186 127.0.0.1:45251 ESTABLISHED 3427/ndb_mgmd
其中1186是管理節點的服務端口
查看集羣信息
# ./ndb_mgm -- NDB Cluster -- Management Client -- ndb_mgm> show Connected to Management Server at: localhost:1186 Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=2 (not connected, accepting connect from 192.168.1.5) id=3 (not connected, accepting connect from 192.168.1.6) [ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.1.10 (mysql-5.5.27 ndb-7.2.8) [mysqld(API)] 1 node(s) id=4 (not connected, accepting connect from 192.168.1.2)
能夠看到當前只有管理節點,其餘節點還未啓動。
數據節點和SQL節點配置
解壓MySQLCluster軟件到指定目錄/usr/local,數據節點能夠不用放在/usr/local目錄下
添加用戶及用戶組
# groupadd mysql # useradd -g mysql mysql
更改所屬用戶和組
# chown -R mysql:mysql mysql
安裝數據庫
# /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
拷貝配置文件
# cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf
修改配置文件
vim /etc/my.cnf # Options for mysqld process: [MYSQLD] ndbcluster # run NDB engine character_set_server=utf8 ndb-connectstring=198.168.1.10 # location of MGM node # Options for ndbd process: [MYSQL_CLUSTER] ndb-connectstring=198.168.1.10 # location of MGM node
啓動數據節點
# ./ndbd --initial 2014-08-29 14:04:54 [ndbd] INFO -- Angel connected to '192.168.1.10:1186' 2014-08-29 14:04:54 [ndbd] INFO -- Angel allocated nodeid: 2
啓動SQL節點
# ./mysqld_safe --user=mysql &
SQL節點啓動能夠添加到系統服務
拷貝運行腳本,添加可執行權限
# cp support-files/mysql.server /etc/init.d/mysqld # chmod +x /etc/init.d/mysqld
啓動數據庫
# service mysqld start Starting MySQL.... [ OK ]
查看集羣信息
# ndb_mgm -e show Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=2 @192.168.1.5 (mysql-5.5.27 ndb-7.2.8, Nodegroup: 0, Master) id=3 @192.168.1.6 (mysql-5.5.27 ndb-7.2.8, Nodegroup: 0) [ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.1.10 (mysql-5.5.27 ndb-7.2.8) [mysqld(API)] 2 node(s) id=4 @192.168.1.2 (mysql-5.5.27 ndb-7.2.8) id=5 @192.168.1.11 (mysql-5.5.27 ndb-7.2.8)
能夠看到當前全部節點均已啓動
集羣管理
查看集羣內存使用狀況
ndb_mgm> all report memoryusage;
關閉集羣順序:SQL節點->數據節點->管理節點 或者使用# ./ndb_mgm -e shutdown
命令關閉集羣
啓動集羣順序: 管理節點->數據節點->SQL節點
驗證測試
經過SQL節點(192.168.1.2記爲SQL1/192.168.1.11記爲SQL2)連入MySQL數據庫
# ./mysql mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | ndbinfo | | performance_schema | | test | +--------------------+ 5 rows in set (0.04 sec)
修改密碼
mysql> set password=password('root');
數據同步測試
鏈接SQL1,建立數據庫dufu,建立成功
鏈接SQL2,查看到建立成功的數據庫dufu
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | dufu | | mysql | | ndbinfo | | performance_schema | | test | +--------------------+ 6 rows in set (0.00 sec)
SQL1建立表,插入數據
mysql> use dufu; Database changed mysql> create table t(i int,name varchar(10)) engine=ndbcluster; Query OK, 0 rows affected (0.22 sec) mysql> insert into t values(1,'this_sql1'); Query OK, 1 row affected (0.01 sec)
SQL2查詢
mysql> select * from t; +------+-----------+ | i | name | +------+-----------+ | 1 | this_sql1 | +------+-----------+ 1 row in set (0.01 sec)
經過以上測試,SQL集羣數據是同步的。
可用性測試
關掉數據節點1或SQL節點1,看集羣是否可以正常工做
通過測試,關閉冗餘節點不會對MySQL集羣形成影響,失敗節點從新啓動後會再次加入加羣。能夠經過管理節點查看到各個節點的狀態
遇到的問題
以上測試只是針對MySQLCluster簡單的驗證測試,後面咱們組織了一次更大壓力的測試,400~1000併發,每一個鏈接執行100次循環,每一個查詢約有5000條數據,同時執行進行的讀操做在40000~100000之間,出現了不少問題。
首先是數據節點啓動問題:
Ndb kernel thread 4 is stuck in: Job Handling elapsed=100 Watchdog: User time: 82 System time: 667 Ndb kernel thread 4 is stuck in: Job Handling elapsed=200 Watchdog: User time: 82 System time: 668 Ndb kernel thread 4 is stuck in: Job Handling elapsed=300 Watchdog: User time: 82 System time: 669 Ndb kernel thread 4 is stuck in: Job Handling elapsed=400 Watchdog: User time: 82 System time: 670
內存不夠或者datamemory、indexmemory設置過大、maxnooflocalscans設置過大致使,經過增大服務器硬件資源以及調大內存設置大小解決。
併發加大後出現:
too many connections
SQL節點的max_connections默認參數爲150,調整該參數大小爲1000解決。
併發加大後出現:
ERROR 1205 (HY000) at line 10208: Lock wait timeout exceeded; try restarting transaction
TransactionDeadlockDetectionTimeout默認只有1200,調整該參數爲10000後解決。調整完後須要重啓集羣
併發加到1000後,錯誤率急劇上升,出現:
got temporary error 245 'too many active scans' from ndbcluster
NaxNoOfConcurrentScans參數過小,默認最大爲500.調整爲500後,仍是繼續報錯-_-!,可能與MaxNoOfLocalScans參數有關。
更新操做,併發加到1000後,出現:
ERROR 1297 (HY000): Got temporary error 410 'REDO log files overloaded (decrease TimeBetweenLocalCheckpoints or increase NoOfFragmentLogFiles)' from NDBCLUSTER
改錯表示redo日誌可能過小,須要調整redo日誌大小,設置TimeBetweenLocalCheckpoints=30NoOfFragmentLogFiles=128(還未試驗)