docker部署mysql叢集

淚夢紅塵blog發表於2021-07-30

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加速器

  1. 配置阿里雲映象加速器
    1. 配置阿里雲映象加速器需要註冊賬號
    2. https://cr.console.aliyun.com/#/imageList)
    3. 註冊之後點選左下方映象加速器會生成一個專屬加速網址
    4. 將生成的專屬網址,加入/etc/docker/daemon.json即可
# 修改docker配置檔案
vi /etc/docker/daemon.json
  1. 配置Daocloud加速器
    1. 官網:https://www.daocloud.io/mirror
#配置加速器命令(複製貼上執行即可)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 單節點資料庫的弊端

    1. 大型網際網路程式使用者群體龐大,所以架構必須要特殊設計
    2. 單節點的資料庫無法滿足效能上的要求
    3. 單節點設計,無冗餘設計,一旦資料庫當機,整個系統面臨崩潰,無法滿足高可用

2.02 常見Mysql資料庫叢集方案

  • 常見的mysql叢集有兩種:
    1. Replication
      1. 速度快,但僅能保證弱一致性,適用於儲存價值不高的資料,比如日誌、帖子、新聞等。
      2. 採用master-slave結構,在master寫入會同步到slave,能從slave讀出;但在slave寫入無法同步到master。
      3. 採用非同步複製,master寫入成功就向客戶端返回成功,但是同步slave可能失敗,會造成無法從slave讀出的結果。
    1. PXC (Percona XtraDB Cluster)
      1. 速度慢,但能保證強一致性,適用於儲存價值較高的資料,比如訂單、客戶、支付等。
      2. 資料同步是雙向的,在任一節點寫入資料,都會同步到其他所有節點,在任何節點上都能同時讀寫。
      3. 採用同步複製,向任一節點寫入資料,只有所有節點都同步成功後,才會向客戶端返回成功。事務在所有節點要麼同時提交,要麼不提交。

    1. PXC既然能保障強一致性,那麼當一個節點當機了,其他節點無法向這個節點,寫入資料,那是不是意味著整個,mysql叢集就掛掉了呢?
    2. 其實如果說不介入中介軟體的情況下,確實是這樣的,一旦一個節點當機,那麼其他節點都將無法寫入資料,就相當於整個叢集,掛了
    3. 但是採用PXC做資料庫叢集,肯定會採用中介軟體比如支援tcp協議Haproxy和Nginx
    4. 因為每個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個

    1. Haproxy
    2. Nginx
    3. Apache
    4. LVS
  • Haproxy,Nginx,Apache,LVS對比

  • Nginx最近幾年才支援tcp協議

  • Apache不支援tcp無法使用

  • LVS其實效能最好的,但是無法在虛擬機器使用

  • Haproxy不支援外掛,但是對比其他幾個,個人感覺這個比價合適

  • 不使用負載均衡的弊端

    1. 所有請求都傳送到一個資料庫,而其他資料庫,只做同步,此時資料庫1負載時很高的,而資料庫2,3,4卻很空閒
    2. 當資料庫1承受不住壓力當機了,其他節點也就無法使用
    3. 當資料庫2意外當機了,而正常處理請求的資料庫1也無法在寫入資料

  • 使用負載均衡的優點

    1. 使用Haproxy,Haproxy會將應用程式傳送的請求均勻的分發到每一個pxc節點上面,使每個節負載比較低
    2. 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實現雙擊熱備

    1. Keepalived執行方式類似於執行緒是搶佔式的,兩個Keepalived搶一個虛擬Haproxy ip,其中一個Keepalived搶到虛擬ip另一個則在等待狀態,兩個Keepalived之間是有心跳監測的
    docker部署mysql叢集
  • 安裝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 資料庫熱備份

  • 常見的資料庫備份方案

    1. lvm,LVM採用的是快照方式備份,備份的是分割槽裡面儲存的資料,可以相容任何資料庫,備份時加鎖,只可讀不可寫
    2. XtraBackup,
      1. XtraBackup備份不加鎖
      2. 不會打斷正在執行事務
      3. 壓縮備份
      4. 可增量備份(只備份變化資料)全量備份(首次備份採用全量後續採用增量)
  • 安裝 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叢集/

相關文章