docker部署mysql集群
1.0 安裝環境
1.1 安裝Centos7
-
Docker官方建議在Ubuntu中安裝,因為Docker是基於Ubuntu發布的,而且一般Docker出現的問題Ubuntu是最先更新或者打補丁的。在很多版本的CentOS中是不支持更新最新的一些補丁包的。
-
如果docker安裝在centos上面建議用Centos7版本,在CentOS6.x的版本中,安裝前需要安裝其他很多的環境而且Docker很多補丁不支持更新。
1.2 安裝Docker
# 更新原有安裝包
yum -y update
# 安裝依賴
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 安裝docker
sudo yum install docker-ce
1.21 docker常用命令
- linux 的 service 和 systemctl 命令大致區別
- 啟用可以用service docker start也可以用systemctl start docker其他重啟停止也可以用systemctl
- CentOS 7.x 開始,CentOS 開始使用 systemd 服務來代替 daemon,原來管理系統啟動和管理系統服務的相關命令全部由 systemctl命 令來代替。
- service命令是Redhat Linux兼容的發行版中用來控制系統服務的實用工具,它以啟動、停止、重新啟動和關閉系統服務,還可以顯示所有系統服務的當前狀態。
- service啟動缺點
- 一是啟動時間長。init 進程是串行啟動,只有前一個進程啟動完,才會啟動下一個進程。
- 二是啟動腳本復雜。init 進程只是執行啟動腳本,不管其他事情。腳本需要自己處理各種情況,這往往使得腳本變得很長
- systemctl 優缺點
- Systemd 的優點是功能強大,使用方便,缺點是體系龐大,非常復雜。事實上,現在還有很多人反對使用 Systemd,理由就是它過於復雜,與操作系統的其他部分強耦合,違反 “keep simple, keep stupid” 的Unix 哲學。
# 查看docker版本
docker -v
# 啟動
service docker start
# 停止
service dockerstop
# 重啟
service docker restart
# 開機啟動
systemctl enable docker
# 重啟docker
systemctl restart docker
1.21 在線安裝docker鏡像
# 搜索java鏡像
docker search java
#拉取java鏡像
docker pull java
- docker倉庫是部署在國外服務器上面的,所以如果在國內拉取鏡像那將是一個非常漫長的過程,因此我們可以用一些國內的鏡像倉庫,比如阿里雲的又或者加速器DaoCloud
1.22 配置Docker加速器
- 配置阿里雲鏡像加速器
- 配置阿里雲鏡像加速器需要注冊賬號
- https://cr.console.aliyun.com/#/imageList)
- 注冊之后點擊左下方鏡像加速器會生成一個專屬加速網址
- 將生成的專屬網址,加入/etc/docker/daemon.json即可
# 修改docker配置文件
vi /etc/docker/daemon.json
- 配置Daocloud加速器
#配置加速器命令(復制粘貼執行即可)Ps:此命令僅克用於Linux操作系統
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
- 注意:在設置完成后,可能有一個坑存在的,執行命令設置后,它會在docker配置文件中添加一個地址,但是地址后面是多了一個,號的,需要手動刪除

- 刪除配置文件中多余的,號
# 修改docker配置文件
vi /etc/docker/daemon.json
1.23 導出和導出鏡像
# 導出鏡像
docker save 鏡像名>導出路徑
docker sava tomcat > /home/tomcat.tar.gz
# 導入鏡像
docker load<鏡像文件路徑
docker load < /home/mysql.tar.gz
#查看docker已有鏡像
docker images
# 刪除鏡像
docker rmi 鏡像名
docker rmi reids
#修改鏡像名
docker tag 原鏡像名 修改后鏡像名
docker tag docker.io/percona/percona-xtradb-cluster pxc
1.24 容器相關命令
# 創建並且啟動一個容器
# -it表示啟動容器后開啟一個交互的界面 --name 給容器起一個名字不取就沒有可通過id辨別 bash代表啟動程序后運行什么樣的成員bash=bash命令行
docker run -it --name myTomcat tomcat bash
# 開啟容器並且映射端口 -p 8088:8080代表將容器8080端口映射到宿主機8088上面 可以映射多個端口
docker run -it --name myTomcat -p 8088:8080 -p 8089:3306 tomcat bash
# 開啟容器並且映射目錄或者文件
# -v宿主機目錄映射到容器中/home/data:/mysqlData冒號之前是宿主機的目錄集將目錄/home/data映射到/mysqlData
# --privileged這個是代表容器操作映射目錄使用的是最高權限,即可讀可寫可執行
docker run -it --name myTomcat -v /home/data:/mysqlData --privileged tomcat bash
# 三條命令合一
docker run -it -p 8088:8080 -p 8089:3306 -v /home/data:/mysqlData --privileged --name myTomcat tomcat bash
# 停止容器 myTomcat是容器名字沒有可以通過容器id識別
docker pause myTomcat
# 恢復容器
docker unpauser myTomcat
# 徹底停止容器
docker stop myTomcat
# 重新啟動容器
docker start -i myTomcat
# 退出交互頁面開啟容器-it執行的(同時會徹底關閉容器)
exit
# 刪除容器
docker rm myTomcat
# 進入容器
docker exec -it 容器名 bash
# 重命名容器名
docker rename 原容器名稱 新容器名稱
PS:
以上僅僅是Docker基礎命令
Docker后面還有
容器數據卷
DockerFile(制作鏡像使用)
Docker Compose (多容器管理)
Docker Swarm (docker集群)
2.0 基於Docker部署Mysql集群
2.01 單節點數據庫的弊端
-
- 大型互聯網程序用戶群體龐大,所以架構必須要特殊設計
- 單節點的數據庫無法滿足性能上的要求
- 單節點設計,無冗余設計,一旦數據庫宕機,整個系統面臨崩潰,無法滿足高可用
2.02 常見Mysql數據庫集群方案
- 常見的mysql集群有兩種:
-
- Replication
- 速度快,但僅能保證弱一致性,適用於保存價值不高的數據,比如日志、帖子、新聞等。
- 采用master-slave結構,在master寫入會同步到slave,能從slave讀出;但在slave寫入無法同步到master。
- 采用異步復制,master寫入成功就向客戶端返回成功,但是同步slave可能失敗,會造成無法從slave讀出的結果。
- Replication
-
- PXC (Percona XtraDB Cluster)
- 速度慢,但能保證強一致性,適用於保存價值較高的數據,比如訂單、客戶、支付等。
- 數據同步是雙向的,在任一節點寫入數據,都會同步到其他所有節點,在任何節點上都能同時讀寫。
- 采用同步復制,向任一節點寫入數據,只有所有節點都同步成功后,才會向客戶端返回成功。事務在所有節點要么同時提交,要么不提交。
- PXC (Percona XtraDB Cluster)

-
- PXC既然能保障強一致性,那么當一個節點宕機了,其他節點無法向這個節點,寫入數據,那是不是意味着整個,mysql集群就掛掉了呢?
- 其實如果說不介入中間件的情況下,確實是這樣的,一旦一個節點宕機,那么其他節點都將無法寫入數據,就相當於整個集群,掛了
- 但是采用PXC做數據庫集群,肯定會采用中間件比如支持tcp協議Haproxy和Nginx
- 因為每個PXC節點都是可以讀寫的,所以SQL語句無論讀寫,發送哪個節點都可以執行。有一個節點掛掉也不怕,因為Haproxy有心跳檢測,節點宕機,就不向這個節點發送SQL語句。當然一個Haproxy還存在宕機的問題,所以可以配置雙機熱備的Haproxy方案
2.1 Docker安裝PXC
# docker拉去安裝PXC
# 這邊使用的nysql是5.7.21版本的,我現在部署的項目使用的數據庫就是這個版本,用mysql8就需要修改一些配置
# 需要注意的是,如果你使用的是mysql8,pxc是需要設置一個ssl秘鑰的,否則啟用第二個節點會爆錯
docker pull percona/percona-xtradb-cluster:5.7.21
# docker本地安裝PXC
doker load < 鏡像壓縮文件路徑
2.12 設置PXC內部網絡
# docker自帶網段172.17.0....多個網段一次類推
docker network create network1
docker network create network2
docker network create network3
# 創建自定義ip 網段--subnet=172.19.0.0/24指定網段為172.19.0.0子網掩碼24位
docker network create --subnet=172.19.0.0/24 network1
# 查看已經創建網段
docker network inspect 網段名
# 刪除已有網段
docker network rm 網段名
2.13 創建Docker數據卷
- pxc在容器中使用是無法直接使用映射目錄的,所以為它創建docker容器卷
# 創建docker卷
docker volume create --name 卷名
# 查看數據卷具體位置
docker inspect 卷名
# 刪除數據卷
docker volume rm 卷名
2.14 創建PXC容器
# 創建第1個MySQL節點
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -v v1:/var/lib/mysql --privileged --name=pxcnode1 --net=network1 --ip 172.19.0.2 pxc
# 創建第2個MySQL節點
# 需要注意,只有當第一個節點的mysql完全啟動后(在本地連接成功后)才可以創建第二個,第三個
docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pxcnode1 -v v2:/var/lib/mysql --privileged --name=pxcnode2 --net=network1 --ip 172.19.0.3 pxc
# 創建第3個MySQL節點
docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pxcnode1 -v v3:/var/lib/mysql --privileged --name=pxcnode3 --net=network1 --ip 172.19.0.4 pxc
# 創建第4個MySQL節點
docker run -d -p 3309:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pxcnode1 -v v4:/var/lib/mysql --privileged --name=pxcnode4 --net=network1 --ip 172.19.0.5 pxc
# 創建第5個MySQL節點並映射數據庫熱備數據卷用於后面熱備數據
docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pxcnode1 -v v5:/var/lib/mysql -v backupv:/data --privileged --name=pxcnode5 --net=network1 --ip 172.19.0.6 pxc

-
PXC容器全部啟動成功


-
容器啟動失敗
-
當容器啟動失敗后,通過log查看具體錯誤,並修改。

-
當你在其中一個數據庫中添加表或者數據,其他四個數據庫也會同步添加
-
當你把其中一個節點關閉后,數據庫將無法插入數據,(強一致性)

2.2 數據庫負載均衡
-
復制均衡的中間件,常用的有4個
- Haproxy
- Nginx
- Apache
- LVS
-
Haproxy,Nginx,Apache,LVS對比
-
Nginx最近幾年才支持tcp協議
-
Apache不支持tcp無法使用
-
LVS其實性能最好的,但是無法在虛擬機使用
-
Haproxy不支持插件,但是對比其他幾個,個人感覺這個比價合適
-
不使用負載均衡的弊端
- 所有請求都發送到一個數據庫,而其他數據庫,只做同步,此時數據庫1負載時很高的,而數據庫2,3,4卻很空閑
- 當數據庫1承受不住壓力宕機了,其他節點也就無法使用
- 當數據庫2意外宕機了,而正常處理請求的數據庫1也無法在寫入數據

-
使用負載均衡的優點
- 使用Haproxy,Haproxy會將應用程序發送的請求均勻的分發到每一個pxc節點上面,使每個節負載比較低
- Haproxy有心跳檢測,節點宕機,就不向這個節點發送請求,即使其中一個節點意外宕機了,也不會使整個服務掛掉

2.21 安裝Haproxy
#拉去Haproxy鏡像
docker pull docker.io/haproxy:2.0
2.22 創建Haproxy配置文件
mkdir /home/soft/haproxy
vi /home/soft/haproxy/haproxy.cfg
-
haproxy.cfg
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:18081 #訪問協議 mode http #URI相對地址 stats uri /dbs #統計報告格式 stats realm Global\ statistics #登陸帳戶信息 stats auth admin:123456 #數據庫負載均衡 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數據庫心跳檢測 #server LmhcBlogDB1 172.19.0.2:3306 check weight 1 maxconn 2000 #LmhcBlogDB1名字隨意 172.19.0.2:3306容器ip端口 check發送心跳監測 weight 1權重采用權重算法才會生效 maxconn 2000最大連接數 option mysql-check user haproxy server LmhcBlogDB1 172.19.0.2:3306 check weight 1 maxconn 2000 server LmhcBlogDB2 172.19.0.3:3306 check weight 1 maxconn 2000 server LmhcBlogDB3 172.19.0.4:3306 check weight 1 maxconn 2000 server LmhcBlogDB4 172.19.0.5:3306 check weight 1 maxconn 2000 server LmhcBlogDB5 172.19.0.6:3306 check weight 1 maxconn 2000 #使用keepalive檢測死鏈 option tcpka
2.23 創建Haproxy容器
# 創建Haproxy容器
# 注意:不同版本的haproxy映射的目錄是不一樣的,如果容器創建成功后沒有啟動或者處於創建狀態先去看他的log,haproxy的log會給你一個可以執行的目錄
docker run -it -d -p 5000:18081 -p 5001:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name lmhcblogh1 --privileged --net=network1 --ip 172.19.0.7 124f5f3f731b
# 進入容器 指明配置文件位置
docker exec -it lmhcblogh1 bash
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
/usr/local/etc/haproxy
# Haproxy 后台登錄
宿主機ip:5000/dbs
-- 創建haproxy賬號創建這個賬號是無法連接,haproxy要用這個賬號去向pxc發送心跳監測
create user 'haproxy'@'%' IDENTIFIED BY '';
-
HaproxyWeb界面

2.24 Haproxy雙機熱備
-
單節點Haproxy是不具備高可用的 當Haproxy出現故障宕機,應用將無法在於數據庫做交互,

-
利用Keepalived實現雙擊熱備
- Keepalived執行方式類似於線程是搶占式的,兩個Keepalived搶一個虛擬Haproxy ip,其中一個Keepalived搶到虛擬ip另一個則在等待狀態,兩個Keepalived之間是有心跳監測的
-
安裝Keepalived
# 進入Haproxy容器
docker exec -it lmhcblogh1 bash
# Keepalived只能安裝在Haproxy容器中
# Haproxy 以Ubuntu創建出來的 Ubuntu命令以apt-get
# 更新apt-get
apt-get update
# 安裝Keepalived
apt-get install keepalived
# 安裝vim編輯器用來編寫keepalived配置文件
apt-get install vim
# 進入Keepalived配置文件
vim /etc/keepalived/keepalived.conf
-
Keepalived配置文件
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.19.0.200 } } -
啟動Keepalived
service keepalived start
-
查看Keepalived IP172.19.0..200與宿主機的之間通信是否有問題

2.25 數據庫熱備份
-
常見的數據庫備份方案
- lvm,LVM采用的是快照方式備份,備份的是分區里面存儲的數據,可以兼容任何數據庫,備份時加鎖,只可讀不可寫
- XtraBackup,
- XtraBackup備份不加鎖
- 不會打斷正在執行事務
- 壓縮備份
- 可增量備份(只備份變化數據)全量備份(首次備份采用全量后續采用增量)
-
安裝 XtraBackup
# 在前面創建pxcnode5容器是已經映射了用於備份的數據庫backupv # pxc容器安裝XtraBackup # 更新atp-get apt-get update # 安裝XtraBackup apt-get install percona-xtrabackup-24 # 備份數據user=數據庫用戶嗎 password=數據庫密碼 備份路徑/date/backup/full innobackupex --user=root --password=lmhcblog2020 /date/backup/full
2.26 數據還原
-
刪除原有pxc容器刪除數據卷並重新創建pxc容器清除數據然后還原數據
#刪除數據 rm -rf /var/lib/mysql/* #清空事務 innobackupex --user=root --password=abc123456 --apply-back /data/backup/full/2021-03-20-11_08-05-06/ #還原數據 innobackupex --user=root --password=abc123456 --copy-back /data/backup/full/2021-03-20-11_08-05-06/
錯誤匯總
- WARNING: IPv4 forwarding is disabled. Networking will not work.

# 解決命令
echo "net.ipv4.ip_forward=1" >>/usr/lib/sysctl.d/00-system.conf
# 重啟network 和docker
systemctl restart network && systemctl restart docker
作者:淚夢紅塵
文章出處:https://www.s1g.cn/index.php/mysql/7.html
