利用Kubernetes搭建mysql主從復制集群

之前相關的文章請參考:
Docker集群管理方案Kubernetes之部署
Docker集群管理方案Kubernetes之組件

通過本文的實踐,我們可以了解一下k8s能帶給我們什么。另外,實際生產環境中mysql的主從復制考慮的事情會更多。

mysql主從復制

mysql的主從復制可以通過如下方式實現。

  1. master
    在master主機上修改配置文件,比如通常是修改my.cnf。
    [mysqld] server-id=1 log-bin
    在mysql上創建同步賬號并授權。
    如下,創建用戶名為repl,密碼為1234567:
    create user 'repl'@'%' identified by '1234567';
    如下,給repl用戶授權允許同步:
    grant replication slave on *.* to 'repl'@'%' identified by '1234567';

  2. slave
    同樣,在slave主機上修改配置文件。
    [mysqld] server-id=2 log-bin
    接著配置如下,其中x.x.x.x為master主機ip地址。
    change master to master_host='x.x.x.x',master_user='repl',master_password='1234567';

注意server-id為主機標識,不能重復。

利用Docker實現主從復制

本節介紹利用Docker官網鏡像文件實現上述的各項配置,這是為了接下來k8s的使用。利用Docker實現mysql的方式有很多種,可以參考其他文章。

mysql官網Docker鏡像文件地址:https://hub.docker.com/_/mysql/
這里用的是8.0 Dockerfile,包括兩個文件Dockerfile, docker-entrypoint.sh。

  1. 準備master的鏡像
    將Dockerfile, docker-entrypoint.sh復制一份作為master的鏡像。
    在Dockerfile中添加如下:
    RUN sed -i '/\[mysqld\]/a server-id=1\nlog-bin' /etc/mysql/mysql.conf.d/mysqld.cnf
    在docker-entrypoint.sh中添加如下:
    echo "CREATE USER '$MYSQL_REPLICATION_USER'@'%' IDENTIFIED BY '$MYSQL_REPLICATION_PASSWORD' ;" | "${mysql[@]}" echo "GRANT REPLICATION SLAVE ON *.* TO '$MYSQL_REPLICATION_USER'@'%' IDENTIFIED BY '$MYSQL_REPLICATION_PASSWORD' ;" | "${mysql[@]}" echo 'FLUSH PRIVILEGES ;' | "${mysql[@]}"
    可以看到上面添加了兩個環境變量MYSQL_REPLICATION_USER和MYSQL_REPLICATION_PASSWORD,用作主從復制的賬號和密碼。
    通過下面的截圖可以看到上面添加內容所在的位置。

    Dockerfile.png

    docker-entrypoint.sh.png

  2. 準備slave的鏡像
    將Dockerfile, docker-entrypoint.sh復制一份作為slave的鏡像。
    在Dockerfile中添加如下:
    RUN RAND="$(date +%s | rev | cut -c 1-2)$(echo ${RANDOM})" && sed -i '/\[mysqld\]/a server-id='$RAND'\nlog-bin' /etc/mysql/mysql.conf.d/mysqld.cnf
    這里server-id用的是隨機數。
    在docker-entrypoint.sh中添加如下:
    echo "STOP SLAVE;" | "${mysql[@]}" echo "CHANGE MASTER TO master_host='$MYSQL_MASTER_SERVICE_HOST', master_user='$MYSQL_REPLICATION_USER', master_password='$MYSQL_REPLICATION_PASSWORD' ;" | "${mysql[@]}" echo "START SLAVE;" | "${mysql[@]}"
    通過下面的截圖可以看到上面添加內容所在的位置。

    Dockerfile.png

    docker-entrypoint.sh.png

    重要的來了,上面slave的配置中,master_host一項用的是$MYSQL_MASTER_SERVICE_HOST,這個環境變量(enviromnent variable)是由k8s生成的。
    k8s的service創建后,會自動分配一個cluster ip,這個cluster ip是動態的,我們沒法直接使用或硬編碼,k8s為了service對容器的可見,生成了一組環境變量,這些環境變量用于記錄service name到cluster ip地址的映射關系,這樣容器中就可以使用這些變量來使用service。(類似的,Docker中提供了links。)

舉例:如果service的名稱為foo,則生成的環境變量如下:
FOO_SERVICE_HOST
FOO_SERVICE_PORT
更多介紹請參考k8s官方資料:http://kubernetes.io/docs/user-guide/container-environment/

  1. 構建鏡像并上傳至docker hub
    分別構建用于mysql master和mysql slave的Docker鏡像,并上傳至docker hub,地址為https://hub.docker.com/ (這是因為當我們用k8s去做mysql集群部署的時候,k8s默認會去docker hub下載鏡像。通常在生產環境中服務器是不運行連接internet的,因此通常會搭建自己的docker hub服務器。)。

構建master鏡像

切換到master Dockerfile所在的目錄,執行命令:
docker build -t paulliu/mysql-master:0.1 .

構建slave鏡像

切換到slave Dockerfile所在的目錄,執行命令:
docker build -t paulliu/mysql-slave:0.1 .

鏡像推送

然后將構建好的鏡像文件推送到docker hub,首先使用下面的命令登陸,如果沒有注冊,需要先到官網注冊一下。
docker login
接著執行推送命令:
docke push paulliu/mysql-master:0.1
docke push paulliu/mysql-slave:0.1

如果感覺上面的一堆配置太麻煩,可以直接使用我構建好的鏡像,地址為:
https://hub.docker.com/u/paulliu/

k8s部署

終于進入到正題,接下來開始利用k8s構建mysql集群。
首先聲明,由于yaml格式的問題,沒法直接貼源代碼,只能貼截圖,見諒。

  1. mysql master的部署
    replication controller和service的yaml文件如下,文件名分別為mysql-master-rc.yaml和mysql-master-service.yaml。
    replication controller:

    mysql-master-rc.yaml.png

    可以看到在env中添加了mysql需要的環境變量。
    service:
    mysql-master-service.yaml.png

    切換到yaml文件所在目錄,執行命令以部署mysql master服務:
    kubectl create -f mysql-master-rc.yaml
    kubectl create -f mysql-master-service.yaml

  2. mysql slave的部署
    replication controller和service的yaml文件如下,文件名分別為mysql-slave-rc.yaml和mysql-slave-service.yaml。
    replication controller:

    mysql-slave-rc.yaml.png

    service:
    mysql-slave-service.yaml.png

    切換到yaml文件所在目錄,執行命令以部署mysql slave服務:
    kubectl create -f mysql-slave-rc.yaml
    kubectl create -f mysql-slave-service.yaml

  3. 查看運行狀態
    執行命令,查看k8s各資源的運行情況:
    kubectl get pods,service,rc
    我的環境的運行截圖,各資源運行正常。

    k8s.png

  4. 測試mysql的主從復制
    到目前為止,mysql的一主一從均運行在k8s的pod中。由于上面service創建并沒有使用type: NodePort方式,所以service只能在kubernetes的pods中引用,外界是無法使用的。

mysql master上的操作

通過如下命令連接到pods中的容器,其中mysql-master-pe18a為pod名稱。
kubectl exec -it mysql-master-pe18a /bin/bash
接著連接本地mysql master服務器:
mysql -uroot -p
至此進入到mysql命令模式。
執行命令show master status;查看狀態。
執行下面的命令創建數據庫以及表,以測試數據同步:
create database paul_test_sync_db; use paul_test_sync_db; create table test_tb(id int(3),name char(10)); insert into test_tb values(001,'ok');

mysql slave上的操作

按照上面相同的方式進入到mysql slave的命令行,執行以下命令:
show slave status\G;
通過該命令可以查看主從同步的情況,通常利用該命令來檢查主從配置是否有問題。

mysql-slave-running.png

執行以下命令,可以看到剛才在master上創建的庫表已經同步過來了:
show databases; use paul_test_sync_db; select * from test_tb;

  1. 集群伸縮
    上面僅僅是一主一從,那接下來看看如何利用k8s對從服務器進行擴展。
    此處將原先的1臺從服務器擴展為3臺,執行命令:
    kubectl scale rc mysql-slave --replicas=3
    上面命令的意思是將名稱為mysql-slave的rc控制的pod副本數量變更為3。
    執行kubectl get pods命令可以看到擴展后的結果。

總結

本文假設你已經對kubernetes有一定了解,因此并沒有對一些命令、文件進行解釋。
本文搭建的mysql一主多從集群環境,并沒有考慮外部卷的掛載,因此當集群服務重啟后,在mysql中創建的數據庫、添加的數據會全部丟失。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,615評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,606評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,044評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,826評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,227評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,447評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,992評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,807評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,001評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,243評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,667評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,930評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,709評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,996評論 2 374

推薦閱讀更多精彩內容