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.41it.cn/index.php/2021/07/28/docker部署mysql叢集/