最近疫情期間某饰,為了提升自己的知識(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)圖如下所示:
那么問題來了鲁猩,目前市面上的負(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ù)的集群方案如下圖所示: