• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

Programmatischer Import von CSV-Daten in dockerisiertes MySQL

sia

gesperrt

Registriert
26 März 2015
Beiträge
5.931
Ort
FFM (NSFW)
Hallo Leute,

Ich habe mir unter Fedora 32 eine Ubuntu 20.04 VM mit Qemu/KVM aufgesetzt, in der Docker-Compose installiert ist und mit folgender docker-compose.yml betrieben wird:

Code:
version: "3.5"

services:
  mariadb:
    image: mariadb
    restart: unless-stopped
    environment:
      - 'MYSQL_ROOT_PASSWORD=columnstore-example'

  columnstore:
    image: mariadb/columnstore
    restart: unless-stopped
    environment:
      - 'MARIADB_ROOT_HOST=%'
      - 'MARIADB_ROOT_PASSWORD=columnstore-example'

  adminer:
    image: adminer
    restart: always
    ports:
    - 8080:8080

Also eine Instanz von regulärem MariaDB, eine Instanz mit dem Columnstore.

Nun habe ich Daten aus einer CSV-Datei mit mariadb-import importiert. Dazu musste ich zunächst eine Tabelle mit den entsprechenden Spaltenköpfen anlegen.

Das Ganze möchte ich jetzt automatisieren. Dazu würde ich gerne folgendes tun:

  • Download der Testdaten
  • Installation von Docker-Compose
  • Kopieren der docker-compose.yml
  • Aufsetzen der Datenbank
  • Import der Daten mit mysqlimport

Theoretisch könnte man die Installation, das Kopieren und das Aufsetzen der Datenbank auf einfache Art und Weise mit Ansible managen. Dazu gibt es auch einen MySQL-Importer (mysql_db) in Ansible. Nun ist die Frage, wie ich die Daten von den CSV-Dateien auf dem lokalen Host in die Ziel-DB bekomme – ist es sinnvoll, das als local playbook zu machen oder bin ich auf dem Holzweg und ich sollte lieber was anderes nutzen?

Wie würdet ihr das machen?
 
Zuletzt bearbeitet:

musv

Bekannter NGBler

Registriert
15 Juli 2013
Beiträge
3.453
Ort
/dev/null
Ich hab bisher nicht viel mit Docker gemacht. Grundsätzlich es sollte es aber so sein, dass man die Daten nicht im Container ablegt. D.h. der Container sollte austauschbar sein.

D.h. /var/lib/mysql von der VM in den Container reinlinken.

Nun ist die Frage, wie ich die Daten von den CSV-Dateien auf dem lokalen Host in die Ziel-DB bekomme
MySQL-Client auf der VM installieren. Über ein Portmapping (3306 intern, 33xx in der VM) das MySQL aus dem Docker nach außen ansprechbar machen.

Und die Konfiguration der Datenbank nimmst du nicht im Ansible-Playbook vor sondern im Dockerfile.
 

sia

gesperrt

Registriert
26 März 2015
Beiträge
5.931
Ort
FFM (NSFW)
  • Thread Starter Thread Starter
  • #3
D.h. /var/lib/mysql von der VM in den Container reinlinken.

Das steht ja dann aber im Konflikt mit den über den Paketmanager installierten Paketen ;) Wenn man das so macht, sollte es wohl eher sowas wie /var/local/lib/mysql oder /opt/docker/data/mysql sein.

MySQL-Client auf der VM installieren. Über ein Portmapping (3306 intern, 33xx in der VM) das MySQL aus dem Docker nach außen ansprechbar machen.
Hab's so ähnlich gemacht: In der docker-compose einfach die Ports komplett nach außen freigegeben – man muss ja dennoch die User so anlegen, dass man drauf zugreifen kann. Ist zwar nicht die sicherste Variante, aber seit MySQL 5.6 ist ja alles TLS-verschlüsselt, was Authentifizierung etc. angeht.

Und die Konfiguration der Datenbank nimmst du nicht im Ansible-Playbook vor sondern im Dockerfile.
Gute Idee – ich kann ja einfach die SQL-Daten in das Image kopieren! Das habe ich jetzt so gemacht:

Code:
ADD schema.sql /docker-entrypoint-initdb.d

Die Daten schiebe ich jetzt über LOAD DATA LOCAL INFILE direkt über MySQL, als ich gemerkt habe dass mysqlimport genau dasselbe macht, nur dümmer.
 

KingJamez

Aktiver NGBler

Registriert
18 Juli 2013
Beiträge
500
folgend ein teil meiner docker-compose.yml, bei mir ist es mysql, macht aber für die Einrichtung keinen unterschied.

Code:
  database:
    build:
      context: "./bin/${DATABASE}"
    container_name: 'database'
    restart: 'always'
    ports:
      - "127.0.0.1:${HOST_MACHINE_MYSQL_PORT}:3306"
    volumes: 
      - ${MYSQL_DATA_DIR-./data/mysql}:/var/lib/mysql
      - ${MYSQL_LOG_DIR-./logs/mysql}:/var/log/mysql
Wichtig hierbei sind die volumes, die müssen aus dem DockerContainer raus, und in deinen host-pfad, damit du jederzeit an die Daten kommst und nicht nach jedem Docker build alle Daten neu anlegen musst.

Du kannst dir zum importieren einfach ein script schreiben (php, python, whatever), mit dem du diese importierst. Der host wäre in meinem fall dann `database` in deinem fall `mariadb`. Es geht auch den mysql-client auf der host Maschine zu installieren und dann als host den container-host anzugeben.
 

sia

gesperrt

Registriert
26 März 2015
Beiträge
5.931
Ort
FFM (NSFW)
  • Thread Starter Thread Starter
  • #5
Wichtig hierbei sind die volumes, die müssen aus dem DockerContainer raus, und in deinen host-pfad, damit du jederzeit an die Daten kommst und nicht nach jedem Docker build alle Daten neu anlegen musst.
Man könnte auch named volumes nutzen… Die liegen auch auf dem Host ;)

Es geht auch den mysql-client auf der host Maschine zu installieren und dann als host den container-host anzugeben.
Danke :) genau so hab ich's gemacht.
 

musv

Bekannter NGBler

Registriert
15 Juli 2013
Beiträge
3.453
Ort
/dev/null
Das steht ja dann aber im Konflikt mit den über den Paketmanager installierten Paketen ;) Wenn man das so macht, sollte es wohl eher sowas wie /var/local/lib/mysql oder /opt/docker/data/mysql sein.
Da hast du natürlich Recht. Auf der VM kannst du die hinlegen, wohin du willst. D.h. die sollten sogar irgendwo in einem Datenverzeichnis liegen, was kein Systemverzeichnis ist. Genauso, wie KingJamez schon angemerkt hat, gilt das natürlich auch für Logverzeichnisse.

Wie ich schon oben erwähnt hab: Wenn du den Container löschst, sollten keinerlei Daten verloren sein, sonst hast du was falsch konfiguriert. Der Container ist nur eine temporäre Umgebung.

Und wegen der Portgeschichte:
Wenn du abweichende Ports verwendest, z.B. eine Portragen 3306-33xx, kannst du mehrere Dockerinstanzen parallel nutzen, was eigentlich auch der/ein Sinn von Docker ist, dass du die Instanzen startest, wenn und in welcher Anzahl du sie benötigst.
 

sia

gesperrt

Registriert
26 März 2015
Beiträge
5.931
Ort
FFM (NSFW)
  • Thread Starter Thread Starter
  • #7
Joah, das einzige Puzzlestück was mir noch fehlt wäre, wie ich die Daten in das System bekomme. Aber das ist dann halt ein weiterer manueller Schritt über ein Skript, was ich lokal mit Ansible ausführe.

Wenn du abweichende Ports verwendest, z.B. eine Portragen 3306-33xx, kannst du mehrere Dockerinstanzen parallel nutzen, was eigentlich auch der/ein Sinn von Docker ist, dass du die Instanzen startest, wenn und in welcher Anzahl du sie benötigst.

Na ja, nicht ganz – wenn ich das skalieren wollte, würde ich noch einen Loadbalancer (z.B. HAProxy+Galera) irgendwo hin setzen und gar nichts über die VM nach außen freigeben. Was ich im konkreten Fall machen will ist aber eine Appliance, die ohne große Konfiguration lauffähig sein soll. Dazu wird mit Ansible alles gemacht was ich oben beschrieben habe (VM aufgesetzt mit virt und dann die restlichen Schritte). Als komplettes Image (also eine ISO direkt in die VM geladen) ist es leider zu unflexibel.
 

musv

Bekannter NGBler

Registriert
15 Juli 2013
Beiträge
3.453
Ort
/dev/null
Na ja, nicht ganz – wenn ich das skalieren wollte, würde ich noch einen Loadbalancer (z.B. HAProxy+Galera) irgendwo hin setzen und gar nichts über die VM nach außen freigeben.
Galera klingt gar nicht übel. Ich kannte es bisher nur vom Namen nach. Wir benutzen bei uns eine reine MySQL-basierte Master-Master-Replication. Allerdings ist das ein grauenvolles Gebilde.

Allerdings ist Docker eigentlich genau für Skalierung gedacht. Natürlich kann man auch Docker auch dazu nutzen, Services ohne lokale Installation und damit ohne Installationsaufwand ins eigene System integrieren, dazu noch andere Distris. Aber diese Nutzung birgt bei uns auf Arbeit bisher immer die Gefahr (und leider auch Erfahrung), dass wir uns da Projekte im Alpha-Stadium reinholen, die nicht updatefähig sind. Dann wären wir wieder ganz schnell bei Kubernetes.

Zum Spielen und Lernen ok. Aber wenn du eh eine VM aufsetzt, wieso installierst du die Datenbank nicht gleich nativ auf der VM?
 

sia

gesperrt

Registriert
26 März 2015
Beiträge
5.931
Ort
FFM (NSFW)
  • Thread Starter Thread Starter
  • #9
Galera klingt gar nicht übel. Ich kannte es bisher nur vom Namen nach. Wir benutzen bei uns eine reine MySQL-basierte Master-Master-Replication. Allerdings ist das ein grauenvolles Gebilde.
Glaub' ja nicht, dass Galera kein grauenvolles Gebilde ist ;)

Zum Spielen und Lernen ok. Aber wenn du eh eine VM aufsetzt, wieso installierst du die Datenbank nicht gleich nativ auf der VM?
Wie gesagt, das wird 'ne Appliance, das Ding besteht nicht nur aus MySQL sondern einem ganzen Ökosystem an Containern. Klar könnte man die jetzt stattdessen in ein Repository gießen, aber dann müssten wir sämtliche Komponenten pflegen… Ist auch noch nicht 100% durchdacht sondern pre-pre-alpha-Status.
 
Oben