溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

【恩墨學(xué)院】通過Docker技術(shù)在macOS上部署3實例MGR環(huán)境

發(fā)布時間:2020-08-05 05:26:36 來源:ITPUB博客 閱讀:172 作者:恩墨學(xué)院 欄目:MySQL數(shù)據(jù)庫

 通過Docker技術(shù)在macOS上部署3實例MGR環(huán)境

自從有了Docker,各種環(huán)境部署都簡單從容起來,其實MySQL的環(huán)境部署起來同樣得心應(yīng)手。


前提條件,已經(jīng)在自己的macOS操作系統(tǒng)中設(shè)置成功了運(yùn)行在本地的3節(jié)點MySQL Group Replication集群,如何設(shè)置,可以參考官方文檔。

假設(shè)在我們的macOS上已經(jīng)實現(xiàn)了如下架構(gòu)的3節(jié)點MGR集群,我們的目標(biāo)是將這三個數(shù)據(jù)庫全部挪到docker容器中去運(yùn)行,并且可以互相通信,仍然是MGR集群。

【恩墨學(xué)院】通過Docker技術(shù)在macOS上部署3實例MGR環(huán)境

Docker on MacOS


接下來我們把MySQL放在一邊,先介紹一下在macOS中的docker架構(gòu),在macOS中,docker的實現(xiàn)跟在其它Linux系統(tǒng)中略有不同,在其它Linux系統(tǒng)中,操作系統(tǒng)本身就是docker容器的宿主機(jī),docker鏡像都是直接存儲在宿主機(jī)本身的文件系統(tǒng)中,比如我們通過docker info命令可以看到docker的根目錄是:


$ docker info|grep "Docker RootDir"

Docker Root Dir: /var/lib/docker


但是在macOS下,我們直接查看這個目錄,其實是根本不存在的。


$ ls /var/lib/docker

ls: /var/lib/docker: No such file or directory


Docker宿主機(jī)是誰


那么這個目錄到底在哪里?實際上是在一個QEMU虛擬機(jī)中,當(dāng)我們在macOS中安裝完docker并啟動,就是啟動了一個虛擬機(jī),這個虛擬機(jī)的整個內(nèi)容全部都在一個文件里,可以在docker程序?qū)傩越缑嬷锌吹竭@個文件的路徑,比如在我的機(jī)器上,路徑就是/Users/Kamus/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/Docker.qcow2,該文件通常比較大,特別是安裝了多個docker鏡像之后,會輕易占用到數(shù)十GB的空間。

【恩墨學(xué)院】通過Docker技術(shù)在macOS上部署3實例MGR環(huán)境

如上圖所示,就是Disk image location的位置。


從上圖中同樣可以看到,這個虛擬機(jī)被限制只能使用2顆CPU和2GB內(nèi)存。


那么,我們是否可以登錄這個虛擬機(jī)來確認(rèn)這點呢?使用macOS自帶的screen命令可以登錄該臺虛擬機(jī)。如下,可以看到這是一個擁有非常新的Linux 4.9.38版本內(nèi)核的虛擬機(jī),在這個虛擬機(jī)中才有/var/lib/docker目錄,只有2顆CPU,總共有2GB內(nèi)存。


【恩墨學(xué)院】通過Docker技術(shù)在macOS上部署3實例MGR環(huán)境


在screen的窗口按組合鍵control+a d(先按control+a,再按d)可以暫時dettach出這個screen,screen -r可以重新打開窗口。更多的screen命令,可以自行man screen來查看。


所以現(xiàn)在我們可以明確一個概念,macOS本身并不是以后將運(yùn)行的docker容器的宿主機(jī),而這個Linux虛擬機(jī)才是真正的宿主機(jī)。這臺機(jī)器的主機(jī)名是moby,這正是docker項目社區(qū)版的名稱。


Docker宿主機(jī)與macOS操作系統(tǒng)的目錄共享


由于如下共享文件夾功能的存在,在這個虛擬機(jī)中可以訪問并更新macOS操作系統(tǒng)本地的目錄,這在后面我們將運(yùn)行在本地的MySQL數(shù)據(jù)庫搬遷到docker容器中起了重要的作用。

【恩墨學(xué)院】通過Docker技術(shù)在macOS上部署3實例MGR環(huán)境

我們還是在screen中看一下這些共享目錄的情況。


【恩墨學(xué)院】通過Docker技術(shù)在macOS上部署3實例MGR環(huán)境


可以看到,確實macOS操作系統(tǒng)中的目錄在虛擬機(jī)中是可以直接訪問的,而且更方便的地方是,在虛擬機(jī)中自動掛載的目錄路徑跟macOS中的路徑是完全相同的,比如我的個人主目錄無論是在macOS中還是在這個虛擬機(jī)中,都是/Users/Kamus。


那現(xiàn)在我們的思路基本上有了,就是要將原本運(yùn)行在macOS操作系統(tǒng)中的MySQL數(shù)據(jù)庫的數(shù)據(jù)文件和配置文件挪到Docker宿主機(jī)可以訪問的目錄下,然后在docker容器中啟動MySQL實例。


安裝MySQL docker鏡像


先要將MySQL docker鏡像安裝上,這是運(yùn)行MySQL docker容器的基礎(chǔ)。安裝鏡像極其簡單,只需要一步就可以,以下命令在macOS操作系統(tǒng)中執(zhí)行。


標(biāo)準(zhǔn)步驟是:


$ docker pull mysql 


但是由于這樣會安裝latest版本,而我原先在macOS中的MySQL數(shù)據(jù)庫是5.7.17版本,為了避免可能產(chǎn)生的版本升級問題,我做了指定版本的鏡像拉取。


$ docker pull mysql:5.7.17 


從官方的docker store中拉取MySQL鏡像,大約只需要幾分鐘時間,完畢以后,可以通過docker images命令來查看。


【恩墨學(xué)院】通過Docker技術(shù)在macOS上部署3實例MGR環(huán)境


第一行就是最新拉取的MySQL鏡像,這是創(chuàng)建者在4個月前創(chuàng)建的。


運(yùn)行MySQL docker容器前的準(zhǔn)備


設(shè)計docker宿主機(jī)目錄結(jié)構(gòu)


現(xiàn)在我們已經(jīng)有了docker鏡像,也有了在macOS操作系統(tǒng)中運(yùn)行良好的MySQL MGR集群,開始遷移。首先當(dāng)然是干凈地關(guān)閉在macOS操作系統(tǒng)中的三臺MySQL數(shù)據(jù)庫,然后我們設(shè)計如下的目錄結(jié)構(gòu),將三個數(shù)據(jù)庫的數(shù)據(jù)文件全部分別挪進(jìn)去。


$ mkdir /Users/Kamus/mysql_data

$ mkdir /Users/Kamus/mysql_data/s1-docker

$ mkdir /Users/Kamus/mysql_data/s2-docker

$ mkdir /Users/Kamus/mysql_data/s3-docker


根據(jù)之前闡述的共享文件夾功能,可以知道在docker宿主機(jī)中是可以通過完全相同的路徑訪問到這幾個目錄的,我們將原本在macOS操作系統(tǒng)中的三個數(shù)據(jù)庫的數(shù)據(jù)文件分別移動到s1-docker,s2-docker,s3-docker目錄中,至于哪些文件需要移動,這是MySQL DBA的基本知識,不在這里贅述。


由于目標(biāo)是能運(yùn)行MGR集群,那么是有一部分?jǐn)?shù)據(jù)庫初始化參數(shù)要額外設(shè)置的,而docker容器中的my.cnf內(nèi)容無法改動,所以我們再設(shè)計一個專門的目錄用來存儲所有數(shù)據(jù)庫的my.cnf文件。


$ mkdir /Users/Kamus/mysql_data/conf.d

$ mkdir /Users/Kamus/mysql_data/conf.d/s1-docker

$ mkdir /Users/Kamus/mysql_data/conf.d/s2-docker

$ mkdir /Users/Kamus/mysql_data/conf.d/s3-docker 


然后將原本各個數(shù)據(jù)庫的my.cnf文件分別拷貝到conf.d/s1-docker等三個目錄下,最后形成了如下的目錄結(jié)構(gòu)。


【恩墨學(xué)院】通過Docker技術(shù)在macOS上部署3實例MGR環(huán)境


設(shè)計這些目錄結(jié)構(gòu)的目的是在運(yùn)行docker容器的時候通過volume選項將數(shù)據(jù)文件目錄掛載成容器內(nèi)部的/var/lib/mysql目錄,將my.cnf參數(shù)文件所在目錄掛載成容器內(nèi)部的/etc/mysql/conf.d目錄,從而實現(xiàn)MySQL數(shù)據(jù)庫實例啟動所需要的所有關(guān)鍵文件都存儲在宿主機(jī)中,而docker容器本身只提供MySQL軟件鏡像。這比將所有文件都存儲在docker鏡像內(nèi)部更靈活。


設(shè)計docker容器主機(jī)名和IP地址


在macOS本機(jī)運(yùn)行的MySQL實例中為MGR配置的各種參數(shù)中使用到的主機(jī)名往往是localhost,IP地址則是127.0.0.1,MGR集群的節(jié)點間通信端口也往往是指定了本機(jī)IP上的不同端口,如果我們參照了官方文檔中的搭建指南,使用的就是24901,24902,24903三個端口。


group_replication_group_seeds="127.0.0.1:24901,127.0.0.1:24902,127.0.0.1:24903" 


現(xiàn)在我們既然將數(shù)據(jù)庫搬到了容器中,那么就完全可以重新設(shè)計更有意義的主機(jī)名和分別的IP地址。


【恩墨學(xué)院】通過Docker技術(shù)在macOS上部署3實例MGR環(huán)境


在啟動Docker容器的時候,可以通過hostname和ip選項指定主機(jī)名和靜態(tài)IP??梢詤⒄兆詈筮\(yùn)行Docker容器的完整命令。


如果要為Docker容器指定靜態(tài)IP,則必須要使用手動創(chuàng)建的network,通過以下命令可以創(chuàng)建,比如此處我們創(chuàng)建了名稱為mynet的網(wǎng)絡(luò)。


$ docker network create--subnet=192.168.100.0/24 mynet


創(chuàng)建完畢以后,通過network ls命令可以查看新創(chuàng)建的網(wǎng)絡(luò)??梢钥吹侥J(rèn)是橋接方式。


【恩墨學(xué)院】通過Docker技術(shù)在macOS上部署3實例MGR環(huán)境


設(shè)計docker容器資源占用限制


對于在同一宿主機(jī)上運(yùn)行多個docker容器,進(jìn)行資源限制是必不可少的需求,雖然在此文中我們只是進(jìn)行將MySQL實例搬遷到docker容器中的測試,但是也仍然規(guī)劃了容器資源限制,由于宿主機(jī)本身只有2顆CPU和2GB內(nèi)存,因此做如下規(guī)劃。


 【恩墨學(xué)院】通過Docker技術(shù)在macOS上部署3實例MGR環(huán)境

在啟動Docker容器的時候,可以通過cpus和memory以及memory-swap選項指定CPU和內(nèi)存的資源限制??梢詤⒄兆詈筮\(yùn)行Docker容器的完整命令。


根據(jù)以上設(shè)置修改各數(shù)據(jù)庫的my.cnf配置


因為我們設(shè)計了容器啟動時候會擁有不同的IP地址,因此在容器中運(yùn)行的MySQL實例的初始化參數(shù)中關(guān)于MGR的部分也需要指定這些IP地址。以下是my.cnf文件的設(shè)置內(nèi)容。


【恩墨學(xué)院】通過Docker技術(shù)在macOS上部署3實例MGR環(huán)境

【恩墨學(xué)院】通過Docker技術(shù)在macOS上部署3實例MGR環(huán)境

【恩墨學(xué)院】通過Docker技術(shù)在macOS上部署3實例MGR環(huán)境


三個節(jié)點的my.cnf文件內(nèi)容除了loose-group_replication_local_address參數(shù)之外,其它內(nèi)容都是完全相同的。


對于第一個容器s1-container會使用到的my.cnf文件,這個參數(shù)為:


loose-group_replication_local_address="192.168.100.11:24901" 


對于第二個容器s2-container會使用到的my.cnf文件,這個參數(shù)為:


loose-group_replication_local_address="192.168.100.12:24901"


對于第三個容器s3-container會使用到的my.cnf文件,這個參數(shù)為:


loose-group_replication_local_address="192.168.100.13:24901"


運(yùn)行MySQL docker容器


由于MGR集群要求每個數(shù)據(jù)庫在主機(jī)層是可以直接訪問到其它節(jié)點的主機(jī)名的,如果在普通的主機(jī)上,只需要修改/etc/hosts文件增加其它節(jié)點的主機(jī)名和IP地址對應(yīng)條目即可,但是容器內(nèi)的/etc/hosts卻是無法手動修改的,即使手動增加了條目,只要重新啟動容器,該條目就會丟失。

要應(yīng)對該問題,可以在運(yùn)行容器時使用add_host選項。在真實的生產(chǎn)環(huán)境中,我們可以選擇配置專門的DNS服務(wù)器來做IP和主機(jī)名對應(yīng)(DNS服務(wù)器同樣可以是Docker容器,我們后續(xù)的測試將增加此部分內(nèi)容,本文先暫時通過add_host的方式來解決)。

最終運(yùn)行三個docker容器的完整命令如下:

【恩墨學(xué)院】通過Docker技術(shù)在macOS上部署3實例MGR環(huán)境

【恩墨學(xué)院】通過Docker技術(shù)在macOS上部署3實例MGR環(huán)境

【恩墨學(xué)院】通過Docker技術(shù)在macOS上部署3實例MGR環(huán)境


全部容器都啟動完畢以后,可以通過docker ps命令查看容器的運(yùn)行狀態(tài),或者通過docker logs命令查看MySQL數(shù)據(jù)庫日志的輸出。非常方便。


【恩墨學(xué)院】通過Docker技術(shù)在macOS上部署3實例MGR環(huán)境


啟動MGR


通過如下命令登錄到Docker容器的操作系統(tǒng)中,再進(jìn)入MySQL實例,啟動MGR。我們目前設(shè)置的是Single Primary模式的MGR,先啟動第一個Primary實例。

【恩墨學(xué)院】通過Docker技術(shù)在macOS上部署3實例MGR環(huán)境

【恩墨學(xué)院】通過Docker技術(shù)在macOS上部署3實例MGR環(huán)境


再依次啟動第二個只讀實例。

【恩墨學(xué)院】通過Docker技術(shù)在macOS上部署3實例MGR環(huán)境

【恩墨學(xué)院】通過Docker技術(shù)在macOS上部署3實例MGR環(huán)境




啟動第三個只讀實例。

【恩墨學(xué)院】通過Docker技術(shù)在macOS上部署3實例MGR環(huán)境

【恩墨學(xué)院】通過Docker技術(shù)在macOS上部署3實例MGR環(huán)境




到此為止,我們將原先運(yùn)行在macOS中的一整套MGR集群全部搬遷到docker容器中。最終實現(xiàn)了如下的系統(tǒng)架構(gòu)。


【恩墨學(xué)院】通過Docker技術(shù)在macOS上部署3實例MGR環(huán)境


恩墨學(xué)院隸屬于云和恩墨(北京)信息技術(shù)有限公司,致力于提供專業(yè)高水準(zhǔn)的oracle數(shù)據(jù)庫與大數(shù)據(jù)培訓(xùn)服務(wù),挖掘培養(yǎng)大數(shù)據(jù)與數(shù)據(jù)庫人才。恩墨學(xué)院提供包括個人實戰(zhàn)技能培訓(xùn)、個人認(rèn)證培訓(xùn)、企業(yè)內(nèi)訓(xùn)在內(nèi)的全方位大數(shù)據(jù)和數(shù)據(jù)庫技術(shù)培訓(xùn)。ACE級別超強(qiáng)師資,配備專業(yè)實驗室,沉浸式學(xué)習(xí)與訓(xùn)練,專業(yè)實驗室、配備專業(yè)助教指導(dǎo)訓(xùn)練。能迅速融入專家圈子,業(yè)內(nèi)資源豐富,迅速積累職場人脈。oracle數(shù)據(jù)庫課程包括:Oracle DBA實戰(zhàn)班、Oracle OCM考試、Oracle OCP考試等。


【恩墨學(xué)院】通過Docker技術(shù)在macOS上部署3實例MGR環(huán)境

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI