【DB宝44】Oracle rac集群中的IP类型简介

Oracle 专栏收录该内容
95 篇文章 12 订阅

Oracle rac集群中的IP类型简介

在Oracle RAC中,Public IP、Private IP、Virtual IP、SCAN IP、GNS VIP及HAIP的作用分别是什么?

从Oracle 11g开始,安装RAC至少需要7个IP地址,两块网卡(一块公网网卡,一块私网网卡),其中public、vip和scan都在同一个网段,使用的是公网网卡,private在另一个网段,使用的是私网网卡。主机名不能包含下横线,如:RAC_01是不允许的。通过执行ifconfig -a检查两个节点的网络设备名称是否一致。另外,在配置了/etc/hosts文件后,在安装RAC之前,公网、私网共4个IP可以ping通,其它3个IP不能ping通才是正常的。

从Oracle 18c开始,scan建议至少为3个。

在安装RAC时,其IP地址的规划类似于下表所示:

其在/etc/hosts文件中的配置如下所示:

[root@raclhr-19c-n1 ~]# more /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

#Public IP
192.168.59.52            raclhr-19c-n1
192.168.59.53            raclhr-19c-n2

#Private IP
192.168.2.52             raclhr-19c-n1-priv
192.168.2.53             raclhr-19c-n2-priv

#Virtual IP
192.168.59.54            raclhr-19c-n1-vip
192.168.59.55            raclhr-19c-n2-vip

#Scan IP
192.168.59.56            raclhr-19c-scan
192.168.59.57            raclhr-19c-scan
192.168.59.58            raclhr-19c-scan

下面分别介绍一下RAC环境中的几种IP及其作用。

(一)Public IP

Public IP称为公网IP,它是网卡上的真实IP。每个节点在安装Oracle软件之前都需要事先配置Public IP。Oracle通过Public IP对外提供网络服务。如果RAC中Public IP所在的网卡设备故障,那么该节点将无法继续对外提供服务,所以,建议通过开启操作系统层面的多网卡绑定技术来实现IP Failover。如果是双节点RAC环境,那么需要在tnsnames.ora文件中写入对应两个节点的Public IP、端口号以及通信协议。如果没有开启负载均衡功能(软/硬件),那么当tnsnames.ora文件中第一个ADDRESS对应的主机故障或关机,那么在客户端连接时,Oracle会等待一个网络超时,然后继续连接第二个ADDRSS对应的数据库实例。即使RAC一个节点依然可以对外提供服务,用户每次连接都需要等待几秒钟。网络超时会让用户体验相当不好。所以,在Oracle 10g RAC中VIP(Virtual IP)的出现完美地解决了这个问题。

需要注意的是,这里的Public IP不是云平台上的弹性公网IP(Elastic IP,简称EIP),在云平台上,EIP提供独立的公网IP资源,包括公网IP地址与公网出口带宽服务。可以与弹性云服务器、裸金属服务器、虚拟IP、弹性负载均衡、NAT网关等资源灵活地绑定及解绑。一个弹性公网IP只能绑定一个云资源使用。

使用EIP就可以连接到公共的网络资源,该IP是对外开放的IP,是属于收费的内容。

(二)Private IP

对于Oracle集群来说,私网通信是非常重要的,因为节点和节点之间的通信绝大部分都是要通过私网来实现的。私网通信基本上可以分为两种:第一种是集群层面之间的通信;第二种是数据库实例之间的通信。第一种通信(例如:节点间的网络心跳)的主要特点是持续存在、实时性要求高,但是数据量比较小,所以通过TCP/IP协议传递就可以了。第二种通信是缓存融合(Cache Fusion)造成的实例之间的数据传输,其特点是数据量很大,而且速度要求非常高,TCP/IP协议此时已经不能满足要求了,所以需要使用UDP或者RDS,同时Oracle也一直建议用户对集群的私网进行高可用性和负载均衡的配置。

与Public IP一样,Private IP称为私网IP或心跳IP,它也是网卡上的真实IP,每个节点在安装Oracle集群软件之前都需要事先配置Private IP。Private IP用于集群间多节点心跳同步和Cache Fusion等任务,在Oracle 12c中还需要担任Flex ASM的任务。当然,如果不设置Private IP而是由Public IP也可以去完成这些任务。但是,这样做只会使Public IP所在网卡负载过大,一旦网卡设备发生故障,集群将会分裂踢出掉一部分节点保证一致性,使RAC性能不稳定。从Oracle 11g开始,都需要配置Private IP。

对于Oracle 10g和11gR1版本的集群,Oracle并不提供私网的高可用性和负载均衡特性,而是建议用户在操作系统层面配置(例如Linux bonding、AIX etherchannel等),从而开启操作系统层面的多网卡绑定技术实现IP Failover。从Oracle 11.2.0.2版本开始推出的HAIP技术提供了私网的高可用性和负载均衡特性,从而替代了操作系统层面的网卡绑定技术,功能更强大更兼容,但是HAIP的bug较多,在云平台上安装rac,一般会禁用掉HAIP。

(三)Virtual IP(VIP)

VIP是Oracle 10g RAC的新特性,称为虚拟IP。VIP是在Public IP所在的网卡上由Oracle集群软件虚拟出来的一个IP,需要和Public IP设置在同一个子网网段中。Oracle集群软件安装之前只需定义好(/etc/hosts文件)即可,而无需事先配置。在正常情况下,VIP和Public IP的功能是一模一样的。后台进程PMON对每个节点的VIP所在的监听器注册实例信息,本地监听器中会看到两个地址host,一个是Public IP,一个是VIP。当节点故障时,Oracle集群软件会把VIP自动飘逸到其它节点上,但是本地监听器却没有飘逸到其它节点上。客户端tnsnames.ora文件中host选项不再需要配置Public IP而选择配置VIP,这样做的好处是在双节点RAC架构中当第一个节点故障时,第二个节点会有两个VIP,客户端连接第一个VIP失败后会立即连接第二个VIP对应的实例,整个切换过程是非常短暂的,用户完全感受不到RAC架构中有节点故障。整个连接过程可以说对用户是透明了。但是并非真正意义上的透明,用户还是可以知道整个RAC架构是由多少个节点组成,所以,Oracle 11g RAC中推出了SCAN IP的新概念,可以实现对用户连接的透明性,用户不再需要知道整个RAC架构中是由多少个节点组成的。

VIP的特点:

(1)VIP是通过VIPCA脚本创建的。

(2)VIP作为Nodeapps类型的CRS Resource注册到OCR中,并由CRS维护状态。

(3)VIP会绑定到节点的Public网卡上,故Public网卡有两个地址。

(4)当某个节点发生故障时,CRS会把故障节点的VIP转移到其它节点上。

(5)每个节点的LISTENER会同时监听Public网卡上的Public IP和VIP。

(6)客户端的tnsnames.ora一般会配置指向节点的VIP。

可以使用如下命令让节点1的VIP强制漂移到节点2上去:

crsctl relocate resource ora.raclhr-11gr2-n1.vip -n raclhr-11gR2-N2 -f

以下命令针对Oracle 11g版本之前:

crs_relocate ora.lhr-11gr2-rac1.vip -c lhr-11gR2-rac2 -f

(四)SCAN IP

从Oracle 11gR2 RAC开始引入SCAN(Single Client Access Name,集群的单客户端访问名称)IP的概念,相当于在客户端和数据库之间增加一层虚拟的网络服务层,即是SCAN IP和SCAP IP LISTENER。在客户端的tnsnames.ora配置文件中,只需要配置SCAN IP,然后用户即可访问数据库,并且实现了负载均衡的功能。客户端通过SCAN IP、SCAN IP LISTENER来负载均衡地连接到RAC数据库。同之前各版本的RAC相比,使用SCAN IP的好处就是,当后台RAC数据库添加、删除节点时,客户端配置信息无需修改。SCAN提供一个域名来访问RAC,域名可以解析1个到3个(注意,最多3个)SCAN IP,可以通过DNS、GNS或/etc/hosts文件来解析实现。需要注意的是,SCAN IP、VIP和Public IP必须属于同一子网。

SCAN监听器可以监听到集群中运行的所有数据库,它是实现SCAN负载均衡的原理所在。SCAN监听器跟着SCAN VIP随机分配到节点服务器上,如果某个节点发生故障,那么运行在此节点上的SCAN VIP会进行漂移,这时候SCAN监听器也跟着漂移到正常的节点上,继续为SCAN VIP监听连接请求。当PMON进程下次动态更新实例信息到该SCAN监听器之后,它又重新接收客户端的连接。这和VIP产生漂移的时候是有所区别的。

要使用SCAN IP来连接rac数据库,并且实现负载均衡的功能,那么需要在数据库中配置参数remote_listener:

alter system set remote_listener='raclhr-19c-scan:1521' sid='*';

其中,raclhr-19c-scan是集群的scan名称。

通过设置这个参数,任何数据库实例都会向SCAN监听器注册,主要用于注册远程数据库实例,所以SCAN监听器能够负载均衡地分发连接请求到节点本地监听器上,也就是连接到其本地节点上实例上。

scan监听器的监听状态如下:

[root@raclhr-19c-n1 ~]# lsnrctl status LISTENER_SCAN1

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 02-MAR-2021 15:06:21

Copyright (c) 1991, 2019, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN1)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER_SCAN1
Version                   TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date                02-MAR-2021 09:54:36
Uptime                    0 days 5 hr. 11 min. 45 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/19.3.0/grid/network/admin/listener.ora
Listener Log File         /u01/app/grid/diag/tnslsnr/raclhr-19c-n1/listener_scan1/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER_SCAN1)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.59.56)(PORT=1521)))
Services Summary...
Service "86b637b62fdf7a65e053f706e80a27ca" has 2 instance(s).
  Instance "rac19c1", status READY, has 1 handler(s) for this service...
  Instance "rac19c2", status READY, has 1 handler(s) for this service...
Service "9188f464f9113646e053343ba8c0fe51" has 2 instance(s).
  Instance "rac19c1", status READY, has 1 handler(s) for this service...
  Instance "rac19c2", status READY, has 1 handler(s) for this service...
Service "pdblhr1" has 2 instance(s).
  Instance "rac19c1", status READY, has 1 handler(s) for this service...
  Instance "rac19c2", status READY, has 1 handler(s) for this service...
Service "rac19c" has 2 instance(s).
  Instance "rac19c1", status READY, has 1 handler(s) for this service...
  Instance "rac19c2", status READY, has 1 handler(s) for this service...
Service "rac19cXDB" has 2 instance(s).
  Instance "rac19c1", status READY, has 1 handler(s) for this service...
  Instance "rac19c2", status READY, has 1 handler(s) for this service...
Service "rac19c_CFG" has 2 instance(s).
  Instance "rac19c1", status READY, has 1 handler(s) for this service...
  Instance "rac19c2", status READY, has 1 handler(s) for this service...
The command completed successfully

接下来做负载均衡测试:

[root@raclhr-19c-n2 ~]# more lhr_load_banlance.sh 
#!/bin/bash  
for i in {1..100}
do
echo $i
sqlplus -S "sys/lhr@192.168.59.56/rac19c as sysdba" <<EOF
select instance_name from v\$instance;
EOF
done
exit 0
EOF
[root@raclhr-19c-n2 ~]# chmod +x lhr_load_banlance.sh
[root@raclhr-19c-n2 ~]# ./lhr_load_banlance.sh > a.txt
[root@raclhr-19c-n2 ~]# more a.txt | grep rac19c1 | wc -l
42
[root@raclhr-19c-n2 ~]# more a.txt | grep rac19c2 | wc -l 
58

可以看到,通过SCAN IP基本上是负载均衡的连接到rac的2个节点上。

(五)GNS VIP

GNS VIP是Oracle 11g RAC新特性。在传统RAC架构中,Public IP、Private IP、Virtual IP、SCAN IP都是预先配好的。如果开启了GNS服务只需要预先配置Public IP、Private IP即可,Virtual IP、SCAN IP都是由GNS服务从DHCP服务器动态获取的。配置GNS服务需要事先配置DNS和DHCP服务,GNS VIP可以绑定在任意一个节点的Public网卡上来实现GNS服务,如果没有配置GNS服务就不需要配置GNS VIP。配置起来相对传统架构来说复杂一些,所以,在Oracle 11g RAC架构中很少会看到GNS VIP。12c Flex Cluster架构必须配置GNS VIP。

(六)HAIP(Highly Available IP)

在Oracle 11.2.0.2之前,私网的冗余一般是通过在OS上做网卡绑定(如Bond等)来实现的,从Oracle 11.2.0.2版本开始推出HAIP(Highly Available IP)技术替代了操作系统层面的网卡绑定技术,功能更强大、更兼容。HAIP通过其提供的独特的169.254.*网段的IP地址实现集群内部链接的高可用及负载均衡。所以,在11.2.0.2或更高版本安装RAC的时候需要注意169.254.*的IP地址不能被占用。有了HAIP技术则可以不再需要借助任何第三方的冗余技术来实现私网网卡的冗余。

资源ora.cluster_interconnect.haip将会启动一个到四个本地HAIP地址附在Private网络适配器上(私网网卡)。通过HAIP完成Oracle RAC和ASM等内部通讯。如果某一个私有网卡物理损坏,那么该网卡上的HAIP地址会漂移到其它的可用的私有网络上。多个私网网卡可以在安装阶段定义,也可以在GRID配置完成之后,通过调用$GRID_HOME/bin/oifcfg setif工具(命令为:oifcfg setif -global eth2/192.168.1.0:cluster_interconnect)来配置HAIP。

HAIP的个数取决于GRID激活的私网网卡的个数。如果只有1块私网网卡,那么GRID将会创建1个HAIP。如果有两块私网网卡,那么GRID将会创建两个HAIP。若超过两块私网网卡则GRID创建4个HAIP。GRID最多支持4块私网网卡,而集群实际上使用的HAIP地址数则取决于集群中最先启动的节点中激活的私网网卡数目。如果选中更多的私网网卡作为Oracle的私有网络,那么多余4个的不能被激活。

管理ora.cluster_interconnect.haip这个资源的是ohasd.bin进程,其对应的log位于$GRID_HOME/log/$HOSTNAME/ohasd/ohasd.log以及$GRID_HOME/log/$HOSTNAME/agent/ohasd/orarootagent_root/orarootagent_root.log这两个位置。需要注意的是,从Oracle 12c开始,集群的告警日志已经归于ADR中,目录位置在$GRID_BASE/diag/$HOSTNAME/crs/trace中,可以使用adrci命令来查看:

[root@raclhr-19c-n1 ~]# adrci

ADRCI: Release 19.0.0.0.0 - Production on Tue Mar 2 15:31:08 2021

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

ADR base = "/u01/app/grid"
adrci> show home
ADR Homes: 
diag/asmcmd/user_oracle/raclhr-19c-n1
diag/asmcmd/user_grid/raclhr-19c-n1
diag/kfod/raclhr-19c-n1/kfod
diag/tnslsnr/raclhr-19c-n1/listener
diag/tnslsnr/raclhr-19c-n1/listener_scan2
diag/tnslsnr/raclhr-19c-n1/asmnet1lsnr_asm
diag/tnslsnr/raclhr-19c-n1/listener_scan3
diag/tnslsnr/raclhr-19c-n1/listener_scan1
diag/asm/+asm/+ASM1
diag/rdbms/_mgmtdb/-MGMTDB
diag/clients/user_root/host_4079108462_110
diag/clients/user_grid/host_4079108462_110
diag/crs/raclhr-19c-n1/crs

[root@raclhr-19c-n1 trace]# pwd
/u01/app/grid/diag/crs/raclhr-19c-n1/crs/trace
[root@raclhr-19c-n1 trace]# ll *ohasd*
-rw-rw---- 1 root oinstall  1358974 Mar  2 15:32 ohasd_cssdagent_root.trc
-rw-rw---- 1 root oinstall   262948 Mar  2 15:32 ohasd_cssdagent_root.trm
-rw-rw---- 1 root oinstall  1323737 Mar  2 15:32 ohasd_cssdmonitor_root.trc
-rw-rw---- 1 root oinstall   256254 Mar  2 15:32 ohasd_cssdmonitor_root.trm
-rw-rw---- 1 grid oinstall  2213526 Mar  2 15:32 ohasd_oraagent_grid.trc
-rw-rw---- 1 grid oinstall   405923 Mar  2 15:32 ohasd_oraagent_grid.trm
-rw-rw---- 1 root oinstall 17569942 Mar  2 15:32 ohasd_orarootagent_root.trc
-rw-rw---- 1 root oinstall  2998382 Mar  2 15:32 ohasd_orarootagent_root.trm
-rw-rw---- 1 root oinstall  7550545 Mar  2 15:32 ohasd.trc
-rw-rw---- 1 root oinstall  1170542 Mar  2 15:32 ohasd.trm

在HAIP资源online以后,通过操作系统命令ifconfig -a就能查看到多了类似于eth1:1的虚拟网卡,HAIP地址为169.254.X.X。当然也可以在数据库级别通过GV$CLUSTER_INTERCONNECTS视图查看HAIP的地址。HAIP对应的地址由系统自动分配,无法由用户手工进行指定。

SQL> select * from GV$CLUSTER_INTERCONNECTS;

   INST_ID NAME            IP_ADDRESS                                     IS_ SOURCE                              CON_ID
---------- --------------- ---------------------------------------------- --- ------------------------------- ----------
         2 ens37:1         169.254.12.150                                 NO                                           0
         1 ens37:1         169.254.15.64                                  NO                                           0

Oracle数据库和ASM实例可以通过HAIP来实现私网通讯的高可用性和负载均衡。私网的流量会在这些私网网卡上实现负载均衡,如果某个网卡出现了故障,它上面的HAIP会自动切换到别的可用的私网网卡上,从而不影响私网的通讯。Windows平台目前不支持HAIP技术。

但是,在有些客户环境下,私网是通过VLAN划出来的,而出于网络管理要求,VLAN的IP地址与网卡必须是绑定的,私网IP也必须是固定的IP地址(虽然按Oracle RAC的安装要求,私网应该是独立隔离的网络),这时HAIP会无法分配,导致依赖它的ASM资源无法启动。HAIP存在不少Bug,若不幸碰到,则可以将HAIP功能禁用掉。麦老师目前已经碰到过2次了,而且查原因查了很久,惭愧啊。

如果用户使用的是操作系统级别的绑定或者没有使用私网的绑定,那么可以通过在RDBMS和ASM的参数文件中设置cluster_interconnect指定私网地址将HAIP覆盖(如果有多个私网地址,请用英文冒号分隔)。虽然说HAIP本身依然存在,但是ASM实例和RDBMS实例以后就不会使用HAIP。

-- 修改DB参数
alter system set cluster_interconnects="192.168.2.52" scope=spfile sid='rac19c1';
alter system set cluster_interconnects="192.168.2.53" scope=spfile sid='rac19c2';

-- 修改ASM参数
alter system set cluster_interconnects="192.168.2.52" scope=spfile sid='+ASM1';
alter system set cluster_interconnects="192.168.2.53" scope=spfile sid='+ASM2';


-- 重启集群
crsctl stop has -f
crsctl start has


-- DB和ASM查询
SQL> select * from GV$CLUSTER_INTERCONNECTS;

   INST_ID NAME            IP_ADDRESS                                     IS_ SOURCE                              CON_ID
---------- --------------- ---------------------------------------------- --- ------------------------------- ----------
         2 ens37           192.168.2.53                                   NO  cluster_interconnects parameter          0
         1 ens37           192.168.2.52                                   NO  cluster_interconnects parameter          0

禁用HAIP

除了上边修改cluster_interconnect参数外,我们也可以选择禁用HAIP。在禁用HAIP后,ASM和DB默认使用私网的网卡地址。禁用HAIP的步骤如下所示。

使用root用户执行以下命令。

1、停止所有节点的CRS

crsctl stop crs

2、依次在每个节点中执行以下命令(节点1执行完毕以下所有命令后再在节点2执行)

crsctl start crs -excl -nocrs
crsctl stop res ora.asm -init
crsctl modify res ora.cluster_interconnect.haip -attr "ENABLED=0" -init
crsctl modify res ora.asm -attr "START_DEPENDENCIES='hard(ora.cssd,ora.ctssd)pullup(ora.cssd,ora.ctssd)weak(ora.drivers.acfs)',STOP_DEPENDENCIES='hard(intermediate:ora.cssd)'" -init
crsctl stop crs

说明,ora.cluster_interconnect.haip的ENABLED属性的原始值为1:

ENABLED=1

ora.asm资源的START_DEPENDENCIES和STOP_DEPENDENCIES的原始值为:

START_DEPENDENCIES=hard(ora.cssd,ora.ctssd)pullup(ora.cssd,ora.ctssd)weak(ora.cluster_interconnect.haip,ora.drivers.acfs)
STOP_DEPENDENCIES=hard(intermediate:ora.cssd,shutdown:ora.cluster_interconnect.haip)

3、依次在每个节点启动CRS

crsctl start crs

4、检查HAIP是否禁用

crsctl stat res -t -init

若ora.cluster_interconnect.haip为offline则为禁用状态。

ora.cluster_interconnect.haip
      1        ONLINE  OFFLINE                               STABLE

然后执行如下命令:

ifconfig -a 或ip a |grep 169.254

查看是否还有169.254开头的地址,如果没有了,那么说明已经禁用成功。

下面给出查看资源的属性值的命令:

[root@rac2 ~]# crsctl stat res ora.cluster_interconnect.haip  -p -init | grep ENABLED
ENABLED=0
[root@rac2 ~]# crsctl stat res ora.asm  -p -init | grep START_DEPENDENCIES
START_DEPENDENCIES=hard(ora.cssd,ora.ctssd)pullup(ora.cssd,ora.ctssd)weak(ora.drivers.acfs)
[root@rac2 ~]# 
[root@rac2 ~]# crsctl stat res ora.asm  -p -init | grep STOP_DEPENDENCIES 
STOP_DEPENDENCIES=hard(intermediate:ora.cssd)

若启用HAIP,则过程和禁用的过程一致,其主要修改命令如下:

crsctl modify res ora.cluster_interconnect.haip -attr "ENABLED=1" -init
crsctl modify res ora.asm -attr "START_DEPENDENCIES='hard(ora.cssd,ora.ctssd)pullup(ora.cssd,ora.ctssd)weak(ora.cluster_interconnect.haip,ora.drivers.acfs)',STOP_DEPENDENCIES='hard(intermediate:ora.cssd,shutdown:ora.cluster_interconnect.haip)'" -init

说明:

有关RAC中IP的更多内容可以参考:

http://blog.itpub.net/26736162/viewspace-2141223/
http://blog.itpub.net/26736162/viewspace-2132596/
http://blog.itpub.net/26736162/viewspace-2157362/
http://blog.itpub.net/26736162/viewspace-2157364/
http://blog.itpub.net/26736162/viewspace-2157372/

About Me


● 本文作者:小麦苗,部分内容整理自网络,若有侵权请联系小麦苗删除
● 本文在个人微 信公众号(DB宝)上有同步更新
● QQ群号: 230161599 、618766405,微信群私聊
● 个人QQ号(646634621),微 信号(db_bao),注明添加缘由
● 于 2021年3月 在西安完成
● 最新修改时间:2021年3月
● 版权所有,欢迎分享本文,转载请保留出处


●小麦苗的微店: https://weidian.com/?userid=793741433
●小麦苗出版的数据库类丛书: http://blog.itpub.net/26736162/viewspace-2142121/
●小麦苗OCP、OCM、高可用、DBA学习班(Oracle、MySQL、NoSQL): http://blog.itpub.net/26736162/viewspace-2148098/
●数据库笔试面试题库及解答: https://mp.weixin.qq.com/s/Vm5PqNcDcITkOr9cQg6T7w


使用微信客户端扫描下面的二维码来关注小麦苗的微信公众号(DB宝)及QQ群(DBA宝典)、添加小麦苗微信, 学习最实用的数据库技术。
小麦苗信息


  • 0
    点赞
  • 0
    评论
  • 6
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 猿与汪的秘密 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值