Ringkaskan dan susun konfigurasi replikasi separa segerak MySQL

WBOY
Lepaskan: 2022-07-05 20:46:45
ke hadapan
2218 orang telah melayarinya

Artikel ini membawakan anda pengetahuan yang berkaitan tentang mysql, yang terutamanya mengatur isu yang berkaitan dengan konfigurasi replikasi separa segerak Dalam mod separa segerak, transaksi pangkalan data utama mesti memastikan bahawa sekurang-kurangnya satu pangkalan data hamba menerima The penyerahan tidak dapat diselesaikan sehingga log Oleh itu, ia boleh dijamin bahawa apabila pangkalan data utama turun, transaksi yang diserahkan telah dipindahkan ke pangkalan data hamba untuk memastikan data itu tidak hilang semoga ianya bermanfaat kepada semua.

Ringkaskan dan susun konfigurasi replikasi separa segerak MySQL

Pembelajaran yang disyorkan: tutorial video mysql

Kata Pengantar:

Induk lalai MySQL -replikasi hamba menggunakan mod tak segerak Pangkalan data induk tidak perlu mengesahkan sama ada transaksi yang diserahkan telah dihantar ke pangkalan data hamba Apabila pangkalan data induk gagal dan bertukar antara induk dan sandaran, urus niaga yang telah diserahkan oleh pangkalan data induk mungkin hilang dalam pangkalan data hamba.

Dalam MySQL 5.7, mod replikasi separa segerak disokong melalui pemalam Dalam mod separa segerak, transaksi pangkalan data utama mesti memastikan bahawa sekurang-kurangnya satu pangkalan data hamba menerima log sebelum ia boleh. selesai. Oleh itu, ia boleh dijamin bahawa apabila pangkalan data utama turun, , transaksi yang diserahkan telah dipindahkan ke pangkalan data hamba untuk memastikan bahawa data tidak hilang.

Separuh segerak:

Kesan prestasi replikasi separa segerak berbanding replikasi tak segerak adalah terutamanya pertukaran integriti data, yang menambah keperluan untuk menghantar penyerahan ke perpustakaan hamba dan mengesahkan Masa pergi balik TCP/IP yang diterima, oleh itu, replikasi separa segerak memerlukan rangkaian penghantaran tinggi dan jarak dekat antara tuan dan hamba Jika penghantaran rangkaian adalah perlahan atau jarak antara tuan dan hamba terlalu jauh, ia boleh menyebabkan prestasi pangkalan data induk berkurangan dan replikasi Separa segerak tamat masa.

Pangkalan data induk dan hamba replikasi separa segerak akan melaksanakan operasi berikut:

Apabila menyambung ke pangkalan data induk, sistem replikasi akan menyemak sama ada pangkalan data induk telah bertukar replikasi separa segerak on;

Jika replikasi separa segerak didayakan pada kedua-dua pustaka induk dan pustaka hamba, apabila utas melakukan transaksi, ia perlu menunggu sekurang-kurangnya satu pustaka hamba separa segerak untuk mengesahkan penerimaan urus niaga atau sehingga tamat masa menunggu;

Pustaka hamba hanya perlu berada dalam Selepas transaksi telah ditulis ke log geganti dan dibuang ke cakera (tidak perlu melaksanakan transaksi ini), anda boleh menghantar pengesahan ke perpustakaan utama bahawa transaksi telah diterima;

Jika tiada perpustakaan hamba menghantar maklumat pengesahan dalam masa yang ditetapkan Ke perpustakaan utama, replikasi separa segerak pustaka utama akan tamat masa dan diturunkan taraf kepada tak segerak replikasi. Apabila sekurang-kurangnya satu pustaka hamba separa segerak boleh menghantar maklumat pengesahan ke pustaka utama, pustaka utama secara automatik akan menaik taraf kepada mod separa segerak

Replikasi separa segerak perlu didayakan dalam kedua-dua induk; dan pangkalan data hamba pada masa yang sama Jika pangkalan data induk tidak mendayakan mod separa segerak atau pangkalan data induk mendayakan mod separa segerak tetapi tiada satu pun daripada pangkalan data hamba mendayakan mod separa segerak, replikasi hamba induk masih akan menggunakan mod tak segerak. . ;

Apabila penyerahan transaksi pangkalan data utama disekat kerana menunggu pengesahan pangkalan data hamba, sesi yang menghantar transaksi tidak akan kembali sehingga penyekatan selesai, dan sesi tidak akan dikembalikan transaksi pangkalan data utama perlu menunggu sekurang-kurangnya satu pengesahan pangkalan data hamba menerima. Parameter rpl_semi_sync_master_wait_for_slave_count boleh digunakan untuk mengawal bilangan hamba yang perlu disahkan dalam pustaka induk.

Penyekatan juga akan berlaku dalam pemulangan jadual bukan urus niaga Kerana jadual bukan urus niaga tidak digulung semula, pengembalian jadual bukan urus niaga masih perlu ditulis pada log dan disegerakkan ke pangkalan data hamba. .

Parameter rpl_semi_sync_master_wait_point digunakan dalam mod separa segerak untuk mengawal titik masa di mana transaksi pangkalan data induk menyerahkan dan menunggu pangkalan data hamba untuk mengesahkan penerimaan transaksi Terdapat dua cara:

after_sync (default): pangkalan data induk menulis transaksi ke binlog dan menyegerakkan perpustakaan hamba dan menyegerakkan binlog ke cakera Selepas perpustakaan induk menyegerak, ia menunggu pustaka hamba menerima pengesahan transaksi pengesahan, perpustakaan induk menyerahkan transaksi kepada enjin storan dan kembali kepada pelanggan.

after_commit: Pustaka utama menulis transaksi ke binlog dan menyegerakkan pustaka hamba, menyegerakkan binlog dan menyerahkan transaksi kepada enjin storan Selepas penyerahan, perpustakaan utama menunggu pustaka hamba menerima pengesahan urus niaga selepas menerima pengesahan, Asal mengembalikan penyerahan penyerahan kepada pelanggan.

Dua titik masa penyegerakan terutamanya mempunyai perbezaan berikut

Di bawah after_sync, semua pelanggan melihat transaksi yang diserahkan pada masa yang sama Kerana enjin storan diserahkan selepas mengesahkan bahawa transaksi telah diterima daripada pangkalan data, semua pelanggan melihat data transaksi yang diserahkan pada masa yang sama ; Di samping itu, apabila failover berlaku, semua transaksi yang diserahkan dalam pangkalan data induk telah disegerakkan ke log geganti pangkalan data hamba, dan data dalam pangkalan data hamba adalah tanpa kerugian.

klien-->MySQLSQL Parse-->Storage Involve-->tulis log binari-->tunggu ACK-->storagecommit-->klien(OK)

Di bawah after_commit, pelanggan yang menyerahkan urus niaga perlu menunggu pengesahan bahawa perpustakaan hamba telah menerima urus niaga sebelum kembali, namun, memandangkan penyerahan kepada enjin storan selesai sebelum mengesahkan perpustakaan hamba, pelanggan lain akan lebih awal daripada pelanggan yang menyerahkan transaksi Apabila failover berlaku, pelanggan lain mungkin mengalami kehilangan data yang berkaitan dengan data yang mereka lihat pada sumber untuk transaksi yang telah dilakukan kepada enjin storan tetapi belum disahkan telah dilakukan oleh pangkalan data hamba. .

klien-->MySQLSQL Parse-->Storage Involve-->tulis log binari-->storagecommit-->tunggu ACK-->klien(OK)

Secara ringkasnya, adalah disyorkan untuk menggunakan after_sync lalai.

Langkah pemasangan separa segerak:

Maklumat alam sekitar:

Versi MySQL: 5.7.32

Seni bina: satu tuan (192.168.1.110:3306) dua hamba (192.168.1.111:3306,192.168.1.111:3307)

binlog:on

binlog penuh🎜>

binlog_ penuh🎜 > binlog_format:row

gtid:on

Syarat penyediaan:

Replikasi separuh segerak adalah berdasarkan replikasi tak segerak, jadi ia mesti dikonfigurasikan dalam pendahuluan Master-hamba replikasi tak segerak (langkah ditinggalkan di sini).

Replikasi separa segerak tidak menyokong replikasi berbilang sumber (berbilang saluran replikasi separa segerak hanya boleh menggunakan saluran lalai).

Pengurusan konfigurasi menggunakan arahan INSTALLPLUGIN, SET GLOBAL, STOP HAMBA, MULAKAN HAMBA dan keistimewaan SUPER.

Memasang pemalam memerlukan pelayan MySQL untuk menyokong pemuatan dinamik Anda perlu mengesahkan bahawa have_dynamic_loading ialah YA

show global variables like'%have_dynamic_loading%';
Salin selepas log masuk
Sahkan bahawa laluan pemalam dikonfigurasikan dengan betul install_home/lib/plugin.

show global variables like '%plugin_dir%';
Salin selepas log masuk
Sahkan bahawa pemalam replikasi separa segerak semisync_master dan semisync_slave wujud di bawah laluan pemalam plugin_dir Akhiran nama fail berbeza-beza bergantung pada platform (contohnya, .so digunakan untuk Unix dan sistem seperti Unix, .dll digunakan untuk Windows).

Konfigurasikan separa penyegerakan:

Pasang kedua-dua tuan dan hamba untuk mengelakkan penukaran tuan-hamba.

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
Salin selepas log masuk
Nota: Jika pemasangan gagal seperti berikut, anda perlu memasang libimf terlebih dahulu.

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)
Salin selepas log masuk
Periksa sama ada komponen dimuatkan.

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        |
+----------------------+---------------+
Salin selepas log masuk
Selepas memasang pemalam, anda boleh melihat parameter yang berkaitan dengan separa penyegerakan.

show global variables like 'rpl_semi%';
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | OFF        |
| rpl_semi_sync_master_timeout              | 10000      |
| rpl_semi_sync_master_trace_level          | 32         |
| rpl_semi_sync_master_wait_for_slave_count | 1          |
| rpl_semi_sync_master_wait_no_slave        | ON         |
| rpl_semi_sync_master_wait_point           | AFTER_SYNC |
| rpl_semi_sync_slave_enabled               | OFF        |
| rpl_semi_sync_slave_trace_level           | 32         |
+-------------------------------------------+------------+
Salin selepas log masuk
Penjelasan terperinci tentang parameter:

rpl_semi_sync_master_enabled: Sama ada pustaka induk mendayakan separa penyegerakan.

rpl_semi_sync_master_wait_point: titik masa penyegerakan after_commit, after_sync.

rpl_semi_sync_master_wait_for_slave_count: Bilangan pengesahan yang diperlukan daripada pangkalan data hamba selepas transaksi pangkalan data induk diserahkan.

RPL_SEMI_SYNC_MASTER_TIMEOUT: Pustaka utama sedang menunggu masa pengesahan perpustakaan (MS), 10000ms lalai dan penurunan taraf separa segerak kepada mod tak segerak.

rpl_semi_sync_master_wait_no_slave:

Apabila ia MATI, selagi pustaka utama mendapati bahawa (Rpl_semi_sync_master_clients) adalah kurang daripada (rpl_semi_sync_master_wait_for_slave_count), mod separa segerak akan menjadi_kira_hamba >

HIDUP, apabila Semasa masa terbiar apabila tiada transaksi dilakukan, walaupun perpustakaan utama mendapati bahawa (Rpl_semi_sync_master_clients) adalah kurang daripada (rpl_semi_sync_master_wait_for_slave_count), tiada pelarasan akan dibuat; adalah dijamin bahawa perpustakaan utama menerima nilai yang lebih besar daripada atau sama dengan (rpl_semi_sync_master_wait_for_slave_count) sebelum masa transaksi Jumlah respons ACK, perpustakaan utama akan kekal dalam mod separa segerak Jika fasa penyerahan transaksi (pustaka utama menunggu ACK) tamat masa, mod separa segerak akan ditukar kepada mod tak segerak;

                无论(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;
Salin selepas log masuk

        从库开启半同步功能

SET GLOBAL rpl_semi_sync_slave_enabled = 1;
Salin selepas log masuk

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

STOP SLAVE IO_THREAD; 
START SLAVE IO_THREAD;
Salin selepas log masuk

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

[mysqld] 
rpl_semi_sync_master_enabled=1 
rpl_semi_sync_master_timeout=10000
Salin selepas log masuk

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

[mysqld] 
rpl_semi_sync_slave_enabled=1
Salin selepas log masuk

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

      主库查询半同步状态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   |
+--------------------------------------------+-------+
Salin selepas log masuk

        从库查询半同步状态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    |
+--------------------------------------------+-------+
Salin selepas log masuk

半同步状态检查:

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     |
+--------------------------------------------+---------+
Salin selepas log masuk

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视频教程

Atas ialah kandungan terperinci Ringkaskan dan susun konfigurasi replikasi separa segerak MySQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:csdn.net
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan