热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

DRBD+Heartbeat解决NFS单点故障

nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd

1.1  环境准备
1.1.1          添加新磁盘,分区并格式化

fdisk -uc /dev/sdb
mkfs.ext4 /dev/sdb1
dd if=/dev/zero of=/dev/sdb1bs=1M count=1

1.1.2          在hosts文件中添加以下记录

cat /etc/host
172.16.1.111 test01
172.16.1.112 test02
172.16.1.113 web

1.1.3          关闭selinux和iptables

setenforce 0
/etc/init.d/iptables stop

1.1.4          测试约定

主机名,系统版本及内核版本:

[root@test01 ~]# uname -nr
test01 2.6.32-573.el6.x86_64
[root@test01 ~]# cat /etc/RedHat-release
CentOS release 6.7 (Final)

[root@test02 ~]# uname -nr
test02 2.6.32-573.el6.x86_64
[root@test02 ~]# cat /etc/redhat-release
CentOS release 6.7 (Final)

[root@web ~]# uname -nr
web 2.6.32-573.el6.x86_64
[root@web ~]# cat /etc/redhat-release
CentOS release 6.7 (Final)

测试IP:

test01 172.16.1.111
test02 172.16.1.112
web  172.16.1.113
虚拟IP 172.16.1.100

1.2  DRBD的安装
1.2.1          配置DRBD
默认官方源中没有drbd软件,所以使用elrepo源

[root@test01 ~]# rpm --importhttps://www.elrepo.org/RPM-GPG-KEY-elrepo.org
[root@test01 ~]# rpm -Uvhhttp://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
Retrieving http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
Preparing...              ########################################### [100%]
  1:elrepo-release        ########################################### [100%]
[root@test01 ~]# yum installdrbd84-utils kmod-drbd84 -y

[root@test01 ~]# modprobe drbd
[root@test01 ~]# lsmod|grepdrbd
drbd                  365931  0
libcrc32c              1246  1 drbd

编辑配置文件

[root@test01 ~]# vim/etc/drbd.conf
# You can find an examplein  /usr/share/doc/drbd.../drbd.conf.example
#include"drbd.d/*.res";
global{
    usage-count no;
}
common{
    syncer{
        rate 200M;
    }
}
resource r1 {
      protocol C;
      startup{
          wfc-timeout 120;
          degr-wfc-timeout 120;
      }
      disk {
          on-io-error detach;
      }
      net {
          timeout 60;
          connect-int 10;
          ping-int 10;
          max-buffers 2048;
          max-epoch-size 2048;
          cram-hmac-alg"sha1";
          shared-secret"Mysql-abcD";
      }
      on test01 {
          device /dev/drbd0;
          disk /dev/sdb1;
          address 172.16.1.31:6666;
          meta-disk internal;
      }
      on test02 {
          device /dev/drbd0;
          disk /dev/sdb1;
          address 172.16.1.41:6666;
          meta-disk internal;
      }
}

1.2.3          初始化设

[root@test01 ~]# drbdadmcreate-md r1
initializing activity log
NOT initializing bitmap
Writing meta data...
New drbd meta data blocksuccessfully created.
[root@test01 ~]# drbdadm up r1
[root@test01 ~]# cat /proc/drbd
version: 8.4.6(api:1/proto:86-101)
GIT-hash:833d830e0152d1e457fa7856e71e11248ccf3f70 build by phil@Build64R6, 2015-04-0914:35:00
 0: cs:Connected ro:Secondary/Secondaryds:Inconsistent/Inconsistent C r-----
    ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0ua:0 ap:0 ep:1 wo:f oos:5241660

现在两个节点都处于Secondary状态     

将test01手动提升至primary。并将/dev/drbd0进行格式化以供挂在使用

[root@test01 ~]# drbdadmprimary --force r1
[root@test01 ~]# cat/proc/drbd
version: 8.4.6(api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70build by root@test01, 2015-12-07 10:40:31
 0: cs:Connected ro:Primary/Secondaryds:UpToDate/UpToDate C r-----
    ns:1047484 nr:0 dw:0 dr:1048148 al:0 bm:0lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

1.2.4          格式化虚拟分区

[root@test01 ~]# mkfs.ext4/dev/drbd0
mke2fs 1.41.12 (17-May-2010)
文件系统标签=
操作系统:Linux
..
...
Writing superblocks andfilesystem accounting information: 完成
 
This filesystem will beautomatically checked every 33 mounts or
180 days, whichever comesfirst.  Use tune2fs -c or -i to override.
[root@test01 ~]# tune2fs -c -1/dev/drbd0
tune2fs 1.41.12 (17-May-2010)
Setting maximal mount count to-1

1.2.5          挂载测试

[root@test01 ~]# mkdir /data
[root@test01 ~]# mount -t ext4/dev/drbd0 /data
[root@test01 ~]# df -h
Filesystem      Size Used Avail Use% Mounted on
/dev/sda2      9.4G 1.5G  7.4G  17% /
tmpfs          495M    0  495M  0% /dev/shm
/dev/sda1      190M  36M  145M  20% /boot
/dev/drbd0      991M 1.3M  939M  1% /data
[root@test01 ~]# touch/data/drbd.test
[root@test01 ~]# ls /data/
drbd.test lost+found

手动切换连个节点状态,并进行挂载测试

[root@test01 ~]# umount /data
[root@test01 ~]# drbdadmsecondary r1
[root@test01 ~]# cat/proc/drbd
version: 8.4.6(api:1/proto:86-101)
GIT-hash:833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@test01, 2015-12-0710:40:31
 0: cs:Connected ro:Secondary/Secondaryds:UpToDate/UpToDate C r-----
    ns:1080828 nr:0 dw:33344 dr:1048921 al:10bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

将test01手动提升至primary。并将/dev/drbd0进行格式化以供挂在使用

[root@test02drbd-utils-8.9.2]# drbdadm primary r1
[root@test02drbd-utils-8.9.2]# cat /proc/drbd
version: 8.4.6(api:1/proto:86-101)
GIT-hash:833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@test02, 2015-12-0710:40:31
 0: cs:Connected ro:Primary/Secondaryds:UpToDate/UpToDate C r-----
    ns:0 nr:1080828 dw:1080828 dr:664 al:0 bm:0lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
[root@test02 ~]# mkdir /data
[root@test02 ~]# mount -t ext4/dev/drbd0 /data
[root@test02 ~]# ls /data/
drbd.test lost+found
[root@test01 ~]# umount /data
[root@test01 ~]# drbdadmsecondary r1

现在drbd两个节点已经配置成功,并手动测试成功。drbd的两个节点,同时时间只有primary状态的节点提供服务。

1.3  配置nfs服务
test01 test02 web配置nfs的共享目录为/data ,test01 test02同时/dev/drbd0的挂载目录也是/data

1.3.1          将test01 drbd状态提升为primary并将/dev/drbd0挂载至/data,编辑/etc/exports文件,并本地测试。

[root@test01 ~]# cat/proc/drbd 
version: 8.4.6(api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70build by root@test01, 2015-12-07 10:40:31
 0: cs:Connected ro:Secondary/Secondaryds:UpToDate/UpToDate C r-----
    ns:1080828 nr:8 dw:33352 dr:1048921 al:10bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

[root@test01 ~]# drbdadmprimary r1
[root@test01 ~]# mount -t ext4/dev/drbd0 /data
[root@test01 ~]# df -h
Filesystem      Size Used Avail Use% Mounted on
/dev/sda2      9.4G 1.5G  7.4G  17% /
tmpfs          495M    0 495M  0% /dev/shm
/dev/sda1      190M  36M  145M  20% /boot
/dev/drbd0      991M 1.3M  939M  1% /data

[root@test01 ~]# cat/etc/exports 
/data172.16.1.0/24(rw,sync,all_squash)

[root@test01 ~]#/etc/init.d/rpcbind start
[root@test01 ~]#/etc/init.d/nfs start
[root@test01 ~]# chown -R nfsnobody.nfsnobody/data
[root@test01 ~]# showmount -e172.16.1.111
Export list for 172.16.1.111:
/data 172.16.1.0/24

[root@test01 ~]# mount -t nfs172.16.1.111:/data /mnt
[root@test01 ~]# ls /mnt
drbd.test lost+found
[root@test01 ~]# touch/mnt/test01.test
[root@test01 ~]# ls /mnt
drbd.test lost+found  test01.test

1.3.2          将test01状态降为secondary,将test02状态提升为primary,并将/dev/drbd0挂载至/data,编辑/etc/exports文件,并本地测试

[root@test01 ~]# umount /mnt
[root@test01 ~]#/etc/init.d/nfs stop
[root@test01 ~]# umount /data
[root@test01 ~]# drbdadmsecondary r1
[root@test01 ~]# cat/proc/drbd
version: 8.4.6(api:1/proto:86-101)
GIT-hash:833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@test01, 2015-12-0710:40:31
 0: cs:Connected ro:Secondary/Secondaryds:UpToDate/UpToDate C r-----
    ns:1080952 nr:8 dw:33476 dr:1049979 al:10bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

[root@test02 ~]# drbdadm primary r1
[root@test02 ~]# mount -t ext4/dev/drbd0 /data
[root@test02 ~]# df -h
Filesystem      Size Used Avail Use% Mounted on
/dev/sda2      9.4G 1.5G  7.4G  17% /
tmpfs          495M    0 495M  0% /dev/shm
/dev/sda1      190M  36M  145M  20% /boot
/dev/drbd0      991M 1.3M  939M  1% /data

[root@test02 ~]# cat/etc/exports 
/data172.1.6.0/24(rw,sync,all_squash)

[root@test02 ~]#/etc/init.d/rpcbind start
[root@test02 ~]#/etc/init.d/nfs start
[root@test02 ~]# chown -Rnfsnobody.nfsnobody /data
[root@test02 ~]# showmount -e172.16.1.112
Export list for 172.16.1.112:
/data 172.16.1.0/24

[root@test02 ~]# mount -t nfs172.16.1.112:/data /mnt
[root@test02 ~]# ls /mnt
drbd.test lost+found  test01.test
[root@test02 ~]# touch/mnt/test02.test
[root@test02 ~]# ls /mnt
drbd.test lost+found  test01.test  test02.test

[root@test02 ~]# umount /mnt
[root@test02 ~]#/etc/init.d/nfs stop
[root@test02 ~]# umount /data
[root@test02 ~]# drbdadmsecondary r1
version: 8.4.6(api:1/proto:86-101)
GIT-hash:833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@test02, 2015-12-0710:40:31
 0: cs:Connected ro:Secondary/Secondaryds:UpToDate/UpToDate C r-----
    ns:124 nr:1080952 dw:1081076 dr:1726 al:2bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

至此:drbd nfs手动挂载测试成功

1.4  配置heartbeat
配置heartbeat以达到nfs主节点失效自动将所有资源切换到备用节点

1.4.1          两台nfs服务器上安装heartbeat
添加epel扩展源。官方yum源没有heartbeat

yum -y install epel-release
yum install heartbeat -y

1.4.2          将两台服务器默认配置文件拷贝到/etc/ha.d/并做更改

[root@test01 ~]# rpm -qdheartbeat|grep doc
/usr/share/doc/heartbeat-3.0.4/AUTHORS
/usr/share/doc/heartbeat-3.0.4/COPYING
/usr/share/doc/heartbeat-3.0.4/COPYING.LGPL
/usr/share/doc/heartbeat-3.0.4/ChangeLog
/usr/share/doc/heartbeat-3.0.4/README
/usr/share/doc/heartbeat-3.0.4/apphbd.cf
/usr/share/doc/heartbeat-3.0.4/authkeys
/usr/share/doc/heartbeat-3.0.4/ha.cf
/usr/share/doc/heartbeat-3.0.4/haresources

1 [root@test01 ~]# cp/usr/share/doc/heartbeat-3.0.4/authkeys /usr/share/doc/heartbeat-3.0.4/ha.cf/usr/share/doc/heartbeat-3.0.4/haresources /etc/ha.d/

[root@test01 ~]# egrep -v"#|^$" /etc/ha.d/ha.cf
logfile /var/log/ha-log
logfacility    local0
keepalive 2
deadtime 30
warntime 10
initdead 60
mcast eth0 225.0.0.1 694 1 0
auto_failback on
node    test01
node    test02

[root@test01 ~]# egrep -v"#|^$" /etc/ha.d/authkeys
auth 1
1 sha1 liyanan
[root@test01 ~]# chmod600  /etc/ha.d/authkeys
[root@test01 ~]# ll  /etc/ha.d/authkeys       
-rw------- 1 root root 647 12月  7 15:13 /etc/ha.d/authkeys
 
[root@test01 ~]#echo " test01drbddisk::r1 Filesystem::/dev/drbd0::/data::ext4 nfsIPaddr::172.16.1.100/24/eth1
" >>/etc/ha.d/haresources

将附件的脚本加入到/etc/ha.d/resource.d/ 下并赋予可执行权限。

1.4.3          启动两台服务器heartbeat

[root@test01 ~]#/etc/init.d/heartbeat start
[root@test01 ~]#/etc/init.d/heartbeat status
heartbeat OK [pid 5362 et al]is running on test01 [test01]...

1.4.4          测试heartbeat

全部启动heartbeat服务

[root@test01 ha.d]#/etc/init.d/heartbeat status
heartbeat OK [pid 22646 et al]is running on test01 [test01]...
[root@test02 ~]#/etc/init.d/heartbeat status
heartbeat OK [pid 13217 et al]is running on test02 [test02]...

检查test01挂载

[root@test01 ha.d]# df -h
Filesystem      Size Used Avail Use% Mounted on
/dev/sda2      9.4G 1.6G  7.3G  18% /
tmpfs          495M    0 495M  0% /dev/shm
/dev/sda1      190M  36M  145M  20% /boot
/dev/drbd0      991M 1.3M  939M  1% /data

检查test02挂载

[root@test02 ~]# df -h
Filesystem      Size Used Avail Use% Mounted on
/dev/sda2      9.4G 1.6G  7.3G  18% /
tmpfs          495M    0 495M  0% /dev/shm
/dev/sda1      190M  36M  145M  20% /boot

关闭test01的heartbeat服务后再检查挂载

[root@test01 ha.d]#/etc/init.d/heartbeat stop
Stopping High-Availabilityservices: Done.

[root@test01 ha.d]# df -h
Filesystem      Size Used Avail Use% Mounted on
/dev/sda2      9.4G 1.6G  7.3G  18% /
tmpfs          495M    0  495M  0% /dev/shm
/dev/sda1      190M  36M  145M  20% /boot

再次检查test02挂载

[root@test02 ~]# df -h
Filesystem      Size Used Avail Use% Mounted on
/dev/sda2      9.4G 1.6G  7.3G  18% /
tmpfs          495M    0 495M  0% /dev/shm
/dev/sda1      190M  36M  145M  20% /boot
/dev/drbd0      991M 1.3M  939M  1% /data

再次启动test01的heartbeat服务,并检查挂载

[root@test01 ha.d]#/etc/init.d/heartbeat start
Starting High-Availabilityservices: Done.

[root@test01 ha.d]# df -h
Filesystem      Size Used Avail Use% Mounted on
/dev/sda2      9.4G 1.6G  7.3G  18% /
tmpfs          495M    0 495M  0% /dev/shm
/dev/sda1      190M  36M  145M  20% /boot
/dev/drbd0      991M 1.3M  939M  1% /data

再次检查test02挂载

[root@test02 ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2      9.4G 1.6G  7.3G  18% /
tmpfs          495M    0 495M  0% /dev/shm
/dev/sda1      190M  36M  145M  20% /boot

经过循环测试,证明heartbeat服务已经成功接管drbd nfs VIP服务

可通过VIP向外部提供nfs挂载解决nfs单点故障。

终极测试,循环写入数据测试丢包率

测试方式:由test01为主,提供nfs服务、test02为备,接管nfs服务。web挂载test01提供的nfs共享目录。通过间隔 1S 连续在web的挂载点上写入数据,期间手动关闭test01的heartbeat服务,造成意外宕机的实验效果,等脚本执行完毕后,在web端查看写入的数据,以便检测丢包率。

检查挂载情况及虚拟IP

[root@test01 ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2      9.4G  1.6G  7.4G  18% /
tmpfs          242M    0  242M  0% /dev/shm
/dev/sda1      190M  36M  145M  20% /boot
/dev/drbd0      4.8G  11M  4.6G  1% /data
[root@test01 ~]# ip add |grep 172.16
    inet 172.16.1.111/24 brd 172.16.1.255 scope global eth1
    inet 172.16.1.100/24 brd 172.16.1.255 scope global secondary eth1

--------------------------------------------------------------------------------

[root@test02 ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2      9.4G  1.6G  7.4G  18% /
tmpfs          242M    0  242M  0% /dev/shm
/dev/sda1      190M  36M  145M  20% /boot
[root@test02 ~]# ip add |grep 172.16
    inet 172.16.1.112/24 brd 172.16.1.255 scope global eth1

--------------------------------------------------------------------------------

[root@web ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2            9.4G  2.1G  6.9G  24% /
tmpfs                242M    0  242M  0% /dev/shm
/dev/sda1            190M  36M  145M  20% /boot
172.16.1.100:/data  4.8G  11M  4.6G  1% /data/www/

测试脚本:

for ((n=1;n<30;n++))
do 
  touch /data/www/$n
  sleep 1
done

期间关闭test01的heartbeat服务,并检查最终测试结果

[root@web ~]# ls /data/www/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 22 23 24 25 26 27 28 29

测试结果表明数据丢包率为0,试验成功。

------------------------------------------分割线------------------------------------------

免费下载地址在 http://linux.linuxidc.com/

用户名与密码都是www.linuxidc.com

具体下载目录在 /2015年资料/12月/22日/DRBD+Heartbeat 解决NFS单点故障/

下载方法见 2013-07/87684.htm

------------------------------------------分割线------------------------------------------

有关DRBD的相关知识,可以参考:
DRBD原理及特性概述 2015-11/124759.htm
快速安装及部署DRBD  2015-11/124760.htm

Linux 高可用(HA)集群之DRBD详解 2013-08/89035.htm

DRBD中文应用指南 PDF 2013-08/89034.htm

CentOS 6.3下DRBD安装配置笔记 2013-06/85600.htm

基于DRBD+Corosync实现高可用MySQL 2013-05/84471.htm

CentOS 6.4下DRBD 安装配置 2013-09/90536.htm

DRBD 的详细介绍:请点这里
DRBD 的下载地址:请点这里


推荐阅读
  • 本文总结了初学者在使用dubbo设计架构过程中遇到的问题,并提供了相应的解决方法。问题包括传输字节流限制、分布式事务、序列化、多点部署、zk端口冲突、服务失败请求3次机制以及启动时检查。通过解决这些问题,初学者能够更好地理解和应用dubbo设计架构。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • Java如何导入和导出Excel文件的方法和步骤详解
    本文详细介绍了在SpringBoot中使用Java导入和导出Excel文件的方法和步骤,包括添加操作Excel的依赖、自定义注解等。文章还提供了示例代码,并将代码上传至GitHub供访问。 ... [详细]
  • 负载均衡_Nginx反向代理动静分离负载均衡及rewrite隐藏路径详解(Nginx Apache MySQL Redis)–第二部分
    nginx反向代理、动静分离、负载均衡及rewrite隐藏路径详解 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记
    本文介绍了大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记,包括outputFormat接口实现类、自定义outputFormat步骤和案例。案例中将包含nty的日志输出到nty.log文件,其他日志输出到other.log文件。同时提供了一些相关网址供参考。 ... [详细]
  • 本文介绍了禅道作为一款国产开源免费的测试管理工具的特点和功能,并提供了禅道的搭建和调试方法。禅道是一款B/S结构的项目管理工具,可以实现组织管理、后台管理、产品管理、项目管理和测试管理等功能。同时,本文还介绍了其他软件测试相关工具,如功能自动化工具和性能自动化工具,以及白盒测试工具的使用。通过本文的阅读,读者可以了解禅道的基本使用方法和优势,从而更好地进行测试管理工作。 ... [详细]
  • {moduleinfo:{card_count:[{count_phone:1,count:1}],search_count:[{count_phone:4 ... [详细]
  • nginx+多个tomcat
    学习nginx的时候遇到的问题:nginx怎么部署两台tomcat?upstream在网上找的资源,我在nginx配置文件(nginx.conf)中添加了两个server。结果只显 ... [详细]
author-avatar
深tp悟人生
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有