2017-06-07 251 views
4

通过swarm模式,容器可以部署在任何连接的节点中。我在host1上创建了一个共享的nfs文件夹作为mysql数据文件夹。Mysql容器无法将数据挂载到nfs文件夹

mkdir -p /nfs/data-volume 

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

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

结果是: 如果主机1 mysql的容器运行,工作非常好。 如果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来共享数据。有没有人成功完成这项工作?或者对我有什么建议?

感谢

+0

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

回答

1

Q1:是否有任何人谁成功地完成这项工作?

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

,与他们的确很清楚,从MySQL documentation

使用NFS与MySQL使用NFS与MySQL时考虑建议

注意。潜在的问题,它通过操作系统和NFS版本有所不同,包括:

  • MySQL的数据和日志放在NFS卷变得锁定,无​​法使用文件...
  • 数据不一致...
  • 最大文件大小限制

我也经历file locks,查询速度慢,慢写...

问题二:或者对我有什么建议?

docker-swarm其中一个棘手的部分确实与数据,尤其是与数据库。你不知道女巫主机的MySQL容器将运行。我用两个备选方案,以便解决这个问题:

1群模式创建服务--constraint选项

此选项将指示泊坞窗在同一台主机上始终部署你的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重新启动,这将始终在host1节点上。

2.泊坞窗卷

另一种选择是dynamically attach a shared docker volume到MySQL服务启动之前。 The documentation states

如果你希望自己的数据仍然存在,使用一个名为量,这是多主机知道,这样的数据是从任何节点访问的卷驱动程序...

有是一些docker volume plugins,允许你这样做。我个人在AWS环境中尝试,但是我还有其他的卷删除,同步等问题...

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

PS:关于NFS

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

希望我的经验能帮到你!

相关问题