2017-06-07 26 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來說,這是不行的。

希望我的經驗能幫到你!

相關問題