Docker搭建MySQL集群

最近疫情期間某饰,為了提升自己的知識(shí)面以及技術(shù)示损,我將自己研發(fā)項(xiàng)目的單節(jié)點(diǎn)數(shù)據(jù)庫(kù)方案谢肾,改為多節(jié)點(diǎn)的集群方案,以此來增加數(shù)據(jù)庫(kù)的高可用性蹦骑。

數(shù)據(jù)庫(kù)常見的集群方案

Replication集群方案

特點(diǎn):

1曼库、速度快区岗。
2、弱一致性毁枯,比如我們?cè)跀?shù)據(jù)庫(kù)A節(jié)點(diǎn)寫入數(shù)據(jù)慈缔,集群不一定將數(shù)據(jù)寫入到其他的節(jié)點(diǎn)上,可能發(fā)生的事情是我們?cè)贏節(jié)點(diǎn)寫入的數(shù)據(jù)种玛,有可能在B節(jié)點(diǎn)查不到相關(guān)的數(shù)據(jù)藐鹤。
3瓤檐、低價(jià)值,由于弱一致性娱节,我們?cè)谠摲桨覆荒鼙4娓邇r(jià)值的數(shù)據(jù)挠蛉。

適合保存的數(shù)據(jù):

1、日志數(shù)據(jù)
2肄满、新聞數(shù)據(jù)
3谴古、帖子數(shù)據(jù)等其他的低價(jià)值數(shù)據(jù)

注意:由于Replication方案同步數(shù)據(jù)是單向的,寫入數(shù)據(jù)的節(jié)點(diǎn)我們把它稱為主節(jié)點(diǎn)稠歉,讀取數(shù)據(jù)的節(jié)點(diǎn)稱為從節(jié)點(diǎn)掰担,寫入數(shù)據(jù),只能從主節(jié)點(diǎn)寫入從節(jié)點(diǎn)怒炸,從節(jié)點(diǎn)不能寫入到主節(jié)點(diǎn)带饱,所以稱之為單向數(shù)據(jù)同步。采用異步復(fù)制機(jī)制

PXC集群方案

特點(diǎn):

1阅羹、速度慢纠炮,由于他的強(qiáng)一致性造成的,要在集群的多個(gè)節(jié)點(diǎn)寫入數(shù)據(jù)灯蝴。
2、強(qiáng)一致性孝宗,我們?cè)贏節(jié)點(diǎn)寫入的數(shù)據(jù)穷躁,集群是一定會(huì)發(fā)送到其他節(jié)點(diǎn)上,要么一起成功因妇,要么一起失敗问潭。
3、高價(jià)值婚被,由于強(qiáng)一致性狡忙,該方案可以保存高價(jià)值的數(shù)據(jù)。

適合保存的數(shù)據(jù):

1址芯、訂單數(shù)據(jù)
2灾茁、賬戶數(shù)據(jù)
3、財(cái)務(wù)數(shù)據(jù)等其他高價(jià)值的數(shù)據(jù)

注意:PXC集群對(duì)于每個(gè)節(jié)點(diǎn)都是可讀可寫的谷炸,任何一個(gè)節(jié)點(diǎn)寫入的數(shù)據(jù)北专,都會(huì)同步到其他節(jié)點(diǎn)上。采用同步復(fù)制機(jī)制

由于我的項(xiàng)目是和訂單有關(guān)系的旬陡,所以這次我選擇高價(jià)值的PXC集群方案拓颓。

開始安裝PXC集群

第一步我們首先我們?cè)赿ocker倉(cāng)庫(kù)里下載percona/percona-xtradb-cluster

docker pull percona/percona-xtradb-cluster:5.7.21(冒號(hào)后面的是版本號(hào))

第二步由于我們下載集群的名字太長(zhǎng),我們給pxc鏡像設(shè)置別名

docker tag percona/percona-xtradb-cluster(比如他就是我們下載的鏡像名稱)  pxc(為鏡像定義的別名)

本項(xiàng)目描孟,我創(chuàng)建了一個(gè)五節(jié)點(diǎn)的集群驶睦,由于本人機(jī)器配置的原因砰左,下面我們將創(chuàng)建五節(jié)點(diǎn)的容器,代碼如下:

//節(jié)點(diǎn)一
docker run -d -p 3307:3306 -v v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 --privileged --name=pxc_node1 --net=net1 --ip 172.18.0.2 pxc:5.7.21

//節(jié)點(diǎn)二-五
docker run -d -p 3308:3306 -v v2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pxc_node1 --privileged --name=pxc_node2 --net=net1 --ip 172.18.0.3 pxc:5.7.21
docker run -d -p 3309:3306 -v v3:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pxc_node1 --privileged --name=pxc_node3 --net=net1 --ip 172.18.0.4 pxc:5.7.21
docker run -d -p 3310:3306 -v v4:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pxc_node1 --privileged --name=pxc_node4 --net=net1 --ip 172.18.0.5 pxc:5.7.21
docker run -d -p 3311:3306 -v v5:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pxc_node1 --privileged --name=pxc_node5 --net=net1 --ip 172.18.0.6 pxc:5.7.21

其他節(jié)點(diǎn)和第一個(gè)節(jié)點(diǎn)不同在于场航,其他幾點(diǎn)要加入集群當(dāng)中缠导,目前我們?cè)O(shè)定加入節(jié)點(diǎn)一當(dāng)中,CLUSTER_JOIN=pxc_node1旗闽,XTRABACKUP_PASSWORD:數(shù)據(jù)節(jié)點(diǎn)同步用到的密碼
MYSQL_ROOT_PASSWORD:數(shù)據(jù)庫(kù)連接的密碼
CLUSTER_NAME:集群的名稱

我們可以給容器創(chuàng)建數(shù)據(jù)卷酬核,可以用作映射容器的文件,我們這里的數(shù)據(jù)卷映射到數(shù)據(jù)庫(kù)存放數(shù)據(jù)的地方适室,還可以為他們創(chuàng)建網(wǎng)段嫡意。

//創(chuàng)建數(shù)據(jù)卷
docker volume create --name v1

//創(chuàng)建網(wǎng)段
docker network create --subnet=172.19.0.0/16 net1

目前我們創(chuàng)建出了的數(shù)據(jù)庫(kù)集群,但是還有一個(gè)問題捣辆,如果我們每次請(qǐng)求都是訪問某一個(gè)節(jié)點(diǎn)蔬螟,這樣我們數(shù)據(jù)庫(kù)的壓力還是沒有解決,還是和單節(jié)點(diǎn)的一樣汽畴,這時(shí)我們就應(yīng)該為數(shù)據(jù)庫(kù)集群加上負(fù)載均衡旧巾,讓每一個(gè)節(jié)點(diǎn)都工作起來,來分擔(dān)整個(gè)數(shù)據(jù)庫(kù)訪問的壓力忍些。整個(gè)的架構(gòu)圖如下所示:


PXC負(fù)載均衡示意圖

那么問題來了鲁猩,目前市面上的負(fù)載均衡器的種類很多,比如Haproxy罢坝、Nginx廓握、Apache、LVS等嘁酿,我們應(yīng)該選擇哪一個(gè)呢隙券,接下來我們就來對(duì)比一下這幾種負(fù)載均衡器,如下所示:

名稱 Haproxy Nginx Apache LVS
是否免費(fèi) 免費(fèi) 免費(fèi) 免費(fèi) 免費(fèi)
支持虛擬機(jī) 支持 支持 支持
HTTP協(xié)議 支持 支持 支持 支持
TCP/IP協(xié)議 支持 剛剛支持 不支持 支持
支持插件 不支持 支持 不支持 不支持
性能 一般 最好

從以上的對(duì)比我們看出我們?cè)贖aproxy和Nginx二者進(jìn)行選擇闹司,應(yīng)為我們數(shù)據(jù)集群節(jié)點(diǎn)的連接是通過TCP/IP協(xié)議進(jìn)行連接的娱仔,由于目前Nginx才支持TCP/IP協(xié)議不久,目前Haproxy的技術(shù)已經(jīng)很成熟了游桩,所以我們選擇Haproxy作為我們的負(fù)載均衡器牲迫;

安裝haproxy鏡像

第一步安裝

docker pull haproxy

第二步我們給haproxy起別名

docker tag docker.io/haproxy haproxy

第三步創(chuàng)建haproxy的容器:

docker run -it -d -p 4001:8888 -p 4002:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name haproxy_node1 --privileged --net=net1 haproxy

我們將haproxy的配置文件映射到宿主機(jī)上,方便我們以后管理配置文件借卧。
haproxy的配置文件如下所示:

global
    #工作目錄
    chroot /usr/local/etc/haproxy
    #日志文件恩溅,使用rsyslog服務(wù)中l(wèi)ocal5日志設(shè)備(/var/log/local5),等級(jí)info
    log 127.0.0.1 local5 info
    #守護(hù)進(jìn)程運(yùn)行
    daemon

defaults
    log global
    mode    http
    #日志格式
    option  httplog
    #日志中不記錄負(fù)載均衡的心跳檢測(cè)記錄
    option  dontlognull
    #連接超時(shí)(毫秒)
    timeout connect 5000
    #客戶端超時(shí)(毫秒)
    timeout client  50000
    #服務(wù)器超時(shí)(毫秒)
    timeout server  50000

#監(jiān)控界面   
listen  admin_stats
    #監(jiān)控界面的訪問的IP和端口
    bind  0.0.0.0:8888
    #訪問協(xié)議
    mode        http
    #URI相對(duì)地址
    stats uri   /dbs
    #統(tǒng)計(jì)報(bào)告格式
    stats realm     Global\ statistics
    #登陸帳戶信息
    stats auth  admin:abc123456
#數(shù)據(jù)庫(kù)負(fù)載均衡
listen  proxy-mysql
    #訪問的IP和端口
    bind  0.0.0.0:3306  
    #網(wǎng)絡(luò)協(xié)議
    mode  tcp
    #負(fù)載均衡算法(輪詢算法)
    #輪詢算法:roundrobin
    #權(quán)重算法:static-rr
    #最少連接算法:leastconn
    #請(qǐng)求源IP算法:source 
    balance  roundrobin
    #日志格式
    option  tcplog
    #在MySQL中創(chuàng)建一個(gè)沒有權(quán)限的haproxy用戶谓娃,密碼為空脚乡。Haproxy使用這個(gè)賬戶對(duì)MySQL數(shù)據(jù)庫(kù)心跳檢測(cè)
    option  mysql-check user haproxy
    server  MySQL_1 172.18.0.2:3306 check weight 1 maxconn 2000  
    server  MySQL_2 172.18.0.3:3306 check weight 1 maxconn 2000  
    server  MySQL_3 172.18.0.4:3306 check weight 1 maxconn 2000 
    server  MySQL_4 172.18.0.5:3306 check weight 1 maxconn 2000
    server  MySQL_5 172.18.0.6:3306 check weight 1 maxconn 2000
    #使用keepalive檢測(cè)死鏈
    option  tcpka  

之后我們進(jìn)入容器里面,運(yùn)行配置文件

docker exec -it haproxy_node1 /bin/bash

//運(yùn)行配置文件
haproxy -f usr/local/etc/haproxy/haproxy.cfg

這樣我們的數(shù)據(jù)庫(kù)負(fù)載均衡就成功搭建了,也可以正常的使用起來了奶稠。

還有一個(gè)問題要我們?nèi)ソ鉀Q俯艰,如果我們的負(fù)載均衡器掛了,那么我們的負(fù)載均衡就會(huì)失效锌订,這樣我們?yōu)榱吮kU(xiǎn)起見竹握,我們可以創(chuàng)建多個(gè)負(fù)載均衡器,將他們形成集群辆飘,這也就是我們的雙機(jī)熱備方案啦辐,解決單節(jié)點(diǎn)負(fù)載均衡器失效的情況。
目前我才用的是京東云服務(wù)器蜈项,我利用京東云服務(wù)器的負(fù)載均衡搭建了haproxy集群芹关,這個(gè)很簡(jiǎn)單,只要?jiǎng)?chuàng)建好了紧卒,在京東云上進(jìn)行簡(jiǎn)單的配置就可以達(dá)到效果侥衬。

目前我整個(gè)數(shù)據(jù)庫(kù)的集群方案如下圖所示:


整體MySQL集群的方案
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市跑芳,隨后出現(xiàn)的幾起案子轴总,更是在濱河造成了極大的恐慌,老刑警劉巖博个,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怀樟,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡盆佣,警方通過查閱死者的電腦和手機(jī)往堡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來罪塔,“玉大人,你說我怎么就攤上這事养葵≌骺埃” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵关拒,是天一觀的道長(zhǎng)佃蚜。 經(jīng)常有香客問我,道長(zhǎng)着绊,這世上最難降的妖魔是什么谐算? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮归露,結(jié)果婚禮上洲脂,老公的妹妹穿的比我還像新娘。我一直安慰自己剧包,他們只是感情好恐锦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布往果。 她就那樣靜靜地躺著,像睡著了一般一铅。 火紅的嫁衣襯著肌膚如雪陕贮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天潘飘,我揣著相機(jī)與錄音肮之,去河邊找鬼。 笑死卜录,一個(gè)胖子當(dāng)著我的面吹牛戈擒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播暴凑,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼峦甩,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了现喳?” 一聲冷哼從身側(cè)響起凯傲,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嗦篱,沒想到半個(gè)月后冰单,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡灸促,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年诫欠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浴栽。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡荒叼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出典鸡,到底是詐尸還是另有隱情被廓,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布萝玷,位于F島的核電站嫁乘,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏球碉。R本人自食惡果不足惜蜓斧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望睁冬。 院中可真熱鬧挎春,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至帮碰,卻和暖如春相味,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背殉挽。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工丰涉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人斯碌。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓一死,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親傻唾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子投慈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 前言 本文章使用Percona XtraDB Cluster(MySQL改進(jìn)版,性能提升很大)進(jìn)行集群搭建冠骄,集群m...
    embers1996閱讀 3,734評(píng)論 2 4
  • 安裝環(huán)境 centos7, docker 集群方案介紹 大型網(wǎng)站數(shù)據(jù)庫(kù)需要應(yīng)對(duì)高負(fù)載伪煤、實(shí)現(xiàn)高可用。而單節(jié)點(diǎn)數(shù)據(jù)庫(kù)在...
    Avery_up閱讀 3,033評(píng)論 1 11
  • Linux服務(wù)器集群系統(tǒng)各概念辨析 計(jì)算機(jī)集群 WEB的負(fù)載均衡凛辣、集群抱既、高可用解決方案 計(jì)算機(jī)集群 計(jì)算機(jī)集群簡(jiǎn)稱...
    Zhang21閱讀 3,290評(píng)論 0 18
  • 冷熱數(shù)據(jù)分離 業(yè)務(wù)不斷地在增長(zhǎng),集群分片中的數(shù)據(jù)也會(huì)隨著時(shí)間的推移而增加扁誓,其中有相當(dāng)一部分的數(shù)據(jù)是很少被使用的防泵,例...
    端碗吹水閱讀 495評(píng)論 0 0
  • 寫在前面:本文寫作前景為在b站上看到的一個(gè)三高(高可用、高并發(fā)蝗敢、高性能)的分布式集群架構(gòu)方案捷泞,并對(duì)其中的pxc集群...
    樵夫有橋閱讀 5,341評(píng)論 3 3