首页 > 数据库 > 数据库开发技术 > 放弃这些安装方式,简单多了!

免费学习网站:https://itgogogo.cn
大家好,我是皇子。
同样是安装 MySQL,在官网关于 Linux 操作系统中给出的就有 8 种安装方式,分别有:
使用 MySQL Yum 存储库进行安装
使用 MySQL APT 存储库进行安装
使用 MySQL SLES 存储库进行安装
使用 Oracle 的 RPM 软件包进行安装
使用 Oracle 的 Debian 软件包进行安装
从本机软件存储库进行安装
使用 Docker 容器进行安装
使用 Juju 部署框架进行安装
安装方式看起来有多种,但是稍微分类就 4 种:存储库、软件包、Docker、Juju。
1)对于使用存储库进行安装的方式,都被官方标记为“全新安装 MySQL 的步骤”,包括:使用 MySQL Yum 存储库、使用 MySQL APT 存储库、使用 MySQL SLES 存储库 进行安装。
2)使用 Docker 容器安装,在官方文档中会展示“在使用 Docker 容器部署 MySQL 之前,请确保我们了解运行容器的安全风险并正确缓解它们。”
3)提供了除“Docker”一键式安装以外,更加方便的的部署方式,即使用 Juju 部署框架进行安装。
而本此想讨论的重点是,推荐一种 MySQL 的安装方式,先说下个人观点:特定场景,极致追求性能时,在裸机使用存储库和软件包安装MySQL;否则使用 Docker 方式进行安装。

理由如下:
1、使用存储库和软件包的安装方式,能给我们带来在裸机安装上的性能、安全以及稳定的优势。
其中最主要的是在性能上的优势会很明显,可以直接避免了容器化带来的额外开销。所以说在极致追求高性能时,还是建议使用这种传统的安装方式。
而现在越来越多的企业都在追求更低的成本、更好的敏捷性和自动化运维能力,这是传统的安装方式所不能带来的。
2、使用 Juju 部署框架进行安装,可能很多人没了解和使用过这种安装方式。首先 Juju 是 Canonical 公司开发的一款开源、端到端、生产就绪的数据平台,可以理解为服务建模和部署工具,再简单点就是:一个通用的 DevOps 工具。
而要使用 Juju 进行安装的 MySQL,实际上是一个 Juju 中的一个 charm(模型化的部署单元),即 Charmed MySQL。
这种安装方式的好处是:可以快速在多种环境(包括公有云、私有云或本地数据中心)中实现一键式安装,自动化处理数据库集群配置、高可用性设置以及安全加固等复杂任务。
还提供了一套完整的监控和日志管理系统,方便运维人员实时查看MySQL状态并进行问题排查。
但不推荐使用的原因是:1)学习成本高,因为需要学习如何有效地利用和管理 Charmed MySQL;2)使用Charmed MySQL意味着深度绑定到了Juju生态系统,如果组织内部没有采用Juju作为基础运维工具,则引入新的运维栈会增加复杂性。
3、重点来了,看一个Docker Hub 的数据

官方的 **MySQL 镜像拉取量为1B+**,意味着将近 1 个亿的个体和企业在使用,说明Docker 的安装方式是很受欢迎的,结合使用Kubernetes等容器编排系统,还可以更容易搭建出高性能、高可用、可扩展性的MySQL运行环境。
它能给我们带来企业在追求的很多东西,包括:
1)快速部署与环境一致性:通过一条简单的命令即可拉取镜像并启动容器,还可以保证不同环境下的Mysql配置和版本一致性,也有利于做版本回滚之类的操作。
Docker 的基础是 Linux 容器(LXC)等技术。在LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。
下面的图片比较了 Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。
2)资源隔离与提高服务器利用率:提供了一定程度上的资源隔离,允许在同一台主机上运行多个MySQL实例而不会互相干扰,提高硬件资源利用率。
3)可移植性与扩展性:Docker 容器易于迁移和复制,可以方便地在不同的云服务提供商之间移动MySQL服务;同时在Kubernetes等容器编排系统的支持下,可以根据负载需求动态调整MySQL实例的数量,实现水平扩展。
接下来我们看下 MySQL 官方给我们的警告是“要了解运行容器的安全风险”,而这个问题在我们的的最佳实践方案里面,可以多手段可以针对多个安全风险进行逐个击破的。
我们直接看安全风险牵扯到的有哪些问题,及我们的解决办法是什么?
1)数据持久化和安全性:风险是如果未正确配置数据卷挂载,容器停止或删除时可能导致数据库数据丢失。
解决办法:我们可以使用-v选项将宿主机目录映射到容器内部的MySQL数据目录(如 /var/lib/mysql),确保即使容器关闭或重启,数据也能持久化存储。
2)资源限制的问题:容器可能因内存、CPU等资源不足导致性能下降或服务中断。
解决办法:通过 --memory 和 --cpus 参数合理设置资源限制,并保持监控以确保资源充足。
同时我们需要注意的是:生产环境应尽量避免禁用OOM Killer,因为这可能导致整个系统的不稳定。而应该正确设置内存限制,使其适应应用需求,并留出足够的缓冲空间,以减少发生OOM的风险。
3)权限和隔离性:默认情况下,容器内进程可能以root用户运行,增加了攻击面。
解决办法:我们可以创建一个非root用户来运行MySQL服务器;或者在容器启动时指定适当的用户标识符(UID)和组标识符(GID)。
4)环境变量泄露:敏感信息(如密码)通过环境变量传递时可能被无意间暴露。
解决办法:这个问题我们应优先使用Docker Swarm Secrets和Kubernetes Secrets或来管理和保护敏感信息。
5)高可用性和故障恢复:单个容器实例可能无法提供足够的冗余和故障转移能力。
解决办法:通过 Docker 设计并实现多实例集群部署,还可以通过在Kubernetes中使用StatefulSet和持久卷声明(PVC)来保证MySQL的高可用性和数据一致性。
Docker 是一个用于开发、发布和运行应用程序的开放平台。
能够将应用程序与基础设施分离,以便可以快速交付软件。借助 Docker,我们可以像管理应用程序一样管理基础设施。
通过利用 Docker 的方法来传送、测试和部署代码,我们可以显着减少编写代码和在生产中运行代码之间的延迟。
Docker 提供了在称为容器的松散隔离环境中打包和运行应用程序的能力。隔离和安全性使我们可以在给定主机上同时运行多个容器。而容器是轻量级的,包含运行应用程序所需的一切。
因此我们不需要依赖主机上安装的内容。我们可以在工作时共享容器,并确保与我们共享的每个人都获得以相同方式工作的相同容器。
Docker 提供了工具和平台来管理容器的生命周期:
使用容器开发我们的应用程序及其支持组件。
容器成为分发和测试应用程序的单元。
准备就绪后,将应用程序作为容器或编排服务部署到生产环境中。无论我们的生产环境是本地数据中心、云提供商还是两者的混合,这都是一样的。
Docker 允许开发人员使用提供应用程序和服务的本地容器在标准化环境中工作,从而简化了开发生命周期。容器非常适合持续集成和持续交付 (CI/CD) 工作流程。
官网上的这句话,我觉得可以说明全部
Fast, consistent delivery of your applications
译:快速、一致地交付我们的应用程序
Docker使用客户端-服务器架构:Docker客户端与Docker守护进程对话,后者负责构建、运行和分发Docker容器。Docker客户端和守护进程可以在同一个系统上运行,或者我们可以将Docker客户端连接到远程Docker守护进程。
Docker客户端和守护进程通过UNIX套接字或网络接口使用REST API进行通信。
另一个Docker客户端是Docker Compose,它允许我们使用由一组容器组成的应用程序。

1)Docker 守护进程:Docker 守护进程 ( dockerd ) 侦听 Docker API 请求并管理 Docker 对象,例如映像、容器、网络和卷。守护进程还可以与其他守护进程通信来管理 Docker 服务。
2)Docker 客户端:Docker 客户端 ( docker ) 是许多 Docker 用户与 Docker 交互的主要方式。当我们使用 docker run 等命令时,客户端会将这些命令发送到 dockerd ,由后者执行这些命令。docker 命令使用 Docker API。Docker 客户端可以与多个守护进程通信。
3)Docker 桌面:Docker Desktop 是一款适用于 Mac、Windows 或 Linux 环境的易于安装的应用程序,使我们能够构建和共享容器化应用程序和微服务。Docker Desktop 包括 Docker 守护进程 ( dockerd )、Docker 客户端 ( docker )、Docker Compose、Docker Content Trust、Kubernetes 和 Credential Helper。有关更多信息,请参阅 Docker 桌面(https://docs.docker.com/desktop/)。
4)Docker 注册表:Docker 注册表存储 Docker 镜像。Docker Hub 是任何人都可以使用的公共注册表,Docker 默认在 Docker Hub 上查找镜像。我们甚至可以运行自己的私人注册表。
当我们使用 docker pull 或 docker run 命令时,Docker 会从我们配置的注册表中提取所需的映像。当我们使用 docker push 命令时,Docker 会将我们的映像推送到我们配置的注册表。
5)Docker 对象:当我们使用 Docker 时,我们正在创建和使用镜像、容器、网络、卷、插件和其他对象。
5.1 镜像:镜像是一个只读模板,包含创建 Docker 容器的说明。通常,一个图像基于另一个图像,并进行一些额外的自定义。例如,我们可以构建一个基于 ubuntu 映像的映像,但会安装 Apache Web 服务器和我们的应用程序,以及运行应用程序所需的配置详细信息。
我们可以创建自己的映像,也可以仅使用其他人创建并在注册表中发布的映像。要构建我们自己的映像,我们可以使用简单的语法创建一个 Dockerfile,用于定义创建映像并运行它所需的步骤。
Dockerfile 中的每条指令都会在映像中创建一个层。当我们更改 Dockerfile 并重建映像时,只会重建那些已更改的层。与其他虚拟化技术相比,这就是映像如此轻量、小型且快速的部分原因。
5.2 容器:容器是镜像的可运行实例。我们可以使用 Docker API 或 CLI 创建、启动、停止、移动或删除容器。我们可以将容器连接到一个或多个网络,为其附加存储,甚至可以根据其当前状态创建一个新映像。默认情况下,容器与其他容器及其主机相对较好地隔离。我们可以控制容器的网络、存储或其他底层子系统与其他容器或主机的隔离程度。容器由其映像以及我们在创建或启动它时提供给它的任何配置选项来定义。
当容器被删除时,任何未存储在持久存储中的状态更改都会消失。
Docker 使用 Go 编程语言编写,并利用 Linux 内核的多个特性来提供其功能。Docker 使用一种名为 namespaces 的技术来提供称为容器的隔离工作空间。
当我们运行容器时,Docker 会为该容器创建一组命名空间。这些命名空间提供了一层隔离。容器的每个方面都在单独的命名空间中运行,并且其访问仅限于该命名空间。
同时考虑了数据持久化、安全性和资源限制等要素
# 拉取MySQL 8.0官方镜像
docker pull mysql:8.0
# 创建用于存储MySQL数据的本地目录(如果不存在)
mkdir -p /path/to/mysql/data
# 运行MySQL容器
docker run --name=mysql-server \
--restart unless-stopped \
-e MYSQL_ROOT_PASSWORD=yourStrongPasswordHere \
-e MYSQL_DATABASE=mydatabase \
-e MYSQL_USER=myuser \
-e MYSQL_PASSWORD=mypassword \
-v /path/to/mysql/data:/var/lib/mysql \
--memory=512m --memory-reservation=256m \
--oom-score-adj=-999 \
-p 3306:3306 \
-d mysql:8.0
# 解释:
# --restart unless-stopped:确保在宿主机重启时容器也会自动启动。
# -e 环境变量:设置MySQL的root用户密码、默认数据库名、新用户和该用户的密码。
# -v 数据卷挂载:将本地路径映射到容器内部的MySQL数据目录以实现数据持久化。
# --memory 和 --memory-reservation:分别指定内存硬限制和软限制,防止容器消耗过多内存导致系统不稳定。
# --oom-score-adj:调整容器在内存不足时被OOM Killer优先级(这里设置为较低值,意味着容器在其他进程之前不会被杀掉)。
# -p 端口映射:将容器内3306端口暴露给宿主机。
# -d 后台运行:启动容器并在后台运行MySQL服务。
---
自行替换 yourStrongPasswordHere、mydatabase、myuser 和 mypassword 以及 /path/to/mysql/data
通过Dockerfile定制一个支持SSL加密连接的MySQL 8.0镜像,并通过docker-compose.yml文件来管理这个服务
添加:使用 SSL 加密连接部分
# 使用官方MySQL 8.0镜像作为基础
FROM mysql:8.0
# 设置环境变量(例如,设置root密码和创建数据库)
ENV MYSQL_ROOT_PASSWORD=your_password \
MYSQL_DATABASE=my_database \
MYSQL_USER=my_user \
MYSQL_PASSWORD=my_password
# 将宿主机上的SSL证书目录复制到容器内部的适当位置
COPY /path/to/ssl-certs /etc/mysql/certs
# 修改配置文件以启用SSL
RUN echo '[mysqld]\n\
ssl-ca=/etc/mysql/certs/ca.crt\n\
ssl-cert=/etc/mysql/certs/server.crt\n\
ssl-key=/etc/mysql/certs/server.key\n\
require_secure_transport=true' >> /etc/mysql/my.cnf
# 容器启动时运行mysql服务
CMD ["mysqld"]
# 注意事项
# 1、在上述Dockerfile中,请将 /path/to/ssl-certs 替换为实际存放SSL证书的宿主机路径。
# 2、确保SSL证书和私钥文件已经在该路径下,并且文件名为 ca.crt、server.crt 和 server.key。
使用以下命令构建自定义镜像:
docker build -t my-mysql-ssl:latest .
version: '3.8'
services:
mysql_ssl:
image: my-mysql-ssl:latest # 使用刚才通过Dockerfile构建的自定义镜像
container_name: mysql_ssl_container
ports:
- "3306:3306"
volumes:
- /path/to/ssl-certs:/etc/mysql/certs # 同样映射SSL证书目录
environment:
- MYSQL_ROOT_PASSWORD=your_password
- MYSQL_DATABASE=my_database
- MYSQL_USER=my_user
- MYSQL_PASSWORD=my_password
networks:
- backend
networks:
backend:
# 注意事项
# 1、确保替换 /path/to/ssl-certs 为实际SSL证书在宿主机上的路径。
# 2、使用 docker-compose up -d 命令启动服务
更多 Docker 实战,可以在:https://itgogogo.cn 中查看
1、我们介绍了主流的 Linux 操作系统中, MySQL 的 8 种安装方式,4 种分类,发现了 3 件有意思的事情。
2、给出了个人关于选择 MySQL 安装方式的观点:特定场景,极致追求性能时,在裸机使用存储库和软件包安装MySQL;否则使用 Docker 方式进行安装,并提供了一些论据。
3、重温Docker,并附一份完整的,生产环境可用的 Docker 安装 MySQL 8.0 的示例。
推荐阅读
有启发,点个在看或赞再走呀~这是将是我持续创作的动力
原文作者:皇子谈技术;如有侵权,请联系管理员删除。