天天看點

MySQL docker PXC叢集搭建筆記

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

9.28筆記重構更新:

離記錄這個筆記的時間也差不多有一個月了,在此之間反複記錄和使用讓我對整個過程有了更深的了解;

本次資料庫叢集的搭建,由于沒有這麼多的真實的電腦當作伺服器來進行模拟搭建環境,采用虛拟機+docker的形式模拟多個伺服器運作。

本次采用的配置:

8G記憶體+i5CPU

虛拟機配置:

2G記憶體+1核CPU+網絡橋接模式

軟體配置:

centos 7.4+ docker

具體虛拟機和docker安裝不做過多記錄。網絡連接配接模式采用橋接的目的是為了在其他電腦上也能通路虛拟機,相關ip配置方法不做記錄。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

操作步驟:

1、更新yum: 

yum -y update           

2、下載下傳docker

yum install -y docker           

3、docker配置加速器--網絡好的可以忽略這步

4、docker pxc-cluster叢集鏡像下載下傳

docker pull percona/percona-xtradb-cluster           

5、docker服務網段的建立

docker network create --subnet=172.20.0.0/24 net1



########################################################
--docker服務網段的建立:--docker network create net1   docker建立的網段預設内置是172.17.0.$$,逐漸增加,再次建立就是:172.18.0.$$
docker network inspect net1  檢視網段資訊   docker network rm net1 删除網段  subnet指定一個網段  

           

6、建立docker券

docker volume create --name d1   建立冷熱備份的券:docker volume create backup           

7、運作容器

docker run -d -p 3306:3306 --name=node1 -v d1:/var/lib/mysql -v backup:/data -e MYSQL_ROOT_PASSWORD=TT123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PACSSWORD=TT123456 --privileged  --net=net1 --ip 172.20.0.2 pxc


#########################################################################
翻譯:
背景運作docker,主控端3306端口映射到docker pxc服務的3306端口,取名這個服務為node1,将本地d1卷目錄映射到docker-pxc服務保證資料持久化,映射backup卷目錄作為資料備份目錄,啟動pxc的root密碼,指定叢集名稱為PXC,指定加入叢集的密碼,給與最高權限,定義node1服務網段是net1,具體網段ip是.0.2 ,運作鏡像是pxc           

8、運作node2、3、4、等節點容器

docker run -d -p 3307:3306 --name=node2 -v d2:/var/lib/mysql -v backup:/data -e MYSQL_ROOT_PASSWORD=TT123456 -e CLUSTER_NAME=PXC -e CLUSTER_JOIN=node1 -e XTRABACKUP_PACSSWORD=TT123456 --privileged  --net=net1 --ip 172.20.0.3 pxc


############################################################################
于第一個節點建立不同點:
1、端口不能沖突,是以指定主控端3307端口映射到node2的3306
2、name取名不能沖突,是以取名node2
3、需要加入第一個節點組,是以多了cluster_join
4、ip不能沖突,是以定義的.0.3位址           

9、檢測-----建立完成後通過navicat連結服務,測試叢集成功性

[[email protected] ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS                                   NAMES
2f579d9179c2        pxc                 "/entrypoint.sh "   About a minute ago   Up 10 seconds       4567-4568/tcp, 0.0.0.0:3310->3306/tcp   node5
3afd8fb077f2        pxc                 "/entrypoint.sh "   About a minute ago   Up About a minute   4567-4568/tcp, 0.0.0.0:3309->3306/tcp   node4
6bfa8db7dfd3        pxc                 "/entrypoint.sh "   2 minutes ago        Up About a minute   4567-4568/tcp, 0.0.0.0:3308->3306/tcp   node3
fe55c409f1fe        pxc                 "/entrypoint.sh "   15 minutes ago       Up 15 minutes       4567-4568/tcp, 0.0.0.0:3307->3306/tcp   node2
888b24dfff8e        pxc                 "/entrypoint.sh "   48 minutes ago       Up 48 minutes       0.0.0.0:3306->3306/tcp, 4567-4568/tcp   node1
[[email protected] ~]# 
發現全部成功在跑,最後通過navicat連結服務進行資料同步測試           

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

docker常用操作和一些操作原理:

啟動docker服務: --service docker start     --關閉指令--service docker stop    --重新開機指令  --service docker restart




容器服務:
--docker-file  已在的程式打包成鏡像:build     倉庫下載下傳docker鏡像:pull  把鏡像上傳到倉庫:push   檢視倉庫有哪些鏡像:search
--docker-file  實體複制,把一個主機上的鏡像指派到另一個主機上   把鏡像導出到主控端上:save/export   
通過主控端ftp形式傳遞給新主控端   通過導入的形式給到新docker服務 :load/import


--docker 建立docker服務:run   主控端進入到已建立的docker服務:  exec     連結到docker服務(不進入docker): attach


--已在運作的docker鏡像管理:  暫停:pause    停止:stop    運作:start



問題:
1、為什麼要映射目錄?2、為什麼要用卷?3、卷目錄映射和主控端目錄映射差別?
答案:
1、由于Docker 采用 AFUS 分層檔案系統時,檔案系統的改動都是發生在最上面的容器層。
在容器的生命周期内,它是持續的,包括容器在被停止後。但是,當容器被删除後,該資料層也随之被删除。目錄映射是為了保證資料的持久化,在主控端上建立的目錄映射到docker中,保證docker内服務運作時的資料能夠在主控端上保留使用。
2、卷是容器中繞過 Union 檔案系統的一個特定的目錄。它被設計用來儲存資料,而不管容器的生命周期。當删除docker時不會删除卷檔案夾
3、docker卷映射和主控端本地目錄映射差別:docker卷是建立的一個屬于docker的主控端檔案夾,他的檔案夾屬性屬于docker而不是屬于主控端。
在部分docker程式服務中,有的程式隻允許資料寫入到docker服務的檔案夾,如pxc叢集。而本地檔案夾屬性是屬于主控端,那麼如果我本地建立目錄映射到docker pxc服務,則pxc服務會報無法寫入的錯誤。這時候想解決pxc叢集資料持久化的問題,我們要使用docker卷檔案夾

必須了解的兩點:
容器内的資料是臨時性的,它會随着容器生命周期的結束而消失
預設的 Docker volume (driver = ‘loclal’)不管是哪種形式,本質上都是将容器所在的主機上的一個目錄 映射 到容器内的一個目錄,是以,它不具備可移植性

--當删除docker服務時,服務如果有映射主控端檔案夾,那麼該服務的檔案不會被docker所删除,這時候我們如果再用該檔案夾重新映射建立服務的時候,報錯已存在服務檔案
是以對于這種已經删除docker服務的孤卷,如果沒有保留必要,我們再次使用該檔案夾之前,需要删除孤卷。


檢視docker建立的資料券詳情
--docker volume inspect d1

删除孤券
--檢視孤券:docker volume ls -qf dangling=true    删除孤券:docker volume rm $(docker volume ls -qf dangling=true)   檢視删除後結果:docker volume ls


docker容器運作日志檢視最近1000條,根據報錯再去查資料會比較有目的性:
docker logs --tail=1000 node1

運作容器:
docker run -it(互動界面前台運作)/-d(背景運作)            

PXC建立問題:

每個節點執行建立後等待1分鐘後再建立下一個節點,雖然前端建立顯示完成,實際MySQL叢集服務的建立需要時間,在未完成前一節點建立下一個節點服務時,會啟動閃退           

2018.10.11更新

今天模拟災難突發:

在容器運作正常的情況下直接重新開機docker服務,模拟機器斷電或者是服務故障導緻docker不可使用時的資料庫恢複;

直接重新開機docker,所有的docker服務都會被停掉,包括hapeoxy,pxc各個節點通過指令檢視全市exit狀态;

直接通過重新開機docker指令進行容器重新開機:

docker start haproxy01 haproxy02 node1 node2 node3 node
4 node5
           

發現haproxy容器能正常啟動,pxc節點有部分啟動狀态,或無法啟動(閃關閉);

通過navicat打開啟動成功的節點發現,navicat無法打開,打開haproxy進入pxc發現無法打開haproxy

原因:

檢視啟動報錯節點日志,如node1節點:

docker logs --tail=1000 node1           

發現error報錯日志:

2018-10-11T10:45:18.905663Z 0 [Note] WSREP: Setting initial position to 00000000-0000-0000-0000-000000000000:-1
2018-10-11T10:45:18.905668Z 0 [ERROR] WSREP: It may not be safe to bootstrap the cluster from this node. It was not the last one to leave the cluster and may not contain all the updates. To force cluster bootstrap with this node, edit the grastate.dat file manually and set safe_to_bootstrap to 1 .
2018-10-11T10:45:18.905672Z 0 [ERROR] WSREP: Provider/Node (gcomm://) failed to establish connection with cluster (reason: 7)
           

這裡日志顯示該節點不是最後關閉節點,無法直接啟動,需要啟動請進入配置檔案設定啟動參數為1;

查詢配置檔案:

find .  -name 'grastate.dat'

找到很多配置檔案,隻需要修改需要進入的那個就行了
find: ‘./run/user/1000/gvfs’: 權限不夠
./var/lib/docker/volumes/d1/_data/grastate.dat
./var/lib/docker/volumes/d3/_data/grastate.dat
./var/lib/docker/volumes/d4/_data/grastate.dat
./var/lib/docker/volumes/d5/_data/grastate.dat
./var/lib/docker/volumes/d2/_data/grastate.dat


編輯配置檔案:
safe_to_bootstrap: 1

把參數改為1           

接下來有兩種方案能讓pxc節點恢複:

1、删除所有docker-pxc節點重新安裝
順序是配置檔案更改的那個卷目錄對應的節點作為第一節點進行安裝,其他節點正常加入即可


2、直接啟動這個節點:
如果挂掉的節點是第一節點,則啟動的時候,由于有其他節點在運作,是以再次啟動第一節點的時候需要cluster——join到其他節點
如果是其他節點直接加入叢集即可           

推薦方式是:重新安裝pxc叢集;

步驟:

1、删除所有pxc節點
docker rm node1 node2 node3 node4 node5

2、修改node1配置檔案啟動方式為1

3、重新安裝node1 node2 node3.。。。
docker run -d -p 3306:3306 --name=node1 -v d1:/var/lib/mysql -v backup:/data -e MYSQL_ROOT_PASSWORD=TT123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PACSSWORD=TT123456 --privileged  --net=net1 --ip 172.20.0.2 pxc




docker run -d -p 3307:3306 --name=node2 -v d2:/var/lib/mysql -v backup:/data -e MYSQL_ROOT_PASSWORD=TT123456 -e CLUSTER_NAME=PXC -e CLUSTER_JOIN=node1 -e XTRABACKUP_PACSSWORD=TT123456 --privileged  --net=net1 --ip 172.20.0.3 pxc


。。。。。。。。           

進入pxc叢集,由于之前做了卷目錄映射,發現資料都在。資料庫運作恢複正常。

2019.4更新

今天突發奇想的想測試mycat中間件,之前的pxc叢集早就删了,是以又開始重新搭建了一套。

與之前不同的事,經過公司上的一些磨練,發現企業跑dockers基本都是docker叢集上跑的,要麼k8s,要麼swarm,是以這次我在自己的測試機上做了docker-swarm叢集上的mysql-pxc叢集搭建。

由于我這有一台伺服器,是以swarm雖說是叢集,實際上就一個節點。不過并不妨礙我對swarm的使用

大體安裝和之前的差不多,docker-swarm些許差別在于以下:

1、docker需要初始化swarm

初始化
docker swarm init

賦予docker-swarm管理角色
docker swarm join-token manager           

2、由于swarm叢集自帶overlay的網絡通信模式,是以我們自需要建立一個swarm的網絡,不需要指定IP給各個pxc節點,swarm會自動配置設定網絡ip位址給到pxc,是以需要操作兩步:

建立swarm網段
docker network create -d overlay --attachable pxc

啟動容器指令:

 docker run -d -p 33061:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -v v1:/var/lib/mysql -v backup:/data --privileged --name=pxc1 --net=pxc pxc


docker run -d -p 33062:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC  -e CLUSTER_JOIN=pxc1 -e XTRABACKUP_PASSWORD=123456 -v v2:/var/lib/mysql -v backup2:/data --privileged --name=pxc2 --net=pxc pxc           

其他的都和之前的一樣,實際生産或者運維的docker幾乎都是叢集的形式,是以練手單機的同時也要強化叢集。