当前位置:首页 > 文章列表 > 数据库 > MySQL > Docker 小记 — MySQL 与 Redis 配置

Docker 小记 — MySQL 与 Redis 配置

来源:SegmentFault 2023-01-13 17:44:55 0浏览 收藏

本篇文章给大家分享《Docker 小记 — MySQL 与 Redis 配置》,覆盖了数据库的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。

1. 部署准备

一般部署这些 db_service 容器都应该配套其管理工具(我不否认可以通过命令行完成所有的操作,而且功能更多,权限更大,但是非 DBA 的童鞋还是乖乖使用 UI 吧,耍酷浪费太多时间也不值当?),因此,这里我选择的镜像组合是 mysql、adminer 与 redis、erikdubbelboer/phpredisadmin。

Ps:这节太短了,就插一些题外话吧。现在爽 Docker 的同时其实也在为过去的自己默哀,想当年初入编程的时候还没普及云服务器和各种打包好的云服务方案,当然也没有 Docker,想做点什么实验和测试都得在本机。本本性能不行还得一天到晚折腾各种安装环境,就拿 db_service 来说吧,当时选择的是 SQL Server,流行的版本是 05、08 和 08 r2 等,客户要求啥版本的都有。那开发的时候得在本地装呀,要命的是这家伙根本无法彻底卸载,版本之间还有兼容问题,啥错误都遇到过,解决不了最后的终极方案就是重装系统,然后呢... 还得再装呀... 这一下子就是半天到一天的时间。使用虚拟机吧,打开几个 IDE 再启动几个虚拟机,不要说那时候了,就是现在的主流机也扛不动呀,编程体验几乎为零。这里算是忆苦思甜了,想想那时候,现在简直太幸福了。

2. 配置

adminer 与 phpredisadmin 都可以在集群内访问需要代理的服务,如果是在服务器上也不用额外暴露 3306 和 6379 端口,以下是我的 docker-compose 配置:

MySQL

mysql:
  image: mysql
  networks:
    - proxy
    - youclk
  volumes:
    - /mnt/nas/db/mysql:/var/lib/mysql
  environment:
    MYSQL_ROOT_PASSWORD: db_password
  deploy:
    restart_policy:
      condition: any
      max_attempts: 3
    update_config:
      delay: 5s
      order: start-first
    resources:
      limits:
        cpus: '0.50'
        memory: 1g

mysql_admin:
  image: adminer
  networks:
    - proxy
    - youclk
  depends_on:
    - mysql
  deploy:
    labels:
      - com.df.notify=true
      - com.df.port=8080
      - com.df.serviceDomain=mysql.youclk.com
    restart_policy:
      condition: any
      max_attempts: 3
    update_config:
      delay: 5s
      order: start-first
    resources:
      limits:
        cpus: '0.50'
        memory: 1g

启动后 UI 展示如下:


Redis

redis:
  image: redis
  networks:
    - proxy
    - youclk
  deploy:
    restart_policy:
      condition: any
      max_attempts: 3
    update_config:
      delay: 5s
      order: start-first
    resources:
      limits:
        cpus: '0.50'
        memory: 1g

redis_admin:
  image: erikdubbelboer/phpredisadmin
  networks:
    - proxy
    - youclk
  environment:
    - REDIS_1_HOST=redis
    - REDIS_1_NAME=redis
  depends_on:
    - redis
  deploy:
    labels:
      - com.df.notify=true
      - com.df.port=80
      - com.df.serviceDomain=redis.youclk.com
    restart_policy:
      condition: any
      max_attempts: 3
    update_config:
      delay: 5s
      order: start-first
    resources:
      limits:
        cpus: '0.50'
        memory: 1g

启动后 UI 展示如下:

如果看过我之前的两篇博文或者对 Compose 有一定了解的话,以上参数一目了然,此处不做过多赘述。

但如果是部署在本地的话,各种 db_service 工具或者是集群外的其他服务也可能需要连接 db,所以得暴露其各自的端口,我倾向于再编写一个 docker-compose.local.yml ,用于放置本地配置,如下:

version: '3.5'
services:

  mysql:
    ports:
      - 3306:3306
    volumes:
      - /Users/Jermey/Documents/data/db/mysql:/var/lib/mysql
  mysql_admin:
    deploy:
      labels:
        - com.df.notify=true
        - com.df.port=8080
        - com.df.serviceDomain=local-mysql.youclk.com

  redis:
    ports:
      - 6379:6379
  redis_admin:
    deploy:
      labels:
        - com.df.notify=true
        - com.df.port=80
        - com.df.serviceDomain=local-redis.youclk.com

然后再编写一个启动脚本,根据当前的系统环境判断是否合并多个配置文件(我的写法比较粗暴,若有更优雅的方案欢迎留言交流):

if [ -z "`uname -a | grep 'Linux'`" ];then
    docker-compose -f ../src/docker-compose.yml \
        -f ../src/docker-compose.local.yml \
        config > docker-stack.yml
    docker stack deploy -c docker-stack.yml --with-registry-auth db
else
    docker stack deploy -c ../src/docker-compose.yml --with-registry-auth db
fi

3. MySQL 异常事故记录

开门见山先说结果吧,最后确认是导致异常的原因是使用 NFS 存储 MySQL 的数据。起初服务一直能非常稳定在我本地的集群中运行,但在测试服务器上却时不时突然挂掉且无法重启,开始的时候一头雾水,本地和测试环境的配置文件完全一致呀,而且都是 Docker Swarm 集群,不应该有任何系统因素相关的干扰。而且它不是启动过后立马会挂,而是运行一段时间之后,期间我发了疯地去排除一个个可能导致 MySQL 宕机的其他服务,而因 NFS 能够正常挂载却被我最先排除(期间的心塞程度有 BUG 经历的工友应当能理解)。

直到我在 MySQL 官网看到了这则申明:

Caution is advised when considering using NFS with MySQL. Potential issues, which vary by operating system and NFS version, include:

  • MySQL data and log files placed on NFS volumes becoming locked and unavailable for use. Locking issues may occur in cases where multiple instances of MySQL access the same data directory or where MySQL is shut down improperly, due to a power outage, for example. NFS version 4 addresses underlying locking issues with the introduction of advisory and lease-based locking. However, sharing a data directory among MySQL instances is not recommended.
  • Data inconsistencies introduced due to messages received out of order or lost network traffic. To avoid this issue, use TCP with hard and intr mount options.
  • Maximum file size limitations. NFS Version 2 clients can only access the lowest 2GB of a file (signed 32 bit offset). NFS Version 3 clients support larger files (up to 64 bit offsets). The maximum supported file size also depends on the local file system of the NFS server.

Using NFS within a professional SAN environment or other storage system tends to offer greater reliability than using NFS outside of such an environment. However, NFS within a SAN environment may be slower than directly attached or bus-attached non-rotational storage.

If you choose to use NFS, NFS Version 4 or later is recommended, as is testing your NFS setup thoroughly before deploying into a production environment.

官方文档非常直白地警告 NFS 有风险,使用需谨慎。这下总算松了一口气,终于知道问题源头了,反正是测试环境,随便指定 MySQL 挂载集群中一个节点的目录就行。但不死心的我又尝试了下先将 NFS 挂载到主机,然后由 MySQL 容器再去挂载已经挂载了 NFS 的主机目录,现在是已经正常运行好几天了没有再宕机。

Ps:可以将挂载的命令写入初始配置脚本,新服务器到手之后只需执行一行代码就可以愉快地玩耍了,有兴趣可以看我这篇随笔:“Ubuntu 自动化配置”

结语

编程的乐趣非程序员不能体会,一行行代码造就了这缤纷多彩的世界,而且其最大的魅力在于我们的产品复用几乎是无成本的。也正因如此,无论我现今生活质量如何,我都能始终怀揣带有一些梦幻色彩的理想,并为之奋斗。而程序员的悲哀也非他人能轻易理解,你可能认为你在处理一个伟大的问题,到头来,可能仅仅是一个符号在作祟。本篇随笔抒情的废话比较多,感谢阅读 :)


我的公众号《捷义》

qrcode_for_gh_c1a4cd5ae0fe_430.jpg

以上就是《Docker 小记 — MySQL 与 Redis 配置》的详细内容,更多关于mysql的资料请关注golang学习网公众号!

版本声明
本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
MySql高级(一)MySql高级(一)
上一篇
MySql高级(一)
聊一聊 MySQL 数据库中的那些锁
下一篇
聊一聊 MySQL 数据库中的那些锁
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • ChatExcel酷表:告别Excel难题,北大团队AI助手助您轻松处理数据
    ChatExcel酷表
    ChatExcel酷表是由北京大学团队打造的Excel聊天机器人,用自然语言操控表格,简化数据处理,告别繁琐操作,提升工作效率!适用于学生、上班族及政府人员。
    3167次使用
  • Any绘本:开源免费AI绘本创作工具深度解析
    Any绘本
    探索Any绘本(anypicturebook.com/zh),一款开源免费的AI绘本创作工具,基于Google Gemini与Flux AI模型,让您轻松创作个性化绘本。适用于家庭、教育、创作等多种场景,零门槛,高自由度,技术透明,本地可控。
    3380次使用
  • 可赞AI:AI驱动办公可视化智能工具,一键高效生成文档图表脑图
    可赞AI
    可赞AI,AI驱动的办公可视化智能工具,助您轻松实现文本与可视化元素高效转化。无论是智能文档生成、多格式文本解析,还是一键生成专业图表、脑图、知识卡片,可赞AI都能让信息处理更清晰高效。覆盖数据汇报、会议纪要、内容营销等全场景,大幅提升办公效率,降低专业门槛,是您提升工作效率的得力助手。
    3409次使用
  • 星月写作:AI网文创作神器,助力爆款小说速成
    星月写作
    星月写作是国内首款聚焦中文网络小说创作的AI辅助工具,解决网文作者从构思到变现的全流程痛点。AI扫榜、专属模板、全链路适配,助力新人快速上手,资深作者效率倍增。
    4513次使用
  • MagicLight.ai:叙事驱动AI动画视频创作平台 | 高效生成专业级故事动画
    MagicLight
    MagicLight.ai是全球首款叙事驱动型AI动画视频创作平台,专注于解决从故事想法到完整动画的全流程痛点。它通过自研AI模型,保障角色、风格、场景高度一致性,让零动画经验者也能高效产出专业级叙事内容。广泛适用于独立创作者、动画工作室、教育机构及企业营销,助您轻松实现创意落地与商业化。
    3789次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码