搭建5個MySQL節點
- 拉取鏡像到本地
docker pull percona/percona‐xtradb‐cluster
- 鏡像名稱太長不方便使用,進行一下改名,改名後刪除原來的鏡像
docker tag percona/percona‐xtradb‐cluster pxc
docker rmi percona/percona‐xtradb‐cluster
- 創建內網網段net1
創建網段:docker network create --subnet=172.18.0.0/24 net1
查詢網段信息: docker inspect net1
刪除網段:docker network rm net1
- 創建docker數據卷
創建:docker volume create --name v1
查看數據卷信息:docker inspect v1
刪除:docker volume rm v1
重複操作創建v1-v5共5個數據卷
創建備份數據卷:docker volume create --name backup
- 創建容器
- node1啓動後一段時間再啓動其他節點沒如果node1沒初始化完成就啓動其他節點就會報錯
- node如果啓動幾秒就掛掉了,刪除對應的數據卷之後再重新創建數據卷再啓動
- 參數說明:
- -d 後臺運行
- -p 3307:3306 將容器內的3306端口映射到宿主機3307端口
- -e 初始化MySQL的基本參數
- -v 映射宿主機數據卷和容器目錄
- –name 指定容器名
- –net 指定容器的網關
- –ip 指定容器的IP,如果不指定會自動生成
#創建第1個MySQL節點
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -v v1:/var/lib/mysql -v backup:/data --privileged --name=node1 --net=net1 --ip 172.18.0.2 pxc
#創建第2個MySQL節點
docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v2:/var/lib/mysql -v backup:/data --privileged --name=node2 --net=net1 --ip 172.18.0.3 pxc
#創建第3個MySQL節點
docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v3:/var/lib/mysql --privileged --name=node3 --net=net1 --ip 172.18.0.4 pxc
#創建第4個MySQL節點
docker run -d -p 3309:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v4:/var/lib/mysql --privileged --name=node4 --net=net1 --ip 172.18.0.5 pxc
#創建第5個MySQL節點
docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v5:/var/lib/mysql -v backup:/data --privileged --name=node5 --net=net1 --ip 172.18.0.6 pxc
- 外部嘗試連接5個MySQL節點,通過navicat進行連接
- ip爲宿主機公網IP
- 端口爲只設置到暴露到公網的端口
- 用戶名root
- 密碼abc123456
使用Haproxy實現負載均衡
MySQL各個節點之間通過TCP/IP協議進行交互,而使用較爲廣泛的負載均衡中間件nginx(適用於HTTP)就不太適合了,適用於TCP/IP協議的負載均衡中間件有Haproxy和LVS。這裏採用Haproxy來實現負載均衡
- 安裝Haproxy
拉取鏡像到本地
docker pull haproxy
在宿主機創建haproxy.cfg的配置文件,放置在自定義目錄,如/root/docker/haproxy/
下
global
#工作目錄
chroot /usr/local/etc/haproxy
#日誌文件,使用rsyslog服務中local5日誌設備(/var/log/local5),等級info
log 127.0.0.1 local5 info
#守護進程運行
daemon
defaults
log global
mode http
#日誌格式
option httplog
#日誌中不記錄負載均衡的心跳檢測記錄
option dontlognull
#連接超時(毫秒)
timeout connect 5000
#客戶端超時(毫秒)
timeout client 50000
#服務器超時(毫秒)
timeout server 50000
#監控界面
listen admin_stats
#監控界面的訪問的IP和端口
bind 0.0.0.0:8888
#訪問協議
mode http
#URI相對地址
stats uri /dbs
#統計報告格式
stats realm Global\ statistics
#登陸帳戶信息
stats auth admin:abc123456
#數據庫負載均衡
listen proxy-mysql
#訪問的IP和端口
bind 0.0.0.0:3306
#網絡協議
mode tcp
#負載均衡算法(輪詢算法)
#輪詢算法:roundrobin
#權重算法:static-rr
#最少連接算法:leastconn
#請求源IP算法:source
balance roundrobin
#日誌格式
option tcplog
#在MySQL中創建一個沒有權限的haproxy用戶,密碼爲空。Haproxy使用這個賬戶對MySQL數據庫心跳檢測
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檢測死鏈
option tcpka
- 啓動第一個Haproxy容器
docker run -it -d -p 4001:8888 -p 4002:3306 -v /root/docker/haproxy:/usr/local/etc/haproxy --name h1 --privileged --net=net1 --ip 172.18.0.7 haproxy
參數說明
- 4001:8888 :將haproxy暴露在8888的監控端口映射到宿主機
- 4002:3306:將haproxy的3306端口映射到宿主機4002端口
- 將haproxy的/usr/local/etc/haproxy目錄映射到宿主機的/root/docker/haproxy目錄,用於設置配置文件
- haproxy取名爲h1
- 使用網段net1
- 手動設置一個ip爲172.18.0.7
- 啓動第一個Haproxy
以界面交互方式進入容器:
docker exec -it h1 bash
加上配置文件啓動
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
- 啓動第二個Haproxy容器
docker run -it -d -p 4003:8888 -p 4004:3306 -v /root/docker/haproxy:/usr/local/etc/haproxy --name h2 --privileged --net=net1 --ip 172.18.0.8 haproxy
- 啓動第一個Haproxy
以界面交互方式進入容器:
docker exec -it h2 bash
加上配置文件啓動
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
- 配置連接賬號
先任意登錄一個MySQL節點
在MySQL中創建一個沒有權限的haproxy用戶,密碼爲空。
Haproxy使用這個賬戶對MySQL數據庫心跳檢測
CREATE USER 'haproxy' @'%' IDENTIFIED BY '';
- 訪問Haproxy監控
url可以是任意一個節點的監控端口
公網ip:4001/dbs
公網ip:4003/dbs
訪問界面如圖所示
使用的時候就可以直接向haproxy節點發起請求,haproxy只是對請求進行轉發,並不會進行存儲
用navicat連接一個節點方便使用
Keepalived實現高可用方案
PXC集羣的目的是保證單節點MySQL故障時的高可用
引入Haproxy做負載均衡後,所有的請求都需要Haproxy進行轉發
如果Haproxy宕機了,同樣不能做到集羣高可用
所以需要對Haproxy也進行高可用配置
方案如下
現在已經配置好了數據庫集羣和兩個節點的Haproxy
還需要在兩個Haproxy上各配置一個Keepalived
然後在宿主機上配置一個Keepalived用於爲外提供服務
- 在haproxy上安裝keepalived(haproxy鏡像使用的是unbuntu,所以以下操作使用apt-get)
進入haproxy
docker exec -it h1 bash
更新apt-get
apt-get update
下載keepalived
apt-get install keepalived
修改keepalived配置文件
因爲keepalived鏡像裝載ubuntu上,如果直接修改還需要裝vim等工具,所以可以在宿主機寫好了複製進來或者設置目錄映射
編寫keepalived.conf文件
vrrp_instance VI_1 {
state MASTER #keepalived的身份:MASTER主服務,會搶佔虛擬ip;BACKUP備用服務
interface eth0 #網卡配置較:etho是docker虛擬機的網卡,宿主機能訪問但是局域網不能訪問,宿主機的keepalived上將網卡映射到局域網
virtual_router_id 51 #id:0-255間隨便取
priority 100 #權重,根據硬件配置調整數字
advert_int 1 # 心跳檢測的時間間隔 1s
authentication { #心跳檢測需要開放的密碼
auth_type PASS
auth_pass 123456
}
virtual_ipaddress { #eth0開放的虛擬ip
172.18.0.201
}
}
採用宿主機寫好再複製的操作:
docker cp 宿主機文件路徑 鏡像名稱:鏡像中文件存放路徑
docker cp /root/keepalived.conf h1:/etc/keepalived/
啓動keepalived
service keepalived start
返回宿主機測試是否啓動成功
ping 172.18.0.201
同理修改h2中的配置,其中所有的配置包括ip設置都一模一樣
- 宿主機安裝keepalived
yum ‐y install keepalived
修改配置文件
vi /etc/keepalived/keepalived.conf
配置文件如下
其中:
- 172.26.0.288表示本地網關下的任意一個IP
- 查看本地網關可以通過:
ip addr
/ifconfig
/ip a
查看 - 172.18.0.201表示Haproxy的IP
- 8888是Haproxy監控的端口
- 3306是MySQL的端口
virtual_server 172.26.0.228 8888 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 172.18.0.201 8888 {
weight 1
}
}
virtual_server 172.26.0.228 3306 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 172.18.0.201 3306 {
weight 1
}
}
啓動keepalived
service keepalived start
啓動完成之後可以通過ping自定義的IP來查看是否連接成功
ping 172.26.0.228
- 數據熱備份
進入node1
docker exec ‐it node1 bash
更新apt-get
apt‐get update
安裝熱備份工具
apt‐get install percona‐xtrabackup‐24
進行全量熱備份
innobackupex ‐‐user=root ‐‐password=abc123456 /data/backup/full