利用Kubernetes搭建mysql主從復(fù)制集群

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

通過本文的實踐葵陵,我們可以了解一下k8s能帶給我們什么锨能。另外耸携,實際生產(chǎn)環(huán)境中mysql的主從復(fù)制考慮的事情會更多。

mysql主從復(fù)制

mysql的主從復(fù)制可以通過如下方式實現(xiàn)。

  1. master
    在master主機上修改配置文件,比如通常是修改my.cnf。
    [mysqld] server-id=1 log-bin
    在mysql上創(chuàng)建同步賬號并授權(quán)遂填。
    如下,創(chuàng)建用戶名為repl澈蝙,密碼為1234567:
    create user 'repl'@'%' identified by '1234567';
    如下吓坚,給repl用戶授權(quán)允許同步:
    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為主機標識逗载,不能重復(fù)哆窿。

利用Docker實現(xiàn)主從復(fù)制

本節(jié)介紹利用Docker官網(wǎng)鏡像文件實現(xiàn)上述的各項配置,這是為了接下來k8s的使用厉斟。利用Docker實現(xiàn)mysql的方式有很多種挚躯,可以參考其他文章。

mysql官網(wǎng)Docker鏡像文件地址:https://hub.docker.com/_/mysql/
這里用的是8.0 Dockerfile擦秽,包括兩個文件Dockerfile, docker-entrypoint.sh码荔。

  1. 準備master的鏡像
    將Dockerfile, docker-entrypoint.sh復(fù)制一份作為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[@]}"
    可以看到上面添加了兩個環(huán)境變量MYSQL_REPLICATION_USER和MYSQL_REPLICATION_PASSWORD感挥,用作主從復(fù)制的賬號和密碼目胡。
    通過下面的截圖可以看到上面添加內(nèi)容所在的位置。

    Dockerfile.png

    docker-entrypoint.sh.png

  2. 準備slave的鏡像
    將Dockerfile, docker-entrypoint.sh復(fù)制一份作為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用的是隨機數(shù)。
    在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[@]}"
    通過下面的截圖可以看到上面添加內(nèi)容所在的位置眉尸。

    Dockerfile.png

    docker-entrypoint.sh.png

    重要的來了域蜗,上面slave的配置中,master_host一項用的是$MYSQL_MASTER_SERVICE_HOST噪猾,這個環(huán)境變量(enviromnent variable)是由k8s生成的霉祸。
    k8s的service創(chuàng)建后,會自動分配一個cluster ip袱蜡,這個cluster ip是動態(tài)的丝蹭,我們沒法直接使用或硬編碼,k8s為了service對容器的可見坪蚁,生成了一組環(huán)境變量奔穿,這些環(huán)境變量用于記錄service name到cluster ip地址的映射關(guān)系镜沽,這樣容器中就可以使用這些變量來使用service。(類似的贱田,Docker中提供了links缅茉。)

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

  1. 構(gòu)建鏡像并上傳至docker hub
    分別構(gòu)建用于mysql master和mysql slave的Docker鏡像男摧,并上傳至docker hub蔬墩,地址為https://hub.docker.com/ (這是因為當我們用k8s去做mysql集群部署的時候,k8s默認會去docker hub下載鏡像耗拓。通常在生產(chǎn)環(huán)境中服務(wù)器是不運行連接internet的拇颅,因此通常會搭建自己的docker hub服務(wù)器。)乔询。

構(gòu)建master鏡像

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

構(gòu)建slave鏡像

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

鏡像推送

然后將構(gòu)建好的鏡像文件推送到docker hub哥谷,首先使用下面的命令登陸岸夯,如果沒有注冊,需要先到官網(wǎng)注冊一下们妥。
docker login
接著執(zhí)行推送命令:
docke push paulliu/mysql-master:0.1
docke push paulliu/mysql-slave:0.1

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

k8s部署

終于進入到正題监婶,接下來開始利用k8s構(gòu)建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需要的環(huán)境變量鱼冀。
    service:
    mysql-master-service.yaml.png

    切換到y(tǒng)aml文件所在目錄报破,執(zhí)行命令以部署mysql master服務(wù):
    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

    切換到y(tǒng)aml文件所在目錄充易,執(zhí)行命令以部署mysql slave服務(wù):
    kubectl create -f mysql-slave-rc.yaml
    kubectl create -f mysql-slave-service.yaml

  3. 查看運行狀態(tài)
    執(zhí)行命令,查看k8s各資源的運行情況:
    kubectl get pods,service,rc
    我的環(huán)境的運行截圖荸型,各資源運行正常盹靴。

    k8s.png

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

mysql master上的操作

通過如下命令連接到pods中的容器自赔,其中mysql-master-pe18a為pod名稱妈嘹。
kubectl exec -it mysql-master-pe18a /bin/bash
接著連接本地mysql master服務(wù)器:
mysql -uroot -p
至此進入到mysql命令模式。
執(zhí)行命令show master status;查看狀態(tài)绍妨。
執(zhí)行下面的命令創(chuàng)建數(shù)據(jù)庫以及表润脸,以測試數(shù)據(jù)同步:
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的命令行,執(zhí)行以下命令:
show slave status\G;
通過該命令可以查看主從同步的情況他去,通常利用該命令來檢查主從配置是否有問題毙驯。

mysql-slave-running.png

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

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

總結(jié)

本文假設(shè)你已經(jīng)對kubernetes有一定了解,因此并沒有對一些命令秦爆、文件進行解釋序愚。
本文搭建的mysql一主多從集群環(huán)境,并沒有考慮外部卷的掛載等限,因此當集群服務(wù)重啟后爸吮,在mysql中創(chuàng)建的數(shù)據(jù)庫、添加的數(shù)據(jù)會全部丟失望门。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末形娇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子筹误,更是在濱河造成了極大的恐慌桐早,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厨剪,死亡現(xiàn)場離奇詭異勘畔,居然都是意外死亡,警方通過查閱死者的電腦和手機宇姚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門缀壤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事镰吆∶⒋猓” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長奕巍。 經(jīng)常有香客問我,道長儒士,這世上最難降的妖魔是什么的止? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮着撩,結(jié)果婚禮上诅福,老公的妹妹穿的比我還像新娘。我一直安慰自己拖叙,他們只是感情好氓润,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著薯鳍,像睡著了一般咖气。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上挖滤,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天崩溪,我揣著相機與錄音,去河邊找鬼斩松。 笑死伶唯,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的砸民。 我是一名探鬼主播抵怎,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼岭参!你這毒婦竟也來了反惕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤演侯,失蹤者是張志新(化名)和其女友劉穎姿染,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秒际,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡悬赏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了娄徊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闽颇。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖寄锐,靈堂內(nèi)的尸體忽然破棺而出兵多,到底是詐尸還是另有隱情尖啡,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布剩膘,位于F島的核電站衅斩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏怠褐。R本人自食惡果不足惜畏梆,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望奈懒。 院中可真熱鬧奠涌,春花似錦、人聲如沸筐赔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茴丰。三九已至达皿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贿肩,已是汗流浹背峦椰。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留汰规,地道東北人汤功。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像溜哮,于是被迫代替她去往敵國和親滔金。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容