基于Docker的mysql mha 的集群環境構建實踐
12月2日,云計算高級工程師王佩老師,在 【DBA+社群】中間件用戶組 進行了一次主題為“基于Docker的mysql mha 的集群環境構建實踐”的線上分享。小編特別整理出其中精華內容,供大家學習交流。同時,也非常感謝王佩老師對DBA+社群給予的大力支持。
-
云計算高級工程師
-
目前主要研究docker 相關的云計算技術
關于docker 想必前面的各位大牛分享的演講講的非常多了,今天主要跟大家分享基于docker快速構建 mysql mha 的一個實戰案例分享,在分享的過程中主要講解一下我的思路和如何利用docker本身的一些特性進行一些自動化的工作,整個過程如果有錯誤或者不足之處還 請大家指正。
為什么想到基于docker 構建 mysql
這是我們dba給我列出來的,傳統mysql mha 安裝方式粗略流程
整個安裝過程,會受到網絡不可控影響,正常情況下dba一般在2~3個小時左右部署完成,從這個安裝過程我們可以看到其實很多工作需要在最少3個服務器節點上重復操作。
在我們接觸docker過程中,應該對他最熟悉的就是一次編譯生成鏡像,push到倉庫后,可以在任意docker節點上運行,所以我們在構建mysql mha 時候就利用docker的一些特性來快速構建我們的mysql mha 集群。
我將構建MHA 的過程,拆分為2個版本,在2個不同版本我們將看到docker與mysql MHA集群的構建結合過程中 ,帶來了哪些優勢, 同時產生了哪些不同的問題。
第一版 mysql 容器
在第一版中我們只使用docker 快速構建mysql能力,構建mysql容器,與宿主機配合組成mysql mha,在這種方式下最容易讓dba理解,同時讓整個集群的環境具備docker的一些優秀特性。
容器MYSQL構建步驟簡述:
1. pull mysql 容器
可以使用私有倉庫(如果有)或公有倉庫進行pull,這里我直接從私有倉庫中下載percona。
2. 定義目錄與my.cnf 文件
在宿主機創建my.cnf 配置文件存放目錄,創建mysql 數據存放目錄,由于容器本身的存儲系統不太適合mysql 數據存放使用,所以我們后面將使用-v 來掛載容器卷,使用宿主機的文件系統目錄提供使用。
mkdir -p /home/docker/mount/mysql/mhadb
mkdir -p /home/docker/conf/mysql/master.cnf
在定義my.cnf 文件時候,需要注意幾個參數的定義
>端口最好不要使用默認3306,避免可能的端口沖突
>相關目錄定義需要與前面創建目錄一致,主要涉及如下參數定義路徑
3. run 容器
然后我們使用 docker run 命令啟動容器,注意網絡我們必須以 --net=host方式,docker網絡有4種方式,詳細的大家可以官方doc 了解,同時我們將宿主機的/etc/localtime 掛載到容器,避免宿主機時間和容器時間不對問題。
這里 啟動容器我們還有幾個可選配置項,大家可以根據實際情況進行配置,建議將自動oom進行關閉。
> --oom-kill-disable=false --考慮是否禁用oom kill
> --memory-swap="" ---是否禁用swap
>相關資源限制指令,是否進行內存/cpu/io資源限制
4. 其他節點重復以下配置
-
創建目錄
-
復制my.cnf文件到其他節點,注意修改一些與主從相關的配置參
-
使用同樣的命令 run mysql容器
5. 配置數據庫主從同步
這里我們選舉一個為主服務器,配置其他其他兩個節點與主數據庫進行主從同步,這里的主從配置與傳統db安裝后配置無異,所以我們這里省略。
6. mha配置工作
mysql mha 安裝配置安裝工作在第一版中都是在宿主機上完成由于時間關系就不在這里展開,很簡單,相信大家都知道配置,如果大家有興趣,我可以再后面講解整個完整配置過程,至此我們3個節點的主從數據庫通過容器構建完成了。
7. 第一版中基于docker 構建mysql mha 集群的優缺點分析
1) 優點
-
提升5%~10 效率,并且在db從節點增加的情況下,基本不增加部署時間開銷。
-
利用docker image分層特性,與mysql mha 高可用 實現了mysql 分鐘級甚至更短時間內 滾動平滑版本升級與回退(請先確保你在新的MySQL版本中徹底測試了所有的應用功能。這對重要版本之間的升級尤為重要,對重要版本之間的跨越升級也很重 要)。
-
基于容器構建的db, 只要宿主機資源充足,我們可以快速重復構建N個db數據庫,傳統安裝方式下,多個db實例安裝在同一個宿主機上,會很麻煩。
2) 缺點
-
如果在單一實例部署情況下,整個mysql mha 部署安裝的效率并沒有帶來大的提升。
-
由于mha 相關安裝包還是需要在宿主機上安裝,所以我們整個mysql mha 集群的構建還是依賴于宿主機操作系統類型與版本。
-
相對于傳統數據庫安裝,使用容器技術會占用更多目錄空間。
我們來看一下使用docker進行mysql升級步驟,整個版本升級過程基本在秒級完成。
(請先確保你在新的MySQL版本中徹底測試了所有的應用功能。這對重要版本之間的升級尤為重要,對重要版本之間的跨越升級也很重要)
第二版 容器即一切
接下來,我們再構建我們基于 docker 化的mysql mha 集群第二版,我們第二版的目的是盡量提供部署效率,并具備一定通用性,在第二版將使用更多docker命令與特性,同時我們在后面也會分析使用第二版構建存在哪些問題。
我們在第二版本中使用完整的os層上附加mysql,mha 編譯成image,但與虛擬機克隆不同的是我們包含容器鏡像分層,同時我們分離出2個鏡像分別是,node,manager節點。
我們來把第二版中Dockerfile build一層層解析,看我們在第二版做了哪些工作(基于manager 節點)。
1、引用了centos 作為base image*
FROM centos:6.7
2、將安裝mha之前需要安裝的依賴包安裝,并安裝mysql 數據庫
3、將下載的mha 添加到os中,并編譯安裝
4、將配置文件copy 到容器中
配置文件設置有2種方式,一種是編寫好的配置文件放入容器,另外一種是在容器run時候替換參數值,這我們使用run 時候參數傳遞。
5、COPY容器RUN時執行shell*
6、我們編譯打包完image,使用docker run 啟動(manager節點)
7、我們繼續構建mha node節點
在dockerfile 中,我們只需要剔除與manager 相關的內容,同時我們在mysql-entrypoint.sh 腳本中剔除一些無用的參數替換sh,node 啟動配置:
8、配置主從
-
獲取主節點信息
docker exec -it 容器id mysql -uroot -pxxx -e 'show master status'
-
配置從庫
我們可以使用 docker exec -it 容器id 命令進行配置,也可以使用傳統方式登錄數據庫中進行配置
9、配置節點互信
這里我們必須是在容器當中進行節點互信配置,而不是在宿主機上進行配置,我們需要登錄到容器當中進行節點互信配置,相關的命令與在宿主機上配置互信相同,這里就不在重復。
10、mha 監控啟動
11、第二版中基于docker 構建mysql mha 集群的優缺點分析*
1) 優點:
-
整個mha install & config 過程大部分自動化完成,這讓我們在分鐘級搭建mysql mha平臺成為可能。
-
做到了整個mha 構建與平臺無關性,基于docker,使我們mha集群可以運行在任意宿主系統上。
-
直接在構建 image 層級時候進行一些os配置優化工作。
-
監控部署直接在使用Dockerfile 構建image層部署(可選)。
2) 缺點
-
基于的是完整os層構建,鏡像占用的空間相對更大。
-
mha 也附加到os image層后, 容器啟動必須以--net=host --privileged=true 啟動,但這會降低安全性,同時可能會存在端口沖突。
-
需要安裝完整的ssh server,容器間需要配置ssh互信而不是在宿主機層。
-
整個構建過程相對復雜,需要自己編寫配置dockerfile文件構建,以及編寫腳本進行配置,但好在只需要構建一次,后面可以重復運行在其他服務器上。
-
整個的過程有點類似于虛擬機克隆功能,但不同的是它包含很多docker特性,如運行是執行腳本,鏡像分層。
12、mysql-entrypoint.sh 解析
由于mysql-entrypoint.sh 包含太多重復內容,就不全部展開了,里面的腳本也很簡單,對傳遞的變量執行一些操作,這些操作包含:刪除test用戶,參數值替換,用戶創建,不太了解的 朋友可以看一下官方doc中ENTRYPOINT 解釋部分,自己編寫一下。
這是其中一段參數值替換與復制用戶創建
在第一版中我們只使用docker 構建 mysql ,我們利用的是docker 快速構建容器, 鏡像分層技術使mysql搭建與升級能夠快速平滑,但我們需要在宿主機上面做大量工作,并需要系統依賴。
在第二版中我們用docker 構建一個完整的os,并包含已經安裝好的mysql數據庫和mha,同時我們還能利用docker 本身的一些特性,實現一些自動化工作,但由于docker天生隔離性,安全性相對較低,這會導致一些額外的問題。