天天看點

基于Docker的mysql mha 的叢集環境建構實踐

基于Docker的mysql mha 的叢集環境建構實踐

12月2日,雲計算進階工程師王佩老師,在【dba+社群】中間件使用者組進行了一次主題為“基于docker的mysql mha 的叢集環境建構實踐”的線上分享。小編特别整理出其中精華内容,供大家學習交流。同時,也非常感謝王佩老師對dba+社群給予的大力支援。

嘉賓簡介  

雲計算進階工程師

目前主要研究docker 相關的雲計算技術

演講實錄 

關于docker 想必前面的各位大牛分享的演講講的非常多了,今天主要跟大家分享基于docker快速建構 mysql mha 的一個實戰案例分享,在分享的過程中主要講解一下我的思路和如何利用docker本身的一些特性進行一些自動化的工作,整個過程如果有錯誤或者不足之處還請大家指正。

1 為什麼想到基于docker 建構 mysql 

這是我們dba給我列出來的,傳統mysql mha 安裝方式粗略流程 

基于Docker的mysql mha 的叢集環境建構實踐

整個安裝過程,會受到網絡不可控影響,正常情況下dba一般在2~3個小時左右部署完成,從這個安裝過程我們可以看到其實很多工作需要在最少3個伺服器節點上重複操作。

在我們接觸docker過程中,應該對他最熟悉的就是一次編譯生成鏡像,push到倉庫後,可以在任意docker節點上運作,是以我們在建構mysql mha 時候就利用docker的一些特性來快速建構我們的mysql mha 叢集。

我将建構mha 的過程,拆分為2個版本,在2個不同版本我們将看到docker與mysql mha叢集的建構結合過程中 ,帶來了哪些優勢, 同時産生了哪些不同的問題。

2 第一版 mysql 容器 

在第一版中我們隻使用docker 快速建構mysql能力,建構mysql容器,與主控端配合組成mysql mha,在這種方式下最容易讓dba了解,同時讓整個叢集的環境具備docker的一些優秀特性。

2.1 容器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,避免可能的端口沖突

>相關目錄定義需要與前面建立目錄一緻,主要涉及如下參數定義路徑

基于Docker的mysql mha 的叢集環境建構實踐

3. run 容器

然後我們使用 docker run 指令啟動容器,注意網絡我們必須以 --net=host方式,docker網絡有4種方式,詳細的大家可以官方doc 了解,同時我們将主控端的/etc/localtime 挂載到容器,避免主控端時間和容器時間不對問題。

基于Docker的mysql mha 的叢集環境建構實踐

這裡 啟動容器我們還有幾個可選配置項,大家可以根據實際情況進行配置,建議将自動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 的叢集環境建構實踐

3 第二版 容器即一切 

接下來,我們再建構我們基于 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 資料庫

基于Docker的mysql mha 的叢集環境建構實踐

3、将下載下傳的mha 添加到os中,并編譯安裝

基于Docker的mysql mha 的叢集環境建構實踐

4、将配置檔案copy 到容器中

配置檔案設定有2種方式,一種是編寫好的配置檔案放入容器,另外一種是在容器run時候替換參數值,這我們使用run 時候參數傳遞。

基于Docker的mysql mha 的叢集環境建構實踐

5、copy容器run時執行shell*

基于Docker的mysql mha 的叢集環境建構實踐

6、我們編譯打包完image,使用docker run 啟動(manager節點)

基于Docker的mysql mha 的叢集環境建構實踐

7、我們繼續建構mha node節點

在dockerfile 中,我們隻需要剔除與manager 相關的内容,同時我們在mysql-entrypoint.sh 腳本中剔除一些無用的參數替換sh,node 啟動配置:

基于Docker的mysql mha 的叢集環境建構實踐

8、配置主從

擷取主節點資訊

docker exec -it 容器id mysql -uroot -pxxx -e 'show master status'

配置從庫

我們可以使用 docker exec -it 容器id  指令進行配置,也可以使用傳統方式登入資料庫中進行配置  

9、配置節點互信

這裡我們必須是在容器當中進行節點互信配置,而不是在主控端上進行配置,我們需要登入到容器當中進行節點互信配置,相關的指令與在主控端上配置互信相同,這裡就不在重複。

10、mha 監控啟動

基于Docker的mysql mha 的叢集環境建構實踐

11、第二版中基于docker 建構mysql mha 叢集的優缺點分析*

1) 優點:

整個mha install & config 過程大部分自動化完成,這讓我們在分鐘級搭建mysql mha平台成為可能。

做到了整個mha 建構與平台無關性,基于docker,使我們mha叢集可以運作在任意宿主系統上。

直接在建構 image 層級時候進行一些os配置優化工作。

監控部署直接在使用dockerfile 建構image層部署(可選)。

基于的是完整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 mha 的叢集環境建構實踐

4 總結 

在第一版中我們隻使用docker 建構 mysql ,我們利用的是docker 快速建構容器, 鏡像分層技術使mysql搭建與更新能夠快速平滑,但我們需要在主控端上面做大量工作,并需要系統依賴。

在第二版中我們用docker 建構一個完整的os,并包含已經安裝好的mysql資料庫和mha,同時我們還能利用docker 本身的一些特性,實作一些自動化工作,但由于docker天生隔離性,安全性相對較低,這會導緻一些額外的問題。

<b>本文來自雲栖社群合作夥伴"dbaplus",原文釋出時間:2015-12-04</b>