容器化部署mysql數據庫(容器部署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-hant/n/149912.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
CKKO的頭像CKKO
上一篇 2024-11-05 16:54
下一篇 2024-11-05 16:54

相關推薦

  • 如何修改mysql的端口號

    本文將介紹如何修改mysql的端口號,方便開發者根據實際需求配置對應端口號。 一、為什麼需要修改mysql端口號 默認情況下,mysql使用的端口號是3306。在某些情況下,我們需…

    編程 2025-04-29
  • Python 常用數據庫有哪些?

    在Python編程中,數據庫是不可或缺的一部分。隨着互聯網應用的不斷擴大,處理海量數據已成為一種趨勢。Python有許多成熟的數據庫管理系統,接下來我們將從多個方面介紹Python…

    編程 2025-04-29
  • openeuler安裝數據庫方案

    本文將介紹在openeuler操作系統中安裝數據庫的方案,並提供代碼示例。 一、安裝MariaDB 下面介紹如何在openeuler中安裝MariaDB。 1、更新軟件源 sudo…

    編程 2025-04-29
  • Python操作MySQL

    本文將從以下幾個方面對Python操作MySQL進行詳細闡述: 一、連接MySQL數據庫 在使用Python操作MySQL之前,我們需要先連接MySQL數據庫。在Python中,我…

    編程 2025-04-29
  • 解決docker-compose 容器時間和服務器時間不同步問題

    docker-compose是一種工具,能夠讓您使用YAML文件來定義和運行多個容器。然而,有時候容器的時間與服務器時間不同步,導致一些不必要的錯誤和麻煩。以下是解決方法的詳細介紹…

    編程 2025-04-29
  • 數據庫第三範式會有刪除插入異常

    如果沒有正確設計數據庫,第三範式可能導致刪除和插入異常。以下是詳細解釋: 一、什麼是第三範式和範式理論? 範式理論是關係數據庫中的一個規範化過程。第三範式是範式理論中的一種常見形式…

    編程 2025-04-29
  • MySQL遞歸函數的用法

    本文將從多個方面對MySQL遞歸函數的用法做詳細的闡述,包括函數的定義、使用方法、示例及注意事項。 一、遞歸函數的定義 遞歸函數是指在函數內部調用自身的函數。MySQL提供了CRE…

    編程 2025-04-29
  • leveldb和unqlite:兩個高性能的數據庫存儲引擎

    本文將介紹兩款高性能的數據庫存儲引擎:leveldb和unqlite,並從多個方面對它們進行詳細的闡述。 一、leveldb:輕量級的鍵值存儲引擎 1、leveldb概述: lev…

    編程 2025-04-28
  • Python怎麼導入數據庫

    Python是一種高級編程語言。它具有簡單、易讀的語法和廣泛的庫,讓它成為一個靈活和強大的工具。Python的數據庫連接類型可以多種多樣,其中包括MySQL、Oracle、Post…

    編程 2025-04-28
  • MySQL bigint與long的區別

    本文將從數據類型定義、存儲空間、數據範圍、計算效率、應用場景五個方面詳細闡述MySQL bigint與long的區別。 一、數據類型定義 bigint在MySQL中是一種有符號的整…

    編程 2025-04-28

發表回復

登錄後才能評論