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/node

2. 簡介

MySQL-Cluster是一種技術,該技術容許在無共享的系統中部署「內存中」數據庫的簇。經過無共享體系結構,系統可以使用廉價的硬件,並且對軟硬件無特殊要求。此外,因爲每一個組件都有本身的內存和磁盤,因此不存在單點故障。mysql

MySQL簇將標準的MySQL服務器與名爲NDB的「內存中」的簇式存儲引擎集成了起來。術語NDB指的是與存儲引擎相關的設置部分,而術語「MySQL簇」指的是MySQL和NDB存儲引擎的組合。redis

MySQL簇由一組計算機構成,每臺計算機上均運行着多種進程,包括MySQL服務器,NDB簇的數據節點,管理服務器(MGM),以及(可能)專門的數據訪問程序。關於簇中組件的關係,以下圖:sql

 

全部這些程序一塊兒構成了MySQL簇。將數據保存到NBD簇引擎中時,表將保存在數據節點內。可以從簇中全部其餘MySQL服務器直接訪問這些表。所以,假如在將數據保存在簇內的工資應用程序中,若是某一應用程序更新了一位僱員的工資,全部查詢該數據的其餘MySQL 服務器能馬上發現這種變化。shell

對於MySQL簇,保存在數據節點的數據可被映射,簇可以處理單獨數據節點的故障,除了少數事物將因事物狀態丟失而被放棄外,不會產生其餘影響。因爲事物性應用程序可以處理失敗事宜,於是它不是問題源。數據庫

3. MySQL簇的基本概念

NDB 是一種「內存中」存儲引擎,它具備可用性高和數據一致性好的特色。bootstrap

可以使用多種故障切換和負載平衡選項配置NDB 存儲引擎,但以簇層面上的存儲引擎開始最簡單。MySQL簇的NDB存儲引擎包含完整的數據集,僅取決於簇自己內的其餘數據。ubuntu

下面名,咱們將介紹設置由NDB存儲引擎和一些MySQL服務器構成的MySQL簇的設置方法。vim

目前,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的事務型內存數據庫
相關文章
相關標籤/搜索