1. 參考文檔 http://xuwensong.elastos.org/2014/01/13/ubuntu-%E4%B8%8Bmysql-cluster%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE/ 2. 簡介 MySQL-Cluster是一種技術,該 ...
1. 參考文檔
http://xuwensong.elastos.org/2014/01/13/ubuntu-%E4%B8%8Bmysql-cluster%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE/
2. 簡介
MySQL-Cluster是一種技術,該技術允許在無共用的系統中部署“記憶體中”資料庫的簇。通過無共用體繫結構,系統能夠使用廉價的硬體,而且對軟硬體無特殊要求。此外,由於每個組件都有自己的記憶體和磁碟,所以不存在單點故障。
MySQL簇將標準的MySQL伺服器與名為NDB的“記憶體中”的簇式存儲引擎集成了起來。術語NDB指的是與存儲引擎相關的設置部分,而術語“MySQL簇”指的是MySQL和NDB存儲引擎的組合。
MySQL簇由一組電腦構成,每台電腦上均運行著多種進程,包括MySQL伺服器,NDB簇的數據節點,管理伺服器(MGM),以及(可能)專門的數據訪問程式。關於簇中組件的關係,如下圖:
所有這些程式一起構成了MySQL簇。將數據保存到NBD簇引擎中時,表將保存在數據節點內。能夠從簇中所有其他MySQL伺服器直接訪問這些表。因此,假如在將數據保存在簇內的工資應用程式中,如果某一應用程式更新了一位雇員的工資,所有查詢該數據的其他MySQL 伺服器能立刻發現這種變化。
對於MySQL簇,保存在數據節點的數據可被映射,簇能夠處理單獨數據節點的故障,除了少數事物將因事物狀態丟失而被放棄外,不會產生其他影響。由於事物性應用程式能夠處理失敗事宜,因而它不是問題源。
3. MySQL簇的基本概念
NDB 是一種“記憶體中”存儲引擎,它具有可用性高和數據一致性好的特點。
能夠使用多種故障切換和負載平衡選項配置NDB 存儲引擎,但以簇層面上的存儲引擎開始最簡單。MySQL簇的NDB存儲引擎包含完整的數據集,僅取決於簇本身內的其他數據。
下麵名,我們將介紹設置由NDB存儲引擎和一些MySQL伺服器構成的MySQL簇的設置方法。
目前,MySQL簇的部分可以獨立於MySQL伺服器進行配置。在MySQL簇中,簇的每個部分被視為一個節點。
註釋:在很多情況下,術語“節點”用於指電腦,但在討論MySQL簇時,它表示的是進程。在單台電腦上可以有任意數目的節點,所以我們才有可能將多個不同功能的節點配置在同一臺電腦上,為此,我們採用術語簇主機。
有三類簇節點,在最低的MySQL簇配置中,至少有三個節點,這三類節點分別是:
管理節點(MGM):這類節點的作用是管理MySQL簇內的其他節點,如提供配置數據,啟動並停止節點,運行備份等。由於這類節點負責管理其他節點的配置,所以管理節點應在其他節點之前先啟動。MGM節點是用命令ndb_mgm啟動的。
數據節點(NDB):這類節點用於保存簇的數據。數據集點的數目與副本的數目相關,是片段的倍數。例如,對於兩個副本,每個副本又兩個片段,那麼就有4個數據節點。沒有必要有一個以上的副本。。數據節點是用命令ndbd來啟動的。
SQL節點:這類節點是用來訪問簇數據的節點。對於MySQL簇,客戶端節點是使用NDB 簇存儲引擎的傳統MySQL伺服器。典型情況下,SQL節點是使用命令mysql -ndbcluster來啟動的,或將ndbcluster添加到my.cnf後面使用mysqld啟動。
簇配置包括對簇中單獨節點的配置,以及設置節點之間的單獨通信鏈路。對於目前設計的MySQL簇,其意圖在於,從處理器的能力,記憶體空間和寬頻來講,存儲節點是同質的,此外,為了提供單一的配置點,作為整體,簇的所有配置均位於一個文件中。
管理伺服器(MGM節點)負責管理簇配置文件和簇日誌。簇中的每個節點從管理伺服器檢索配置數據,並請求確定管理伺服器所在的位置的方式。當數據節點內出現有趣的事件時,節點將關於這類事件的信息傳輸到管理伺服器,然後,啊經這類信息寫入簇日誌。
4. 實現環境
現在,我們計劃建立有5個節點的MySQL CLuster體系,因此需要用到3台機器(sql和數據節點共用),分別做如下用途:
節點(用途) IP地址(主機名)
管理節點(MGM) 10.24.0.101(db1)
nodeid = 1
數據節點1(NDBD1) 10.24.6.4 (db4) nodeid = 11
數據節點2(NDBD2) 10.24.6.6(db5) nodeid =12
SQL節點1(SQL1) 10.24.6.4(db2)
nodeid = 21
SQL節點2(SQL2) 10.24.6.6(db3)
nodeid = 22
5. MySQL-Cluster安裝包下載
對於MySQL-Cluster的安裝包下載,下載地址見http://dev.mysql.com/downloads/cluster/
mysql-cluster-gpl-7.4.7-debian7-x86_64.deb
6. 安裝
6.1. 清除之前的mysql痕跡
此外 如果之前安裝過mysql-server,在進行此次實驗之前,需要將mysql-server卸載,執行以下指令卸載mysql
sudo apt-get autoremove --purge mysql-server
sudo apt-get remove mysql-server
sudo apt-get autoremove mysql-server
sudo apt-get remove mysql-common (非常重要)
6.2. 安裝deb文件
sudo dpkg -i mysql-cluster-gpl-7.4.7-debian7-x86_64.deb
安裝目錄/opt/mysql/server-5.6
6.3. 存儲節點/SQL節點安裝
SQL節點和數據節點的安裝步驟基本相同,所以在設計為存儲節點或SQL節點的的每一臺機器上,以系統根用戶身份執行以下步驟:
mysql組和mysql用戶
檢查/etc/passwd和/etc/group/文件,查看在系統上是否已經存在mysql組和mysql用戶,這時因為某些操作系統會將其作為安裝進程的一部分創建。可以使用以下指令查看:
cat show /etc/passwd
cat show /etc/group
如果它們不存在,則需要創建新的mysql用戶組,然後為該組添加一個mysql用戶
groupadd mysql
useradd -g mysql mysql
6.4. 創建系統資料庫的腳本
sudo /opt/mysql/server-5.6/scripts/mysql_install_db --user=mysql
如果此腳本不能運行,若報錯為主機名不匹配的話,則很有可能是下載的版本不對,查看操作系統是32位還是64位,選擇正確的版本。若報錯找不到預設的文件,則很有可能是因為之前的mysql-server沒有卸載,執行上文提供的指令,徹底卸載mysql-server
成功結果:
To start mysqld at boot time you have to copy
support-files/mysql.server to the right place for your system
PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:
/opt/mysql/server-5.6/bin/mysqladmin -u root password 'new-password'
/opt/mysql/server-5.6/bin/mysqladmin -u root -h drbd01 password 'new-password'
Alternatively you can run:
/opt/mysql/server-5.6/bin/mysql_secure_installation
which will also give you the option of removing the test
databases and anonymous user created by default. This is
strongly recommended for production servers.
See the manual for more instructions.
You can start the MySQL daemon with:
cd /opt/mysql/server-5.6 ; /opt/mysql/server-5.6/bin/mysqld_safe &
You can test the MySQL daemon with mysql-test-run.pl
cd mysql-test ; perl mysql-test-run.pl
Support MySQL by buying support/licenses at http://shop.mysql.com
WARNING: Found existing config file /opt/mysql/server-5.6/my.cnf on the system.
Because this file might be in use, it was not replaced,
but was used in bootstrap (unless you used --defaults-file)
and when you later start the server.
The new default config file was created as /opt/mysql/server-5.6/my-new.cnf,
please compare it with your file and take the changes you need.
6.5.設置MySQL伺服器和數據目錄必要的許可權
chown -R root .
chown -R mysql data
3 |
chgrp -R mysql . |
6.6. 拷貝mysql.server
sudo cp /opt/mysql/server-5.6/support-files/mysql.server /etc/init.d/mysql
chmod +x /etc/init.d/mysql
6.7. 拷貝 my.cnf
sudo cp /opt/mysql/server-5.6/my-new.cnf /etc/my.cnf
sudo vim /etc/my.cnf
6.8. 設置root密碼
sudo apt-get install mysql-client
mysqladmin -u root flush-privileges password "123456"
6.9. 管理節點安裝
對於管理(MGM)節點,不需要安裝mysqld可執行文件,僅需要安裝用於MGM伺服器和客戶端的二進位文件,這類文件可在下載的檔案文件中找到。假定將下載的檔案文件放在了/var/tmp文件下,以系統管理員的身份執行以下步驟,在簇管理節點主機上安裝ndb_mgmd和ndb_mgm
ndb_mgmd:ndb管理伺服器
ndb_mgm: ndb管理客戶端
6.10. 安裝deb文件
sudo dpkg -i mysql-cluster-gpl-7.4.7-debian7-x86_64.deb
安裝目錄/opt/mysql/server-5.6
6.11. 創建管理目錄
sudo mkdir /usr/local/mysql/
6.12. 拷貝ndb管理程式
sudo cp /opt/mysql/server-5.6/bin/ndb_mgm* /usr/local/mysql/
6.13. 埠
註釋:簇管理節點的預設埠是1186,數據節點的預設端後是2202。
6.14. 配置ndb管理節點
cd /usr/local/mysql/
sudo vim config.ini:
# Options affecting ndbd processes on all data nodes:
[NDBD DEFAULT]
NoOfReplicas=2
DataMemory=80M
IndexMemory=18M
# TCP/IP options:
[TCP DEFAULT]
#portnumber=2202
# Management process options:
[NDB_MGMD]
nodeid=1
HostName=10.24.0.101
DataDir=/usr/local/mysql
# Options for data node :
[NDBD]
nodeid=11
HostName=10.24.6.4
DataDir=/opt/mysql/server-5.6/data/
# Options for data node :
[NDBD]
nodeid=12
HostName=10.24.6.6
DataDir=/opt/mysql/server-5.6/data/
# SQL node options:
[MYSQLD]
nodeid=21
HostName=10.24.6.4
[MYSQLD]
nodeid=22
HostName=10.24.6.6
7. 啟動
完成配置後,啟動簇並不困難。必須在數據節點所在的主機上分別啟動每個簇節點進程。儘管能夠按任何順序啟動節點,但還是建議,首先啟動管理節點,然後啟動存儲節點,最後啟動SQL節點。
7.1. 管理節點啟動
可使用nbd_mgm指令登錄到ndb_mgm客戶端,登錄後,可使用show指令來查看簇中個節點情況。
註意,啟動MGM時,必須用-f或者–config-file選項,告訴ndb_mgmd到哪裡找到配置文件。首次啟動時必須選用–initial選項,或者更改了MGM節點的配置信息後,也需選用–initial選項。
sudo /usr/local/mysql/ndb_mgmd -f /usr/local/mysql/config.ini
Ndb客戶端查看:
wiki@zoweewiki:/usr/local/mysql$ /usr/local/mysql/ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm>
ndb_mgm>
ndb_mgm>
ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=11 @10.24.6.4 (mysql-5.6.25 ndb-7.4.7, Nodegroup: 0, *)
id=12 @10.24.6.6 (mysql-5.6.25 ndb-7.4.7, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @10.24.0.101 (mysql-5.6.25 ndb-7.4.7)
[mysqld(API)] 2 node(s)
id=21 @10.24.6.4 (mysql-5.6.25 ndb-7.4.7)
id=22 @10.24.6.6 (mysql-5.6.25 ndb-7.4.7)
7.2. 數據節點啟動
在每台數據節點主機上,對於首次啟動,運行下述命令啟動NDBD進程:
sudo /opt/mysql/server-5.6/bin/ndbd --initial
註意,應僅在首次啟動時ndbd時,或者在備份/恢復或者配置變化後重啟ndbd時使用“–initial”參數,這很重要,因為該參數會使數據節點刪除由早期ndbd實例創建的,用於恢復的任何文件,包括恢復用日誌文件。
7.3. MYSQL節點啟動
sudo /etc/init.d/mysql restart
啟動日誌:
/opt/mysql/server-5.6/data/drbd02.err
151015 14:33:19 mysqld_safe Starting mysqld daemon with databases from /opt/mysql/server-5.6/data
2015-10-15 14:33:22 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2015-10-15 14:33:22 0 [Note] /opt/mysql/server-5.6/bin/mysqld (mysqld 5.6.25-ndb-7.4.7-cluster-gpl-log) starting as process 15192 ...
2015-10-15 14:33:23 15192 [Note] Plugin 'FEDERATED' is disabled.
2015-10-15 14:33:23 15192 [Note] InnoDB: Using atomics to ref count buffer pool pages
2015-10-15 14:33:23 15192 [Note] InnoDB: The InnoDB memory heap is disabled
2015-10-15 14:33:23 15192 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2015-10-15 14:33:23 15192 [Note] InnoDB: Memory barrier is not used
2015-10-15 14:33:23 15192 [Note] InnoDB: Compressed tables use zlib 1.2.3
2015-10-15 14:33:23 15192 [Note] InnoDB: Using Linux native AIO
2015-10-15 14:33:23 15192 [Note] InnoDB: Not using CPU crc32 instructions
2015-10-15 14:33:23 15192 [Note] InnoDB: Initializing buffer pool, size = 128.0M
2015-10-15 14:33:23 15192 [Note] InnoDB: Completed initialization of buffer pool
2015-10-15 14:33:24 15192 [Note] InnoDB: Highest supported file format is Barracuda.
2015-10-15 14:33:24 15192 [Note] InnoDB: 128 rollback segment(s) are active.
2015-10-15 14:33:24 15192 [Note] InnoDB: Waiting for purge to start
2015-10-15 14:33:24 15192 [Note] InnoDB: 5.6.25 started; log sequence number 1626027
2015-10-15 14:33:24 15192 [Note] NDB: Changed global value of binlog_format from STATEMENT to MIXED
2015-10-15 14:33:24 15192 [Note] NDB: NodeID is 22, management server '10.24.0.101:1186'
2015-10-15 14:33:25 15192 [Note] NDB[0]: NodeID: 22, all storage nodes connected
2015-10-15 14:33:25 15192 [Warning] NDB: server id set to zero - changes logged to bin log with server id zero will be logged with another server id by slave mysqlds
2015-10-15 14:33:25 15192 [Note] NDB Binlog: Starting...
2015-10-15 14:33:25 15192 [Note] NDB Util: Starting...
2015-10-15 14:33:25 15192 [Note] NDB Index Stat: Starting...
2015-10-15 14:33:25 15192 [Note] NDB Index Stat: Wait for server start completed
2015-10-15 14:33:25 15192 [Note] NDB Util: Wait for server start completed
2015-10-15 14:33:25 15192 [Note] NDB Binlog: Started
2015-10-15 14:33:25 15192 [Note] NDB Binlog: Setting up
2015-10-15 14:33:25 15192 [Note] NDB Binlog: Created schema Ndb object, reference: 0x80040016, name: 'Ndb Binlog schema change monitoring'
2015-10-15 14:33:25 15192 [Note] NDB Binlog: Created injector Ndb object, reference: 0x80050016, name: 'Ndb Binlog data change monitoring'
2015-10-15 14:33:25 15192 [Note] NDB Binlog: Setup completed
2015-10-15 14:33:25 15192 [Note] NDB Binlog: Wait for server start completed
2015-10-15 14:33:25 15192 [Note] Server hostname (bind-address): '*'; port: 3306
2015-10-15 14:33:25 15192 [Note] IPv6 is available.
2015-10-15 14:33:25 15192 [Note] - '::' resolves to '::';
2015-10-15 14:33:25 15192 [Note] Server socket created on IP: '::'.
2015-10-15 14:33:25 15192 [Note] Event Scheduler: Loaded 0 events
2015-10-15 14:33:25 15192 [Note] /opt/mysql/server-5.6/bin/mysqld: ready for connections.
Version: '5.6.25-ndb-7.4.7-cluster-gpl-log' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Cluster Community Server (GPL)
2015-10-15 14:33:25 15192 [Note] NDB Util: Wait for cluster to start
2015-10-15 14:33:25 15192 [Note] NDB Util: Started
2015-10-15 14:33:25 15192 [Note] NDB Binlog: Check for incidents
2015-10-15 14:33:25 15192 [Note] NDB Binlog: Wait for cluster to start
2015-10-15 14:33:25 15192 [Note] NDB Index Stat: Wait for cluster to start
2015-10-15 14:33:25 15192 [Note] ndb_index_stat_proc: Created Ndb object, reference: 0x80070016, name: 'Ndb Index Statistics monitoring'
2015-10-15 14:33:25 15192 [Note] NDB Index Stat: Started
2015-10-15 14:33:26 15192 [Note] NDB Binlog: DISCOVER TABLE Event: REPL$mysql/ndb_schema
2015-10-15 14:33:26 15192 [Note] NDB Binlog: logging ./mysql/ndb_schema (UPDATED,USE_WRITE)
2015-10-15 14:33:26 15192 [Note] NDB Binlog: DISCOVER TABLE Event: REPL$mysql/ndb_apply_status
2015-10-15 14:33:26 15192 [Note] NDB Binlog: logging ./mysql/ndb_apply_status (UPDATED,USE_WRITE)
2015-10-15 14:33:26 15192 [Note] NDB: Cleaning stray tables from database 'ndb_12_fs'
2015-10-15 14:33:26 15192 [Note] NDB: Cleaning stray tables from database 'ndbinfo'
2015-10-15 14:33:26 15192 [Note] NDB: Cleaning stray tables from database 'performance_schema'
2015-10-15 14:33:26 15192 [Note] NDB: Cleaning stray tables from database 'test'
2015-10-15 14:33:26 15192 [Note] NDB Binlog: Wait for first event
2015-10-15 14:33:26 [NdbApi] INFO -- Flushing incomplete GCI:s < 4554/3
2015-10-15 14:33:26 [NdbApi] INFO -- Flushing incomplete GCI:s < 4554/3
2015-10-15 14:33:26 15192 [Note] NDB Binlog: starting log at epoch 4554/3
2015-10-15 14:33:26 15192 [Note] NDB Binlog: Got first event
2015-10-15 14:33:26 15192 [Note] NDB Binlog: ndb tables writable
2015-10-15 14:33:26 15192 [Note] NDB Binlog: Startup and setup completed
2015-10-15 14:33:26 15192 [Note] NDB Schema dist: Data node: 11 reports subscribe from node 21, subscriber bitmask 0200000
2015-10-15 14:33:26 15192 [Note] NDB Schema dist: Data node: 12 reports subscribe from node 21, subscriber bitmask 0200000
2015-10-15 14:34:03 15192 [Warning] IP address '10.24.6.170' could not be resolved: Name or service not known
2015-10-15 14:34:56 15192 [Note] NDB Schema dist: Data node: 11 reports subscribe from node 21, subscriber bitmask 00
2015-10-15 14:34:56 15192 [Note] NDB Schema dist: Data node: 12 reports subscribe from node 21, subscriber bitmask 00
2015-10-15 14:35:03 15192 [Note] NDB Schema dist: Data node: 11 reports subscribe from node 21, subscriber bitmask 0200000
2015-10-15 14:35:03 15192 [Note] NDB Schema dist: Data node: 12 reports subscribe from node 21, subscriber bitmask 0200000
2015-10-15 14:41:04 15192 [Note] NDB Schema dist: Data node: 11 failed, subscriber bitmask 00
2015-10-15 14:42:36 15192 [Note] NDB Schema dist: Data node: 12 reports subscribe from node 21, subscriber bitmask 00
8. 測試
8.1. 常規測試
為了讓數據表能夠在cluster中正常複製,創建數據表時必須指定為ndbcluster引擎(engine=ndb或engine=ndbcluster)。
登錄到10.24.64的mysql,然後創建一個新資料庫songzi,並創建一個ndbcluster引擎的數據表test(id int,name char(10)),並向表中插入一條數據(0,songzi)。10.24.6.4上的操作及結果如下圖:
然後登錄10.24.6.6的mysql,可查看到數據已同步,並且新建的表及數據也存在。10.24.6.6上的操作及結果如下圖:
8.2. 模擬NDB節點Crash
終止10.24.6.4上的NDB進程,執行以下指令查看NDB進程情況
ps -ef | grep ndbd
kill 24077
ps -ef | grep ndbd
具體操作及結果見下圖:
也可以在ndb_mgm管理節點客戶端查看到10.24.0.101上的NDB節點已停掉
然後分別登錄到10.24.6.4和10.24.6.6的mysql,可發現依然能夠查詢到數據。結果如下圖
10.24.6.4
10.24.6.6
此結果說明測試成功,即當有一個NDB節點Crash後,整個MySQL環境仍可以正常服務。
8.3. 模擬SQL節點Crash
在上10.24.6.4上終止mysqld進程,可執行以下指令:
killall mysqld
也可以在ndb_mgm管理節點客戶端查看到10.24.6.4上的SQL節點已停掉
登錄到10.24.6.6上的mysql,可查看到數據依然存在
此結果說明測試成功,及當有一個SQL節點Crash後,整個MySQL-Cluster環境仍可以工作。
至此,整個MySQL-Cluster安裝及配置實驗已完成。實驗結束後,可使用指令shell> ndb_mgm -e shutdown或者ndb_mgm>shutdown來關閉簇中的所有節點。
9. 遇到問題
10. 總結
- Mysql cluster是一個統一的共用集群
- 多mysql同時共用
- 一個值多份存儲,不是像redis那樣根據一致性hash分佈存儲
- 高併發、高可用、高伸縮性
- share nothing架構
- 通過增加數據節點擴展:通過32個數據節點實現每秒2億條NoSQL查詢,以及通過16個數據節點每秒查詢近250萬SQL語句
- 推薦使用lvs + keepalived + mysql cluster 實現集群mysqlMySQL Cluster是一個實時可擴展且符合ACID的事務型記憶體資料庫