本文目录一览:
- 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更多详情,欢迎注册登录移动云官网→