MySQL分布式集群
一、什么是MySQL集群
MySQL集群是一個(gè)無共享的(shared-nothing)、分布式節(jié)點(diǎn)架構(gòu)的存儲方案,其目的是提供容錯(cuò)性和高性能。
數(shù)據(jù)更新使用讀已提交隔離級別(read-committedisolation)來保證所有節(jié)點(diǎn)數(shù)據(jù)的一致性,使用兩階段提交機(jī)制(two-phasedcommit)保證所有節(jié)點(diǎn)都有相同的數(shù)據(jù)(如果任何一個(gè)寫操作失敗,則更新失敗)。
無共享的對等節(jié)點(diǎn)使得某臺服務(wù)器上的更新操作在其他服務(wù)器上立即可見。傳播更新使用一種復(fù)雜的通信機(jī)制,這一機(jī)制專用來提供跨網(wǎng)絡(luò)的高吞吐量。
通過多個(gè)MySQL服務(wù)器分配負(fù)載,從而最大程序地達(dá)到高性能,通過在不同位置存儲數(shù)據(jù)保證高可用性和冗余。
二、架構(gòu)圖
三、如何存儲數(shù)據(jù)
1.Mysqlcluster數(shù)據(jù)節(jié)點(diǎn)組內(nèi)主從同步采用的是同步復(fù)制,來保證組內(nèi)節(jié)點(diǎn)數(shù)據(jù)的一致性。一般通過兩階段提交 協(xié)議來實(shí)現(xiàn),一般工作過程如下:
a)Master執(zhí)行提交語句時(shí),事務(wù)被發(fā)送到slave,slave開始準(zhǔn)備事務(wù)的提交。
b)每個(gè)slave都要準(zhǔn)備事務(wù),然后向master發(fā)送OK(或ABORT)消息,表明事務(wù)已經(jīng)準(zhǔn)備好(或者無法準(zhǔn)備該事務(wù))。
c)Master等待所有Slave發(fā)送OK或ABORT消息
e)每個(gè)Slave等待來自Master的OK或ABORT消息。
如果Slave收到提交請求,它們就會提交事務(wù),并向Master發(fā)送事務(wù)已提交 的確認(rèn);如果Slave收到取消請求,它們就會撤銷所有改變并釋放所占有的資源,從而中止事務(wù),然后向Masterv送事務(wù)已中止的確認(rèn)。f) 當(dāng)Master收到來自所有Slave的確認(rèn)后,就會報(bào)告該事務(wù)被提交(或中止),然后繼續(xù)進(jìn)行下一個(gè)事務(wù)處理。
由于同步復(fù)制一共需要4次消息傳遞,故mysql cluster的數(shù)據(jù)更新速度比單機(jī)mysql要慢。所以mysql cluster要求運(yùn)行在千兆以上的局域網(wǎng)內(nèi),節(jié)點(diǎn)可以采用雙網(wǎng)卡,節(jié)點(diǎn)組之間采用直連方式。
疑問: 對cluster進(jìn)行擴(kuò)容增加數(shù)據(jù)節(jié)點(diǎn)組時(shí)會不 會導(dǎo)致數(shù)據(jù)更新速度降低?
答:不會,數(shù)據(jù)更新速度會變快。因?yàn)閿?shù)據(jù)是分別處理,每個(gè)節(jié)點(diǎn)組所保存的數(shù)據(jù)是不一樣的,
也能減少鎖定。
2.Mysqlcluster將所有的索引列都保存在主存中,其他非索引列可以存儲在內(nèi)存中或者通過建立表空間存儲到磁盤上。如果數(shù)據(jù)發(fā)生改變(insert,update,delete等),mysql 集群將發(fā)生改變的記錄寫入重做日志,然后通過檢查點(diǎn)定期將數(shù)據(jù)定入磁盤。由于重做日志是異步提交的,所以故障期間可能有少量事務(wù)丟失。為了減少事務(wù)丟失,mysql集群實(shí)現(xiàn)延遲寫入(默認(rèn)延遲兩秒,可配置),這樣就可以在故障發(fā)生時(shí)完成檢查點(diǎn)寫入,而不會丟失最后一個(gè)檢查點(diǎn)。一般單個(gè)數(shù)據(jù)節(jié)點(diǎn)故障不會導(dǎo)致任何數(shù)據(jù)丟失,因?yàn)榧簝?nèi)部采用同步數(shù)據(jù)復(fù)制。
四、MySQL集群的橫向擴(kuò)展
1.添加數(shù)據(jù)節(jié)點(diǎn)組來擴(kuò)展寫操作,提高 cluster的存儲能力。支持在線擴(kuò)容,先將新的節(jié)點(diǎn)加入到clsuter里,啟動后用
ALTER ONLINE TABLE table_name REORGANIZE PARTITION
命令進(jìn)行數(shù)據(jù)遷移,把數(shù)據(jù)平均分配到數(shù)據(jù)節(jié)點(diǎn)上。
2.添加Slave僅僅擴(kuò)展讀,而不能做到寫操作的橫向擴(kuò)展。
整個(gè)系統(tǒng)的平均負(fù)載可以描述為:
AverageLoad=∑readload+ ∑writeload / ∑capacity
假設(shè)每個(gè)服務(wù)器每秒有10000的事務(wù)量,而Master每秒的寫負(fù)載為4000個(gè)事務(wù),每秒的讀負(fù)載為6000,結(jié)果就是:
AverageLoad=6000+4000/10000=100%
現(xiàn)在,添加3個(gè)slave,每秒的事務(wù)量增加到40000。因?yàn)閷懖僮饕矔粡?fù)制,每個(gè)寫操作執(zhí)行4次,這樣每個(gè)slave的寫負(fù)載就是每秒4000個(gè)事務(wù)。那么現(xiàn)在的平均負(fù)載為:
AverageLoad=6000+44000/ 410000=55%
五、MySQL集群的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
a) 99.999%的高可用性
b)快速的自動失效切換
c)靈活的分布式體系結(jié)構(gòu),沒有單點(diǎn)故障
d)高吞吐量和低延遲
e)可擴(kuò)展性強(qiáng),支持在線擴(kuò)容
缺點(diǎn):
a)存在很多限制,比如:不支持外鍵
b)部署、管理、配置很復(fù)雜
c)占用磁盤空間大,內(nèi)存大
d)備份和恢復(fù)不方便
e)重啟的時(shí)候,數(shù)據(jù)節(jié)點(diǎn)將數(shù)據(jù)load到內(nèi)存需要很長時(shí)間
集群 mysql cluster
高可用 負(fù)載均衡
集群成員:
====管理節(jié)點(diǎn)(MGM) 進(jìn)程名 ndb_mgmd
====數(shù)據(jù)節(jié)點(diǎn)(Data Nodes) 進(jìn)程名 ndbd
====SQL節(jié)點(diǎn)(Sql Nodes) 進(jìn)程名 mysqld
拓?fù)?#xff1a;
192.168.1.3 管理節(jié)點(diǎn) mgm
192.168.1.4 192.168.1.5 SQL節(jié)點(diǎn) sql1 sql2
192.168.1.6 192.168.1.7 數(shù)據(jù)節(jié)點(diǎn) data1 data2
配置:
所有節(jié)點(diǎn)操作
1.創(chuàng)建mysql用戶
2.解壓軟件包
[root@mgm tmp]# tar xf mysql-cluster-gpl-7.4.12-linux-glibc2.5-x86_64.tar.gz
3.將軟件包剪切并改名
[root@mgm tmp]# mv mysql-cluster-gpl-7.4.12-linux-glibc2.5-x86_64 /usr/local/mysql-cluster
4.修改權(quán)限
管理節(jié)點(diǎn):
[root@mgm tmp]# mkdir /usr/local/mysql-cluster/cluster-conf [root@mgm tmp]# vim /usr/local/mysql-cluster/cluster-conf/config.ini[ndbd default]
NoOfReplicas=2
DataMemory=80M
IndexMemory=18M
[ndb_mgmd]
id=1
hostname=192.168.1.3
datadir=/usr/local/mysql-cluster/data
[ndbd]
id=2
hostname=192.168.1.6
datadir=/usr/local/mysql-cluster/ndbdata
[ndbd]
id=3
hostname=192.168.1.7
datadir=/usr/local/mysql-cluster/ndbdata
[mysqld]
id=4
hostname=192.168.1.4
[mysqld]
id=5
hostname=192.168.1.5
sql節(jié)點(diǎn)配置:
# vim /etc/my.cnf[mysqld]
ndbcluster
ndb-connectstring=192.168.1.3
[mysql_cluster]
ndb-connectstring=192.168.1.3
data節(jié)點(diǎn)配置:
# mkdir /usr/local/mysql-cluster/ndbdata # vim /etc/my.cnf[mysqld]
datadir=/usr/local/mysql-cluster/ndbdata
ndbcluster
ndb-connectstring=192.168.1.3
[mysql_cluster]
ndb-connectstring=192.168.1.3
初始化sql節(jié)點(diǎn):
# cd /usr/local/mysql-cluster # ./scripts/mysql_install_db --user=mysql啟動manager節(jié)點(diǎn):(啟動前把mysqld服務(wù)關(guān)閉)
# cd /usr/local/mysql-cluster # ./bin/ndb_mgmd -f cluster-conf/config.ini啟動數(shù)據(jù)節(jié)點(diǎn):
# cd /usr/local/mysql-cluster # ./bin/ndbd啟動sql節(jié)點(diǎn):
# cd /usr/local/mysql-cluster # ./bin/mysqld_safe --user=mysql &管理節(jié)點(diǎn):
# ./bin/ndb_mgm -e show \\檢查集群的狀態(tài)總結(jié)
以上是生活随笔為你收集整理的MySQL分布式集群的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【科普】OSS存储的基本操作
- 下一篇: CentOS7 Python3安装red