2017-06-07 1 views
4

Im Schwarmmodus können Container in allen verbundenen Knoten bereitgestellt werden. Ich habe einen freigegebenen nfs-Ordner als mysql-Datenordner auf host1 erstellt.Mysql-Container kann keine Daten in einen NFS-Ordner laden

mkdir -p /nfs/data-volume 

In einem anderen Host2 wird es in diesem freigegebenen Ordner bereitgestellt. Und fügte notwendige Erlaubnis hinzu. Ich probierte diesen NFS Freigabeordner, indem ich eine Textdatei darin las und schrieb. Es hat sehr gut funktioniert. (Es gab keinen Berechtigungsfehler) Nach diesen NFS-Konfiguration habe ich mein Container-Volume wie folgt definiert;

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

Das Ergebnis ist: Wenn mysql Container laufen auf host1, sehr gut funktioniert. Wenn der mysql-Container auf host2 ausgeführt wird, wird er nicht gestartet. Aber der Container verlässt nicht, der Thread bleibt dort und sieht aus wie etwas warten. Mit Prüfprotokoll Befehl ausführen:

docker logs -f mymysql 

Es zeigt Protokolle wie folgt aus:

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

Nichts mehr zu diesem Protokoll, es auf dieser Linie hält. Ich habe versucht, in den Behälter um sich einzuloggen und Eingabebefehl

mysqld -uroot -proot 

Das Zeigen Protokoll ist völlig gleich.

Ich fühle, dass dies von NFS verursacht wird. Aber ich habe gegoogelt und fast alle Materialien gefunden, die vorgeschlagen wurden, nfs zu benutzen, um Daten zu teilen. Gibt es jemanden, der diese Arbeit erfolgreich macht? Oder irgendeinen Vorschlag an mich?

Dank

+0

Nur um ein paar Infos hinzuzufügen. Dein 'mysqld -uroot -proot' ist falsch. Sie sollten mysql (den Client) anstelle von mysqld (dem Server) ausführen – Robert

Antwort

1

Q1: Gibt es jemanden, der erfolgreich diese Arbeit machen?

Meine Erfahrung ist ... Nein. Ich habe vor ein paar Monaten NFS, MySQL und Docker Swarm (v1.12) ausprobiert und das habe ich auch nicht geschafft.

Sie sind ziemlich mit, dass in der Tat klar, von MySQL documentation:

Mit NFS mit MySQL

Vorsicht ist geboten bei der Verwendung von NFS mit MySQL unter Berücksichtigung. Potenzielle Probleme, die durch Betriebssystem und NFS Version variieren, beinhalten:

  • MySQL-Daten und melden Sie sich platzierte Dateien auf NFS-Volumes für die Verwendung gesperrt und nicht verfügbar immer ...
  • Dateninkonsistenzen ...
  • Maximum Dateigrößenbeschränkungen

ich erlebte auch file locks, langsame Abfragen und langsam schreibt ...

Q2: Oder irgendein Vorschlag zu mir?

Einer der docker-swarm kniffligen Teil ist in der Tat mit den Daten, insbesondere mit Datenbanken. Sie wissen nicht, auf welchem ​​Host der mysql Container ausgeführt wird. Ich habe zwei Alternativen verwendet, um dies zu überwinden:

1. Swarm-Modus Service-Erstellung --constraint Option

Diese Option wird Docker anweisen, Ihre MySQL Container immer auf dem gleichen Host zu implementieren, zum Beispiel:

mysqldb-read: 
    image: demo/db-slave 
    ports: 
    - "3308:3306" 
    volumes: 
    - /nfs/data-volume:/var/lib/mysql 
    deploy: 
    placement: 
     constraints: [node.hostname == host1] 

Wenn docker swarm service mysqldb-read neu gestartet wird, wird dies immer auf host1 Knoten sein.

2. Bände Docker

Eine weitere Möglichkeit ist dynamically attach a shared docker volume auf den MySQL-Dienst vor der Inbetriebnahme. The documentation states:

Wenn Sie Ihre Daten wollen ein benannten Volumen bestehen bleiben, verwenden und einen Volumen-Treiber, die Multi-Host bekannt ist, so dass die Daten von einem beliebigen Knoten zugänglich sind ...

Es sind einige docker volume plugins, die Ihnen erlauben, das zu tun. Ich persönlich probierte in einer AWS-Umgebung, aber ich habe auch andere Probleme mit dem Löschen, Synchronisieren, usw. ...

Sie können auch einen Blick auf this popular SO thread about swarm and docker volumes werfen.

PS: Über NFS

Ich sage nicht, dass Sie NFS für andere Docker Dienste aufgeben sollte, ich kann es immer noch für read-only Konfiguration verwenden, um Dateien (Apache Tomcat und Nginx Konfiguration, etc ...) , aber für MySQL ist es ein Nein.

Hoffe meine Erfahrung wird helfen!