MySql NDB Cluster + HaProxy 安裝部署
簡介
MySQL Cluster是一個基于NDB Cluster存儲引擎的完整的分布式資料庫系統。不僅僅具有高可用性,而且可以自動切分資料,備援資料等進階功能。和Oracle Real Cluster Application不太一樣的是,MySQL Cluster 是一個Share Nothing的架構,各個MySQL Server之間并不共享任何資料,高度可擴充以及高度可用方面的突出表現是其最大的特色。
簡單的說,MySQL Cluster 實際上是在無共享儲存設備的情況下實作的一種完全分布式資料庫系統,其主要通過 NDB Cluster(簡稱 NDB)存儲引擎來實作。
NDB Cluster 是一種技術,該技術允許在無共享的系統中部署“記憶體中”資料庫的 Cluster 。通過無共享體系結構,系統能夠使用廉價的硬體,而且對軟硬體無特殊要求。
NDB CLUSTER概念: 一種記憶體存儲引擎(也稱為NDB),提供高可用性和資料持久性功能。
無共享:每個元件有自己的記憶體和磁盤,不存在單點故障。
NDB Cluster 由一組計算機構成,每台計算機上均運作着多種程序,包括MySQL伺服器,NDB Cluster 的資料節點,管理伺服器,以及(可能)專門的資料通路程式。
Cluster 中所有元件的關系,如下圖:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iUiVmV5B3LchTMvwVMw8CX4EDMy8CXt92YugXM4FmLxM3Lc9CX6MHc0RHaiojIsJye.png)
特點
1、 通過自動分片實作高水準的寫入擴充能力
MySQL Cluster 自動将表分片(或分區)到不同節點上,使資料庫可以在低成本的商用硬體上橫向擴充,同時保持對應用程式完全應用透明。
2、 99.999% 的可用性
憑借其分布式、無共享架構,MySQL Cluster 可提供 99.999% 的可用性,確定了較強的故障恢複能力和在不停機的情況下執行預定維護的能力。
3、 SQL 和NoSQL API
MySQL Cluster 讓使用者可以在解決方案中整合關系資料庫技術和NoSQL技術中的最佳部分,進而降低成本、風險和複雜性。
4、 實時性能
MySQL Cluster 提供實時的響應時間和吞吐量,能滿足最苛刻的 Web、電信及企業應用程式的需求。
5、 具有跨地域複制功能的多站點叢集
跨地域複制使多個叢集可以分布在不同的地點,進而提高了災難恢複能力和全球 Web 服務的擴充能力。
6、 聯機擴充和模式更新
為支援持續營運,MySQL Cluster 允許向正在運作的資料庫模式中聯機添加節點和更新内容,因而能支援快速變化和高度動态的負載。
三大元件
NDB Cluster 有三種類型的節點,也稱三大元件,并且在最小的NDB叢集配置中,至少有三個節點
-
管理節點(MGM):
作用: 管理NDB叢集内的其他節點,執行提供配置資料(Cluster配置檔案和 Cluster日志),啟動和停止節點以及運作備份等功能。 Cluster中的每個節點從管理伺服器檢索配置資料,并請求确定管理伺服器所在位置的方式。當資料節點内出現新的事件時,節點将關于這類事件的資訊傳輸到管理伺服器,然後,将這類資訊寫入 Cluster日志。由于此節點類型管理其他節點的配置,是以應首先啟動此類節點,然後再啟動其他節點。MGM節點使用指令ndb_mgmd啟動 。
-
資料節點(DATE):
作用: 存儲叢集資料。資料節點數量與複制數量一樣多,乘以分段數量(請參見 第21.1.2節“NDB群集節點,節點組,副本和分區”)。例如,有兩個副本,每個副本有兩個片段,則需要四個資料節點。一個副本足夠用于資料存儲,但不提供備援; 是以,建議有2個(或更多)副本提供備援,進而提高可用性。資料節點使用ndbd指令啟動 。
-
SQL節點:
作用: 通路 Cluster資料。對于MySQL Cluster,用戶端節點是使用NDB Cluster存儲引擎的傳統MySQL伺服器。通常,SQL節點是使用指令“mysqld –ndbcluster”啟動的,或将“ndbcluster”添加到“my.cnf”後使用“mysqld”啟動。
這三中類型的所有節點構成一個完成的MySQL叢集體系:
- 資料儲存在“NDB存儲伺服器”的存儲引擎中,表(結構)則儲存在“MySQL伺服器”中。
- 應用程式通過“MySQL伺服器”通路這些資料表。
- 叢集管理伺服器通過管理工具(ndb_mgmd)來管理“NDB存儲伺服器”。
一、安裝前準備
搭建 MySQL Cluster首先需要至少一個管理節點主機來實作管理功能,一個SQL節點主機來實作MySQL server功能和兩個ndb節點主機實作NDB Cluster的功能。在這裡使用雙SQL節點來搭建環境,具體資訊如下:
1. 伺服器規劃表:
2. 下載下傳安裝包到本地電腦
- 下載下傳 MySQL cluster 7.4 版本,選擇 linux-通用二進制發行版本
mysql-cluster-gpl-7.4.17-linux-glibc2.12-x86_64.tar.gz
- 利用 pscp 工具将安裝包遠端上傳到每台伺服器上(除負載均衡伺服器之外)
pscp D:\mysql-cluster-gpl-7.4.17-linux-glibc2.12-x86_64.tar.gz [email protected]:/usr/local
- 務必保證伺服器時間的同步,和軟體源的可用
3. 設定叢集各節點之間的免密登入
-
建立密鑰:
指令:ssh-keygen (一直按回車即可)
-
密鑰傳輸
指令:ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
注意:!!!
1.除了安裝負載均衡的伺服器外,每個節點都必須将自己的密鑰傳輸到其他節點
二、安裝部署
安裝sql節點 :
sql節點:
192.168.1.11
192.168.1.8
注意: 所有節點的伺服器中必須保證沒有舊的、已經安裝過的mysql程式,如有,請解除安裝幹淨。
-
安裝依賴包
[[email protected] ~]# apt-get -y install libaio1 libaio-dev
-
建立 mysql 使用者組及使用者
[[email protected] ~]# addgroup mysql
[[email protected] ~]# adduser -r -g mysql mysql
-
解壓安裝包
[[email protected] ~]# cd /usr/local/
[[email protected] ~]# tar zxvf /usr/local/mysql-cluster-gpl-7.4.17-linux-glibc2.12-x86_64.tar.gz
-
為解壓後的檔案建立符号連結 mysql
[[email protected] local]# ln -sv mysql-cluster-gpl-7.4.17-linux-glibc2.12-x86_64 mysql
-
更改權限
[[email protected] mysql]# chown -R mysql.root /usr/local/mysql
[[email protected] mysql]# chown -R mysql.root /usr/local/mysql/
-
建立data檔案夾,并修改權限,用以存放mysql初始化後的資料,
[[email protected] local]# cd mysql
[[email protected] mysql]# mkdir /usr/local/mysql/data
[[email protected] mysql]# chown -R mysql.root /usr/local/mysql/data
-
複制配置檔案到 /etc 下
[[email protected] mysql]# cp /usr/local/mysql/my.cnf /etc
-
運作 mysql_install_db 腳本,開始初始化
[[email protected] mysql]# /usr/local/mysql/scripts/mysql_install_db –user=mysql –datadir=/usr/local/mysql/data –basedir=/usr/local/mysql
–user 為 mysqld服務的運作使用者
–basedir 和 –datadir 則分别代表 mysql 的安裝目錄和資料存放目錄,如果不指定這兩個參數,就會有如下錯誤:
初始化成功,如圖:
-
将MySQL啟動腳本複制到相應的目錄,使其可執行
[[email protected] mysql]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d
[[email protected] mysql]# chmod +x /etc/init.d/mysql.server
-
添加環境變量,執行指令友善一點
[[email protected] mysql]# echo “export PATH=$PATH:/usr/local/mysql/bin” >> /root/.bash_profile
[[email protected] mysql]# source /root/.bash_profile
-
并将其設定為在作業系統啟動時啟動:
[[email protected] mysql]# apt-get -y install sysv-rc-conf
[[email protected] mysql]# update -rc.d -f mysql.server defaults
[[email protected] mysql]# sysv-rc-conf
- 修改/etc/my.cnf配置檔案,追加如下配置
[mysqld] datadir=/usr/local/mysql/data basedir=/usr/local/mysql socket=/tmp/mysql.sock symbolic-links=0 skip-name-resolve skip-grant-tables # 運作NDB存儲引擎 ndbcluster # 管理節點 ndb-connectstring=192.168.1.7:1186 [MYSQL_CLUSTER] #管理節點 ndb-connectstring=192.168.1.7:1186
安裝NDB節點:
NDB節點:
192.168.1.16
192.168.1.14
注意: NDB節點的安裝和SQL節點安裝大緻相似
- 安裝
[[email protected] ~]# apt-get -y install libaio1 libaio-dev
[[email protected] ~]# addgroup mysql
[[email protected] ~]# adduser -r -g mysql mysql
[[email protected] ~]# cd /usr/local
[[email protected] ~]# tar zxvf /usr/local/mysql-cluster-gpl-7.4.17-linux-glibc2.12-x86_64.tar.gz
[[email protected] local]# ln -sv mysql-cluster-gpl-7.4.17-linux-glibc2.12-x86_64 mysql
[[email protected] mysql]# chown -R mysql.root /usr/local/mysql
[[email protected] mysql]# chown -R mysql.root /usr/local/mysql/
[[email protected] local]# cd mysql
[[email protected] mysql]# mkdir /usr/local/mysql/data
[[email protected] mysql]# chown -R mysql.root /usr/local/mysql/data
[[email protected] mysql]# cp /usr/local/mysql/my.cnf /etc/my.cnf
[[email protected] mysql]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/usr/local/mysql/data --basedir=/usr/local/mysql
[[email protected] mysql]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d
[[email protected] mysql]# chmod +x /etc/init.d/mysql.server
[[email protected] mysql]# echo "export PATH=$PATH:/usr/local/mysql/bin" >> /root/.bash_profile
[[email protected] mysql]# source /root/.bash_profile
[[email protected] mysql]# apt-get -y install sysv-rc-conf
[[email protected] mysql]# update -rc.d -f mysql.server defaults
[[email protected] mysql]# sysv-rc-conf
建立用來存放NDB節點的資料目錄,在管理節點裡面也要配置為該目錄
[[email protected] mysql]# mkdir /var/lib/mysql-cluster
- 和SQL節點一樣,修改/etc/my.cnf配置檔案,追加如下配置
[mysqld] datadir=/usr/local/mysql/data basedir=/usr/local/mysql socket=/tmp/mysql.sock symbolic-links=0 skip-name-resolve skip-grant-tables # 運作NDB存儲引擎 ndbcluster # 管理節點 ndb-connectstring=192.168.1.7:1186 [MYSQL_CLUSTER] #管理節點 ndb-connectstring=192.168.1.7:1186
安裝管理節點MGM:
管理節點 MGM:
192.168.1.7
注意:
如果隻安裝一個管理節點的話,隻需要 ndb_mgm 和 ndb_mgmd兩個程式即可,這兩個可執行程式可以在上面的MySQL節點的MySQL安裝目錄中的bin目錄下面找到,直接CP過來就能使用。但考慮到以後的擴充問題,在這裡,我們依然全部安裝程式。
- 安裝
[[email protected] ~]# apt-get -y install libaio1 libaio-dev
[[email protected] ~]# addgroup mysql
[[email protected] ~]# adduser -r -g mysql mysql
[[email protected] ~]# cd /usr/local
[[email protected] ~]# tar zxvf /usr/local/mysql-cluster-gpl-7.4.17-linux-glibc2.12-x86_64.tar.gz
[[email protected] local]# ln -sv mysql-cluster-gpl-7.4.17-linux-glibc2.12-x86_64 mysql
[[email protected] mysql]# chown -R mysql.root /usr/local/mysql
[[email protected] mysql]# chown -R mysql.root /usr/local/mysql/
[[email protected] local]# cd mysql
[[email protected] mysql]# mkdir /usr/local/mysql/data
[[email protected] mysql]# chown -R mysql.root /usr/local/mysql/data
[[email protected] mysql]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/usr/local/mysql/data --basedir=/usr/local/mysql
[[email protected] mysql]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d
[[email protected] mysql]# chmod +x /etc/init.d/mysql.server
[[email protected] mysql]# echo "export PATH=$PATH:/usr/local/mysql/bin" >> /root/.bash_profile
[[email protected] mysql]# source /root/.bash_profile
[[email protected] mysql]# apt-get -y install sysv-rc-conf
[[email protected] mysql]# update -rc.d -f mysql.server defaults
[[email protected] mysql]# sysv-rc-conf
建立目錄mysql-cluster,該目錄會存放相關日志檔案,以及pid号。并在目錄中建立配置檔案config.ini
[[email protected] mysql]# mkdir /var/lib/mysql-cluster
[[email protected] mysql]# cd /var/lib/mysql-cluster
[[email protected] mysql]# vi config.ini
- 管理節點配置檔案 /var/lib/mysql-cluster/config.ini
[NDBD DEFAULT] #每個資料節點的鏡像數量,通常最低設定為2,否則就沒有意義了,這裡是友善後面測試 NoOfReplicas=2 #每個資料節點中給資料配置設定的記憶體 DataMemory=80M #每個資料節點中給索引配置設定的記憶體 IndexMemory=18M #管理節點 [NDB_MGMD] nodeid=1 #管理節點ip hostname=192.168.1.7 #管理節點資料目錄,存放相關日志,以及pid檔案 datadir=/var/lib/mysql-cluster #第一個 ndbd 節點: [NDBD] nodeid=2 #資料節點ip位址 hostname=192.168.1.16 #NDB點資料存放目錄 datadir=/usr/local/mysql/data #第二個 ndbd 節點: [NDBD] nodeid=3 hostname=192.168.1.14 datadir=/usr/local/mysql/data # SQL node options: [MySQLD] nodeid=4 #SQL節點ip位址 hostname=192.168.1.11 [MySQLD] nodeid=5 hostname=192.168.1.8 這裡保留了一個空節點。否則停止NDB會報錯:No free node id found for ndbd(NDB) [MySQLD]
- 配置參數解釋:
在上面的配置檔案中,包括很多的組,組名用"[]"括起來,在這裡我們最關心的是3類節點組的配置,分别定義如下: [NDB_MGMD] 表示管理節點的配置,隻能有一個。 [NDBD DEFAULT] 表示每個資料節點的預設配置,在每個節點的[NDBD]中不用再寫這些選項,隻能有一個。 [NDBD] 表示每個資料節點的配置,可以有多個。 [MYSQLD] 表示SQL節點的配置,可以有多個,分别寫上不同的SQL節點的ip位址;也可以不用寫,隻保留一個空節點,表示任意一個ip位址都可以進行通路。此節點的個數表明了可以用來連接配接資料節點的SQL節點總數。 *注意:每個節點都有一個獨立的id号,可以填寫,比如nodeid=2,(老版本使用id,新版本已經不使用id辨別了)也可以不用填寫,系統會按照配置檔案的填寫順序自動配置設定。
三、啟動 cluster
注意:啟動順序:管理節點->資料節點->SQL節點(很重要)
1. 啟動管理節點:
[[email protected] ~]# ndb_mgmd -f /var/lib/mysql-cluster/config.ini MySQL Cluster Management Server mysql-5.5.19 ndb-7.2.4 [[email protected] ~]# netstat -ntlp | grep 1186 tcp 0 0 0.0.0.0:1186 0.0.0.0:* > LISTEN 1329/ndb_mgmd [[email protected] ~]# ps -ef | grep ndb_mgmd | grep -v grep root 1329 1 0 17:30 ? 00:00:00 ndb_mgmd -f /> data/mysql-cluster/config.ini [[email protected] ~]#
2. 啟動NDB(資料節點)
兩個資料節點:
192.168.1.16
192.168.1.14
注意:隻有在第一次啟動或在備份/恢複或配置變化後重新開機ndbd時,才加–initial參數!原因在于,該參數會使節點删除由早期ndbd執行個體建立的,用于恢複的任何檔案,包括用于恢複的日志檔案。
啟動資料節點: [[email protected] ~]# ndbd --initial 2018-01-16 17:40:51 [ndbd] INFO -- Angel connected to '192.168.1.16:1186' 2018-01-16 17:40:51 [ndbd] INFO -- Angel allocated nodeid: 3 檢視相關程序: [[email protected] ~]# ps -ef | grep ndbd | grep -v grep root 2266 1 0 17:41 ? 00:00:00 ndbd --initial root 2267 2266 1 17:41 ? 00:00:04 ndbd --initial
啟動資料節點: [[email protected] ~]# ndbd --initial 2018-01-16 17:42:21 [ndbd] INFO -- Angel connected to '192.168.1.14:1186' 2018-01-16 17:42:21 [ndbd] INFO -- Angel allocated nodeid: 3 檢視相關程序: [[email protected] ~]# ps -ef | grep ndbd | grep -v grep root 2266 1 0 17:43 ? 00:00:00 ndbd --initial root 2267 2266 1 17:43 ? 00:00:04 ndbd --initial
ndbd程序是使用NDB存儲引擎處理表中資料的程序。通過該程序,存儲節點能夠實作分布式事務管理,節點恢複,線上備份相關任務。
3. 啟動SQL節點(啟動mysql服務)
兩個sql節點:
192.168.1.11
192.168.1.8
[[email protected] ~]# /etc/init.d/mysql.server start Starting MySQL [ OK ] [[email protected] ~]#
[[email protected] ~]# /etc/init.d/mysql.server start Starting MySQL..... [ OK ] [[email protected] ~]#
4. 節點全部啟動成功後,在管理節點使用ndb_mgm工具的show指令檢視叢集狀态:
[[email protected] ~]# 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 @192.168.1.16 (mysql-5.6.38 ndb-7.4.17, Nodegroup: 0, Master) id=3 @192.168.1.14 (mysql-5.6.38 ndb-7.4.17, Nodegroup: 1) [ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.1.7 (mysql-5.6.38 ndb-7.4.17) [mysqld(API)] 3 node(s) id=4 @192.168.1.11 (mysql-5.6.38 ndb-7.4.17) id=5 @192.168.1.8 (mysql-5.6.38 ndb-7.4.17) id=6 (not connected, accepting connect from any host) ndb_mgm>
ndb_mgm工具是ndb_mgmd(MySQL Cluster Server)的用戶端管理工具,通過該工具可以友善的檢查Cluster的狀态,啟動備份,關閉等功能。更詳細的方法可以通過ndb_mgm –help指令來進行檢視。
- 從上面顯示的狀态可以看出如下資訊:
1. 叢集目前的管理伺服器端口是1186
Connected to Management Server at: localhost:1186
2. 叢集的資料節點(NDB)有2個,詳細資訊:
[ndbd(NDB)] 2 node(s) id=2 @192.168.1.16 (mysql-5.6.38 ndb-7.4.17, Nodegroup: 0, Master) id=3 @192.168.1.14 (mysql-5.6.38 ndb-7.4.17, Nodegroup: 1)
3. 叢集的管理節點有一個,詳細資訊:
[ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.1.7 (mysql-5.6.38 ndb-7.4.17)
4. SQL節點有3個,目前處于連接配接狀态的有2個,詳細資訊:
[mysqld(API)] 3 node(s) id=4 @192.168.1.11 (mysql-5.6.38 ndb-7.4.17) id=5 @192.168.1.8 (mysql-5.6.38 ndb-7.4.17) id=6 (not connected, accepting connect from any host)
四、MySQL Cluster 高可用測試
成功啟動後,下面來測試一下Cluster的功能。如果要使用cluster,則表的引擎必須為NDB,其他類型存儲引擎的資料不會儲存到資料節點中。對于cluster的一個重要功能就是防止單點故障。我們下面對這些問題分别來進行測試。
1. NDB存儲引擎測試
(1)在任意一個SQL節點(我這裡選擇192.168.1.11)的mysql庫中建立測試表t1,設定存儲引擎為NDB,并插入兩條測試資料:
mysql> use mysql; mysql> create table t1 (id int,name varchar(20)) engine=ndb; Query OK, 0 rows affected (0.44 sec) mysql> insert into t1 values(1,'mashuai'); Query OK, 1 row affected (0.11 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> insert into t1 values(2,'mashuai'); Query OK, 1 row affected (0.03 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql>
(2)在另外一個SQL節點(192.168.1.8)查詢mysql庫中t1表,結果如下:
mysql> use mysql; mysql> select * from t1; +------+---------+ | id | name | +------+---------+ | 1 | mashuai | | 2 | mashuai | +------+---------+ 2 rows in set (0.08 sec) mysql>
顯然,兩個SQL節點查詢的資料時一緻的。
(3)在SQL節點192.168.0.11上把測試表t1引擎改為MyISAM,再次插入測試資料:
mysql> alter table t1 engine=myisam; Query OK, 2 rows affected (0.50 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> insert into t1 select 2,'good boy'; Query OK, 1 row affected (0.00 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql>
(4)在SQL節點192.168.1.8上再次查詢表t1,結果如下:
mysql> select * from t1; ERROR 1146 (42S02): Table 't1' doesn't exist mysql> show tables; Empty set (0.04 sec) mysql>
直接報錯,說表不存在了。(老版本是報ERROR 1412:Table definition ha changed,please retry transaction)
(5)我們再次改回NDB引擎。
mysql> alter table t1 engine=ndb; Query OK, 3 rows affected (0.25 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql>
(6)再次進行查詢如下:
mysql> select * from t1; +------+---------+ | id | name | +------+---------+ | 1 | mashuai | | 2 | mashuai | +------+---------+ 3 rows in set (0.02 sec) mysql>
發現表t1的資料再次同步到了資料節點。所有SQL節點又都可以正常查詢資料。
2. 單點故障測試
對于任意一種節點,都存在單點故障的可能性。在cluster的設定過程中,應該盡量對每一類節點設定備援,以防止單點故障發生時造成的應用終端。對于管理節點,一般不需要特殊的配置,隻需要将管理工具和配置檔案防止多台伺服器上即可。下面我們測試一下SQL節點和NDB(資料節點)的單點故障。
- SQL節點發生單點故障
對于上面的測試環境中,我們設定了兩個SQL節點,應用從兩個節點對資料通路都可以得到一緻的結果。如果有一個節點故障,系統會正常運作嗎?我們測試便知。
(1)将SQL節點192.168.1.8上的MySQL服務停止:
[[email protected] ~]# /etc/init.d/mysql.server stop Shutting down MySQL.. [ OK ] [[email protected] ~]#
(2)檢視cluster狀态:
[[email protected] ~]# 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 @192.168.1.16 (mysql-5.6.38 ndb-7.4.17, Nodegroup: 0, Master) id=3 @192.168.1.14 (mysql-5.6.38 ndb-7.4.17, Nodegroup: 1) [ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.1.7 (mysql-5.6.38 ndb-7.4.17) [mysqld(API)] 3 node(s) id=4 @192.168.1.11 (mysql-5.6.38 ndb-7.4.17) id=5 (not connected, accepting connect from any host) id=6 (not connected, accepting connect from any host) ndb_mgm>
可以發現SQL節點192.168.1.8已經斷開,但是另外一個SQL節點192.168.1.11仍然處于正常狀态。
(3)從SQL節點192.168.1.11上檢視表t1,結果如下:
mysql> select * from t1; +------+---------+ | id | name | +------+---------+ | 1 | mashuai | | 2 | mashuai | +------+---------+ 3 rows in set (0.02 sec) mysql>
顯然,SQL節點的單點故障并沒有引起資料查詢的故障。對于應用來說,需要改變的就是将以前對故障節點的通路改為對非故障節點的通路(SQL節點前面可以挂LVS,然後做各種檢測)
- NDB(資料節點)的單點故障
在這個測試環境中,資料節點也是兩個,那麼他們對資料的存儲是互相鏡像還是一份資料分成幾塊存儲呢?(類似磁盤陣列RAID1還是RAID0)?這個答案關鍵在于配置檔案中[NDBD DEFAULT]組中的NoOfReplicas參數,如果這個參數等于1,表示隻有一份資料,但是分成N塊分别存儲在N個資料節點上,如果該值等于2,則表示資料被分成N/2,每塊資料都有兩個備份,這樣即使有任意一個節點發生故障,隻要它的備份節點正常,資料就可以正常查詢。
在下面的例子中,先将兩個資料節點之一停止,通路表t1,看能否正常通路;然後将NoOfReplicas配置改為2,這時,資料節點實際上已經互為鏡像,儲存了兩份。這時再停止任意一個資料節點,看是否能通路表t1。
(1)将資料節點192.168.1.16上的NDB程序停止:
[[email protected] ~]# ps -ef | grep ndbd root 2266 1 0 17:21 ? 00:00:00 ndbd --initial root 2267 2266 1 17:21 ? 00:01:03 ndbd --initial root 2368 1300 0 23:06 pts/0 00:00:00 grep ndbd [[email protected] ~]# pkill -9 ndbd [[email protected] ~]# ps -ef | grep ndbd root 2371 1300 0 17:22 pts/0 00:00:00 grep ndbd [[email protected] ~]#
(2)檢視cluster狀态:
[[email protected] ~]# 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 any host) id=3 @192.168.1.14 (mysql-5.6.38 ndb-7.4.17, Nodegroup: 1) [ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.1.7 (mysql-5.6.38 ndb-7.4.17) [mysqld(API)] 3 node(s) id=4 @192.168.1.11 (mysql-5.6.38 ndb-7.4.17) id=5 @192.168.1.8 (mysql-5.6.38 ndb-7.4.17) id=6 (not connected, accepting connect from any host) ndb_mgm>
看見隻有一個NDB節點在運作。
(3)在任意節點,這裡是192.168.1.11檢視表t1的資料:
mysql> select * from t1; +------+---------+ | id | name | +------+---------+ | 1 | mashuai | | 2 | mashuai | +------+---------+ 3 rows in set (0.02 sec) mysql>
顯然挂掉一個NDB節點不影響我們正常的資料查詢,資料節點的備援同樣防止了單點故障。
3. MySQL Cluster叢集的關閉
關閉順序:SQL節點->資料節點->管理節點(在MySQL Cluster環境中,NDB節點和管理節點的關閉都可以在管理節點的管理程式中完成,也可以分節點關閉,但是SQL節點卻沒辦法。是以,在關閉整個MySQL Cluster環境或者關閉某個SQL節點的時候,首先必須到SQL節點主機上來關閉SQL節點程式。關閉方法和MySQL Server的關閉一樣。)
(1)SQL節點關閉
[[email protected] ~]# /etc/init.d/mysqld stop Shutting down MySQL.. [ OK ] [[email protected] ~]#
(2)(NDB)資料節點關閉
[[email protected] ~]# ndbd stop 2018-01-16 18:30:51 [ndbd] INFO -- Angel connected to '192.168.0.30:1186' 2018-01-16 18:30:51 [ndbd] INFO -- Angel allocated nodeid: 2 [[email protected] ~]#
(3)管理節點關閉
ndb_mgm> shutdown Node 2: Cluster shutdown initiated Node 3: Cluster shutdown initiated 3 NDB Cluster node(s) have shutdown. Disconnecting to allow management server to shutdown. Node 3: Node shutdown completed. ndb_mgm>
總結:
第一次部署MySql Cluster,踩了不少坑,比如參數NoOfReplicas無法臨時更改,管理節點配置檔案中如果不多預留一個[MySQLD],在停止NDB節點時會報錯,以及配置檔案中的[NDBD]段落中的datadir指定的目錄在資料節點的伺服器上面要存在。MySQL Cluster的核心在于NDB Cluster存儲引擎,不僅對資料進行了水準切分,還對資料進行了跨節點備援。既解決了資料庫的擴充問題,同時也在很大程度上提高了資料庫整體可用性。
五、安裝 HaProxy 負載均衡
伺服器: 192.168.1.4
- 下載下傳安裝 HaProxy
[[email protected]]# sudo apt -get install haproxy
- 修改配置檔案
[[email protected]]# sudo vi /etc/haproxy/haproxy.cfg
- 配置檔案如下:
global log /dev/log local0 info #日志相關 log /dev/log local1 notice maxconn 4096 chroot /var/lib/haproxy stats timeout 30s user haproxy group haproxy daemon #debug #quiet #pidfile /usr/local/haproxy/haproxy.pid # Default SSL material locations ca-base /etc/ssl/certs crt-base /etc/ssl/private # Default ciphers to use on SSL-enabled listening sockets. # For more information, see ciphers(1SSL). This list is from: # https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/ ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS ssl-default-bind-options no-sslv3 defaults log global mode tcp #修改:mode http ---->mode tcp option tcplog #修改:option httplog--->option tcplog option dontlognull #retries 3 #option redispatch #maxconn 2000 timeout connect 10s #修改:連接配接逾時時間 timeout client 60s #修改:連接配接用戶端逾時時間 timeout server 60s #修改:連接配接伺服器端逾時時間 listen mysql-cluster bind *:6666 #代理端口 mode tcp #模式 TCP option mysql-check # user root #mysql健康檢查 root為mysql登入使用者名 balance roundrobin #排程算法 server mysql1 192.168.1.11:3306 check port 3306 #weight 1 check inter 1s rise 2 fall 2 #健康檢查加上check server mysql2 192.168.1.8:3306 check port 3306 #weight 1 check inter 1s rise 2 fall 2 listen stats #監控 mode http option httplog bind 0.0.0.0:8888 stats enable stats refresh 30s #設定統計頁面自動重新整理時間 stats uri /dbs stats realm welcome login\ Haproxy stats auth admin:admin stats admin if TRUE
- 檢測修改檔案配置結果
[[email protected]]# haproxy -f /etc/haproxy/haproxy.cfg -c [[email protected]]# Configuration file is valid (配置有效) [[email protected]]# sudo service haproxy restart (重新開機服務)
- 驗證結果:
在浏覽器中輸入:http://192.168.1.4:8888/dbs 彈出登入對話框: 使用者名:admin 密碼為:admin
如圖所示:
- 連接配接測試:
安裝 mysql用戶端: [[email protected]]# sudo apt-get install mysql-client-core-5.7 安裝 mariadb 資料庫系統管理器 [[email protected]]# sudo apt-get install mariadb-client-core-10.0 連接配接mysql 指令: [[email protected]]# mysql -h 192.168.1.4 -P 6666 -u root -D mysql -p
如圖所示:
-
配置mysql允許遠端連結
預設情況下,mysql帳号不允許從遠端登陸,隻能在localhost登入。本文提供了二種方法設定mysql可以通過遠端主機進行連接配接。
1. 改表法
在localhost登入mysql後,更改 "mysql" 資料庫裡的 "user" 表裡的 "host" 項,将"localhost"改稱"%" 例如: [[email protected] ~]# #mysql -u root -p Enter password: …… mysql> mysql> update user set host = '%' where user = 'root'; mysql> select host, user from user;
2.授權法
例如: 你想root使用mypassword(密碼)從任何主機連接配接到mysql伺服器的話。 mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY 'mypassword' WITH GRANT OPTION; 如果你想允許使用者root從ip為192.168.1.6的主機連接配接到mysql伺服器,并使用mypassword作為密碼 mysql> GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'192.168.1.6'IDENTIFIED BY'mypassword' WITH GRANT OPTION; mysql> FLUSH PRIVILEGES #使修改生效,就可以了
3. 常見問題:
1、在采用法二授權法之後,無法在本地登入mysql,如: [[email protected] ~]# #mysql -u root -p -h 192.168.1.11 Enter password: ERROR 1045 (28000): Access denied for user 'root'@'192.168.1.11' (using password: YES) 解決方法: 1、這時可以使用:mysql -u root -p 登入,進入到mysql後。 mysql> grant all privileges on *.* to 'root'@'loadb116' identified by '123456' with grant option; Query OK, 0 rows affected (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec) 2、在本地使用ip位址登入 [[email protected] ~]# # mysql -u root -p -h 192.168.5.116 Enter password: Welcome to the MySQL monitor. Commands end with ; or /g. Your MySQL connection id is 60 Server version: 5.1.45 MySQL Community Server (GPL) Type 'help;' or '/h' for help. Type '/c' to clear the buffer. mysql>
- 用 Navicat 連接配接 cluster