Detaillierte Erläuterung der Konfigurationsmethode der Lese-/Schreibtrennung bei der MySQL-Master-Slave-Replikation

Detaillierte Erläuterung der Konfigurationsmethode der Lese-/Schreibtrennung bei der MySQL-Master-Slave-Replikation

1. Beschreibung

Früher haben wir über die Installation und Konfiguration von MySQL, die Verwendung von MySQL-Anweisungen und die Sicherung und Wiederherstellung von MySQL-Daten gesprochen. Dieses Mal stellen wir die Master-Slave-Replikation, die Lese-/Schreibtrennung und MHA mit hoher Verfügbarkeit von MySQL vor.

Die Umgebung ist wie folgt:

Master:CentOS7_x64 mysql5.721 172.16.3.175 db1
slave1:CentOS7_x64 mysql5.7.21 172.16.3.235 db2
slave2:CentOS7_x64 mysql5.7.21 172.16.3.235 db3
ProxySQL/MHA:CentOS7_x64 mysql5.7.21 172.16.3.235 ProxySQL

Architekturdiagramm:

veranschaulichen:

Bei der Konfiguration des Tests wurden der Firewall-Header und die Selinux-Sicherheitsrichtlinie aus Komfortgründen deaktiviert.
Öffnen Sie in Wirklichkeit die Firewall-Richtlinie. Es gibt bereits ein Skript zum Installieren und Konfigurieren von myslqdb mit einem Klick. Ich werde die Konfiguration hier nicht wiederholen. Ich werde nur die entsprechende Konfiguration für die entsprechende Rolle veröffentlichen oder die zugehörige Software installieren.

2. Master-Slave-Replikationskonfiguration

Eine Masterdatenbank, N Slave-Knoten; auf dem Slave-Knoten werden zwei Threads gestartet, und Binlog-Protokolle werden über den Slave_IO_Running-Thread und das Konto mit Berechtigungen auf dem Master-Knoten vom Masterdatenbankknoten auf den lokalen Knoten kopiert, und Binlog-Protokolle können lokal über den Slave_SQL_Running-Thread ausgeführt werden, um eine Inhaltssynchronisierung des Master-Slave-Knotens zu erreichen;

Masterkonfiguration:

egrep -v '(^$|^#)' /usr/local/mysql/etc/my.cnf

[mysqld]
datadir=/data1/mysqldb
socket=/tmp/mysql.sock
Schlüsselpuffergröße = 16 M
max_allowed_packet = 16M
Thread-Stapel = 192 KB
Thread-Cache-Größe = 8
query_cache_limit = 1M
Abfrage-Cachegröße = 64 M
query_cache_type = 1
symbolische Links = 0
innodb_file_per_table=EIN
skip_name_resolve=EIN

Server-ID = 1
log_bin = /data1/mysqldb/mysql-bin.log
[mysqld_safe]
log-error=/usr/local/mysql/logs/error.log
pid-Datei=/data1/mysqldb/mysql.pid
!includedir /usr/local/mysql/etc/my.cnf.d

Erstellen Sie ein Synchronisierungskonto für den Slave-Knoten:

mysql > gewähre Replikationsclient, Replikations-Slave auf *.* an 'repluser'@'172.16.3.%', identifiziert durch 'replpass';
mysql > Berechtigungen leeren;
mysql > Master-Protokolle anzeigen;
+------------------+------------+
| Protokollname | Dateigröße |
+------------------+------------+
|mysql-bin.000001 | 622 |

主節點上的binlog日志文件及位置;請記下;從節點第一次同步時需要用;

Slave-Knoten:

egrep -v '(^$|^#)' /usr/local/mysql/etc/my.cnf

[mysqld]
datadir=/data1/mysqldb
socket=/data1/mysqldb/mysql.sock
Schlüsselpuffergröße = 16 M
max_allowed_packet = 16M
Thread-Stapel = 192 KB
Thread-Cache-Größe = 8
query_cache_limit = 1M
Abfrage-Cachegröße = 64 M
query_cache_type = 1
symbolische Links = 0

innodb_file_per_table=EIN
skip_name_resolve=EIN

server-id = 11 #Slave-Knoten-ID. Jeder Slave-Knoten hat ein anderes relay_log = relay-log
schreibgeschützt = EIN

[mysqld_safe]
log-error=/usr/local/mysql/log/error.log
pid-Datei=/var/run/mysql/mysql.pid
!includedir /usr/local/mysql/etc/my.cnf.d

Starten Sie die MySQL-Datenbank

Hinweis: Die Server-ID-Werte der beiden Slave-Knoten sind unterschiedlich; alles andere ist gleich; daher wird auf dem Slave-Knoten nur eine Konfigurationsdatei angezeigt;
Melden Sie sich bei der Datenbank an und synchronisieren Sie die Daten, um den Slave zu starten

Beide Slaves müssen synchronisiert und gestartet sein

mysql > ÄNDERN SIE MASTER IN MASTER_HOST="172.16.3.175",MASTER_USER="repluser",MASTER_PASSWORD="replpass",MASTER_PORT=3306,MASTER_LOG_FILE="mysql-bin.000001",MASTER_LOG_POS=622;
mysql > start slave; #Slave-Knoten starten ()

#Den Status des Slave-Knotens anzeigenmysql > SHOW SLAVE STATUS;
*************************** 1. Reihe ***************************
    Slave_IO_State: Wartet darauf, dass der Master ein Ereignis sendet
     Master_Host: 172.16.3.175 #MasterknotenMaster_Benutzer: repluser #SynchronisierungskontoMaster_Port: 3306
    Verbindungswiederholung: 60
    Master_Log_File:mysql-bin.000001
   Read_Master_Log_Pos: 622
    Relay-Log-Datei: relay-log.000001
    Relay_Log_Pos: 582
  Relay_Master_Log_File: mysql-bin.000001
    Slave_IO_Running: Ja #Synchronisierungsthread ist normal Slave_SQL_Running: Ja #Lokaler Schreibthread ist normal Replicate_Do_DB: #Synchronisierungsfilter ist leer (Sie können nur eine oder einige Bibliotheken synchronisieren)
   Replicate_Ignore_DB: #Nicht synchronisierte Datenbank Replicate_Do_Table:      
  Tabelle_Ignorieren_replizieren: 
  Wild_Do_Tabelle replizieren: 
 Tabelle_Wild_Ignore_replizieren: 
     Last_Errno: 0 #Der letzte Synchronisationsfehler 0 zeigt eine normale Synchronisation an Last_Error: 
     Skip_Counter: 0
   Exec_Master_Log_Pos: 622
    Relay_Log_Space: 615
    Until_Condition: Keine
    Bis_Log_Datei: 
    Bis_Log_Pos: 0
   Master_SSL_Allowed: Nein
   Master_SSL_CA_Datei: 
   Master_SSL_CA_Pfad: 
    Master_SSL_Zertifikat: 
   Master_SSL_Chiffre: 
    Master_SSL_Schlüssel: 
  Sekunden_Hinter_Master: 0
Master_SSL_Verify_Server_Cert: Nein
    Last_IO_Errno: 0
    Letzter_E/A-Fehler: 
    Last_SQL_Errno: 0
    Letzter_SQL_Fehler: 
 Server-IDs replizieren_ignorieren: 
    Master_Server_Id: 1
     Master_UUID: 57017c43-36e3-11e8-ac76-080027393fc7
    Master_Info_Datei: /data1/mysqldb/master.info
     SQL_Delay: 0
   SQL_Remaining_Delay: NULL
  Slave_SQL_Running_State: Slave hat alle Relay-Logs gelesen; wartet auf weitere Updates
   Master_Retry_Count: 86400
     Master_Bind: 
  Zeitstempel des letzten IO-Fehlers: 
  Letzter_SQL_Fehler_Zeitstempel: 
    Master_SSL_Crl: 
   Master_SSL_Crlpfad: 
   Abgerufenes_Gtid_Set: 
   Ausgeführtes_Gtid_Set: 
    Auto_Position: 0
   DB replizieren_neu schreiben: 
     Kanalname: 
   Master_TLS_Version: 
1 Zeile im Satz (0,00 Sek.)
FEHLER: 
Keine Abfrage angegeben

Testen der Master-Slave-Synchronisation

Testdaten auf dem Master einspielen, Daten modifizieren und prüfen, ob die Daten im Slave konsistent sind;

[root@db1 ~]# mysql < Testdb.sql
Melden Sie sich bei der Datenbank an [root@db1 ~]# mysql -uroot -p
mysql> Datenbanken anzeigen;
+--------------------+
| Datenbank |
+--------------------+
 Studie |
+--------------------+
5 Zeilen im Satz (0,00 Sek.)
###Study-Testdatenbank erfolgreich importiertmysql> Study verwenden;
Datenbank geändert
mysql> Tabellen anzeigen;
+-----------------+
| Tabellen_im_Arbeitszimmer |
+-----------------+
| Klasse |
| Kurs |
| Teil |
| Punktzahl |
| Studentin |
|tb31|
|tb32|
| Lehrer |
| Prüfung1 |
| Prüfung 2 |
| Benutzerinfo |
+-----------------+
11 Zeilen im Satz (0,00 Sek.)
#Löschen Sie die Tabellen test1 und test2

Slave-Ansicht vom Knoten

mysql> Tabellen anzeigen;
+-----------------+
| Tabellen_im_Arbeitszimmer |
+-----------------+
| Klasse |
| Kurs |
| Teil |
| Punktzahl |
| Studentin |
|tb31|
|tb32|
| Lehrer |
| Benutzerinfo |
+-----------------+
9 Zeilen im Satz (0,00 Sek.)

Die Daten können normal synchronisiert werden. Beachten Sie, dass die Master-Slave-Synchronisierung nur beim ersten Mal manuell gestartet werden muss. Danach wird sie automatisch mit dem MySQL-Dienst gestartet. Die Master-Slave-Synchronisierungsarchitektur erleichtert nur die Datensynchronisierung. Wenn kein Drittanbietertool beteiligt ist, müssen Sie dies im Programm tun, um eine Lese-/Schreibtrennung zu erreichen, was unvermeidlich ist. Wenn ein Fehler auftritt, müssen Sie die Daten manuell synchronisieren. Hier wird ProxySQL verwendet, um eine Lese-/Schreibtrennung durchzuführen.

3. ProxySQL-Lese-/Schreibtrennung

Die Konfiguration der Master-Slave-Replikation wurde oben abgeschlossen. Dies ist jedoch nur eine Grundkonfiguration, zu der ein ProxySQL hinzukommt, um eine Trennung von MySQL-Lese- und Schreibvorgängen zu erreichen. ProxySQL ähnelt der siebenschichtigen Proxy-Routing-Funktion von Haproxy und unterstützt den Datenbankproxy des MySQL-Protokolls. Es wurde von DBAs für DBAs entwickelt. Benutzeranforderungen werden an ProxySQL gesendet. Wenn es sich um eine Schreibanforderung handelt, wird sie an den Masterknoten gesendet. Leseanforderungen werden an die Slave-Knotengruppe gesendet. Auf diese Weise wird eine Trennung von Lese- und Schreibvorgängen erreicht. Bis zu einem gewissen Grad wird der IO-Druck der Masterdatenbank reduziert.
Laden Sie ProxySQL herunter und installieren Sie es
Die neueste Version ist 1.4.7-1 (aufgrund von Problemen mit der neuesten Version)
Hier laden wir das auf CentOS7 basierende RPM-Paket unter Verwendung von 1.3.6-1 herunter; laden Sie es lokal herunter und installieren Sie es mit yum

[root@proxysql ~]# yum installiere proxysql-1.3.6-1-centos7.x86_64.rpm -y
[root@proxysql ~]# rpm -ql proxysql
/etc/init.d/proxysql
/etc/proxysql.cnf #Hauptkonfigurationsdatei /usr/bin/proxysql
/usr/share/proxysql/tools/proxysql_galera_checker.sh
/usr/share/proxysql/tools/proxysql_galera_writer.pl

Die Konfiguration ist wie folgt:

Bevor Sie ProxySQL konfigurieren, müssen Sie auf dem Masterknoten ein autorisiertes Konto konfigurieren, damit ProxySQL auf dem Master- und Slaveknoten ausgeführt werden kann. Darüber hinaus muss das MySQL-Clienttool auf ProxySQL mit dem auf dem Master- und Slaveknoten übereinstimmen.
Autorisieren Sie das Anmeldekonto auf dem Masterknoten:

 mysql > GRANT ALL ON *.* TO 'myadmin'@'172.16.3.%' identified by 'mypass';

proxysql.cnf-Konfiguration

[root@proxysql ~]# egrep -v '(^$|^#)' /etc/proxysql.cnf

Datenverzeichnis="/var/lib/proxysql"
admin_variables=
{ 
 admin_credentials="admin:admin" #proxysqls eigener administrativer Benutzername und Passwort mysql_ifaces="127.0.0.1:6032;/tmp/proxysql_admin.sock"
}
mysql_variables=
{
 threads=4 #Anzahl der Threads, es wird empfohlen, mit der Anzahl der CPU-Kerne übereinzustimmen max_connections=2048 #Maximale Verbindung default_query_delay=0
 default_query_timeout=36000000
 have_compress=true
 poll_timeout=2000
 interfaces="0.0.0.0:3306;/tmp/proxysql.sock" #Externe Schnittstelle default_schema="information_schema"
 Stapelgröße=1048576
 server_version="5.5.30"
 Verbindungstimeout_Server = 3000
 monitor_username="Monitor"
 monitor_password="Monitor"
 monitor_history=600000
 Monitor-Verbindungsintervall = 60000
 monitor_ping_interval=10000
 Monitor_Nur-Lese-Intervall = 1500
 Monitor_Nur-Lese-Timeout = 500
 ping_interval_server_msec=120000
 ping_timeout_server=500
 commands_stats=true
 session_sort=true
 connect_retries_on_failure=10
}

#####Konfiguration von Master- und Slave-Knotenmysql_servers =      
(
 {
  Adresse = "172.16.3.175" # kein Standard, erforderlich. Wenn Port 0 ist, wird die Adresse als Unix Socket Domain interpretiert
  port = 3306 # kein Standard, erforderlich. Wenn Port 0 ist, wird die Adresse als Unix Socket Domain interpretiert
  hostgroup = 1 # Setzt den Gruppennummernstatus = "ONLINE" # Standard: ONLINE
  Gewicht = 1 # Standard: 1
  Komprimierung = 0 # Standard: 0
  max_connections = 200 ###Definieren Sie die maximale Anzahl von Verbindungen},
 {
  Adresse = "172.16.3.235" # kein Standard, erforderlich. Wenn Port 0 ist, wird die Adresse als Unix Socket Domain interpretiert
  port = 3306 # kein Standard, erforderlich. Wenn Port 0 ist, wird die Adresse als Unix Socket Domain interpretiert
  hostgroup = 2 # kein Standard, erforderlich
  Status = "ONLINE" # Standard: ONLINE
  Gewicht = 1 # Standard: 1
  Komprimierung = 0 # Standard: 0
  max_verbindungen=1000
 },
 {
  Adresse = "172.16.3.241" # kein Standard, erforderlich. Wenn Port 0 ist, wird die Adresse als Unix Socket Domain interpretiert
  port = 3306 # kein Standard, erforderlich. Wenn Port 0 ist, wird die Adresse als Unix Socket Domain interpretiert
  hostgroup = 2 # kein Standard, erforderlich
  Status = "ONLINE" # Standard: ONLINE
  Gewicht = 1 # Standard: 1
  Komprimierung = 0 # Standard: 0
  max_verbindungen=1000
 }
)
mysql_users:
(
 {
  Benutzername = "myadmin" # kein Standard, erforderlich
  Passwort = "mypass" # Standard: ''
  default_hostgroup = 1 # Standard: 0
  max_verbindungen=1000
  default_schema="Test"
  aktiv = 1 #Aktivieren oder nicht}
)
mysql_query_rules:
(
)
Planer =
(
)
mysql_replication_hostgroups=
(
  {
    writer_hostgroup=1 #Schreibgruppennummer 1 definieren
    reader_hostgroup=2 #Lesegruppennummer 2 definieren
    Kommentar="Test-Repl 1" #Kommentarinhalt}
)

Starten Sie den ProxySQL-Dienst


[root@proxysql ~]# service proxysql start

Testen von ProxySQL

Simulieren Sie die Verwendung der Datenbank durch ProxySQL [root@proxysql] # mysql -h172.16.3.175 -umyadmin -pmypass
mysql: [Warnung] Die Verwendung eines Passworts in der Befehlszeilenschnittstelle kann unsicher sein.
Willkommen beim MySQL-Monitor. Befehle enden mit ; ​​oder \g.
Ihre MySQL-Verbindungs-ID lautet 17406
Serverversion: 5.7.21-log MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle und/oder seine Tochtergesellschaften. Alle Rechte vorbehalten.
Oracle ist eine eingetragene Marke der Oracle Corporation und/oder ihrer
Tochtergesellschaften. Andere Namen können Marken ihrer jeweiligen
Eigentümer.
Geben Sie „help;“ oder „\h“ ein, um Hilfe zu erhalten. Geben Sie „\c“ ein, um die aktuelle Eingabeanweisung zu löschen.
MySQL> 

mysql > Datenbanken anzeigen;
mysql> Datenbanken anzeigen;
+--------------------+
| Datenbank |
+--------------------+
| Informationsschema |
|mysql |
| Leistungsschema |
| studieren |
|System|
+--------------------+
5 Zeilen im Satz (0,00 Sek.)
###Löschen Sie die Daten zwischen 6 und 12 in der Studiendatenbank user_info. Vor dem Löschen:
mysql> wähle * aus Benutzerinfo;
+-----+-------+------+--------+----------+
| Nid | Name | Alter | Geschlecht | Teil_NID |
+-----+-------+------+--------+----------+
| 1 | san | 20 | männlich | 1 |
| 2 | dong | 29 | männlich | 2 |
| 4 | Ling | 28 | Männlich | 4 |
| 5 | lang | 28 | männlich | 3 |
| 6 | Dong | 30 | männlich | 1 |
| 7 | b | 11 | weiblich | 1 |
| 8 | c | 12 | Weiblich | 1 |
| 9 | d | 18 | Weiblich | 4 |
| 10 | e | 22 | Männlich | 3 |
| 11 | w | 23 | männlich | 2 |
| 12 | dongy | 22 | männlich | 1 |
+-----+-------+------+--------+----------+
11 Zeilen im Satz (0,00 Sek.)
Nach dem Löschen:
mysql> lösche aus user_info, wobei nid >6 und nid <12;
Abfrage OK, 5 Zeilen betroffen (0,03 Sek.)

mysql> wähle * aus Benutzerinfo;
+-----+-------+------+--------+----------+
| Nid | Name | Alter | Geschlecht | Teil_NID |
+-----+-------+------+--------+----------+
| 1 | san | 20 | männlich | 1 |
| 2 | dong | 29 | männlich | 2 |
| 4 | Ling | 28 | Männlich | 4 |
| 5 | lang | 28 | männlich | 3 |
| 6 | Dong | 30 | männlich | 1 |
| 12 | dongy | 22 | männlich | 1 |
+-----+-------+------+--------+----------+
6 Zeilen im Satz (0,00 Sek.)

Beim Überprüfen der Master- und Slave-Knoten werden Sie feststellen, dass die obigen Abfrage- und Änderungsdaten zur Verarbeitung durch ProxySQL korrekt an das Backend weitergeleitet werden.
Das Obige ist nicht intuitiv. Um die Kommunikation zwischen ProxySQL und jedem Master- und Slave-Knoten anzuzeigen, installieren wir TCPDump auf den Master- und Slave-Knoten und filtern die Pakete

Masterknoten:
Ähnlich wie das Folgende:
[root@db1 ~]# tcpdump -i enp0s3 -nn TCP-Port 3306
tcpdump: ausführliche Ausgabe unterdrückt, verwenden Sie -v oder -vv für die vollständige Protokolldekodierung
lauscht auf enp0s3, Verbindungstyp EN10MB (Ethernet), Erfassungsgröße 262144 Bytes
18:04:34.678861 IP 172.16.3.254.42191 > 172.16.3.175.3306: Flags [S], Sequenz 3385407732, Win 29200, Optionen [mss 1460,sackOK,TS val 17576713 ecr 0,nop,wscale 7], Länge 0
18:04:34.678908 IP 172.16.3.175.3306 > 172.16.3.254.42191: Flags [S.], Sequenz 1579426335, ack 3385407733, Win 28960, Optionen [mss 1460,sackOK,TS val 29413673 ecr 17576713,nop,wscale 7], Länge 0
18:04:34.680902 IP 172.16.3.254.42191 > 172.16.3.175.3306: Flags [.], ack 1, win 229, Optionen [nop,nop,TS val 17576715 ecr 29413673], Länge 0
18:04:34.681264 IP 172.16.3.175.3306 > 172.16.3.254.42191: Flags [P.], Sequenz 1:83, ack 1, Win 227, Optionen [nop,nop,TS val 29413675 ecr 17576715], Länge 82
....
Vom Knoten:
Ähnlich wie das Folgende:
[root@db2 data1]# tcpdump -i enp0s3 -nn TCP-Port 3306
tcpdump: ausführliche Ausgabe unterdrückt, verwenden Sie -v oder -vv für die vollständige Protokolldekodierung
lauscht auf enp0s3, Verbindungstyp EN10MB (Ethernet), Erfassungsgröße 262144 Bytes
18:02:57.932043 IP 172.16.3.254.42733 > 172.16.3.235.3306: Flags [S], Sequenz 76520456, Win 29200, Optionen [mss 1460,sackOK,TS val 17479189 ecr 0,nop,wscale 7], Länge 0
...........

ProxySQL-Befehlszeilenverwaltungsschnittstelle: unterstützt Laufzeitänderungen

 [root@proxysql]# mysql -u admin -padmin -h 127.0.0.1 -P6032 --prompt='Admin> '
Admin > Datenbanken anzeigen;
+-----+---------+-------------------+
| Sequenz | Name | Datei |
+-----+---------+-------------------+
| 0 | Haupt- | |
| 2 | Festplatte | /var/lib/proxysql/proxysql.db |
| 3 | Statistiken | |
| 4 | überwachen | |
+-----+---------+-------------------+
4 Zeilen im Satz (0,00 Sek.)

Die oben genannten Statistiken, Monitore und Hauptdaten werden alle aus der Konfigurationsdateidatenbank abgerufen. Sie können auf ähnliche Weise wie die MySQL-Laufzeitumgebung ohne Neustart geändert werden.

Bisher wurde unsere Lese-/Schreibtrennungsarchitektur basierend auf der ProxySQL-Master-/Slave-Replikation fertiggestellt.
Das Dual-Master- oder Multi-Master-Modell muss keine Lese-/Schreibtrennung implementieren und erfordert nur einen Lastausgleich: Haproxy, Nginx, LVS usw.;
ProxySQL löst das Problem nicht, wenn die Stammdaten auf der Maschine hängen bleiben. In diesem Fall ist zur Lösung MHA erforderlich, das später vorgestellt wird.

Das könnte Sie auch interessieren:
  • Beispielcode für die Master-Slave-Trennung einer MySQL-Datenbank
  • Konfigurationsschritte für die MySQL-Master-Slave-Synchronisierung und die Trennung von Lesen und Schreiben
  • Detaillierte Erläuterung der MySQL Master-Slave-Replikation, Lese-/Schreibtrennung, Sicherung und Wiederherstellung
  • Detaillierte Erläuterung der Konstruktion der Lese-/Schreibtrennung bei der MySQL-Master-Slave-Replikation
  • Schritte zum Konfigurieren der MySQL-Master-Slave-Trennung unter Linux

<<:  Detaillierte Erklärung dieses Zeigeproblems in der JavaScript-Funktion

>>:  Eine kurze Einführung in Protobuf und ein Installationstutorial in der Ubuntu 16.04-Umgebung

Artikel empfehlen

Linux-Dateisysteme erklärt: ext4 und darüber hinaus

Heute werde ich Sie durch die Geschichte von ext4...

Sequentielles und zufälliges Schreiben auf Linux-Festplatten

1. Einleitung ● Zufälliges Schreiben führt dazu, ...

So passen Sie geplante AT- und Cron-Aufgaben in Linux an

Es gibt zwei Arten von geplanten Tasks im Linux-S...

Grafische Installationsschritte für VMware vSphere 6.7 (ESXI 6.7)

Umgebung: VMware VCSA 6.7 (VMware-VCSA-all-6.7.0-...

Detaillierte Erläuterung des MySQL InnoDB-Sekundärindex-Sortierbeispiels

Sortierproblem Ich habe kürzlich auf Geek Time „4...

Probleme mit Join-Abfragen und Unterabfragen in MySQL

Inhaltsverzeichnis Grundlegende Syntax für Multi-...

Detailliertes Tutorial zur Installation von ffmpeg unter Linux

1. Installieren Sie ffmpeg unter Centos Linux 1. ...

js und jquery, um einen Tab-Statusleisten-Umschalteffekt zu erzielen

Heute werden wir einen einfachen Fall durchgehen ...

Modulare CSS-Lösung

Es gibt wahrscheinlich ebenso viele modulare Lösu...

Docker stellt nginx bereit und mountet Ordner und Dateioperationen

Während dieser Zeit habe ich Docker studiert und ...

Implementierungsidee zur Linksausrichtung der letzten Zeile des Flexbox-Layouts

Wenn es sich bei der Verwendung des Flex-Layouts ...

Was ist ein MySQL-Tablespace?

Das Thema, das ich heute mit Ihnen teilen möchte,...