安裝PXC
PXC 模式,沒(méi)有主從之分,每個(gè)數(shù)據(jù)庫(kù)都可以進(jìn)行讀寫(xiě),數(shù)據(jù)可以保持強(qiáng)一致性,執(zhí)行時(shí)間較慢,由于一般是強(qiáng)一致性,所以一般用于存儲(chǔ)重要的信息,例如金融。
- 安裝pxc鏡像
進(jìn)入docker官網(wǎng)找到pxc鏡像傳送門(mén)復(fù)制安裝pxc進(jìn)行的指令docker pull percona/percona-xtradb-cluster - 執(zhí)行該指令,等待linux安裝完畢。安裝完畢后使用
docker images檢查是否已經(jīng)安裝
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/percona/percona-xtradb-cluster latest 70b3670450ef 3 months ago 408 MB
- 由于系統(tǒng)自帶的PXC名字過(guò)長(zhǎng),我們可以將他的名字進(jìn)行修改,方便使用
[root@localhost ~]# docker tag docker.io/percona/percona-xtradb-cluster pxc
[root@localhost ~]# docker rmi docker.io/percona/percona-xtradb-cluster
Untagged: docker.io/percona/percona-xtradb-cluster:latest
Untagged: docker.io/percona/percona-xtradb-cluster@sha256:78460483e99c093d2910d3667d928ed8c2165165554482058875bccafa4ccf0b
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
pxc latest 70b3670450ef 3 months ago 408 MB
- 每個(gè)PXC節(jié)點(diǎn)內(nèi)部包含一個(gè)mysql實(shí)例,如果需要?jiǎng)?chuàng)建包含5個(gè)數(shù)據(jù)庫(kù)節(jié)點(diǎn)的數(shù)據(jù)庫(kù)集群,那么要?jiǎng)?chuàng)建5個(gè)pxc節(jié)點(diǎn)。出于安全考慮,需要給PXC集群實(shí)例創(chuàng)建一個(gè)Docker內(nèi)部網(wǎng)絡(luò)。
- 創(chuàng)建一個(gè)網(wǎng)段
docker network create
- 創(chuàng)建一個(gè)網(wǎng)段
[root@localhost ~]# docker network create --subnet=172.18.0.0/24 net1
0b8e9701ac4e79239e4a92013ee80a089ff8e9681e881d20a7b1a4ccd8e9ddf9
- 查看指定網(wǎng)段信息
docker network inspect 網(wǎng)段名稱
[root@localhost ~]# docker network inspect net1
[
{
"Name": "net1",
"Id": "0b8e9701ac4e79239e4a92013ee80a089ff8e9681e881d20a7b1a4ccd8e9ddf9",
"Created": "2019-06-10T09:34:11.010208053+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/24"
}
]
},
"Internal": false,
"Attachable": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
- 移除指定網(wǎng)段
docker network rm 網(wǎng)段名稱 - 創(chuàng)建docker卷
docker volume create --name
創(chuàng)建一個(gè)docker卷名字為v1,通過(guò)查看其詳細(xì)信息,發(fā)現(xiàn)該卷在宿主機(jī)的映射地址為/var/lib/docker/volumes/v1/_data
[root@localhost ~]# docker volume create v1
v1
[root@localhost ~]# docker inspect v1
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/v1/_data",
"Name": "v1",
"Options": {},
"Scope": "local"
}
]
-
創(chuàng)建PXC容器
image.png
-d :代表創(chuàng)建的容器在后臺(tái)運(yùn)行
-p : 端口映射 宿主機(jī)端口:容器端口
-v :路徑映射
-e MYSQL_ROOT_PASSWORD=root 指定mysql的root賬號(hào)密碼為root
-e CLUSTER_NAME=PXC 執(zhí)行名稱為PXC
-e XTRABACKUP_PASSWORD=root 指定mysql數(shù)據(jù)同步時(shí)用的密碼為root
--privileged 給最高的權(quán)限
--name=node1 節(jié)點(diǎn)名稱node1
--net=net1 使用的內(nèi)部網(wǎng)段
--ip 172.18.0.2 分發(fā)的ip地址
pxc 鏡像名稱pxc
[root@localhost ~]# docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -v v1:/var/lib/mysql --privileged --name=node1 --net=net1 --ip 172.18.0.2 pxc
96e7588f1e9f2f657217f7ede6c53b1c5e7c044b57b5ef3787df2e7c5e69b974
[root@localhost ~]# docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -v v2:/var/lib/mysql -e CLUSTER_JOIN=node1 --privileged --name=node2 --net=net1 --ip 172.18.0.3 pxc
206452fddb60a03f44bd175c075b527781fbe7cc2d3eb805969ef1b48894fa76
[root@localhost ~]# docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -v v3:/var/lib/mysql -e CLUSTER_JOIN=node1 --privileged --name=node3 --net=net1 --ip 172.18.0.4 pxc
0fc05938f19fd16c69999ce79e67983609308417a500407ae693900667f668dc
[root@localhost ~]# docker run -d -p 3309:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -v v4:/var/lib/mysql -e CLUSTER_JOIN=node1 --privileged --name=node4 --net=net1 --ip 172.18.0.5 pxc
74e8fb3022e5077669dc05d519aa331e9c678b2943fdd61e331d93ab39548424
[root@localhost ~]# docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -v v5:/var/lib/mysql -e CLUSTER_JOIN=node1 --privileged --name=node5 --net=net1 --ip 172.18.0.6 pxc
bc48ae76e854ef3ddd6ef0a6d412f00a6e3a826edecc8c56a572322e1b821b10
執(zhí)行docker ps進(jìn)行查看
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
14a0ba3c314e pxc "/entrypoint.sh " 6 seconds ago Up 5 seconds 4567-4568/tcp, 0.0.0.0:3309->3306/tcp node4
bc48ae76e854 pxc "/entrypoint.sh " About a minute ago Up About a minute 4567-4568/tcp, 0.0.0.0:3310->3306/tcp node5
0fc05938f19f pxc "/entrypoint.sh " 2 minutes ago Up 2 minutes 4567-4568/tcp, 0.0.0.0:3308->3306/tcp node3
206452fddb60 pxc "/entrypoint.sh " 4 minutes ago Up 4 minutes 4567-4568/tcp, 0.0.0.0:3307->3306/tcp node2
96e7588f1e9f pxc "/entrypoint.sh " 13 minutes ago Up 12 minutes 0.0.0.0:3306->3306/tcp, 4567-4568/tcp node1
通過(guò)navcat進(jìn)行連接,連接的ip即為宿主機(jī)的ip

數(shù)據(jù)負(fù)載均衡機(jī)制

負(fù)載均衡中間件對(duì)比

安裝Haproxy
- 拉取鏡像
docker pull haproxy
- 創(chuàng)建配置文件
[root@localhost ~]# mkdir /home/soft -p
[root@localhost ~]# touch /home/soft/haproxy.cfg
配置文件具體內(nèi)容可參考戳我
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ù)載均衡的心跳記錄
option dontlognull
#連接超時(shí)(毫秒)
timeout connect 5000
#客戶端超時(shí)(毫秒)
timeout client 5000
#服務(wù)器超時(shí)(毫秒)
timeout server 5000
#監(jiān)控界面
listen admin_stats
#監(jiān)控界面訪問(wèn)ip和端口
bind 0.0.0.0:8888
#訪問(wèn)協(xié)議
mode http
#URI相對(duì)地址
stats uri /dbs
#統(tǒng)計(jì)報(bào)告格式
stats realm Gloal\ statistics
#登錄賬戶信息 用于登錄監(jiān)控網(wǎng)站使用
stats auth root:root
#數(shù)據(jù)庫(kù)負(fù)載均衡
listen proxy-mysql
#訪問(wèn)的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è)沒(méi)有權(quán)限的haproxy用戶,密碼為空。
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

- 創(chuàng)建Haproxy容器
[root@localhost ~]# docker run -it -d -p 4001:8888 -p 4002:3306 -v /home/haproxy:/usr/local/etc/haproxy --name haproxy --privileged --net=net1 haproxy
- 進(jìn)入haproxy后臺(tái)
docker exec,加載配置文件
[root@localhost haproxy]# docker exec -it h1 bash
root@4e53fd48e900:/# haproxy -f /usr/local/etc/haproxy/haproxy.cfg
- 在node1節(jié)點(diǎn)上創(chuàng)建一個(gè)沒(méi)有密碼沒(méi)有權(quán)限的用戶用于做心跳檢測(cè)
create user 'haproxy'@'%' IDENTIFIED BY '';
- 確認(rèn)防火墻關(guān)閉或者端口4001是暴露的狀態(tài)的前提下客戶端訪問(wèn)
ip:4001/dbs
用戶名和密碼為在haproxy.cfg配置文件設(shè)置好的,查看配置文件即可。
image.png - 后臺(tái)關(guān)閉任意一個(gè)數(shù)據(jù)庫(kù)節(jié)點(diǎn)進(jìn)行測(cè)試
[root@localhost ~]# docker stop node1
node1

-
haproxy連接navcat客戶端
像連接mysql客戶端一樣,
ip為宿主機(jī)ip,端口為剛剛啟動(dòng)的時(shí)候映射的4002,密碼為數(shù)據(jù)庫(kù)的密碼。
image.png
haproxy本身并不會(huì)存儲(chǔ)數(shù)據(jù),他只會(huì)將發(fā)過(guò)來(lái)的請(qǐng)求進(jìn)行轉(zhuǎn)發(fā)。值得注意的是單節(jié)點(diǎn)的haproxy是不具備高可用性的,所以必須要有冗余的設(shè)計(jì)。具體如下:
haproxy高可用
-
Keepalived雙機(jī)熱備
image.png
設(shè)置一個(gè)虛擬ip,兩個(gè)keepalive同時(shí)進(jìn)行搶占該虛擬ip,搶到的為主服務(wù)器,沒(méi)有搶到的為從服務(wù)器,從服務(wù)器定期向主服務(wù)器發(fā)送心跳,如果檢測(cè)到主服務(wù)器宕機(jī),從服務(wù)便可以獲得虛擬ip成為主服務(wù)器。
-
總體架構(gòu)設(shè)計(jì)
image.png
前面已經(jīng)介紹過(guò)keepalived雙機(jī)熱備,不在贅述,最外面的那個(gè)keepalived作為跳板機(jī)使用。
- 安裝
- 在haproxy中安裝keepalived
sudo apt-get update
sudo apt-get install keepalived
- 更改keepalived配置文件
路徑:/etc/keepalived/keepalived.conf
內(nèi)容:
vrrp_instance VI_1{
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication{
auth_type PASS
auth_pass 123456
}
virtual_ipaddress{
172.18.0.201
}
}
[配置文件說(shuō)明]
- state MASTER 表明keepalived身份(MASTER為主服務(wù)器,BACKUP為從服務(wù)器),主服務(wù)器搶占虛擬IP,備用服務(wù)器不會(huì)搶占IP
- interface eth0 網(wǎng)卡設(shè)備,用于保存虛擬IP地址,該網(wǎng)卡是docker的網(wǎng)卡,只有在宿主機(jī)可見(jiàn)。所以需要將該虛擬IP映射到其他可見(jiàn)的IP上
- virtual_router_id 51 虛擬路由標(biāo)識(shí),MASTER和BACKUP的虛擬路由標(biāo)識(shí)必須保持一致,標(biāo)識(shí)可以是0~255
- priority 100 權(quán)重,MASTER的權(quán)重要高于BACKUP數(shù)字越大優(yōu)先級(jí)越高。
- advert_int 1 心跳檢測(cè)的時(shí)間間隔,主備之間必須一致。單位(秒)
- authentication{
auth_type PASS
auth_pass 123456
}
心跳檢測(cè)使用的賬號(hào)和密碼 - virtual_ipaddress{
172.18.0.201
}
虛擬IP地址,可以設(shè)置多個(gè)虛擬IP地址,每行一個(gè)。
- 啟動(dòng)keepalived程序,在宿主機(jī)ping定義好的虛擬ip




