Heim > Datenbank > MySQL-Tutorial > Hauptteil

Fassen Sie die Konfiguration der halbsynchronen MySQL-Replikation zusammen und organisieren Sie sie

WBOY
Freigeben: 2022-07-05 20:46:45
nach vorne
2230 Leute haben es durchsucht

Dieser Artikel vermittelt Ihnen relevantes Wissen über MySQL, das hauptsächlich Probleme im Zusammenhang mit der halbsynchronen Replikationskonfiguration organisiert. Im halbsynchronen Modus muss die Hauptdatenbanktransaktion sicherstellen, dass mindestens eine Slave-Datenbank das Protokoll empfängt, bevor sie abgeschlossen werden kann Daher kann sichergestellt werden, dass die übermittelten Transaktionen bei einem Ausfall der Hauptdatenbank nicht verloren gehen. Ich hoffe, dass dies für alle hilfreich ist .

Fassen Sie die Konfiguration der halbsynchronen MySQL-Replikation zusammen und organisieren Sie sie

Empfohlenes Lernen: MySQL-Video-Tutorial

Vorwort:

        Die Standard-Master-Slave-Replikation von MySQL verwendet den asynchronen Modus. Die Master-Datenbank muss nicht bestätigen, ob die Transaktion an die Slave-Datenbank übertragen wurde. Wenn die Datenbank ausfällt und zwischen Master- und Backup-Datenbank wechselt, gehen die von der Master-Datenbank übermittelten Transaktionen möglicherweise in der Slave-Datenbank verloren.

        In MySQL 5.7 wird der halbsynchrone Replikationsmodus durch das Plug-in unterstützt. Im halbsynchronen Modus muss die Hauptdatenbanktransaktion sicherstellen, dass mindestens eine Slave-Datenbank das Protokoll empfängt, um die Übermittlung abzuschließen Es kann garantiert werden, dass die übermittelte Transaktion abgeschlossen wird, wenn die Hauptdatenbank ausfällt. Die Transaktion wurde an die Slave-Datenbank übertragen, um sicherzustellen, dass keine Daten verloren gehen.

Semi-sync:

Der Leistungseinfluss der semi-sync-Replikation im Vergleich zur asynchronen Replikation besteht hauptsächlich im Kompromiss der Datenintegrität, der die TCP/IP-Roundtripzeit für das Senden von Übermittlungen an die Slave-Bibliothek erhöht Bestätigung des Empfangs, daher erfordert die halbsynchrone Replikation ein Netzwerk mit hoher Übertragungsrate und einen geringen Abstand zwischen Master und Slave. Wenn die Netzwerkübertragung langsam ist oder der Abstand zwischen Master und Slave zu groß ist, kann dies die Leistung des Masters beeinträchtigen Datenbank zu verringern und bei der halbsynchronen Replikation kommt es zu einer Zeitüberschreitung.

                                                                                                                                                                                            musste erfolgen: „Halbsynchrone Replikation, bei der Ausführung der Transaktionsübermittlung muss der Thread darauf warten, dass mindestens eine halbsynchrone Slave-Bibliothek den Empfang der Transaktion bestätigt oder bis die Wartezeit abläuft; , Sie können eine Bestätigung an die Hauptbibliothek senden, dass die Transaktion eingegangen ist.

           Wenn keine Slave-Bibliothek innerhalb der angegebenen Zeit Bestätigungsinformationen an die Hauptbibliothek sendet, kommt es zu einer Zeitüberschreitung der halbsynchronen Replikation der Hauptbibliothek und sie wird herabgestuft zur asynchronen Replikation. Wenn mindestens eine halbsynchrone Slave-Bibliothek Bestätigungsinformationen an die Master-Bibliothek senden kann, wird die Master-Bibliothek automatisch auf den halbsynchronen Modus aktualisiert Wenn es eine Master-Bibliothek gibt, die den halbsynchronen Modus nicht aktiviert, oder wenn die Master-Bibliothek den halbsynchronen Modus aktiviert, aber keine der Slave-Bibliotheken den halbsynchronen Modus aktiviert, aktiviert der Master -Slave-Replikation verwendet weiterhin den asynchronen Modus;

                                                                                                                                  Die Hauptbibliothek Die Übermittlung wird aufgrund des Wartens auf die Bestätigung der Slave-Bibliothek blockiert und die Sitzung, die die Transaktion übermittelt hat, wird nicht zurückgegeben. Die Sitzung wird erst nach der Blockierung zurückgegeben ist beendet und die Übermittlung der Hauptdatenbanktransaktion muss warten, bis mindestens eine Slave-Datenbank die Annahme bestätigt. Der Parameter rpl_semi_sync_master_wait_for_slave_count kann verwendet werden, um die Anzahl der Slaves zu steuern, die in der Master-Bibliothek bestätigt werden müssen. Der Standardwert ist 1.在Carding findet auch in der Nicht-Transaktionstabelle des Rollbacks statt. Da die Nicht-Transaktionstabelle nicht zurückgesetzt wird, ist es dennoch erforderlich, ein Protokoll in das Rollback der Nicht-Transaktionstabelle zu schreiben, um es mit dem Warehouse zu synchronisieren.

                                                                             bei dem die Master-Datenbanktransaktion festgeschrieben wird und darauf wartet, dass die Slave-Datenbank die Transaktionsannahme im halbsynchronen Modus bestätigt:

                                                ' s ' s ' s ' s ‐ ‐ Der Parameter rpl_semi_sync_master_wait_point wird im halbsynchronen Modus verwendet, um den Zeitpunkt zu steuern, zu dem die Master-Datenbanktransaktion übermittelt wird, und wartet darauf, dass die Slave-Datenbank die Transaktionsannahme auf der Festplatte bestätigt. Nachdem die Hauptbibliothek synchronisiert wurde, wartet sie auf die Slave-Bibliothek Um eine Bestätigung der Transaktion zu erhalten, sendet die Hauptbibliothek die Transaktion an die Speicher-Engine und sendet sie an den Client zurück.

                                                                                                                                                            Nach Bestätigung kehrt die Quelle zurück, um „Abgeschlossen“ an den Kunden zu übermitteln.

Die beiden Synchronisationszeitpunkte weisen hauptsächlich die folgenden Unterschiede auf

S Unter After_Sync sehen alle Clients gleichzeitig die übermittelten Transaktionen, da sie an die Speicher-Engine übermittelt werden, nachdem bestätigt wurde, dass sie die Transaktion von der Bibliothek erhalten haben, sodass alle Clients die Daten der empfangenen Transaktion sehen konnten wurden gleichzeitig übermittelt; außerdem wurden bei einem Failover alle festgeschriebenen Transaktionen in der Master-Datenbank mit dem Relay-Protokoll der Slave-Datenbank synchronisiert und die Daten in der Slave-Datenbank sind verlustfrei.

client-->MySQLSQL Parse-->Storage Involve-->binäres Protokoll schreiben-->wait ACK-->storagecommit-->client(OK)

Unter after_commit die Transaktion festschreiben Der Client muss vor der Rückgabe auf die Bestätigung warten, dass die Slave-Datenbank die Transaktion empfangen hat. Da jedoch die Übermittlung an die Speicher-Engine abgeschlossen ist, bevor die Slave-Datenbank bestätigt wird, sehen andere Clients die Daten der übermittelten Transaktion früher als der Client, der sie übermittelt hat Im Falle eines Failovers kann es bei anderen Clients zu Datenverlusten im Zusammenhang mit den Daten kommen, die sie auf der Quelle für Transaktionen sehen, die an die Speicher-Engine übertragen wurden, deren Übertragung jedoch noch nicht vom Slave bestätigt wurde.

client-->MySQLSQL Parse-->Storage Involve-->Binärprotokoll schreiben-->storagecommit-->wait ACK-->client(OK)

Zusammenfassend wird empfohlen, dies zu tun Verwenden Sie die Standardeinstellung after_sync.

Halbsynchrone Installationsschritte:

Umgebungsinformationen:

MySQL-Version: 5.7.32

Architektur: ein Master (192.168.1.110:3306) zwei Slaves (192.168.1.11. 1:3306 ,192.168. 1.111: 3307)

                    binlog:on                        binlog_row_image: full                       binlog_format:                                                                                                        binlog:on

        - Die synchrone Replikation basiert auf der asynchronen Replikation, daher müssen Master und Slave im Voraus konfiguriert werden. Asynchrone Replikation (Schritte werden hier weggelassen).

           Die halbsynchrone Replikation unterstützt keine Multi-Source-Replikation (mehrere Kanäle), die halbsynchrone Replikation kann nur den Standardkanal verwenden.

                                                                                                                                                                         verwendete Befehle INSTALLPLUGIN, SET GLOBAL, STOP SLAVE, START SLAVE und super SUPER-Berechtigung für die Konfigurationsverwaltung.

Hongkong in Peking in China, um auf dem MySQL -Server zu sein, um dynamisches Laden zu unterstützen.

show global variables like'%have_dynamic_loading%';
Nach dem Login kopieren

Bestätigen Sie, dass die semisynchronen Replikations-Plug-ins semisync_master und semisync_slave unter dem Plug-in-Pfad „plugin_dir“ vorhanden sind. Das Dateinamensuffix variiert je nach Plattform (z. B. wird .so für Unix und Unix-ähnliche Systeme verwendet). .dll wird für Windows verwendet).

Halbsynchronisation konfigurieren:

Installieren Sie sowohl Master als auch Slave, um einen Master-Slave-Wechsel zu verhindern.

show global variables like '%plugin_dir%';
Nach dem Login kopieren

Hinweis: Wenn die Installation wie folgt fehlschlägt, müssen Sie zuerst libimf installieren.

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
Nach dem Login kopieren

Überprüfen Sie, ob die Komponente geladen ist.

mysql> INSTALLPLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
ERROR 1126(HY000): Can't open shared library
'/usr/local/mysql/lib/plugin/semisync_master.so'
(errno: 22libimf.so: cannot open shared object file:
No such fileor directory)
Nach dem Login kopieren

Nach der Installation des Plug-Ins können Sie die Parameter für die Halbsynchronisation anzeigen.

show plugins;
+----------------------------+----------+--------------------+--------------------+---------+
| Name                       | Status   | Type               | Library            | License |
+----------------------------+----------+--------------------+--------------------+---------+
| binlog                     | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| mysql_native_password      | ACTIVE   | AUTHENTICATION     | NULL               | GPL     |
| sha256_password            | ACTIVE   | AUTHENTICATION     | NULL               | GPL     |
| CSV                        | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| MEMORY                     | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| InnoDB                     | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| INNODB_TRX                 | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_LOCKS               | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_LOCK_WAITS          | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMP                 | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMP_RESET           | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMPMEM              | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMPMEM_RESET        | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMP_PER_INDEX       | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_CMP_PER_INDEX_RESET | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_BUFFER_PAGE         | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_BUFFER_PAGE_LRU     | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_BUFFER_POOL_STATS   | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_TEMP_TABLE_INFO     | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_METRICS             | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_FT_DEFAULT_STOPWORD | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_FT_DELETED          | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_FT_BEING_DELETED    | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_FT_CONFIG           | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_FT_INDEX_CACHE      | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_FT_INDEX_TABLE      | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_SYS_TABLES          | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_SYS_TABLESTATS      | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_SYS_INDEXES         | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_SYS_COLUMNS         | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_SYS_FIELDS          | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_SYS_FOREIGN         | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_SYS_FOREIGN_COLS    | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_SYS_TABLESPACES     | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_SYS_DATAFILES       | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| INNODB_SYS_VIRTUAL         | ACTIVE   | INFORMATION SCHEMA | NULL               | GPL     |
| MyISAM                     | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| MRG_MYISAM                 | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| PERFORMANCE_SCHEMA         | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| ARCHIVE                    | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| BLACKHOLE                  | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| FEDERATED                  | DISABLED | STORAGE ENGINE     | NULL               | GPL     |
| partition                  | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| ngram                      | ACTIVE   | FTPARSER           | NULL               | GPL     |
| rpl_semi_sync_master       | ACTIVE   | REPLICATION        | semisync_master.so | GPL     |
| rpl_semi_sync_slave        | ACTIVE   | REPLICATION        | semisync_slave.so  | GPL     |
+----------------------------+----------+--------------------+--------------------+---------+
SELECT PLUGIN_NAME, PLUGIN_STATUS
    ->        FROM INFORMATION_SCHEMA.PLUGINS
    ->        WHERE PLUGIN_NAME LIKE '%semi%';
+----------------------+---------------+
| PLUGIN_NAME          | PLUGIN_STATUS |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE        |
| rpl_semi_sync_slave  | ACTIVE        |
+----------------------+---------------+
Nach dem Login kopieren

Detaillierte Erklärung der Parameter:

rpl_semi_sync_master_enabled: Ob die Master-Bibliothek die Halbsynchronisation aktiviert.      rpl_semi_sync_master_wait_point: Synchronisationszeitpunkt after_commit, after_sync.

               rpl_semi_sync_master_wait_for_slave_count: Die Anzahl der Bestätigungen, die von der Slave-Bibliothek erforderlich sind, nachdem die Master-Bibliothekstransaktion übermittelt wurde.

                                                                                                 raus       durch aus zusammen raus zusammen durch raus zusammen raus zusammen raus zusammengehörig psi richtig outceps richtig raus cleanps richtig raus sauber raus richtig raus raus richtig outmbps raus raus raus raus raus outmballow outOUT raus raus durch aus durch aus durch so so so so so so so so so so so so so so so so so so so so so so so so so so so M RPL_SEMI_SYNC_MATER_WAIT_NO_SLAVE:

Wenn die Hauptbibliothek gefunden wird (RPL_SEMI_SYNC_MASTER_CLIENTS) ist weniger als (RPL_SEMI_MATER_WAIT_SLAVE_COUNT) Wechseln Sie in den asynchronen Modus; wenn eingeschaltet, in der freien Zeit für die Übermittlung von Transaktionen, auch wenn die Hauptbibliothek erkannt wird (Rpl_semi_sync_master_clients). kleiner als (rpl_semi_sync_master_wait_for_slave_count), und es wird keine Anpassung vorgenommen;

Solange die Hauptbibliothek eine Anzahl von ACK-Antworten größer oder gleich (rpl_semi_sync_master_wait_for_slave_count) erhält, bleibt die Hauptbibliothek halbsynchron Wenn die Transaktions-Commit-Phase (die Hauptbibliothek wartet auf ACK) abläuft, wechselt die Halbsynchronisation in den asynchronen Modus

                无论(rpl_semi_sync_master_wait_no_slave)为ON还是OFF,当slave上线到(rpl_semi_sync_master_wait_for_slave_count)值时,master都会自动由异步模式转为半同步模式。

        主库开启半同步功能

SET GLOBAL rpl_semi_sync_master_enabled = 1; 
SET GLOBAL rpl_semi_sync_master_timeout=10000;
Nach dem Login kopieren

        从库开启半同步功能

SET GLOBAL rpl_semi_sync_slave_enabled = 1;
Nach dem Login kopieren

        从库对于正在进行的异步复制,需要重启sql_io_thread 线程,才能生效半同步复制

STOP SLAVE IO_THREAD; 
START SLAVE IO_THREAD;
Nach dem Login kopieren

        主库添加参数到/etc/my.cnf文件

[mysqld] 
rpl_semi_sync_master_enabled=1 
rpl_semi_sync_master_timeout=10000
Nach dem Login kopieren

        从库添加参数到/etc/my.cnf文件

[mysqld] 
rpl_semi_sync_slave_enabled=1
Nach dem Login kopieren

查看主从是否启用了半同步复制:

      主库查询半同步状态Rpl_semi_sync_master_status为on表示主库开启了半同步复制,Rpl_semi_sync_master_clients表示目前有2个半同步的从库。

show global status like 'rpl%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 2     |
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 0     |
| Rpl_semi_sync_master_no_times              | 0     |
| Rpl_semi_sync_master_no_tx                 | 0     |
| Rpl_semi_sync_master_status                | ON    |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 0     |
| Rpl_semi_sync_master_tx_wait_time          | 0     |
| Rpl_semi_sync_master_tx_waits              | 0     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 0     |
| Rpl_semi_sync_slave_status                 | OFF   |
+--------------------------------------------+-------+
Nach dem Login kopieren

        从库查询半同步状态Rpl_semi_sync_slave_status 为on表示从库开启了半同步复制。

show global status like 'rpl%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 0     |
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 0     |
| Rpl_semi_sync_master_no_times              | 0     |
| Rpl_semi_sync_master_no_tx                 | 0     |
| Rpl_semi_sync_master_status                | OFF   |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 0     |
| Rpl_semi_sync_master_tx_wait_time          | 0     |
| Rpl_semi_sync_master_tx_waits              | 0     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 0     |
| Rpl_semi_sync_slave_status                 | ON    |
+--------------------------------------------+-------+
Nach dem Login kopieren

半同步状态检查:

show global status like 'rpl%';
+--------------------------------------------+---------+
| Variable_name                              | Value   |
+--------------------------------------------+---------+
| Rpl_semi_sync_master_clients               | 2       |
| Rpl_semi_sync_master_net_avg_wait_time     | 0       |
| Rpl_semi_sync_master_net_wait_time         | 0       |
| Rpl_semi_sync_master_net_waits             | 12463   |
| Rpl_semi_sync_master_no_times              | 1       |
| Rpl_semi_sync_master_no_tx                 | 2739    |
| Rpl_semi_sync_master_status                | ON      |
| Rpl_semi_sync_master_timefunc_failures     | 0       |
| Rpl_semi_sync_master_tx_avg_wait_time      | 1030    |
| Rpl_semi_sync_master_tx_wait_time          | 5075616 |
| Rpl_semi_sync_master_tx_waits              | 4926    |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0       |
| Rpl_semi_sync_master_wait_sessions         | 0       |
| Rpl_semi_sync_master_yes_tx                | 5595    |
| Rpl_semi_sync_slave_status                 | OFF     |
+--------------------------------------------+---------+
Nach dem Login kopieren

Rpl_semi_sync_master_net_avg_wait_time:变量已经废弃,总是等于0。

Rpl_semi_sync_master_net_wait_time:变量已经废弃,总是等于0。

Rpl_semi_sync_master_net_waits:主库等待从库的总次数。

Rpl_semi_sync_master_no_times:主库关闭半同步的总次数,可以用来分析半同步降级为异步的频率次数。

Rpl_semi_sync_master_no_tx:表示半同步事务提交没有接受到从库确认接受的总次数,可以用来分析半同步事务的提交是否存在超时的情况。

Rpl_semi_sync_master_yes_tx: 表示半同步事务提交接受到从库确认接受的总次数。

Rpl_semi_sync_master_timefunc_failures::调用 gettimeofday() 等时间函数失败的次数。

Rpl_semi_sync_master_tx_avg_wait_time:每个事务提交平均等待时间(单位: microseconds ),可以用来分析事务提交性能。

Rpl_semi_sync_master_tx_wait_time:事务总的提交等待时间(单位: microseconds ),可以用来分析事务提交性能。

Rpl_semi_sync_master_tx_waits:事务总的提交等待次数,可以用来分析事务提交性能。

Rpl_semi_sync_master_wait_pos_backtraverse:主库event binary位置低于之前等待event的总次数,当事务开始等待回复的顺序与其二进制日志事件的写入顺序不同时,就会发生这种情况。

Rpl_semi_sync_master_wait_sessions:当前会话等待从库确认接受的个数,可以用来确认分析会话是否存在由于等待从库确认而堵塞的情况。

推荐学习:mysql视频教程

Das obige ist der detaillierte Inhalt vonFassen Sie die Konfiguration der halbsynchronen MySQL-Replikation zusammen und organisieren Sie sie. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:csdn.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage