搭建Mysql Cluster叢集實現高可用
MySQL Cluster是MySQL適合於分散式計算環境的高實用、高冗餘版本。Cluster的漢語是“叢集”的意思。它採用了NDB Cluster 儲存引擎,允許在1個 Cluster 中執行多個MySQL伺服器。MySQL Cluster 是一種技術,該技術允許在無共享的系統中部署“記憶體中”資料庫的 Cluster 。通過無共享體系節構,系統能夠使用廉價的硬體,而且對軟硬體無特殊要求。此外,由於每個元件有自己的記憶體和磁碟,不存在單點故障。
1.1 MySQL叢集架構
SQL節點: 給上層應用層提供SQL訪問。
管理節點(MGM): 管理整個叢集。 啟動,關閉叢集。 通過ndb_mgmd命令啟動叢集
儲存/資料節點: 儲存cluster中的資料。 資料節點,可以提供副本。實現資料冗餘。
NDB引擎:是一種 “記憶體中”的儲存引擎 , 它具有可用性高和資料一致性好的特點。
拓展:NDB引擎介紹:
NDB引擎
MySQL Cluster 使用了一個專用的基於記憶體的儲存引擎——NDB引擎,這樣做的好處是速度快, 沒有磁碟I/O的瓶頸,但是由於是基於記憶體的,所以資料庫的規模受系統總記憶體的限制, 如果執行NDB的MySQL伺服器一定要記憶體夠大,比如4G, 8G, 甚至16G。NDB引擎是分散式的,它可以配置在多臺伺服器上來實現資料的可靠性和擴充套件性,理論上 通過配置2臺NDB的儲存節點就能
缺陷
基於記憶體,資料庫的規模受叢集總記憶體的大小限制
基於記憶體,斷電後資料可能會有資料丟失,這點還需要通過測試驗證。
多個節點通過網路實現通訊和資料同步、查詢等操作,因此整體性受網路速度影響,因此速度也比較慢
優點
1)多個節點之間可以分佈在不同的地理位置,因此也是一個實現分散式資料庫的方案;
2)擴充套件性很好,增加節點即可實現資料庫叢集的擴充套件;
3)冗餘性很好,多個節點上都有完整的資料庫資料,因此任何一個節點宕機都不會造成服務中斷。
MySQL cluster的下載地址:https://dev.mysql.com/downloads/cluster/
在我們做的實驗中MySQL cluster叢集各機器角色如下分配:
MySQL管理節點:xuegod67.cn IP:10.10.10.67
MySQL資料節點:xuegod68.cn IP:10.10.10.68
MySQL資料節點:xuegod69.cn IP:10.10.10.69
MySQL SQL節點:xuegod70.cn IP:10.10.10.70
MySQL SQL節點:xuegod71.cn IP:10.10.10.71
MySQL舊版本清除 首先使用如下命令來清理之前作業系統自帶的MySQL安裝:
yum -y remove mysql
然後使用如下命令:
rpm -qa | grep mysql 有的話也刪除
最後刪掉下列檔案:
rm -rf /var/lib/mysql/*
rm -rf /etc/my.cnf
rm -rf /etc/init.d/mysqld
vim /etc/profile 刪除與mysql相關內容
1.上傳並安裝最新的EPEL源 和 MySQL社群版源安裝包
[[email protected] ~]# rpm -ihv epel-release-7-10.noarch.rpm
[[email protected] ~]# rpm -ihv mysql57-community-release-el7-11.noarch.rpm
2開啟MySQL cluster 源
[[email protected] ~]# sed -i "55s/0/1/g" /etc/yum.repos.d/mysql-community.repo
3重新整理yum源快取
[[email protected] ~]# yum clean all && yum list
2.4 安裝解決Cluster的依賴包
[[email protected] ~]# yum install -y perl perl-Class-MethodMaker perl-DBI libaio numactl
19.2.5 安裝MySQL Cluster
[[email protected] ~]# yum install -y mysql-cluster-community-server
2.6 檢視安裝路徑
[[email protected] ~]# rpm -ql mysql-cluster-community-server
其他4臺主機上重複2.1—2.5的步驟
2.4.資料節點主機都要安裝資料節點的相關包(2臺)
[[email protected] ~]# yum install -y mysql-cluster-community-data-node
[[email protected] ~]# yum install -y mysql-cluster-community-data-node
2.5. 管理節點安裝management管理包
[[email protected]~]# yum -y install mysql-cluster-community-management-server
2.6.建立資料夾
管理節點建立配置目錄:
[[email protected]~]# mkdir -p /usr/mysql-cluster/
3 搭建MySQL叢集
3.1 xuegod67建立管理節點上配置檔案
[[email protected] ~]vim /usr/mysql-cluster/config.ini #寫入以下內容
[ndbd default]
NoOfReplicas=2 #資料寫入數量。2表示兩份
DataMemory=200M #配置資料儲存可使用的記憶體
IndexMemory=100M #索引給100M
[ndb_mgmd]
nodeid=1
datadir=/var/lib/mysql #管理節點的日誌
HostName=10.10.10.67 #管理節點的IP地址。本機IP
###### data node options: #儲存節點
[ndbd]
HostName=10.10.10.68
DataDir=/var/lib/mysql #mysql資料儲存路徑
nodeid=2
[ndbd]
HostName=10.10.10.69
DataDir=/var/lib/mysql #mysql資料儲存路徑
nodeid=3
# SQL node options: #關於SQL節點
[mysqld]
HostName=10.10.10.70
nodeid=4
[mysqld]
HostName=10.10.10.71
nodeid=5
在這個檔案裡,我們分別給五個節點分配了ID,這有利於更好的管理和區分各個節點。當然,要是不指定,MySQL也會動態分配一個。
3.2 xuegod68、xuegod69資料節點
[[email protected] /]# vim /etc/my.cnf #請配置xuegod69一樣
[[email protected] /]# vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql #MySQL資料儲存路徑
ndbcluster #啟動ndb引擎
ndb-connectstring=10.10.10.67 # 管理節點IP地址
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[mysql_cluster]
ndb-connectstring=10.10.10.67 #管理節點IP地址
3.3 SQL節點配置文件:
[[email protected]~]#vim /etc/my.cnf #請配置xuegod71一樣
[[email protected]~]#vim /etc/my.cnf
[mysqld]
ndbcluster #啟動ndb引擎
ndb-connectstring=10.10.10.67 # 管理節點IP地址
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[mysql_cluster]
ndb-connectstring=10.10.10.67 #管理節點IP地址
說明:資料節點和SQL節點配置檔案區別 ,就多一行
資料節點有:datadir=/var/lib/mysql #MySQL資料儲存路徑。
SQL節點上沒有。
3.4 MySQL Cluster啟動
初次啟動命令以及使用者密碼更改調整:(請嚴格按照次序啟動)
先啟動:管理節點服務->資料節點服務->sql節點服務
關閉:關閉管理節點服務,關閉管理節點服務後,nbdb資料節點服務會自動關閉->手動把sql節點服務關了。
執行初次啟動前請先確認 將兩臺機器的防火牆關閉(service iptables stop 或者 設定 防火牆埠可通,兩個埠即通訊埠1186、資料埠3306 )
3.4.1 xuegod67上啟動管理節點命令
[[email protected] ~]#ndb_mgmd --ndb_nodeid=1 --initial -f /usr/mysql-cluster/config.ini
#儘量不要把 管理節點、 資料節點、儲存節點 配置在同一臺機子上,否則一個掛了,就全掛了。
檢視埠號:
[[email protected]~]# netstat -antup | grep 1186
3.4.2 xuegod68和xuegod69啟動資料節點服務
[[email protected] ~]# ndbd --initial
[ndbd] INFO -- Angel connected to '10.10.10.67: 1196'
[ndbd] INFO -- Angel allocated nodeid: 2
[[email protected] ~]# ndbd --initial
[ndbd] INFO -- Angel connected to '10.10.10.67: 1196'
[ndbd] INFO -- Angel allocated nodeid: 3
3.4.3 Xuegod70、xuegod71啟動SQL節點服務
[[email protected]~]#systemctl start mysqld
[[email protected] ~]#systemctl start mysqld
3.4.4. 檢視MySQL叢集狀態:
[[email protected] ~]#ndb_mgm
ndb_mgm> show
3.4.5. 資料同步實驗測試
因為預設密碼比較坑人,我們就需要在此之前改一下兩臺機器MySQL的密碼。
檢視MySQL root使用者密碼
注意:我們只需修改sql節點的密碼
[[email protected] ~]# grep password /var/log/messages
# The random password set for the root user at Wed Apr 1 21:10:53 2015 (local time): gDVpNRBxTcgd17di
5.7以上版本 關閉密碼安全策略外掛
在my.cnf新增 validate-password=off 重啟mysql
[[email protected] ~]# mysql –uroot –p’gDVpNRBxTcgd17di’
mysql>set password for 'root'@'localhost'=password('123456');
mysql>grant all privileges on *.* to [email protected]”%” identified by “123456” #授權
mysql>flush privileges;
另一臺SQL節點也是一樣操作
3.4.6 模擬外部機器的一個客戶端 插入資料:
mysql -ucluster -p123456 -h 10.10.10..70
注意:建立表的時候使用ndb引擎
mysql> create database db;
mysql> use db;
mysql> create table test(id int) engine=ndb;
mysql> insert into test values(1000);
mysql> select * from test;
登陸另一臺sql節點檢視
mysql -ucluster -p123456 -h 10.10.10.71
mysql> use db;
mysql> select * from test;
停掉一個sql節點測試
[[email protected] ~]# mysqladmin -uroot -p123456 shutdown
ndb_mgm> show 檢視狀態
3.4.7 關閉服務
關閉MySQL叢集順序: 關閉管理節點服務 -> 關閉管理節點時,資料節點服務自動關閉 –> 需要手動關閉SQL節點服務
[[email protected] /] # ndb_mgm
-- NDB Cluster -- Management Client --
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 2: Node shutdown completed.
ndb_mgm> exit
ps -axu | grep ndbd #檢視不到,說明資料節點已經被關
手動關閉SQL節點服務
Xuegod70和xuegod71上,手動關閉SQL節點服務
[[email protected] ~]# mysqladmin -uroot -p123456 shutdown
[[email protected] ~]# mysqladmin -uroot -p123456 shutdown
或者:方法二 kill掉
[[email protected] ~]# ps -axu | grep mysql
[[email protected] ~]# kill -9 7617
[[email protected] ~]# kill -9 7743
[[email protected]~]# ps -axu | grep mysql #xuegod71同樣kill掉
再次啟動,MySQL叢集啟動:
[[email protected] /]# ndb_mgmd --ndb_nodeid=1 --initial -f /usr/mysql-cluster/config.ini
[[email protected] /]#ndbd
[[email protected] /]#ndbd
[[email protected] /]# systemctl restart mysqld
[[email protected] /]# systemctl restart mysqld
檢視mysql 叢集狀態:
[[email protected] ~]# ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show