MySQL容器无法将数据挂载到NFS文件夹上。

7

通过群集模式,容器可以部署在任何已加入的节点上。我在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引起的。但我搜索了一下,发现几乎所有的资料都建议使用nfs来共享数据。有没有人成功地做到了这一点?或者对我有什么建议?
谢谢

只是补充一些信息。你的 mysqld -uroot -proot 是不正确的。你应该执行 mysql(客户端)而不是 mysqld(服务器)。 - Robert
1个回答

7

问题1: 有人成功地使这项工作吗?

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

他们确实非常清楚,来自MySQL文档:

使用NFS与MySQL

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

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

我还遇到文件锁定, 查询缓慢和写入缓慢等问题...

问题2: 或者你有什么建议吗?

其中一个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卷
另一个选项是在启动之前动态附加共享的docker卷到MySQL服务。文档说明如下

如果你想让你的数据持久化,使用命名卷和一个支持多主机的卷驱动程序,以便从任何节点都可以访问该数据...

有一些docker卷插件可以实现这一点。我个人在AWS环境中尝试了rancher's convoy,但我还有其他关于卷删除、同步等的问题...
你还可以查看关于Swarm和Docker卷的热门SO主题
PS:关于NFS
我并不是说你应该放弃NFS来使用其他docker服务,我仍然将其用于只读配置文件(如Apache Tomcat和Nginx配置等...),但对于MySQL而言,这是不可行的。
希望我的经验能够帮到你!

1
谢谢你的回答!我一直在努力让它工作,但现在我会尝试其他方法。知道什么是不可能的也很好... - David Kirkland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接