【问题标题】:Mysql container can not mount data to a nfs folderMysql容器无法将数据挂载到nfs文件夹
【发布时间】:2017-06-07 02:55:24
【问题描述】:

通过 swarm 模式,容器可以部署在任何加入的节点中。我在host1 上创建了一个共享nfs 文件夹作为mysql 数据文件夹。

mkdir -p /nfs/data-volume

在另一个 host2 中,它挂载到这个共享文件夹。并添加了必要的许可。我通过在其中读取和写入一些文本文件来尝试此 nfs 共享文件夹。它工作得很好。 (没有权限错误) 在这些 nfs 配置之后,我像这样定义了我的容器卷;

mysqldb-read:
    image: demo/db-slave
    ports:
     - "3308:3306"
    volumes:
     - /nfs/data-volume:/var/lib/mysql

结果是: 如果 mysql 容器在 host1 上运行,效果很好。 如果 mysql 容器在 host2 上运行,它不会启动。但是容器没有退出,线程留在那里,看起来像是在等待什么。 通过运行检查日志命令:

docker logs -f mymysql

它显示这样的日志:

   2017-06-07T02:40:13.627195Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2017-06-07T02:40:13.632313Z 0 [Note] mysqld (mysqld 5.7.18-log) starting as process 52 ...
2017-06-07T02:40:13.648010Z 0 [Note] InnoDB: PUNCH HOLE support available
2017-06-07T02:40:13.648054Z 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2017-06-07T02:40:13.648059Z 0 [Note] InnoDB: Uses event mutexes
2017-06-07T02:40:13.648062Z 0 [Note] InnoDB: GCC builtin __atomic_thread_fence() is used for memory barrier
2017-06-07T02:40:13.648066Z 0 [Note] InnoDB: Compressed tables use zlib 1.2.3
2017-06-07T02:40:13.648069Z 0 [Note] InnoDB: Using Linux native AIO
2017-06-07T02:40:13.648326Z 0 [Note] InnoDB: Number of pools: 1
2017-06-07T02:40:13.648770Z 0 [Note] InnoDB: Using CPU crc32 instructions
2017-06-07T02:40:13.651011Z 0 [Note] InnoDB: Initializing buffer pool, total size = 128M, instances = 1, chunk size = 128M
2017-06-07T02:40:13.760444Z 0 [Note] InnoDB: Completed initialization of buffer pool
2017-06-07T02:40:13.829981Z 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority().

此日志上没有更多内容,它停在这一行。 我尝试登录到容器,然后输入命令

mysqld -uroot -proot

显示日志完全相同。

我觉得这是由 nfs 引起的。但是我google了一下,发现几乎所有的材料都建议使用nfs来共享数据。有没有人成功完成这项工作?或者对我有什么建议?

谢谢

【问题讨论】:

  • 只是添加一些信息。您的 mysqld -uroot -proot 不正确。你应该执行mysql(客户端)而不是mysqld(服务器)

标签: docker docker-compose docker-swarm


【解决方案1】:

Q1:有没有人成功完成这项工作?

我的经验是……没有。几个月前我尝试了 NFS、MySQL 和 Docker Swarm (v1.12),但我也确实失败了。

他们确实很清楚,来自MySQL documentation

在 MySQL 中使用 NFS

建议在考虑将 NFS 与 MySQL 一起使用时要小心。潜在问题因操作系统和 NFS 版本而异,包括:

  • 放置在 NFS 卷上的 MySQL 数据和日志文件被锁定且无法使用...
  • 数据不一致...
  • 最大文件大小限制

我也经历过file locks,查询慢,写入慢……

Q2:或者对我有什么建议?

docker-swarm 的一个棘手部分确实是数据,尤其是数据库。您不知道在女巫主机上将运行 mysql 容器。我已经使用了两种替代方法,所以克服了这个问题:

1. Swarm 模式服务创建--constraint 选项

此选项将指示 docker 始终将您的 MySQL 容器部署在同一主机上,例如:

mysqldb-read:
  image: demo/db-slave
  ports:
    - "3308:3306"
  volumes:
    - /nfs/data-volume:/var/lib/mysql
  deploy:
    placement:
      constraints: [node.hostname == host1]

如果 docker swarm 服务 mysqldb-read 重新启动,这将始终在 host1 节点上。

2。 Docker 卷

另一个选项是在启动之前将dynamically attach a shared docker volume 发送到 MySQL 服务。 The documentation states:

如果您希望数据持久化,请使用命名卷和可识别多主机的卷驱动程序,以便可以从任何节点访问数据...

有一些docker volume plugins 允许您这样做。我个人在 AWS 环境中尝试过rancher's convoy,但我也有其他关于卷删除、同步等问题......

你也可以看看this popular SO thread about swarm and docker volumes

PS:关于 NFS

我并不是说你应该为其他 docker 服务放弃 NFS,我仍然将它用于read-only 配置文件(Apache Tomcat 和 Nginx 配置等),但对于 MySQL,这是不行的。

希望我的经验会有所帮助!

【讨论】:

  • 感谢您的回答!我正在拔头发试图让它发挥作用,但我现在会尝试其他方法。很高兴知道什么时候是不可能的......
猜你喜欢
  • 1970-01-01
  • 2014-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-20
  • 2016-09-18
相关资源
最近更新 更多