本文目錄一覽:
- 1、容器化 | 在 KubeSphere 中部署 MySQL 集群
- 2、docker容器內怎麼連接外部的mysql
- 3、我們是否應該將資料庫也容器化?
- 4、k8s中的Mysql資料庫持久化存儲
- 5、想知道雲資料庫MySql,是存放在獨立的伺服器上嗎?購買後我們如何查看資料庫數據,是登錄遠程還是通
容器化 | 在 KubeSphere 中部署 MySQL 集群
本文將演示如何在 KubeSphere[1] 上部署 RadonDB MySQL on Kubernetes 2.1.2 ,快速實現高可用的 MySQL on K8s。
若已在 KubeSphere 部署過歷史版本 Operator,可以選擇如下方式更新到最新版本。
可任選一個 RadonDB MySQL 配置示例[5] 部署,或自定義配置部署。
以 mysql_v1alpha1_mysqlcluster.yaml 模版為例,創建一個 RadonDB MySQL 集群。
注意
未指定項目時,集群將被默認安裝在 kubesphere-controls-system 項目中。若需指定項目,安裝命令需添加 –namespace=project_name 。
預期結果
預期結果
在 demo-project 項目中,查看 RadonDB MySQL 集群狀態。
至此,完成在 KubeSphere 中部署 RadonDB MySQL 集群。
[1]:KubeSphere:
[2]:OpenPitrix:
[3]:創建操作:
[4]:項目網關:
[5]:配置示例:
docker容器內怎麼連接外部的mysql
推薦使用Dockerfile方式。
服務的管理使用的是supervisord, 因為dockerfile里只會有一個cmd生效,如果我想通過ssh去管理容器還要有mysql服務的啟動起來 cmd的方式就無法實現,當然容器不需要以sshd的方式去管理,這些也都是看自己怎麼去使用,比如說我想備份容器里的數據 我完全可以使用 –volumes-from 容器name , 重啟使用 docker restart 容器id, 我個人也是使用ssh習慣了 所以依賴的鏡像把ssh服務栽進去了。
# docker 版本:
複製代碼
代碼如下:
[root@private_network mysql]# docker version
Client version: 1.6.0-rc5
Client API version: 1.18
Go version (client): go1.4.2
Git commit (client): fc4825d
OS/Arch (client): linux/amd64
Server version: 1.6.0-rc5
Server API version: 1.18
Go version (server): go1.4.2
Git commit (server): fc4825d
OS/Arch (server): linux/amd64[/code]
# 目錄結構
複製代碼
代碼如下:
mysql/
|– cmake-3.2.2.tar.gz
|– create_mysql_user.sh # mysql用戶初始化腳本
|– Dockerfile
|– install_mysql-5.6.24.sh # mysql服務安裝腳本
|– my.cnf # mysql服務配置文件
|– mysql-5.6.24.tar.gz
`– supervisord.conf # 服務管理工具配置文件
# Dockerfile
複製代碼
代碼如下:
# FROM: 依賴的鏡像
FROM ted1993/mysql:5.6.24
#MAINTAINER: 個人信息
MAINTAINER xuqiangqiang “739827282@qq.com”
# RUN: 執行命令
RUN yum -y install tar gcc-c++ supervisor ncurses-devel libtool bison bison-devel pwgen
RUN mkdir -p /var/log/supervisor
# ADD: 添加本地文件到容器中,如果是壓縮包會在目標目錄進行自動解壓,如果只想添加文件可以使用 COPY命令
ADD ./supervisord.conf /etc/supervisord.conf
ADD ./cmake-3.2.2.tar.gz /root/tools/
ADD ./mysql-5.6.24.tar.gz /root/tools/
ADD ./install_mysql-5.6.24.sh /root/tools/
ADD ./create_mysql_user.sh /create_mysql_user.sh
# WORKDIR: 當前的工作目錄
WORKDIR /root/tools/
RUN sh install_mysql-5.6.24.sh
ADD ./my.cnf /data/server/mysql-5.6.24/etc/my.cnf
RUN rm -rf /root/tools/mysql-5.6.24
RUN rm -rf /root/tools/mysql-5.6.24.tar.gz
RUN rm -rf /root/tools/cmake-3.2.2
RUN rm -rf /root/tools/cmake-3.2.2.tar.gz
# EXPOSE: 公開的埠,會暴露在外的埠
EXPOSE 22 3306
# CMD: 容器啟動執行的命令 一個dockerfile只有一個cmd生效。
CMD [“/usr/bin/supervisord”]
# supervisord.conf 服務管理工具通過supervisord管理服務
複製代碼
代碼如下:
[supervisord]
nodaemon=true
[program:mysqld]
command=/etc/init.d/mysqld start
numprocs=1
autostart=true
autorestart=true
[program:sshd]
command=/usr/sbin/sshd -D
numprocs=1
autostart=true
autorestart=true
# install_mysql-5.6.24.sh
複製代碼
代碼如下:
#!/bin/bash
grep “^mysql:” /etc/passwd /dev/null || groupadd mysql useradd -g mysql -s /sbin/nologin mysql
if [ ! -d cmake-3.2.2 ];then
tar xzvf cmake-3.2.2.tar.gz
fi
cd cmake-3.2.2
./bootstrap gmake gmake install cd ..
if [ ! -d mysql-5.6.24 ];then
tar xzf mysql-5.6.24.tar.gz
fi
cd mysql-5.6.24
cmake \
-DCMAKE_INSTALL_PREFIX=/data/server/mysql-5.6.24 \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DMYSQL_DATADIR=/data/mysql-5.6.24/ \
-DSYSCONFDIR=/data/server/mysql-5.6.24/etc/ \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_EXTRA_CHARSETS=complex \
-DENABLED_LOCAL_INFILE=1 \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_unicode_ci \
-DWITH_DEBUG=0
CPU_NUM=$(cat /proc/cpuinfo | grep processor | wc -l)
if [ $CPU_NUM -gt 1 ];then
make -j$CPU_NUM
else
make
fi
make install
echo “PATH=\$PATH:/data/server/mysql/bin” /etc/profile . /etc/profile
ln -s /data/server/mysql-5.6.24/ /data/server/mysql
rm -rf /etc/my.cnf
mkdir -p /data/server/mysql-5.6.24/etc/
mkdir -p /data/server/mysql/data/
mkdir -p /data/log/mysql/
chown -R mysql:mysql /data/server/mysql/
chown -R mysql:mysql /data/server/mysql/data/
chown -R mysql:mysql /data/log/mysql
\cp -f /data/server/mysql/support-files/mysql.server /etc/init.d/mysqld
sed -i ‘s#^basedir=$#basedir=/data/server/mysql#’ /etc/init.d/mysqld
sed -i ‘s#^datadir=$#datadir=/data/server/mysql/data#’ /etc/init.d/mysqld
chmod 755 /etc/init.d/mysqld
/data/server/mysql/scripts/mysql_install_db –datadir=/data/server/mysql/data/ –basedir=/data/server/mysql –user=mysql
# create_mysql_user.sh
複製代碼
代碼如下:
#!/bin/bash
/data/server/mysql/bin/mysqld_safe /dev/null 21
RET=1
while [[ RET -ne 0 ]]; do
echo “= Waiting for confirmation of MySQL service startup”
sleep 5
/data/server/mysql/bin/mysql -uroot -e “status” /dev/null 21
RET=$?
done
echo “============================MYSQL_PASS_INFO=============================== “
echo “”
PASS_ROOT=${MYSQL_PASS:-$(pwgen -s 8 1)}
PASS_DBA=${MYSQL_PASS:-$(pwgen -s 8 1)}
echo “”
echo “= Creating MySQL root user with ${PASS_ROOT} password”
echo “= Creating MySQL dba user with ${PASS_DBA} password”
echo “”
/data/server/mysql/bin/mysql -uroot -e “grant all privileges on *.* to ‘dba’@’%’ identified by ‘${PASS_DBA}'”;
/data/server/mysql/bin/mysql -uroot -e “update mysql.user set password=PASSWORD(‘${PASS_ROOT}’) where user=’root’ and host=’localhost'”;
echo “”
echo “===================================END=====================================”
echo “”
echo “= Done!”
echo “”
echo “”
echo “==============================REMOTE_MYSQL_PASSWORD=====================”
echo “You can now connect to this MySQL Server using:”
echo “”
echo ” mysql -udba -p${PASS_DBA} -hhost -Pport”
echo “”
echo “Please remember to change the above password as soon as possible!”
echo “MySQL user ‘root’ has no password but only allows local connections”
echo “========================================================================”
# 通過docker build命令提交鏡像
複製代碼
代碼如下:
docker build -t ted1993/mysql:5.6.24 . # 注意最後面有一個”.”
# 使用docker images 命令查看鏡像
複製代碼
代碼如下:
[root@private_network mysql]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ted1993/mysql 5.6.24 d3ed9c578f4c 5 days ago 902.8 MB
# 使用docker run 命令啟動容器 -P 使用隨機埠映射容器埠 -p 3306:3306 使用指定埠
複製代碼
代碼如下:
docker run -d -P ted1993/mysql:5.6.24
# 使用docker ps 命令查看運行容器id
複製代碼
代碼如下:
[root@private_network mysql]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ab622592bf1e mysql:5.6.24 “/usr/bin/supervisor 3 days ago Up 3 days 0.0.0.0:5000-22/tcp, 0.0.0.0:5001-3306/tcp jolly_swartz
# 使用docker commit 提交新的鏡像
docker commit ab622592bf1e ted1993/mysql:2015-06-02[/code]
Docker使用Link在容器之間建立連接
在使用Docker的時候我們會常常碰到這麼一種應用,就是我需要兩個或多個容器,其中某些容器需要使用另外一些容器提供的服務。比如這麼一種情況:我們需要一個容器來提供mysql的資料庫服務,而另外兩個容器作為客戶端來連接使用mysql資料庫服務。下面我們就來看看Docker是怎樣通過Link來實現這種功能的。
這裡我們首先創建兩個容器image,一個用來模擬mysql資料庫,另外一個使用mysql的client來模擬一些使用mysql服務的應用,這種應用可以是任何php,python,java等的應用。
先創建一個mysql_server目錄並在其下創建一個Dockerfile文件,內容如下
複製代碼
代碼如下:
FROM centos:centos6
MAINTAINER Fanbin Kong “kongxx@hotmail.com”
RUN yum install -y mysql-server mysql
RUN /etc/init.d/mysqld start \
mysql -e “grant all privileges on *.* to ‘root’@’%’ identified by ‘letmein’;”\
mysql -e “grant all privileges on *.* to ‘root’@’localhost’ identified by ‘letmein’;”\
mysql -u root -pletmein -e “show databases;”
EXPOSE 3306
CMD [“/usr/bin/mysqld_safe”]
然後根據Dockerfile來創建image
複製代碼
代碼如下:
sudo docker build -t kongxx/mysql_server .
創建一個mysql_client目錄並在其下創建一個Dockerfile文件,內容如下
複製代碼
代碼如下:
FROM centos:centos6
MAINTAINER Fanbin Kong “kongxx@hotmail.com”
RUN yum install -y mysql
然後根據Dockerfile來創建image
複製代碼
代碼如下:
sudo docker build -t kongxx/mysql_client .
創建完image之後,我們可以使用下面命令來查看結果
複製代碼
代碼如下:
$ sudo docker images | grep kongxx
kongxx/mysql_client latest aa31f22f6fc5 2 hours ago 303.7 MB
kongxx/mysql_server latest 3b9b08c8dda4 2 hours ago 353.3 MB
第二步是根據image來創建我們的應用場景
首先創建提供mysql資料庫服務的容器
複製代碼
代碼如下:
sudo docker run –name=mysql_server -d -P kongxx/mysql_server
分別創建兩個使用上一步創建出來mysql資料庫服務的容器
第一個應用容器
複製代碼
代碼如下:
sudo docker run –name=mysql_client1 –link=mysql_server:db -t -i kongxx/mysql_client /usr/bin/mysql -h db -u root -pletmein
第二個應用容器
複製代碼
代碼如下:
sudo docker run –name=mysql_client2 –link=mysql_server:db -t -i kongxx/mysql_client /usr/bin/mysql -h db -u root -pletmein
這裡需要特別注意一下「–link=mysql_server:db」,這個參數就是告訴Docker容器需要使用「mysql_server」容器,並將其別名命名為db,這樣在這兩個容器里就可以使用「db」來作為提供mysql資料庫服務的機器名。所以在最後啟動參數里我們使用的是「/usr/bin/mysql -h db -u root -pletmein」來連接mysql資料庫的。
運行完上面兩個命令,我們就會在創建了兩個mysql的client的容器,此時我們可以使用下面命令來查看狀態
複製代碼
代碼如下:
sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ac0c76c627c0 kongxx/mysql_client:latest /usr/bin/mysql -h db 10 seconds ago Up 9 seconds mysql_client2
763c4825722d kongxx/mysql_client:latest /usr/bin/mysql -h db 41 minutes ago Up 40 minutes mysql_client
32f7839f7e9d kongxx/mysql_server:latest /usr/bin/mysqld_safe About an hour ago Up About an hour 0.0.0.0:49153-3306/tcp mysql_client1/db,mysql_client2/db,mysql_server
這裡注意一下最後一行,也就是mysql_server容器的「NAMES」列的內容「mysql_client/db,mysql_client2/db,mysql_server」,這就說明mysql_client1和mysql_client2都和db建立的連接。
我們是否應該將資料庫也容器化?
Docker不適合部署資料庫的7大原因
1、數據安全問題
不要將數據儲存在容器中,這也是 Docker 官方容器使用技巧中的一條。容器隨時可以停止、或者刪除。當容器被rm掉,容器里的數據將會丟失。為了避免數據丟失,用戶可以使用數據卷掛載來存儲數據。但是容器的 Volumes 設計是圍繞 Union FS 鏡像層提供持久存儲,數據安全缺乏保證。如果容器突然崩潰,資料庫未正常關閉,可能會損壞數據。另外,容器里共享數據卷組,對物理機硬體損傷也比較大。
即使你要把 Docker 數據放在主機來存儲 ,它依然不能保證不丟數據。Docker volumes 的設計圍繞 Union FS 鏡像層提供持久存儲,但它仍然缺乏保證。
使用當前的存儲驅動程序,Docker 仍然存在不可靠的風險。如果容器崩潰並資料庫未正確關閉,則可能會損壞數據。
2、性能問題
大家都知道,MySQL 屬於關係型資料庫,對IO要求較高。當一台物理機跑多個時,IO就會累加,導致IO瓶頸,大大降低 MySQL 的讀寫性能。
在一次Docker應用的十大難點專場上,某國有銀行的一位架構師也曾提出過:「資料庫的性能瓶頸一般出現在IO上面,如果按 Docker 的思路,那麼多個docker最終IO請求又會出現在存儲上面。現在互聯網的資料庫多是share nothing的架構,可能這也是不考慮遷移到 Docker 的一個因素吧」。
針對性能問題有些同學可能也有相對應的方案來解決:
(1)資料庫程序與數據分離
如果使用Docker 跑 MySQL,資料庫程序與數據需要進行分離,將數據存放到共享存儲,程序放到容器里。如果容器有異常或 MySQL 服務異常,自動啟動一個全新的容器。另外,建議不要把數據存放到宿主機里,宿主機和容器共享卷組,對宿主機損壞的影響比較大。
(2)跑輕量級或分散式資料庫
Docker 里部署輕量級或分散式資料庫,Docker 本身就推薦服務掛掉,自動啟動新容器,而不是繼續重啟容器服務。
(3)合理布局應用
對於IO要求比較高的應用或者服務,將資料庫部署在物理機或者KVM中比較合適。目前TX雲的TDSQL和阿里的Oceanbase都是直接部署在物理機器,而非Docker 。
3、網路問題
要理解 Docker 網路,您必須對網路虛擬化有深入的了解。也必須準備應付好意外情況。你可能需要在沒有支持或沒有額外工具的情況下,進行 bug 修復。
我們知道:資料庫需要專用的和持久的吞吐量,以實現更高的負載。我們還知道容器是虛擬機管理程序和主機虛擬機背後的一個隔離層。然而網路對於資料庫複製是至關重要的,其中需要主從資料庫間 24/7 的穩定連接。未解決的 Docker 網路問題在1.9版本依然沒有得到解決。
把這些問題放在一起,容器化使資料庫容器很難管理。我知道你是一個頂級的工程師,什麼問題都可以得到解決。但是,你需要花多少時間解決 Docker 網路問題?將資料庫放在專用環境不會更好嗎?節省時間來專註於真正重要的業務目標。
4、狀態
在 Docker 中打包無狀態服務是很酷的,可以實現編排容器並解決單點故障問題。但是資料庫呢?將資料庫放在同一個環境中,它將會是有狀態的,並使系統故障的範圍更大。下次您的應用程序實例或應用程序崩潰,可能會影響資料庫。
**知識點:**在 Docker 中水平伸縮只能用於無狀態計算服務,而不是資料庫。
Docker 快速擴展的一個重要特徵就是無狀態,具有數據狀態的都不適合直接放在 Docker 裡面,如果 Docker 中安裝資料庫,存儲服務需要單獨提供。
目前,TX雲的TDSQL(金融分散式資料庫)和阿里雲的Oceanbase(分散式資料庫系統)都直接運行中在物理機器上,並非使用便於管理的 Docker 上。
5、資源隔離
資源隔離方面,Docker 確實不如虛擬機KVM,Docker是利用Cgroup實現資源限制的,只能限制資源消耗的最大值,而不能隔絕其他程序佔用自己的資源。如果其他應用過渡佔用物理機資源,將會影響容器里 MySQL 的讀寫效率。
需要的隔離級別越多,獲得的資源開銷就越多。相比專用環境而言,容易水平伸縮是Docker的一大優勢。然而在 Docker 中水平伸縮只能用於無狀態計算服務,資料庫並不適用。
我們沒有看到任何針對資料庫的隔離功能,那為什麼我們應該把它放在容器中呢?
6、雲平台的不適用性
大部分人通過共有雲開始項目。雲簡化了虛擬機操作和替換的複雜性,因此不需要在夜間或周末沒有人工作時間來測試新的硬體環境。當我們可以迅速啟動一個實例的時候,為什麼我們需要擔心這個實例運行的環境?
這就是為什麼我們向雲提供商支付很多費用的原因。當我們為實例放置資料庫容器時,上面說的這些便利性就不存在了。因為數據不匹配,新實例不會與現有的實例兼容,如果要限制實例使用單機服務,應該讓 DB 使用非容器化環境,我們僅僅需要為計算服務層保留彈性擴展的能力。
7、運行資料庫的環境需求
常看到 DBMS 容器和其他服務運行在同一主機上。然而這些服務對硬體要求是非常不同的。
資料庫(特別是關係型資料庫)對 IO 的要求較高。一般資料庫引擎為了避免並發資源競爭而使用專用環境。如果將你的資料庫放在容器中,那麼將浪費你的項目的資源。因為你需要為該實例配置大量額外的資源。在公有雲,當你需要 34G 內存時,你啟動的實例卻必須開 64G 內存。在實踐中,這些資源並未完全使用。
怎麼解決?您可以分層設計,並使用固定資源來啟動不同層次的多個實例。水平伸縮總是比垂直伸縮更好。
總結
針對上面問題是不是說資料庫一定不要部署在容器里嗎?
答案是:並不是
我們可以把數據丟失不敏感的業務(搜索、埋點)就可以數據化,利用資料庫分片來來增加實例數,從而增加吞吐量。
docker適合跑輕量級或分散式資料庫,當docker服務掛掉,會自動啟動新容器,而不是繼續重啟容器服務。
資料庫利用中間件和容器化系統能夠自動伸縮、容災、切換、自帶多個節點,也是可以進行容器化的。
見仁見智,一般不推薦用容器做狀態或持久化的東西,因為無法保證數據安全。當然,你如果是類似於一主多從,並對數據一致性沒有變態的要求,那用容器跑幾個只讀從庫也沒啥不可以
k8s中的Mysql資料庫持久化存儲
一、配置:
環境:
CentOS7
VMware
筆者配置了四台虛擬機:
K8S-Master節點: 3GB內存 2核CPU 20GB硬碟空間
K8S-node1節點: 2GB內存 2核CPU 30GB硬碟空間
K8S-node2節點: 2GB內存 2核CPU 30GB硬碟空間
鏡像倉庫節點: 2GB內存 2核CPU 50GB硬碟空間
二、節點規劃:
使用三台虛擬機搭建K8S集群,使用一台虛擬機搭建鏡像倉庫。
每台虛擬機配置兩塊網卡,其中一塊為「NAT模式」,用於拉取鏡像等功能。
另外一塊網卡為「僅主機模式」,用於集群節點間的通信。歸劃如下:
K8s-master節點:
僅主機模式:10.10.10.200
NAT模式: 192.168.200.130
K8S-node1節點:
僅主機模式:10.10.10.201
NAT模式: 192.168.200.131
K8S-node2節點:
僅主機模式:10.10.10.202
NAT模式: 192.168.200.132
鏡像倉庫節點:
僅主機模式:10.10.10.101
NAT模式: 192.168.200.150
三、版本信息
Linux內核版本:
Linux version 3.10.0-862.el7.x86_64 (builder@kbuilder.dev.centos.org)
(gcc version 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) )
#1 SMP Fri Apr 20 16:44:24 UTC 2018
K8s集群版本為1.15.0版本:
四、基於StatefulSet與PV/PVC的MySql持久化存儲實驗
1. 在每個節點安裝nfs服務
在「鏡像倉庫」節點,執行以下命令:
yum install -y nfs-common nfs-utils rpcbind
在k8s集群,執行以下命令:
yum install -y nfs-utils rpcbind
2. 在「鏡像倉庫」節點下,配置nfs伺服器
mkdir /nfs_mysql
Chmod 777 /nfs_mysql/
(在測試環境中,為了不考慮用戶屬性,暫時賦予777許可權,但在生產環境不推薦這樣做)
Chown nfsnobody /nfs_mysql/
echo 「/nfs_mysql *(rw,no_root_squash,no_all_squash,sync)」 /etc/exports
cat /etc/exports
/nfs_mysql *(rw,no_root_squash,no_all_squash,sync)
systemctl start rpcbind
systemctl start nfs
3. 測試nfs服務是否可用
mkdir /test
showmount -e 10.10.10.101
可見/nfs_mysql *已暴露於共享目錄,接下來測試掛載是否可用:
在master節點下執行:
mount -t nfs 10.10.10.101:/nfs_mysql /test/
echo “hello-world”/test/1.txt
在鏡像倉庫節點下查看1.txt是否存在,若存在則掛載成功:
可見nfs服務可以正常使用,接下來刪除test目錄和1.txt
在鏡像倉庫下:
[root@hub nfs_mysql]# rm -f 1.txt
在Master節點下:
[root@k8s-master ~]# umount /test/
[root@k8s-master ~]# rm -rf /test/
同理,依照以上步驟同時創建:(提供多個mysql副本進行掛載)
nfs_mysql1
nfs_mysql2
完成後需要重啟nfs服務
systemctl restart rpcbind
systemctl restart nfs
最終效果:
4. 將nfs封裝成pv
創建mysql_test文件夾,將yaml文件統一保存在此目錄下
mkdir mysql_test
cd mysql_test
vim mysql-pv.yml
mysql-pv.yml配置如下:
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv
spec:
capacity:
storage: 5Gi
accessModes:
– ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs
nfs:
path: /nfs_mysql
server: 10.10.10.101
—
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv1
spec:
capacity:
storage: 5Gi
accessModes:
– ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs
nfs:
path: /nfs_mysql1
server: 10.10.10.101
—
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-pv2
spec:
capacity:
storage: 5Gi
accessModes:
– ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs
nfs:
path: /nfs_mysql2
server: 10.10.10.101
注意:
在k8s集群15版本中recycle回收策略已被刪除,只能用retain策略或者Delete策略。這裡我們使用 persistentVolumeReclaimPolicy: Retain
執行命令:
kubectl create -f mysql-pv.yml
kubectl get pv
如圖所示,即為Pv創建成功。
5. 部署MySQL,在mysql_test目錄下編寫mysql.yml,配置文件如下
apiVersion: v1
kind: Service
metadata:
name: mysql
labels:
app: mysql
spec:
ports:
– port: 3306
name: mysql
clusterIP: None
selector:
app: mysql
—
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
serviceName: “mysql”
replicas: 3
template:
metadata:
labels:
app: mysql
spec:
containers:
– name: mysql
image: mysql:5.6
env:
– name: MYSQL_ROOT_PASSWORD
value: password
ports:
– containerPort: 3306
name: mysql
volumeMounts:
– name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumeClaimTemplates:
– metadata:
name: mysql-persistent-storage
spec:
accessModes: [“ReadWriteOnce”]
storageClassName: “nfs”
resources:
requests:
storage: 1Gi
執行以下命令,部署mysql服務:
kubectl create -f mysql.yml
如圖可知,mysql按StatefulSet依次創建了mysql-0 mysql-1 mysql-2
查看各個Pod部在哪個節點:
6. 通過創建臨時容器,使用MySQL客戶端發送測試請求給MySQL master節點
注意:
主機名為mysql-0.mysql;跨命名空間的話,主機名請使用mysql-0.mysql. [NAMESPACE_NAME].如果沒有指定命名空間,默認為default,即 mysql-0.mysql. default。
這裡筆者打算關閉node2節點來模擬node2宕機,來測試是否實現數據的持久化存儲,
所以我們向node2上的mysql1寫入數據。
執行以下命令,訪問mysql1:
kubectl run mysql-client –image=mysql:5.6 -it –rm –restart=Never — mysql -h mysql-1.mysql.default -p password
創建資料庫demo,並向messages表中寫入hello-world
CREATE DATABASE demo;
CREATE TABLE demo.messages (message VARCHAR(250));
INSERT INTO demo.messages VALUES (‘hello-world’);
如圖所示
接下來我們來關閉k8s-node2虛擬機,模擬宕機
查看nodes的運行狀態,可知node2的狀態已轉變為NotReady
一段時間後,k8s將Pod MySql -1遷移到節點k8s-node1
由於時間過長,筆者把三個Pod都刪除重啟後,驗證數據:
MySQL服務恢復,數據完好無損!
想知道雲資料庫MySql,是存放在獨立的伺服器上嗎?購買後我們如何查看資料庫數據,是登錄遠程還是通
移動雲MySQL是基於物理機進行的容器化部署,通過容器提供的資料庫服務。目前實例規格族,包括通用型、獨享型和通用入門型。其中通用型和通用入門型是與同一物理機上其他通用版實例共享CPU⌄磁碟和I/O資源,獨享被分配的內存資源。獨享型是完全獨享被分配的CPU、內存、磁碟和I/O資源。購買成功的MySQL需要下載適配版本的MySQL客戶端程序進行遠程訪問。
了解移動云云資料庫MySql更多詳情,歡迎註冊登錄移動雲官網→
原創文章,作者:CKKO,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/149912.html