keepalived群集部署

目录

简介

1、VRRP协议介绍:

2、VRRP选举机制

3、VRRP工作过程

4、VRRP的特点

keepalive工作原理

keepalived部署

拓扑图                   

3、keepalive热备部署

3-1、安装httpd1服务器

4、配置 keepalive

VRRP实例定义块

5、配置keepalive实例

6、启动keepalived服务器

7、查看地址

8、httpd2配置

验证与故障测试


本文章目的:

学习如何构建高可用群集

本文章重点:

vrrp协议工作原理

keepalive应用环境

keepalive安装部署

keepalive配置

  • 简介

Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。

keepalived是一个类似于我们平时说的第3层、第 4层和第5层交换机制的软件。

Layer3,4,5工作在IP/TCP协议栈的IP层,TCP层,及应用层,原理分别如下:

Layer3:Keepalived使用Layer3的方式工作式时,Keepalived会定期向服务器群中的服务器发送一个ICMP的数据包(既我们平时用的Ping程序),如果发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。Layer3的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。

Layer4:如果您理解了Layer3的方式,Layer4就容易了。Layer4主要以TCP端口的状态来决定服务器工作正常与否。如web server的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除

Layer5:Layer5对指定的URL执行HTTP GET。然后使用MD5算法对HTTP GET结果进行求和。如果这个总数与预期值(在网络上占用的带宽也要大一些。Keepalived将根据用户的设定检查服务器程序的运行是否正常,如果与用户的设定不相符)不符,那么测试是错误的,服务器将从服务器池中移除。该模块对同一服务实施多URL获取检查。如果您使用承载多个应用程序服务器的服务器,则此功能很有用。此功能使您能够检查应用程序服务器是否正常工作。MD5摘要是使用genhash实用程序(包含在keepalived软件包中)生成的。

  • keepalived工作原理

Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点。

后来Keepalived又加入了VRRP的功能,VRRP(VritrualRouterRedundancyProtocol,虚拟路由冗余协议)出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行,因此Keepalvied一方面具有服务器状态检测和故障隔离功能,另外一方面也有HAcluster功能。

健康检查和失败切换是keepalived的两大核心功能。所谓的健康检查,就是采用tcp三次握手,icmp请求,http请求,udp echo请求等方式对负载均衡器后面的实际的服务器(通常是承载真实业务的服务器)进行保活;而失败切换主要是应用于配置了主备模式的负载均衡器,利用VRRP维持主备负载均衡器的心跳,当主负载均衡器出现问题时,由备负载均衡器承载对应的业务,从而在最大限度上减少流量损失,并提供服务的稳定性。

1、VRRP协议介绍:

网络在设计的时候必须考虑到冗余容灾,包括线路冗余,设备冗余等,防止网络存在单点故障,那在路由器或三层交换机处实现冗余就显得尤为重要。在网络里面有个协议就是来做这事的,这个协议就是VRRP协议,Keepalived就是巧用VRRP协议来实现高可用性(HA)的发生。

keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy [rɪˈdʌndənsi]:过劳、累赘 Protocol,即虚拟路由冗余协议。

虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。

 

虚拟路由器:虚拟路由器是VRRP备份组中所有路由器的集合,它是一个逻辑概念,并不是正真存在的。从备份组外面看备份组中的路由器,感觉组中的所有路由器就像一个一样,可以理解为在一个组中:主路由器+所有备份路由器=虚拟路由器。虚拟路由器有一个虚拟的IP地址和MAC地址。主机将虚拟路由器当作默认网关。虚拟MAC地址的格式为00-00-5E-00-01-{VRID}。通常情况下,虚拟路由器回应ARP请求使用的是虚拟MAC地址,只有虚拟路由器做特殊配置的时候,才回应接口的真实MAC地址。

主路由器(MASTER):虚拟路由器通过虚拟IP对外提供服务,而在虚拟路由器内部同一时间只有一台物理路由器对外提供服务,这台提供服务的物理路由器被称为主路由器。一般情况下Master是由选举算法产生,它拥有对外服务的虚拟IP,提供各种网络功能,如:ARP 请求,ICMP数据转发等。

备份路由器(BACKUP):虚拟路由器中的其他物理路由器不拥有对外的虚拟IP,也不对外提供网络功能,仅接受MASTER的VRRP状态通告信息,这些路由器被称为备份路由器。当主路由器失败时,处于BACKUP角色的备份路由器将重新进行选举,产生一个新的主路由器进入MASTER角色, 继续提供对外服务,整个切换对用户来说是完全透明的。

2、VRRP选举机制

VRRP路由器在运行过程中有三种状态:

  1. Initialize [ɪˈnɪʃəlaɪz]:初始化状态:系统启动后就进入Initialize,此状态下路由器不对VRRP报文做任何处理;
  2. Master状态;

3)Backup状态;

一般主路由器处于Master状态,备份路由器处于Backup状态。

VRRP使用选举机制来确定路由器的状态,优先级选举:

1.VRRP组中IP拥有者。如果虚拟IP地址与VRRP组中的某台VRRP路由器IP地址相同,则此路由器为IP地址拥有者,这台路由器将被定位主路由器。

2.比较优先级。如果没有IP地址拥有者,则比较路由器的优先级,优先级的范围是0~255,优先级大的作为主路由器

3.比较IP地址。在没有IP地址拥有者和优先级相同的情况下,IP地址大的作为主路由器。

如下图所示,虚拟IP为10.1.1.254,在VRRP组中没有IP地址拥有者,则比较优先级,很明显RB和RA的优先级要大于RC,则比较RA和RB的IP地址,RB的IP地址大。所以RB为组中的主路由器。

3、VRRP工作过程

路由器使用VRRP功能后,会根据优先级确定自己在备份组中的角色。优先级高的路由器成为Master路由器,优先级低的成为Backup路由器。Master拥有对外服务的虚拟IP,提供各种网络功能,并定期发送VRRP报文,通知备份组内的其他设备自己工作正常;Backup路由器只接收Master发来的报文信息,用来监控Master的运行状态。当Master失效时,Backup 路由器进行选举,优先级高的Backup将成为新的Master 。

在抢占方式下,当Backup路由器收到VRRP报文后,会将自己的优先级与报文中的优先级进行比较。如果大于通告报文中的优先级,则成为Master路由器;否则将保持Backup状态;

在非抢占方式下,只要Master路由器没有出现故障,备份组中的路由器始终保持Master或Backup状态,Backup路由器即使随后被配置了更高的优先级也不会成为Master路由器;

如果Backup路由器的定时器超时后仍未收到Master路由器发送来的VRRP报文,则认为Master路由器已经无法正常工作,此时Backup路由器会认为自己是Master路由器,并对外发送VRRP报文。备份组内的路由器根据优先级选举出Master路由器,承担报文的转发功能。

4、VRRP的特点

  1. VRRP是用来实现路由器冗余的协议。

2)VRRP协议是为了消除在静态缺省路由环境下路由器单点故障引起的网络失效而设计的主备模式的协议,使得发生故障而进行设计设备功能切换时可以不影响内外数据通信,不需要再修改内部网络的网络参数。

  1. VRRP协议需要具有IP备份,优先路由选择,减少不必要的路由器通信等功能。

4)VRRP协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器IP(一个或多个)。然而,在路由器组内部,如果实际拥有这个对外IP的路由器如果工作正常的话,就是master,或者是通过算法选举产生的,MASTER实现针对虚拟路由器IP的各种网络功能,如ARP请求,ICMP,以及数据的转发等,其他设备不具有该IP,状态是 BACKUP。除了接收MASTER的VRRP状态通告信息外,不执行对外的网络功能,当主级失效时,BACKUP将接管原先MASTER的网络功能。

5)VRRP协议配置时,需要配置每个路由器的虚拟路由ID(VRID)和优先权值,使用VRID将路由器进行分组,具有相同VRID值的路由器为同一个组,VRID是一个0-255的整数;同一个组中的路由器通过使用优先权值来选举MASTER,优先权大者为MASTER,优先权也是一个0-255 的正整数。

keepalive工作原理

Keepalived对服务器运行状态和故障隔离的工作原理:

Keepalived工作在TCP/IP参考模型的三层、四层、五层(物理层,链路层):

网络层(3):Keepalived 通过ICMP协议向服务器集群中的每一个节点发送一个ICMP数据包(有点类似与Ping的功能),如果某个节点没有返回响应数据包,那么认为该节点发生了故障,Keepalived将报告这个节点失效,并从服务器集群中剔除故障节点。

传输层(4):Keepalived 在传输层里利用了TCP协议的端口连接和扫描技术来判断集群节点的端口是否正常,比如对于常见的WEB服务器80端口。或者SSH服务22端口,Keepalived 一旦在传输层探测到这些端口号没有数据响应和数据返回,就认为这些端口发生异常,然后强制将这些端口所对应的节点从服务器集群中剔除掉。

应用层(5):Keepalived的运行方式也更加全面化和复杂化,用户可以通过自定义Keepalived工作方式,例如:可以通过编写程序或者脚本来运行Keepalived,而Keepalived将根据用户的设定参数检测各种程序或者服务是否正常,如果Keepalived的检测结果和用户设定的不一致时,Keepalived将把对应的服务器从服务器集群中剔除。

  • keepalived部署

  1. 拓扑图                   

基本配置 

服务器名

安装软件

ip 地址

httpd1

httpd1+keepalive

192.168.6.10

群集 ip:192.168.6.254

httpd2

httpd2+keepalive

192.168.6.20

群集 ip:192.168.6.254

3、keepalive热备部署

3-1、安装httpd1服务器

配置IP地址:192.168.6.10

安装httpd服务

[root@localhost ~]# mount /dev/cdrom /media/

[root@localhost ~]# rm -rf /etc/yum.repos.d/*

[root@localhost ~]# vim /etc/yum.repos.d/yum.repo

[yum]

baseurl=file:///media

enabled=1

gpgcheck=0

[root@localhost ~]# yum -y install httpd

创建测试页面:

[root@localhost ~]# vim /var/www/html/index.html

哈哈

[root@localhost ~]# systemctl restart httpd

3-2、在httpd1安装keepalive

[root@localhost ~]# yum -y install keepalived

4、配置 keepalive

一个功能比较完整的keepalived配置文件,其配置文件keepalived.conf可以包含三个文本块:全局定义块、VRRP实例定义块及虚拟服务器定义块。

全局定义块和虚拟服务器定义块是必须的,如果在只有一个负载均衡器的场合,就不须VRRP实例定义块。

[root@localhost ~]# vim /etc/keepalived/keepalived.conf

global_defs { #全局定义块

   notification_email {

     acassen@firewall.loc

     failover@firewall.loc

     sysadmin@firewall.loc

   }

   notification_email_from Alexandre.Cassen@firewall.loc

   smtp_server 192.168.200.1

   smtp_connect_timeout 30

   router_id LVS_DEVEL-r1

}

vrrp_instance VI_1 { #VRRP实例定义块

    state MASTER

    interface ens33

    virtual_router_id 51

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.6.254

    }

}

virtual_server 192.168.6.254 80 { #虚拟服务器定义块

    delay_loop 6

    lb_algo rr(可以是rr|wrr|lc|wlc|sh|dh|lblc

    lb_kind NAT(可以是NAT|DR|TUN

    nat_mask 255.255.255.0

    persistence_timeout 50

    protocol TCP

    real_server 192.168.6.20 80 {

        weight 1

        TCP_CHECK { #TCP服务的健康检查方式

            connect_port 80 #健康检查的服务端口

            connect_timeout 3 #连接超时时间

            nb_get_retry 3

            delay_before_retry 3

        }

    }

real_server 192.168.6.30 80 {

        weight 1

        TCP_CHECK {

            connect_port 80

            connect_timeout 3

            nb_get_retry 3

            delay_before_retry 3

        }

    }

}

real_server 192.168.200.2 1358 {

        weight 1

        HTTP_GET { (HTTP_GET|SSL_GET) #定义http和https的检查方式

            url {

              path /testurl/test.jsp #http服务检查的默认路径

              digest 640205b7b0fc66c1ea91c463fac6334d #https检查后的摘要信息

  status_code num #http检查的返回状态码

            }

            url {

              path /testurl2/test.jsp

              digest 640205b7b0fc66c1ea91c463fac6334d

            }

            url {

              path /testurl3/test.jsp

              digest 640205b7b0fc66c1ea91c463fac6334d

            }

            connect_timeout 3

            nb_get_retry 3 #设置重连次数

            delay_before_retry 3 #重连间隔时间

        }

    }

real_server @IP PORT {

weight num

SMTP_CHECK { #SMTP 服务的健康检查方式

host {

connect_ip <IP ADDRESS> #健康检查的服务端口

connect_port <PORT> #健康检查的服务端口

bindto <IP ADDRESS> #以此地址发送请求对服务器端进行健康检查

}

connect_timeout <INTEGER> #连接超时时间

retry <INTEGER> #设置重连次数

delay_before_retry <INTEGER> #重连间隔时间

helo_name <STRING>|<QUOTED-STRING #smtp helo请求命令的参数

}

}

4-1、全局定义块

1)email通知

作用:有故障,发邮件报警。这是可选项目,建议不用,用nagios全面监控代替之。

2) notification_email_from email:

作用:指定邮件的发送人

3) smtp_server host

作用:这里是指定邮件服务器地址

4) smtp_connect_timeout num

作用:设置与邮件服务器连接的超时时长

5) router_id my_hostname

作用:设置 vrrp 路由器的id,用来标识路由器本身

6) 花括号“{}”

用来分隔定义块,因此必须成对出现。如果写漏了,keepalived运行时,不会得到预期的结果。由于定义块内存在嵌套关系,因此很容易遗漏结尾处的花括号,这点要特别注意。

  1. VRRP实例定义块

1)同步vrrp组vrrp_sync_group。

作用:确定失败切换(FailOver)包含的路由实例个数。即在有2个负载均衡器的场景,一旦某个负载均衡器失效,需要自动切换到另外一个负载均衡器的实例是哪些?

2)实例组group.至少包含一个vrrp实例。

3)Vrrp实例vrrp_instance.实例名出自实例组group所包含的那些名字。

(1)实例状态state

只有MASTER和BACKUP两种状态,并且需要大写这些单词。其中MASTER为工作状态,BACKUP为备用状态。当MASTER所在的服务器失效时,BACKUP所在的系统会自动把它的状态有BACKUP变换成MASTER;当失效的MASTER所在的系统恢复时,BACKUP从MASTER恢复到BACKUP状态。

(2)通信接口interface

对外提供服务的网络接口,如ens33、ens37。当前主流的服务器都有2个或2个以上的接口,在选择服务接口时,一定要核实清楚。

(3)lvs_sync_daemon_inteface

负载均衡器之间的监控接口,类似于HA HeartBeat的心跳线。但它的机制优于Heartbeat,因为它没有“裂脑”这个问题,它是以优先级这个机制来规避这个麻烦的。在DR模式中, lvs_sync_daemon_inteface与服务接口interface使用同一个网络接口。

(4)虚拟路由标识virtual_router_id

这个标识是一个数字,范围为0-255,并且同一个vrrp实例使用唯一的标识。即同一个vrrp_stance,MASTER和BACKUP的virtual_router_id是一致的,同时在整个vrrp内是唯一的。

(5)优先级priority

这是一个数字,数值愈大,优先级越高。在同一个vrrp_instance里,MASTER的优先级高于BACKUP。若MASTER的priority值为150,那么BACKUP的priority只能是140或更小的数值。

(6)同步通知间隔advert_int

MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位为秒,默认为1秒。

(7)验证authentication

包含验证类型和验证密码。类型主要有PASS、AH两种,通常使用的类型为PASS,据说AH使用时有问题。验证密码为明文,同一vrrp实例MASTER与BACKUP使用相同的密码才能正常通信。

4)虚拟ip地址virtual_ipaddress

可以有多个地址,每个地址占一行,不需要指定子网掩码。注意:这个ip必须与我们在lvs客户端设定的vip相一致。

4-3、虚拟服务器virtual_server定义块

虚拟服务器定义是keepalived框架最重要的项目了,是keepalived.conf必不可少的部分。

1). 虚拟服务器virtual_server

这个ip来自于vrrp定义块的第“4”步,后面一个空格,然后加上端口号。定义一个vip,可以实现多个tcp端口的负载均衡功能。

(1)delay_loop

健康检查时间间隔,单位是秒。

(2)lb_algo

负载均衡调度算法,互联网应用常使用wlc或rr。

(3)lb_kind

负载均衡转发规则。一般包括DR,NAT,TUN3种,在我的方案中,都使用DR的方式。

(4)persistence_timeout

会话保持时间,单位是秒。这个选项对动态网站很有用处:当用户从远程用帐号进行登陆网站时,有了这个会话保持功能,就能把用户的请求转发给同一个应用服务器。在这里,我们来做一个假设,假定现在有一个lvs环境,使用DR转发模式,真实服务器有3个,负载均衡器不启用会话保持功能。当用户第一次访问的时候,他的访问请求被负载均衡器转给某个真实服务器,这样他看到一个登陆页面,第一次访问完毕;接着他在登陆框填写用户名和密码,然后提交;这时候,问题就可能出现了—登陆不能成功。因为没有会话保持,负载均衡器可能会把第2次的请求转发到其他的服务器。

(5)转发协议protocol

一般有tcp和udp两种。实话说,我还没尝试过udp协议类的转发。

2).真实服务器real_server

也即服务器池。Real_server的值包括ip地址和端口号。多个连续的真实ip,转发的端口相同,是不是可以以范围表示?需要进一步实验。如写成real_server 61.135.20.1-10 80

(1)权重weight

权重值是一个数字,数值越大,权重越高。使用不同的权重值的目的在于为不同性能的机器分配不同的负载,性能较好的机器,负载分担大些;反之,性能差的机器,则分担较少的负载,这样就可以合理的利用不同性能的机器资源。

(2)Tcp检查tcp_check。

5、配置keepalive实例

[root@localhost ~]# vim /etc/keepalived/keepalived.conf

修改:

global_defs {

   notification_email {

     acassen@firewall.loc

     failover@firewall.loc

     sysadmin@firewall.loc

   }

   notification_email_from Alexandre.Cassen@firewall.loc

   smtp_server 192.168.200.1

   smtp_connect_timeout 30

   router_id LVS_DEVEL-r1

}

vrrp_instance VI_1 {

    state MASTER

    interface ens33

    virtual_router_id 51

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.6.254

    }

}

6、启动keepalived服务器

[root@localhost ~]# systemctl restart keepalived

7、查看地址

[root@localhost ~]# ip addr

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 00:0c:29:ca:c2:39 brd ff:ff:ff:ff:ff:ff

    inet 192.168.6.10/24 brd 192.168.6.255 scope global ens33

       valid_lft forever preferred_lft forever

    inet 192.168.6.254/32 scope global ens33

       valid_lft forever preferred_lft forever

通过以上结果,我们可以看出,网络配置中多出一个192.168.10.254的地址。表示keepalive启动成功。

8、httpd2配置

安装httpd服务器

配置IP地址:192.168.6.30

8-1、安装httpd服务

[root@localhost ~]# mount /dev/cdrom /media/

[root@localhost ~]# rm -rf /etc/yum.repos.d/*

[root@localhost ~]# vim /etc/yum.repos.d/yum.repo

[yum]

baseurl=file:///media

enabled=1

gpgcheck=0

[root@localhost ~]# yum -y install httpd

创建测试页面:

[root@localhost ~]# vim /var/www/html/index.html

222222222

[root@localhost ~]# systemctl restart httpd

  1. 在httpd2安装keepalive

[root@localhost ~]# yum -y install keepalived

配置keepalive

[root@localhost ~]# vim /etc/keepalived/keepalived.conf

修改:

global_defs {

   notification_email {

     acassen@firewall.loc

     failover@firewall.loc

     sysadmin@firewall.loc

   }

   notification_email_from Alexandre.Cassen@firewall.loc

   smtp_server 192.168.200.1

   smtp_connect_timeout 30

   router_id LVS_DEVEL-r2

}

vrrp_instance VI_1 {

    state BACKUP

    interface ens33

    virtual_router_id 51

    priority 90

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }   

    virtual_ipaddress {

        192.168.6.254

    }   

}   

启动 keepalived 服务器

[root@localhost ~]# systemctl restart keepalived

查看地址(backup没有虚拟IP地址

[root@localhost ~]# ip addr

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 00:0c:29:ea:a8:79 brd ff:ff:ff:ff:ff:ff

    inet 192.168.6.20/24 brd 192.168.6.255 scope global ens33

       valid_lft forever preferred_lft forever

我们可以看到并没有获取到192.168.10.254的地址,说明是backup状态,要是也有地址,则表示两台主机之间断线了。

  • 验证与故障测试

  1. 客户端访问

 正常访问群集ip,开启httpd1的页面

断开httpd1的网络,再次访问测试

查看httpd2的IP地址

[root@localhost ~]# ip addr

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 00:0c:29:ea:a8:79 brd ff:ff:ff:ff:ff:ff

    inet 192.168.6.20/24 brd 192.168.6.255 scope global ens33

       valid_lft forever preferred_lft forever

    inet 192.168.6.254/32 scope global ens33

       valid_lft forever preferred_lft forever

我们可以看到httpd2中多了192.168.6.254的群集ip地址。

再次开启httpd1

[root@localhost ~]# systemctl restart network

[root@localhost ~]# systemctl stop firewalld

[root@localhost ~]# setenforce 0

[root@localhost ~]# systemctl restart keepalived

[root@localhost ~]# systemctl restart httpd

[root@localhost ~]# ip addr

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000

    link/ether 00:0c:29:ca:c2:39 brd ff:ff:ff:ff:ff:ff

    inet 192.168.6.10/24 brd 192.168.6.255 scope global ens33

       valid_lft forever preferred_lft forever

    inet 192.168.6.254/32 scope global ens33

       valid_lft forever preferred_lft forever

客户端再次访问,master回来

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值