Docker搭建mariadb集群

簡介

本例簡單介紹下如何在多個(gè)主機(jī)使用docker環(huán)境下搭建mairadb集群。只做測試不建議生產(chǎn)中使用康嘉。

實(shí)現(xiàn)原理:
本例基于severalnines/mariadb鏡像制作Mariadb集群仲智,當(dāng)容器啟動(dòng)后會(huì)向etcd注冊集群信息誉简,其他容器啟動(dòng)會(huì)從etcd獲取集群信息(集群名稱费什,運(yùn)行的容器IP等),從而加入集群解幽。容器之間跨主機(jī)的通信則借助flannel來實(shí)現(xiàn)。

架構(gòu)圖

架構(gòu)圖

3節(jié)點(diǎn)上安裝跨主機(jī)網(wǎng)絡(luò)烘苹,讓容器之間可以相互通信躲株,第一個(gè)容器啟動(dòng)時(shí)向etcd注冊自己的集群信息,后面容器啟動(dòng)時(shí)從etcd中查找集群信息镣衡,并加入集群中去霜定。

環(huán)境

主機(jī)名 機(jī)器IP 系統(tǒng) CPU/MEM Docker版本
node-1 10.0.102.218 CentOS 7.5 4H/16G 18.06.2-ce
node-2 10.0.102.151 CentOS 7.5 4H/16G 18.06.2-ce
node-3 10.0.102.162 CentOS 7.5 4H/16G 18.06.2-ce

依賴組件
etcd提供服務(wù)發(fā)現(xiàn)與存放flannel網(wǎng)絡(luò)信息flannel提供跨主機(jī)網(wǎng)絡(luò)
etcd安裝etcd服務(wù),集群都要安裝flannel組件(事先關(guān)掉docker)
若未裝則運(yùn)行--network=host網(wǎng)絡(luò)

部署

Docker環(huán)境設(shè)置

有配置flanneld則需要執(zhí)行
vim /etc/systemd/system/docker.service中增加下面兩條記錄
[Service]
EnvironmentFile=/run/docker_opts.env
ExecStart=/usr/bin/dockerd\
--graph=/var/lib/docker --log-level=error $DOCKER_NETWORK_OPTIONS $DOCKER_OPTS

再啟動(dòng)docker
systemctl daemon-reload &&systemctl restart docker 

etcd集群

臺機(jī)器驗(yàn)證集群的可用性,集群信息如下:
     機(jī)器名     IP地址              角色
     node1    10.0.102.218   etcd節(jié)點(diǎn)
     node2    10.0.102.151   etcd節(jié)點(diǎn)
     node3    10.0.102.162   etcd節(jié)點(diǎn)
    
運(yùn)行容器(每個(gè)節(jié)點(diǎn)都運(yùn)行)
REGISTRY=k8s.gcr.io/etcd
ETCD_VERSION=3.2.24
TOKEN=my-etcd-token
NAME_1=k8s-node-1
NAME_2=k8s-node-2
NAME_3=k8s-node-3
HOST_1=10.0.102.218
HOST_2=10.0.102.151
HOST_3=10.0.102.162
CLUSTER=${NAME_1}=http://${HOST_1}:2380,${NAME_2}=http://${HOST_2}:2380,${NAME_3}=http://${HOST_3}:2380
DATA_DIR=/var/lib/etcd

# 在節(jié)點(diǎn) node1 上運(yùn)行:
THIS_NAME=${NAME_1}
THIS_IP=${HOST_1}
docker run -d \
   -p 2379:2379 \
   -p 2380:2380 \
   --volume=${DATA_DIR}:/etcd-data \
   --name etcd ${REGISTRY}:${ETCD_VERSION} \
   /usr/local/bin/etcd \
   --data-dir=/etcd-data --name ${THIS_NAME} \
   --initial-advertise-peer-urls http://${THIS_IP}:2380 \
   --listen-peer-urls http://0.0.0.0:2380 \
   --advertise-client-urls http://${THIS_IP}:2379 \
   --listen-client-urls http://0.0.0.0:2379 \
   --initial-cluster ${CLUSTER} \
   --initial-cluster-state new --initial-cluster-token ${TOKEN}

# 在節(jié)點(diǎn) node2 上運(yùn)行:
THIS_NAME=${NAME_2}
THIS_IP=${HOST_2}
docker run -d \
   -p 2379:2379 \
   -p 2380:2380 \
   --volume=${DATA_DIR}:/etcd-data \
   --name etcd ${REGISTRY}:${ETCD_VERSION} \
   /usr/local/bin/etcd \
   --data-dir=/etcd-data --name ${THIS_NAME} \
   --initial-advertise-peer-urls http://${THIS_IP}:2380 \
   --listen-peer-urls http://0.0.0.0:2380 \
   --advertise-client-urls http://${THIS_IP}:2379 \
   --listen-client-urls http://0.0.0.0:2379 \
   --initial-cluster ${CLUSTER} \
   --initial-cluster-state existing --initial-cluster-token ${TOKEN}

# 在節(jié)點(diǎn) node3 上運(yùn)行:
THIS_NAME=${NAME_3}
THIS_IP=${HOST_3}
docker run -d \
   -p 2379:2379 \
   -p 2380:2380 \
   --volume=${DATA_DIR}:/etcd-data \
   --name etcd ${REGISTRY}:${ETCD_VERSION} \
   /usr/local/bin/etcd \
   --data-dir=/etcd-data \
   --name ${THIS_NAME} \
   --initial-advertise-peer-urls http://${THIS_IP}:2380 \
   --listen-peer-urls http://0.0.0.0:2380 \
   --advertise-client-urls http://${THIS_IP}:2379 \
   --listen-client-urls http://0.0.0.0:2379 \
   --initial-cluster ${CLUSTER} \
   --initial-cluster-state existing --initial-cluster-token ${TOKEN}

驗(yàn)證集群
#在測試驗(yàn)證節(jié)點(diǎn)NFS上廊鸥,運(yùn)行另一個(gè)etcd容器然爆,
#以便使用其中的etcdctl命令行程序進(jìn)行驗(yàn)證
REGISTRY=k8s.gcr.io/etcd
ETCD_VERSION=3.2.24
docker run -d \
   --name etcd-client ${REGISTRY}:${ETCD_VERSION} \
   /usr/local/bin/etcd

#進(jìn)入容器,查詢集群狀態(tài)
#驗(yàn)證存入數(shù)據(jù)黍图、讀取數(shù)據(jù)
docker exec etcd-client /bin/sh -c "export ETCDCTL_API=3 && /usr/local/bin/etcdctl --endpoints=http://10.0.102.214:2379,http://10.0.102.175:2379,http://10.0.102.191:2379 --write-out=table member list"
docker exec etcd-client /bin/sh -c "export ETCDCTL_API=3 && /usr/local/bin/etcdctl --endpoints=http://10.0.102.214:2379,http://10.0.102.175:2379,http://10.0.102.191:2379 --write-out=table endpoint status"
docker exec etcd-client /bin/sh -c "export ETCDCTL_API=3 && /usr/local/bin/etcdctl --endpoints=http://10.0.102.214:2379,http://10.0.102.175:2379,http://10.0.102.191:2379 --write-out=table endpoint health"
docker exec etcd-client /bin/sh -c "export ETCDCTL_API=3 && /usr/local/bin/etcdctl --endpoints=http://10.0.102.214:2379,http://10.0.102.175:2379,http://10.0.102.191:2379  put url http://www.sina.com.cn"
docker exec etcd-client /bin/sh -c "export ETCDCTL_API=3 && /usr/local/bin/etcdctl --endpoints=http://10.0.102.214:2379,http://10.0.102.175:2379,http://10.0.102.191:2379  get url"

部署mariadb集群

準(zhǔn)備工作

鏡像:severalnines/mariadb:10.1

配置文件/etc/my.cnf.d/binlog.cnf
mkdir -p /etc/my.cnf.d/
cat > /etc/my.cnf.d/bin-log.cnf<<EOF
[mysqld]
log-bin = mysql-bin
log_slave_updates = 1
expire_logs_days = 20
server-id = 211
EOF

部署操作

node-1節(jié)點(diǎn)
第一個(gè)節(jié)點(diǎn):帶binlog日志曾雕,主機(jī)10-0-102-165上操作:
docker run -d -p 3306:3306 --name=galera0_h \
-v /data:/var/lib/mysql -v /etc/my.cnf.d:/etc/my.cnf.d \
-e MYSQL_ROOT_PASSWORD=mypassword \
-e DISCOVERY_SERVICE=10.0.102.215:2379,10.0.102.151:2379,10.0.102.162:2379  \
-e CLUSTER_NAME=my_wsrep_cluster_hp \
-e XTRABACKUP_PASSWORD=mypassword --network=host severalnines/mariadb:10.1

驗(yàn)證
docker ps –a
 【見圖1】
mysql -uroot -pmypassword -h 10.0.102.215 -e "show status like 'wsrep%';"
  【見圖2】
binlog日志
 【見圖3】
1.png

2.png

3.png
node-2節(jié)點(diǎn)
第二個(gè)節(jié)點(diǎn):非binlog日志
docker run -d -p 3306:3306 --name=galera1_h \
-v /data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=mypassword \
-e DISCOVERY_SERVICE=10.0.102.215:2379,10.0.102.151:2379,10.0.102.162:2379  \
-e CLUSTER_NAME=my_wsrep_cluster_hp \
-e XTRABACKUP_PASSWORD=mypassword --network=host severalnines/mariadb:10.1
docker ps –a
 【見圖4】
mysql -uroot -pmypassword -h 10.0.102.151 -e "show status like 'wsrep%';"
  【見圖5】
binlog日志
 【見圖6】
4.png

5.png

6.png
node-3節(jié)點(diǎn)
第三個(gè)節(jié)點(diǎn):非binlog日志
docker run -d -p 3306:3306 --name=galera2_h \
-v /data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=mypassword \
-e DISCOVERY_SERVICE=10.0.102.215:2379,10.0.102.151:2379,10.0.102.162:2379  \
-e CLUSTER_NAME=my_wsrep_cluster_hp \
-e XTRABACKUP_PASSWORD=mypassword --network=host severalnines/mariadb:10.1

mysql -uroot -pmypassword -h 10.0.102.162 -e "show status like 'wsrep%';"
 【見圖7】
binlog日志
【見圖8】
8.png

9.png
注意事項(xiàng)

因?yàn)槿萜鬟\(yùn)行時(shí)掛載主機(jī)下的/data目錄,所以備份與恢復(fù)操作較k8s中的操作更簡單,在此不再詳述娃属,只簡單說明下注意事項(xiàng):

1.如果某個(gè)容器掛掉
可以先使用docker start CONTAINER_NAME進(jìn)行啟動(dòng)跋涣,如果啟動(dòng)不成功,這個(gè)時(shí)候需要重新將node加入集群中搔弄,操作步驟如下:
docker stop CONTAINER_NAME
docker rm CONTAINER_NAME
rm -rf /data/
docker run xxx

2.容器啟動(dòng)時(shí)注意問題:
要按照一定的順序進(jìn)行,當(dāng)docker run第一個(gè)容器時(shí)丰滑,要等容器完全啟動(dòng)起來了再docker run第二個(gè)容器顾犹,依次類推關(guān)閉則執(zhí)行相反操作倒庵,先stop第一個(gè)容器,再stop第二個(gè)容器炫刷,依次類推

3.恢復(fù)操作注意問題
恢復(fù)操作與k8s中mariadb集群相同擎宝,需要依次停止,在最后一個(gè)節(jié)點(diǎn)上執(zhí)行恢復(fù)操作浑玛,恢復(fù)完成后重新讓節(jié)點(diǎn)加入集群(節(jié)點(diǎn)加入集群前需要先刪除本地的/data目錄)

4.使用docker rm命令會(huì)造成集群信息紊亂:
關(guān)閉某個(gè)節(jié)點(diǎn)的mariadb容器時(shí)绍申,切記不可執(zhí)行docker rm –f命令,應(yīng)該先執(zhí)行docker stop顾彰,然后再執(zhí)行docker rm命令极阅。

補(bǔ)充內(nèi)容:
使用docker-compose進(jìn)行部署mariadb-cluster集群
原理與架構(gòu)均與docker部署相同,在此不再贅述涨享。
一筋搏、與上面環(huán)境不同點(diǎn):
1.etcd使用的是集群: 10.0.102.214:2379, 10.0.102.175:2379, 10.0.102.191:2379
原因:測試在之前的etcd中獲得不到集群信息,不想在etcd上過多消耗厕隧,而且使用etcd集群會(huì)更可靠
2.沒有使用flannel網(wǎng)絡(luò)奔脐,使用的docker的host網(wǎng)絡(luò)。
原因:使用docker-compose啟動(dòng)時(shí)默認(rèn)會(huì)創(chuàng)建網(wǎng)絡(luò)栏账,這樣三個(gè)節(jié)點(diǎn)的容器就是在三個(gè)網(wǎng)絡(luò)中帖族,無法通信也就創(chuàng)建不了集群,在docker-compose文件中定義網(wǎng)絡(luò)為network_mode: host,使用本機(jī)IP進(jìn)行

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挡爵,一起剝皮案震驚了整個(gè)濱河市竖般,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌茶鹃,老刑警劉巖涣雕,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異闭翩,居然都是意外死亡挣郭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進(jìn)店門疗韵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兑障,“玉大人,你說我怎么就攤上這事蕉汪×饕耄” “怎么了?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵者疤,是天一觀的道長福澡。 經(jīng)常有香客問我,道長驹马,這世上最難降的妖魔是什么革砸? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任除秀,我火速辦了婚禮,結(jié)果婚禮上算利,老公的妹妹穿的比我還像新娘册踩。我一直安慰自己,他們只是感情好笔时,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布棍好。 她就那樣靜靜地躺著仗岸,像睡著了一般允耿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扒怖,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天较锡,我揣著相機(jī)與錄音,去河邊找鬼盗痒。 笑死蚂蕴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的俯邓。 我是一名探鬼主播骡楼,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼稽鞭!你這毒婦竟也來了鸟整?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤朦蕴,失蹤者是張志新(化名)和其女友劉穎篮条,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吩抓,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涉茧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了疹娶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伴栓。...
    茶點(diǎn)故事閱讀 40,021評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖雨饺,靈堂內(nèi)的尸體忽然破棺而出钳垮,到底是詐尸還是另有隱情,我是刑警寧澤沛膳,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布扔枫,位于F島的核電站,受9級特大地震影響锹安,放射性物質(zhì)發(fā)生泄漏短荐。R本人自食惡果不足惜倚舀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望忍宋。 院中可真熱鬧痕貌,春花似錦、人聲如沸糠排。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽入宦。三九已至哺徊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間乾闰,已是汗流浹背落追。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留涯肩,地道東北人轿钠。 一個(gè)月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像病苗,于是被迫代替她去往敵國和親疗垛。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評論 2 355

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