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

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

mkdir -p /nfs/data-volume 

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

 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(). 

没有更多的这个日志,它停在这一行。 我试图login到容器,并input命令

 mysqld -uroot -proot 

显示日志完全一样。

我觉得这是由nfs引起的。 但我GOOGLE了,发现几乎所有的材料build议使用nfs共享数据。 有没有人成功做这个工作? 或者对我有什么build议?

谢谢

Q1:有没有人成功做这个工作?

我的经验是… 。 几个月前,我尝试了NFS,MySQL和Docker Swarm(v1.12),而且我也做了失败。

从MySQL的文档中 ,他们非常清楚:

在MySQL中使用NFS

build议谨慎使用NFS与MySQL。 潜在问题因操作系统和NFS版本而异,其中包括:

  • 放在NFS卷上的MySQL数据和日志文件被locking,无法使用
  • 数据不一致…
  • 最大的文件大小限制

我也经历了文件locking ,查询缓慢和写入缓慢…

Q2:还是对我有什么build议?

docker-swarm棘手的部分就是数据,尤其是数据库。 你不知道女巫主机的MySQL容器将运行。 我已经使用了两种方法来解决这个问题:

1.群模式服务创build – --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] 

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

2. Docker卷

另一个select是在启动之前将共享docker volumedynamic地附加到MySQL服务。 该文件指出 :

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

有一些docker卷插件 ,可以让你做到这一点。 我个人在AWS环境中尝试了牧场主的车队 ,但是我还有其他有关删除音量,同步等的问题。

你也可以看看这个stream行的关于swarm和docker卷的SO线程 。

PS:关于NFS

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

希望我的经验会有帮助!