Docker搭建mysql集群加haproxy負(fù)載均衡
架構(gòu)圖
img
一惭每、為什么要使用數(shù)據(jù)庫集群和負(fù)載均衡骨饿?
1.高可用 2.高并發(fā) 3.高性能
二、mysql數(shù)據(jù)庫集群方式
Replication | PXC | |||||
---|---|---|---|---|---|---|
速度快 | 弱一致性 | 低價值 | 速度慢 | 強(qiáng)一致性 | 高價值 | |
日志 | 新聞 | 帖子 | 訂單 | 賬號 | 財(cái)務(wù) |
Replication 方案 | ||
---|---|---|
寫 MySQL(master) | 同步 | 讀 MySQL(slave) |
PXC 集群 | ||
---|---|---|
Node1 (reads台腥、writes) | Node2 (reads宏赘、writes) | Node3 (reads、writes) |
使用 mysql數(shù)據(jù)庫集群
(1)創(chuàng)建一個docker的單獨(dú)網(wǎng)段黎侈,預(yù)備mysql數(shù)據(jù)庫集群 使用
docker network create --subnet=172.18.0.0/24 pxc-net
可選:
docket network inspect pxc-net [查看詳情]
docker network rm pxc-net [刪除]
(2)拉取pxc鏡像
docker pull percona/percona-xtradb-cluster:5.7.21
(3)復(fù)制pxc鏡像(實(shí)則重命名)
docker tag percona/percona-xtradb-cluster:5.7.21 pxc
(4)刪除pxc原來的鏡像
docker rmi percona/percona-xtradb-cluster:5.7.21
(5)創(chuàng)建volume
創(chuàng)建:docker volume create --name v1 docker volume create --name v2 docker volume create --name v3
可選:
刪除:docker volume rm 【volume_name】
查看詳情:docker volume inspect 【volume_name】
搭建pxc[mysql]集群察署,用鏡像創(chuàng)建三個pxc容器**
- [CLUSTER_NAME=PXC集群名字]
- [XTRABACKUP_PASSWORD數(shù)據(jù)庫同步需要用到的密碼]
(6)運(yùn)行三個pxc容器
-node1
docker run -d -p 3301:3306 -v v1:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=root
-e CLUSTER_NAME=PXC
-e XTRABACKUP_PASSWORD=root --privileged
--name=node1 --net=pxc-net --ip 172.18.0.2 pxc
-node2
docker run -d -p 3302:3306 -v v2:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=root
-e CLUSTER_NAME=PXC
-e XTRABACKUP_PASSWORD=root
-e CLUSTER_JOIN=node1 --privileged
--name=node2 --net=pxc-net --ip 172.18.0.3 pxc
-node3
docker run -d -p 3303:3306 -v v3:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=root
-e CLUSTER_NAME=PXC
-e XTRABACKUP_PASSWORD=root
-e CLUSTER_JOIN=node1 --privileged
--name=node3 --net=pxc-net --ip 172.18.0.4 pxc
啟動成功后可連接三個節(jié)點(diǎn)的mysql,此時集群完成
使用haproxy作為代理層【負(fù)載均衡/界面監(jiān)控】
(7)拉取haproxy鏡像
docker pull haproxy
(8)創(chuàng)建haproxy配置文件峻汉,這里使用bind mounting的方式
? 創(chuàng)建haproxy配置文件:
touch /tmp/haproxy/haproxy.cfg
編輯haproxy配置文件:
vim /tmp/haproxy/haproxy.cfg
global
#工作目錄贴汪,這邊要和創(chuàng)建容器指定的目錄對應(yīng)
chroot /usr/local/etc/haproxy
#日志文件
log 127.0.0.1 local5 info
#守護(hù)進(jìn)程運(yùn)行
daemon
defaults
log global
mode http
#日志格式
option httplog
#日志中不記錄負(fù)載均衡的心跳檢測記錄
option dontlognull
#連接超時(毫秒)
timeout connect 5000
#客戶端超時(毫秒)
timeout client 50000
#服務(wù)器超時(毫秒)
timeout server 50000
#監(jiān)控界面
listen admin_stats
#監(jiān)控界面的訪問的IP和端口
bind 0.0.0.0:8888
#訪問協(xié)議
mode http
#URI相對地址
stats uri /dbs_monitor
#統(tǒng)計(jì)報告格式
stats realm Global\ statistics
#登陸帳戶信息
stats auth admin:admin
#數(shù)據(jù)庫負(fù)載均衡
listen proxy-mysql
#訪問的IP和端口,haproxy開發(fā)的端口為3306
#假如有人訪問haproxy的3306端口休吠,則將請求轉(zhuǎn)發(fā)給下面的數(shù)據(jù)庫實(shí)例
bind 0.0.0.0:3306
#網(wǎng)絡(luò)協(xié)議
mode tcp
#負(fù)載均衡算法(輪詢算法)
#輪詢算法:roundrobin
#權(quán)重算法:static-rr
#最少連接算法:leastconn
#請求源IP算法:source
balance roundrobin
#日志格式
option tcplog
#在MySQL中創(chuàng)建一個沒有權(quán)限的haproxy用戶扳埂,密碼為空。
#Haproxy使用這個賬戶對MySQL數(shù)據(jù)庫心跳檢測
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
#使用keepalive檢測死鏈
option tcpka
(9)啟動haproxy容器
docker run -d -p 8888:8888 -p 3309:3306
-v /tmp/haproxy:/usr/local/etc/haproxy
--name haproxy01 --privileged --net=pxc-net haproxy
(10)終于可以訪問了 (haproxy性能監(jiān)控界面):
ip:8888/dbs_monitor
此時mysql客戶端是連接不上haproxy的瘤礁,需要根據(jù)配置文件啟動haproxy阳懂,并在數(shù)據(jù)庫上創(chuàng)建用戶用于檢測心跳
(11)根據(jù)haproxy.cfg文件啟動haproxy
docker exec -it haproxy01 bash haproxy -f /usr/local/etc/haproxy/haproxy.cfg
(12)在MySQL數(shù)據(jù)庫上創(chuàng)建用戶,用于心跳檢測
CREATE USER 'haproxy'@'%' IDENTIFIED BY '';
[
小技巧 [如果創(chuàng)建失敗蔚携,可以先輸入一下命令]:
drop user 'haproxy'@'%';
flush privileges;
CREATE USER 'haproxy'@'%' IDENTIFIED BY '';
]
踩過的坑
pxc容器啟動失敗
- 如果重啟過機(jī)器希太,那么原來創(chuàng)建的volume,需要刪除酝蜒,具體原因尚不明確 - 重啟過機(jī)器誊辉,創(chuàng)建的network貌似是down狀態(tài),估計(jì)也要啟動一下亡脑,不行刪除重新創(chuàng)建
命令行不能輸入和粘貼0
無果堕澄,重啟后解決
-
haproxy容器啟動失敗
檢查配置文件邀跃,空格
遇到問題先看錯誤日志
docker logs container_id