免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 61724 | 回复: 63
打印 上一主题 下一主题

转HP MC/ServiceGuard 背景知识和原理 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-02-27 17:10 |只看该作者 |倒序浏览
1. HP MC/ServiceGuard背景知识

  HP MC/ServiceGuard服务器应用软件可以帮助你使用800系列的HP9000服务器建立一个高可靠性的集群服务器系统。一个高可靠的系统是指即使计算机系统出现硬件和软件的故障,运行在该系统上的服务仍然可以继续使用,在一个环节(可能是一个系统处理单元、硬盘、LAN,软件系统等等)出了问题的时候,系统中的臃余部件可以接管错误部位的运行任务。 MC/ServiceGuard和其他高可靠部件一起实现并且协调这种发生错误时候的转换。

  一个MC/ServiceGuard集群系统就是利用网络把一些800系列的HP9000服务器(称为节点)连接起来并且在系统中有足够的臃余硬件和软件来保证任何一个单独的错误并不显著的影响整个系统所提供的服务。



图1-1是一个典型的集群系统的配置图,图中pkg A和pkg B分别是两个服务服务器,通过臃余网络连接。

2. 理解HP MC/ServiceGuard运行的硬件环境

1) 集群系统组件的臃余:为了保证系统的高可靠性,典型的集群系统组件通常情况下都应该有所臃余,比方说多个系统处理单元(SPU),两个或者两个以上的独立磁盘阵列;这样的方案能够避免单一的系统错误。通常情况下,系统的臃余度越高,在发生错误的时候能够保证你的程序、数据和支撑服务能够安全能力越高。除了硬件的臃余外,还必须要有一套支撑软件来实现在系统出错的时候控制服务(程序、数据)从一个SPU到另外一个SPU的转移。MC/ServiceGuard通过以下几个方面提供这种保证:

A. 在LAN出问题的时候MC/ServiceGuard能够切换到备用的LAN上去或者把相关的应用转移到备用的节点上;

B. 如果一个SPU出了问题,MC/ServiceGuard能够保证在最短的时间内将应用从出问题的SPU上转移到没有出问题的SPU上去;

C. 当应用程序出问题的时候,MC/ServiceGuard保证能够在该节点上从新启动应用程序或者转移到其他节点上去启动程序。

  当然,MC/ServiceGuard也能够在你需要维护或者升级一个SPU的时候让你方便的将这个SPU上的应用程序转移到其他的SPU上去运行。目前为止,MC/ServiceGuard集群系统支持的最大节点数为8,可以在共享总线上同时4个节点上连接SCSI的硬盘或者磁盘阵列,如果是光钎总线的或,磁盘阵列可以同时连接8个节点。

2) 网络组件的臃余:在网络连接中IP地址对应着网络接口(网卡等),分配有IP的接口叫做主接口,没有分配IP地址的接口叫做备用接口。当MC/ServiceGuard侦测到主接口发生错误的时候,它会将IP地址和绑定在这个IP地址上的服务全部转移到备用接口上去。

图2-1说明了网络臃余,对于每个Pkg,Pkg A和Pkg B来讲,都有一个主接口网卡(Primary LAN Card)和一个备用接口网卡(Standby LAN Cards),并且有SUBNET A和SUBNET B两个网络连接。

3) 储存磁盘的臃余:在集群系统中每个节点都有自己的跟磁盘,并且每个节点都与多个在集群中的磁盘物理连接,从而使得不止一个节点可以访问与其应用程序相关的数据。这种访问能力由逻辑卷管理器(LVM)来管理。在同一时间内一个磁盘卷组并不能被超过一个的节点所控制,但是当应用程序转移的时候,这个磁盘卷组就可以被备用节点访问。

  MC/ServiceGuard支持Single-ended和Fast/Wide类型的SCSI硬盘,同时支持HP FiberLink和FibreChannel。(注意:并不是所有的SCSI硬盘都支持,可以查阅HP 9000服务器的配置手册)

  为了保护重要数据,需要使用以下两种方法中的一种来保护:一是使用镜相磁盘,一是使用了RAID或者PV Links的磁盘阵列。图2-6是使用磁盘阵列的集群系统。



3. 理解HP MC/ServiceGuard软件的工作原理和组件

图3-1是MC/ServiceGuard软件的组件图和其所处的层次结构。最底层是操作系统本身(HP-UX Kernel with LVM),然后是组成MC/ServiceGuard的三层组件:Network Manager、Cluster Manager和Package Manager。

1) Cluster Manager的工作原理:

Cluster Manager是用来初始化集群系统、监控集群系统的“健康”情况,辨别节点产生的错误,管理和配置新节点加入到集群系统中和一个节点从集群系统中离开。Cluster Manager在每个节点上以监听进程(daemon process)的形式运行,在集群系统的启动和重新配置过程中,一个节点被选择用来做为集群控制点(Cluster coordinator)。虽然所有的节点都执行同样的集群管理功能,但是集群控制点是节点交互通讯的中心点。

集群系统的配置参数包括集群的名字和节点、用于立即转移的网络参数、集群锁(注意实际上是磁盘卷组)磁盘信息、时钟脉冲参数。集群系统参数可以使用SAM输入或者编辑ASCII格式的配置文件模板。你输入的参数用来编译生成一个分发到各个节点的二进制文件,各个节点这个二进制集群配置文件必须是一样的。

  通常在第一次建立集群系统的时候和在对整个集群系统进行维护后需要手动启动整个集群系统。在启动集群系统之前,所有的节点必须都有同样的一个集群配置文件。系统管理员可以从SAM引导系统或者在一台工作站上使用cmruncl命令,这个命令必须是在集群系统开始工作前使用,也就是说没有任何一个节点在运行cmcld监听进程。

  在启动过程中,cluster manager检查在启动命令里面定义的所有节点是否是合法的节点,是否已经启动并且运行,然后开始形成集群状态,能够相互通信。以上过程都正常启动后,一个集群系统就形成了。
在集群系统中有一个比较重要的概念叫heartbeat message(直接翻译过来叫心跳信息,笔者认为不好表达,所以直接引用)。每一个处在集群系统中的服务器通过一个监控LAN或者RS232的串口向集群控制点定时发送一个heartbeat message,如果集群控制点在规定的时间内没有收到这个heartbeat message的话,就会重新构架整个集群系统。

  当集群系统里面的所有节点都产生错误的时候,系统会自动重启,这种情况一般是因为电源断电使得所有的SPU全部down机造成的。设置自动重启的办法是在配置文件/etc/rc.config.d/cmcluster把标志AUTOSTART_CMCLD置为1。

  集群锁(Cluster Lock)在集群系统中也是一个很重要的概念。集群锁其实是磁盘卷组中的被所有节点共享的磁盘空间,所在的磁盘卷组和物理卷名字在集群配置文件中指定。当一个正在运行的集群系统发生错误,MC/ServiceGuard试图重新构架新的集群系统,把原来的系统拆分为两个相等的子集群系统的时候,集群锁被使用。获得集群锁的那个子集群系统形成一个新的集群系统,从而避免两个子系统同时运行,当两个子系统节点数目不一样的时候,数目大于50%的那个子系统会获得机群锁。如果你使用的是两个节点的集群系统的话,你必须配置集群锁;当两个节点之间的通讯中断的时候,集群锁所在的那个节点就会代替整个集群系统运行,另外一个节点就会停机。如果没有集群锁的话,任何一个节点出现错误停机都将造成另外一个节点停机使得整个集群系统停机。

2) Package Manager的工作原理:

  集群系统中每一台机器上都运行一个程序包管理器(Package Manager)的实例,在集群控制点服务器上运行的就叫程序包管理点(Pachage Coordinator)。程序包管理点的作用是确定在什么时间、什么地方运行、停止和删除程序包。程序包管理器的作用是根据用户控制脚本指令运行、停止程序和服务,根据所监控的资源作出反映。

  一旦一个集群系统被建立,在每个节点上的package manager就启动了该节点上的程序组,package manager通过启动包控制脚本(加start参数)来启动一个程序包,这个脚本完成以下一些工作:使用逻辑卷管理器命令激活该程序所需要的磁盘卷组,从活动卷组加载文件系统到本地节点,使用cmrunserv命令启动在包里面配置好的每一个程序,这个命令同时启动了对服务的监控。

  运行包启动脚本加stop参数的时候可以停止一个程序包的运行。比方说,系统管理员在SAM下的程序包管理菜单中选择“停止程序包”,那么这个程序包将被停止;同样,停止一个节点的命令会引发package manager停止在该节点的所有程序包,也就是执行加了stop参数的程序包控制脚本。这个脚本使用cmhaitserv命令来停止每一项程序服务,卸载程序包加载的文件系统。

3)Network Manager的工作原理

  network manager的主要目的是监控和恢复网络设备(网卡等)的错误,保证用户服务的高可靠性。实际上就是对主网络接口为每个服务分配IP地址,同时监控网络设备的健康状况,在必要的时候转移服务的运行。

  每个节点对于处于工作状态的的网络接口都应该分配一个IP地址,这个静态的IP地址在文件/etc/rc.conf.d/netconf中配置。一个静态的IP地址不可以转移到另外一个节点去,但是可以在需要的时候转移给备用的网络接口。静态的IP地址与程序包并不关联,它被用来在网络中传送heartbeat message。

  除了静态的IP地址以为,你可以跟每一个程序包分配一个或者多个唯一的IP地址。这种IP地址叫住可重分配的IP地址(也叫动态IP地址),因为这种IP地址可以动态从一个节点转移到另外一个节点。在一个集群系统中,你最多可以为30个程序包分配200个这种可重分配的IP地址。静态和动态的IP地址在LAN出问题的时候都会被转移到备用LAN设备上去,如果程序包控制被转移到备用节点,动态的IP地址还可以被备用节点使用,从而使得程序仍然可以访问这些包而并不需要知道它在哪个节点上。图3-5和3-6说明这种转移。




  在上图中,Client 1通过动态IP地址127.15.12.147访问package 1,在下图中;由于节点1出错,package 1被转移到节点2上运行,IP地址也被动态地改变到节点2上去了。


  当一个动态IP地址被转移到一个新的节点的时候,集群系统还需要做一件很重要的是就是向整个网络发送一个ARP广播,通知各个节点这个动态IP地址所对应的新的连接层的地址。每个点收到这个ARP广播后更新自己的ARP资料从而反应网络的变化。



可惜图贴过来就没有了!

论坛徽章:
0
2 [报告]
发表于 2003-02-27 17:21 |只看该作者

转HP MC/ServiceGuard 背景知识和原理

MC/ServiceGuard命令详解

1 cmruncl手工启动双机软件
             #cmruncl [-f] [-v] [-n NN...]
             [-f]    Force cluster startup without warning message
             [-v]    Verbose output
             [-n ]  specific name(s) of node(s) to

2 cmhaltcl停止MC
配置MC/ServiceGuard之后,数据库和应用进程的停止都可用MC的命令来执行:
望shutdown 主机后,MC的进程自动停下来则:将/etc/rc.config.d/cmcluster 文件内的 AUTOSTART_CMCLD参数改为1
AUTOSTART_CMCLD置0(缺省),则在shutdown主机之前注意一定要先停下MC的进程,否则下一次启动MC将因逻辑卷状态不对而不能正常执行。

3 cmviewcl监视MC的运行状态
当MC启动之后,您可以用cmviewcl命令来显示MC的运行状态:
回显信息说明:
1、CLUSTER STATUS  分别描述群集的名字和状态;
2、NODE STATUS STATE  分别描述主机的名字、状态和应用包状态;
3、Network_Parameters的INTERFACE  STATUS  PATH  NAME分别描述网卡的主备、状态、物理地址和名字,其中物理地址可能各点是不相同的,LAN0是应用网,LAN1是LAN0的备份,LAN2是MC的心跳网络;
4、 PACKAGE  STATUS  STATE  PKG_SWITCH  NODE分别描述应用包的名字、状态(STATUS,STATE)、是否可切换以及运行的节点;
5、 Script_Parameters的ITEM  STATUS  NAME  MAX_RESTARTS  RESTARTS 分别描述监控程序和子网的名字、状态等;
6、 Node_Switching_Parameters的 NODE_T YPE  STATUS  SWITCHING  NAME 分别描述该应用包运行的主备节点、状态、是否接纳应用包的切换,以及主备结点的名字和应用包当前运行的主机。

4 cmhaltnode停止指定节点的MC的进程
本命令将停止指定主机的MC的后台进程,其结果是导致应用程序的切换。本命令可用以不停应用的系统升级、应用调整或参数调整。

例如:要将B机的应用切换到A机上,可在B机上执行以下命令:
#cmhaltnode -f -v

5 cmrunnode启动指定节点的MC的进程
本命令是启动指定主机的MC进程,但是它不会启动PKG(即应用程序)。比如,紧接上一个命令的结果,当B机的调整完成之后,我们又希望重新将B机加入到Cluster群集中去,可在B机上执行以下命令:
#cmrunnode -v

6 cmhaltpkg停止指定的应用包
本命令可以停止指定的应用包(即pkg),但是它不会导致应用包的切换。如在已有两个应用包的CLUSTER群集中停止pkg1的运行,则在pkg1的运行机上执行以下命令:
#cmhaltpkg -v pkg1

Halting Package pkg1
cmhaltpkg  : Successfully halted pkg1.
cmhaltpkg  : completed successfully on all packages specified.

7 cmrunpkg启动指定的应用包
本命令可以启动指定的应用包(即pkg),如在CLUSTER群集中启动pkg2,则在希望pkg2运行的主机上执行以下命令:
#cmrunpkg -v pkg2

8 cmmodpkg改变指定应用包的切换属性
本命令可以改变应用包的切换属性。如,接着上一条命令,现在想将pkg1的切换属性改成enable,您可在pkg1的运行主机上执行以下命令:
#cmmodpkg -e pkg1

论坛徽章:
0
3 [报告]
发表于 2003-02-27 18:42 |只看该作者

转HP MC/ServiceGuard 背景知识和原理

感激!
感动!
赶快学!

论坛徽章:
0
4 [报告]
发表于 2003-03-13 12:38 |只看该作者

转HP MC/ServiceGuard 背景知识和原理

clic老大,怎么没有图啊?

论坛徽章:
0
5 [报告]
发表于 2003-03-13 12:49 |只看该作者

转HP MC/ServiceGuard 背景知识和原理

能用中文把MC/SG的原理讲的这么清楚也算不容易了,感谢

论坛徽章:
0
6 [报告]
发表于 2003-03-13 15:47 |只看该作者

转HP MC/ServiceGuard 背景知识和原理

感动的是痛哭流涕

论坛徽章:
0
7 [报告]
发表于 2003-03-13 17:20 |只看该作者

转HP MC/ServiceGuard 背景知识和原理

rc

论坛徽章:
0
8 [报告]
发表于 2003-03-14 08:59 |只看该作者

转HP MC/ServiceGuard 背景知识和原理

HP MC/ServiceGuard的安装和配置
1.  安装前系统的准备:
    MC/ServiceGuard使用ARPA服务来保证在集群系统内每个节点之间的通讯安全。在安装之前,你必须指明集群系统中的每一台机器都可以被另外一台机器以root的身份访问。
除了使用操作系统本身的配置文件/.rhosts来定义可访问主机外,MC/ServiceGuard也指定另外一个文件/etc/cmcluster/cmclnodelist来定义,MC/ServiceGuard将首先检查这个文件是否存在,存在就使用这个文件中定义的主机列表,否则就使用配置文件/.rhosts
cmclnodelist文件的输入格式是:[主机名]  [用户]  [注释],下面是一个例子:
node1                  root
node2.sys.dom.com       root
将这个配置文件(或者.rhosts)拷贝到每一个主机。MC/ServiceGuard支持主机名为完整的域名。
然后,检查你的集群系统中的每个主机的操作核心是否一致。因为必须保证在一个节点出问题的时候程序被转移到另外一个节点是能够有相同的运行环境。
当然,强烈推荐你使用NTP服务来保证每个节点的时间保证同步。NTP服务的监听进程为xntpd,配置文件是/etc/ntp.conf。
2.  安装MC/ServiceGuard
假设你已经安装了HP-UX 11.0。在每个节点按下面的步骤安装MC/ServiceGuard:
1)  加载MC/ServiceGuard分发的载体设备,磁带机或者光驱等;
2)  进入安装目录,使用命令swinstall来,运行软件的安装;
3)  选择正确的输入设备(你使用光驱安装的话就选择CD-ROM了);
4)  在所显示的列表中选择包:B3935BA   MC/ServiceGuard
5)  选择了包后,选择OK;
6)  在每个节点上使用ioscan命令核实一下磁盘和驱动器是否被正确配置了。
通常情况下,如果你对HP-UX并不是很陌生的话,这个应该是没有问题了。
3.  为跟逻辑卷建立镜相
假设主盘为/dev/dsk/c4t5d0,其镜相盘是/dev/dsk/c4t6d0,(你的系统中通常不会是这样的,下面的操作请使用你自己的主盘名字)
1)  建立将被用作镜相的可启动LVM盘:
#  pvcreate –B /dev/rdsk/c4t6d0
2)  将这个盘添加到当前跟卷组中:
#  vgextend /dev/vg00 /dev/dsk/c4t6d0
3)  把它设置为启动盘:
#  mkboot /dev/rdsk/c4t6d0
4)  将正确的AUTO文件拷贝到新的LIF区域:
#  mkboot –a “hpux –l q (;0) /vmunix” /dev/rdsk/c4t6d0
5)  将引导卷、主卷和主交换分区镜相到这个新的可引导磁盘上去,确定在vg00目录下的所有设备都被镜相(比如说/usr,/swap等等):
#  lvextend –m 1 /dev/vg00/lvol1 /dev/dsk/c4t6d0
#  lvextend –m 1 /dev/vg00/lvol3 /dev/dsk/c4t6d0
#  lvextend –m 1 /dev/vg00/lvol2 /dev/dsk/c4t6d0
等等,必须保证引导逻辑卷首先被镜相。
6)  为镜相的卷更新在BDRA中的启动信息:
#  /usr/sbin/lvlnboot –b /dev/vg00/lvol1 (启动)
#  /usr/sbin/lvlnboot –v –r /dev/vg00/lvol3
#  /usr/sbin/lvlnboot –s /dev/vg00/lvol2 (交换)
7)  检查BDRA是否正确:
#  /usr/sbin/lvlnboot –R /dev/vg00
8)  检查镜相是否正确创建;
#  lvlboot –v
4.  将一个节点上的磁盘卷组“搬”到另外一个节点上去
假设节点ftsys9上已经配置好了磁盘分区、卷组等,现在我们要在节点ftsys10上建立同样的卷组。
1)  将ftsys9上的卷组映象文件考到指定文件中:
#  vgexport –p –s –m /tmp/vgdatabase..map  /dev/vgdatabase
2)  仍然在ftsys9节点上,将这个文件考到ftsys10节点去:
#  rcp /tmp/vgdatabase.map ftsys10: /tmp/vgdatabase.map
3)  在ftsys10节点上,建立卷组目录:
#  mkdir /dev/vgdatabase
4)  在ftsys10节点上,在/etc/vgdatabase目录下建立一个叫group的控制文件:
#  mknod /dev/vgdatabase/group c 64 0xhh0 0 0 0
5)  在ftsys10节点上导入ftsys9节点上的卷组数据:
#  vgimport –s –m /tmp/vgdatabase.map /dev/vgdatabase
6)  检查/etc/lvmpvg文件中每个物理卷是否都是ftsys10节点上的物理卷名字。
7)  起用ftsys10上的卷组:
#  vgchange –a y /dev/vgdatabase
8)  建立一个目录来加载磁盘:
#  mkdir /mnt1
9)  加载并且校验ftsys10上的卷组:
#  mount /dev/vgdatabase/lvol1 /mnt1

5.  使用MC/ServiceGuard命令来配置集群系统
在节点ftsys9上运行命令cmquerycl
# cmquerycl –v –c /etc/cmcluster/cmclconf.ascii –n ftsys9 –n ftsys10
通常这是个很重要的命令,这个命令将定义生成由ftsys9和ftsys10两个节点组成的一个集群系统的配置文件,典型的文件情况请参考其他资料(呵呵,有点长,懒的输入了)。
# cmquerycl –v –n ftsys9 –n ftsys10
上面这个命令可以得到集群系统磁盘错误的次数。
更多细节还可以使用man cmquerycl命令来看帮助文件。
6.  校验、分配集群系统配置文件
本来SAM可以自动帮助你校验集群系统的配置是否正确,但是如果你是直接编辑的配置文件的话,下面这个命令对你是很有帮助的:
# cmcheckconf –v –c /etc/cmcluster/cmclconf.ascii
这个命令实际上是检查以下内容:
1)  网络地址和网络连接是否有效;
2)  集群锁是否正确设置并且可访问;
3)  名字是否唯一,节点是否可以访问;
4)  命令行的脚本是否存在和允许运行;
5)  是否每个节点都被设置到同一个heartbeat的子网中;
6)  是否只有一个CLUSTER_NAME(集群系统的名字)、HEARTBEAT_INTERVAL(heartbeat message时间间隔)、AUTO_START_ TIMEOUT被设置;
7)  HEARTBEAT_INTERVAL的值最小是1秒(注意:配置文件中的单位是毫秒);
8)  NODE_TIMEOUT的值至少是HEARTBEAT_INTERVAL值的两倍;
9)  AUTO_START_ TIMEOUT合法值应该大于0;
等等其他,在此只介绍以上比较容易出问题的地方。在这个集群系统配置文件被校验正确后,前面已经说到,要让MC/ServiceGuard正确运行,在每个节点上都应有同样的这个配置文件。使用HP-UX命令来分配这个配置文件:
首先获得集群锁并且初始化:
#  vgchange –a y /dev/vglock
然后分配出去:
#  cmapplyconf –v –C /etc/cmcluster/cmclconf.ascii \
–P /etc/cmcluster/pkg1/pkg1conf.ascii
        最后释放集群锁:
        #  vgchang –a n /dev/vglock
7.  测试集群系统的运行状况:
MC/ServiceGuard提供了几个命令来控制集群系统和检测系统运行状况:
1)  cmrunnode:启动一个节点;
2)  cmhaltnode:停止一个节点;(相当于shutdown )
3)  cmruncl:启动一个停止的集群系统;
4)  cmhaltcl:停止一个运行的集群系统;
5)  cmdeleteconf:删除集群配置文件;(非常危险的命令,除非是确实需要)

8.  建立使用MC/ServiceGuard建立一个程序包:
使用命令cmmakepkg来建立一个程序包配置文件(建议使用模板文件修改)。这里解释配置文件里面的几项内容的意义:
1)  NODE_NAME:把每一个节点的名字都输入,一个节点一行;
2)  RUN_SCRIPT和HALT_SCRIPT:启动、停止程序包时运行脚本的路径;
3)  RESOURCE_POLLING_INTERVAL:检查资源是否健全的时间间隔;
程序包配置文件的检查和分配跟集群系统配置文件的过程相似。
9.  集群系统的重新配置:
在一些情况下你需要重新配置你的集群系统,但是有几点必须注意:
1)  在系统运行状态你不能改变集群锁的磁盘配置;
2)  不能直接把一个正在运行程序的节点从集群系统中拿走,必须先停止它的运行;
3)  不能直接把一个正在使用的磁盘卷组从配置文件中去掉,必须先停止使用该资源的程序包,然后才可以去除;
4)  不能改变集群系统的时间参数;
下表可以帮助提醒改变配置时应该满足的条件:
>;'>;改变集群系统的配置类型        >;'>;需要满足的集群系统的状态
>;'>;增加一个节点        '>;所有的节点都必须在运行;串行heartbeat没有被改变配置
'>;删除一个节点        '>;停止节点。即便在该节点不可访问和不可用的情况下也可以删除
'>;改变最大的程序包配置        '>;集群系统不能正在运行
'>;集群系统的时间参数        '>;集群系统不能正在运行
'>;改变集群锁配置        '>;集群系统不能正在运行
>;'>;改变串行设备文件        >;'>;集群系统不能正在运行
>;'>;改变heartbeat或者监控用的子网        >;'>;集群系统不能正在运行

论坛徽章:
0
9 [报告]
发表于 2003-03-14 10:08 |只看该作者

转HP MC/ServiceGuard 背景知识和原理

谢谢

论坛徽章:
0
10 [报告]
发表于 2003-03-14 10:56 |只看该作者

转HP MC/ServiceGuard 背景知识和原理

很好很好。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP