MySQL Cluster搭建及配置

MySQL Cluster介紹

MySQL Cluster是一個高性能、可擴展、集羣化數據庫產品。MySQL Cluster是一個基於NDB Cluster存儲引擎的完整分佈式數據庫系統,採用無共享的數據存儲技術,實時同步且支持快速故障切換、事務。NDB是一種in-memory的存儲引擎,它具備可用性高和數據一致性好的特色。html

MySQL Cluster可由多臺服務器組成的、同時對外提供數據管理服務的分佈式集羣系統。經過合理的配置,能夠將服務請求在多臺物理機上分發實現負載均衡 ;同時內部實現了冗餘機制,在部分服務器宕機的狀況下,整個集羣對外提供的服務不受影響,從而能達到99.999%以上的高可用性。node

MySQLCluster組成

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啓動的。數據庫

MySQL Cluster搭建

環境準備編程

數據節點: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(還未試驗)

相關文章
相關標籤/搜索