mysql集群之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的事務型內存數據庫


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM