Mysql容器无法将数据装载到nfs文件夹

Sei*_*iya 6 docker docker-compose docker-swarm

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

mkdir -p /nfs/data-volume
Run Code Online (Sandbox Code Playgroud)

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

mysqldb-read:
    image: demo/db-slave
    ports:
     - "3308:3306"
    volumes:
     - /nfs/data-volume:/var/lib/mysql
Run Code Online (Sandbox Code Playgroud)

结果是:如果mysql容器在host1上运行,效果非常好.如果mysql容器在host2上运行,则它不会启动.但是容器没有退出,线程停留在那里看起来像是在等待.通过运行check log命令:

docker logs -f mymysql
Run Code Online (Sandbox Code Playgroud)

它显示如下日志:

   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().
Run Code Online (Sandbox Code Playgroud)

此日志上没有更多内容,它会在此行停止.我试着登录容器,然后输入命令

mysqld -uroot -proot
Run Code Online (Sandbox Code Playgroud)

显示日志完全相同.

我觉得这是由nfs引起的.但我用Google搜索并发现几乎所有材料都建议使用nfs来共享数据.是否有人成功完成这项工作?或者对我有什么建议?

谢谢

Fra*_*rel 5

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

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

他们确实很清楚,来自MySQL 文档

在 MySQL 中使用 NFS

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

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

我也经历过文件锁,慢查询和慢写......

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]
Run Code Online (Sandbox Code Playgroud)

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

2. Docker 卷

另一种选择是在启动前动态附加一个共享docker volume到 MySQL 服务。该文件指出

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

有一些docker volume 插件可以让你做到这一点。我个人在 AWS 环境中尝试过Rancher's convoy,但我也遇到了卷删除、同步等其他问题......

您还可以查看这个关于 swarm 和 docker 卷的流行 SO 线程

PS:关于NFS

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

希望我的经验能帮到你!