LVS手册

LVS手册

如何给出合理的框架和有效的设计方法,来建立高性能、高可伸缩、高可用的网络服务,这是

摆在研究者和系统设计者面前极富挑战性的任务。下面文章就是围绕这一任务展开的。

可伸缩网络服务的设计与实现

人类社会正在进入以网络为中心的信息时代,人们需要更快捷、更可靠、功能更丰富的网络服

务。万维网的流行促进互联网使用的指数级增长,现在很多站点收到前所未有的访问负载,经

常担心系统如何被扩展来满足不断增长的性能需求,同时系统如何保持24x7的可用性。未来的

应用将需要更高的吞吐率、更好的交互性、更高的安全性,这要求服务平台具有更强的处理能

力和更高的可用性。所以,如何给出合理的框架和有效的设计方法,来建立高性能、高可伸缩 、

高可用的网络服务,这是摆在研究者和系统设计者面前极富挑战性的任务。本文研究和设计的

可伸缩网络服务便是围绕这一任务展开的。

一、可伸缩网络服务的体系结构

二、 IP

负载均衡技术

三、负载调度

四、 IP

虚拟服务器的实现和性能测试

五、内核中的基于内容请求分发

六、 TCPHA

的设计与实现

一、可伸缩网络服务的体系结构

针对网络服务的可伸缩性、高可用性、可维护性和价格有效性需求,本章给出了可伸缩网络服

务的体系结构和设计方法,它提供了负载平衡、可伸缩性和高可用性。

1、可伸缩网络服务的定义

2、网络服务的需求

3、 LVS 集群的体系结构

4、地理分布 LVS 集群的体系结构

5、小结

1

、可伸缩网络服务的定义

可伸缩性(Scalability)是在当今计算机技术中经常用到的词汇。对于不同的人,可伸缩性有不

同的含义。 现在,我们来定义可伸缩网络服务的含义。

可伸缩网络服务是指网络服务能随着用户数目的增长而扩展其性能,如在系统中增加服务器、

内存或硬盘等;整个系统很容易被扩展,无需重新设置整个系统,无需中断服务。换句话说,

系统管理员扩展系统的操作对最终用户是透明的,他们不会知道系统的改变。

可伸缩系统通常是高可用的系统。在部分硬件(如硬盘、服务器、子网络)和部分软件(如操

作系统、服务进程)的失效情况下,系统可以继续提供服务,最终用户不会感知到整个服务的

中断,除了正在失效点上处理请求的部分用户可能会收到服务处理失败,需要重新提交请求。

Caching和复制是建立高可用系统的常用技术,建立多个副本会导致如何将原件的修改传播到多

个副本上的问题。

实现可伸缩网络服务的方法一般是通过一对多的映射机制,将服务请求流分而治之(Divideand

Conquer)到多个结点上处理。一对多的映射可以在很多层次上存在,如主机名上的DNS 系统、

网络层的TCP/IP、文件系统等。虚拟(Virtual)是描述一对多映射机制的词汇,将多个实体组

成一个逻辑上的、虚拟的整体。例如,虚存(Virtual Memory)是现代操作系统中最典型的一对

多映射机制,虚存建立一个虚拟内存空间,将它映射到多个物理内存上。

2

、网络服务的需求

随着Internet的飞速发展和对我们生活的深入影响,越来越多的个人在互联网上购物、娱乐、休

闲、与人沟通、获取信息;越来越多的企业把他们与顾客和业务伙伴之间的联络搬到互联网上 ,

通过网络来完成交易,建立与客户之间的联系。互联网的用户数和网络流量正以几何级数增长 ,

这对网络服务的可伸缩性提出很高的要求。例如,比较热门的 Web 站点会因为被访问次数急剧

增长而不能及时处理用户的请求,导致用户进行长时间的等待,大大降低了服务质量。另外,

随着电子商务等关键性应用在网上运行,任何例外的服务中断都将造成不可估量的损失,服务

的高可用性也越来越重要。所以,对用硬件和软件方法实现高可伸缩、高可用网络服务的需求

不断增长,这种需求可以归结以下几点:

可伸缩性( Scalability),当服务的负载增长时,系统能被扩展来满足需求,且不降低服务质 量 。

高可用性(Availability),尽管部分硬件和软件会发生故障,整个系统的服务必须是每天24小

时每星期7天可用的。

可管理性(Manageability),整个系统可能在物理上很大,但应该容易管理。

价格有效性(Cost-effectiveness),整个系统实现是经济的、易支付的。

单服务器显然不能处理不断增长的负载。这种服务器升级方法有下列不足:一是升级过程繁琐 ,

机器切换会使服务暂时中断,并造成原有计算资源的浪费;二是越往高端的服务器,所花费的

代价越大;三是一旦该服务器或应用软件失效,会导致整个服务的中断。

通过高性能网络或局域网互联的服务器集群正成为实现高可伸缩的、高可用网络服务的有效结

构。这种松耦合结构比紧耦合的多处理器系统具有更好的伸缩性和性能价格比,组成集群的PC

服务器或RISC服务器和标准网络设备因为大规模生产,价格低,具有很高的性能价格比。但 是 ,

这里有很多挑战性的工作,如何在集群系统实现并行网络服务,它对外是透明的,它具有良好

的可伸缩性和可用性。

针对上述需求,我们给出了基于IP层和基于内容请求分发的负载平衡调度解决方法,并在Linux

内核中实现了这些方法,将一组服务器构成一个实现可伸缩的、高可用网络服务的服务器集群 ,

我们称之为Linux虚拟服务器(LinuxVirtual Server )。在 LVS 集群中,使得服务器集群的结构对

客户是透明的,客户访问集群提供的网络服务就像访问一台高性能、高可用的服务器一样。客

户程序不受服务器集群的影响不需作任何修改。系统的伸缩性通过在服务机群中透明地加入和

删除一个节点来达到,通过检测节点或服务进程故障和正确地重置系统达到高可用性。

3

、 LVS

集群的体系结构

下面先给出 LVS 集群的通用结构,讨论了它的设计原则和相应的特点;然后将 LVS 集群应用于建

立可伸缩的 Web 、Media、Cache和Mail等服务。

3.1、 LVS 集群的通用结构

3.2、可伸缩 Web 和媒体服务

3.3、可伸缩Cache服务

3.4、可伸缩邮件服务

3.1

、 LVS

集群的通用结构

LVS 集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均

衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成

一个高性能的、高可用的虚拟服务器。

图2.1: LVS 集群的体系结构

为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。 LVS 集群的体系结

构如图2.1所示,它有三个主要组成部分:

负载调度器(load balancer),它是整个集群对外面的前端机,负责将客户的请求发送到一组

服务器上执行,而客户认为服务是来自一个IP地址上的。它可以是用IP负载均衡技术的负载

调度器,也可以是基于内容请求分发的负载调度器,还可以是两者的结合。

服务器池(server pool),是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、

FTP和DNS等。

后端存储(backend storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器

池拥有相同的内容,提供相同的服务。

调度器采用IP负载均衡技术、基于内容请求分发技术或者两者相结合。在IP负载均衡技术中,

需要服务器池拥有相同的内容提供相同的服务。当客户请求到达时,调度器只根据负载情况从

服务器池中选出一个服务器,将该请求转发到选出的服务器,并记录这个调度;当这个请求的

其他报文到达,也会被转发到前面选出的服务器。在基于内容请求分发技术中,服务器可以提

供不同的服务,当客户请求到达时,调度器可根据请求的内容和服务器的情况选择服务器执行

请求。因为所有的操作都是在操作系统核心空间中将完成的,它的调度开销很小,所以它具有

很高的吞吐率。

服务器池的结点数目是可变的。当整个系统收到的负载超过目前所有结点的处理能力时,可以

在服务器池中增加服务器来满足不断增长的请求负载。对大多数网络服务来说,结点与结点间

不存在很强的相关性,所以整个系统的性能可以随着服务器池的结点数目增加而线性增长。

后端存储通常用容错的分布式文件系统,如AFS、GFS、Coda和Intermezzo等。分布式文件系统

为各服务器提供共享的存储区,它们访问分布式文件系统就像访问本地文件系统一样。同时,

分布式文件系统提供良好的伸缩性和可用性。然而,当不同服务器上的应用程序同时访问分布

式文件系统上同一资源时,应用程序的访问冲突需要消解才能使得资源处于一致状态。这需要

一个分布式锁管理器(Distributed Lock Manager),它可能是分布式文件系统内部提供的,也可

能是外部的。开发者在写应用程序时,可以使用分布式锁管理器来保证应用程序在不同结点上

并发访问的一致性。

负载调度器、服务器池和分布式文件系统通过高速网络相连,如100Mbps交换机、Myrinet、

CompactNET和Gigabit交换机等。使用高速的网络,主要为避免当系统规模扩大时互联网络成为

瓶颈。

Graphic Monitor是为系统管理员提供整个集群系统的监视器,它可以监视系统中每个结点的状

况。GraphicMonitor是基于浏览器的,所以无论管理员在本地还是异地都可以监测系统的状况 。

为了安全的原因,浏览器要通过HTTPS(SecureHTTP)协议和身份认证后,才能进行系统监 测 ,

并进行系统的配置和管理。

3.1.1、为什么使用层次的体系结构

3.1.2、为什么是共享存储

3.1.3、高可用性

3.1.1

、为什么使用层次的体系结构

层次的体系结构可以使得层与层之间相互独立,允许在一个层次的已有软件在不同的系统中被

重用。例如,调度器层提供了负载平衡、可伸缩性和高可用性等,在服务器层可以运行不同的

网络服务,如 Web 、Cache、Mail和Media等,来提供不同的可伸缩网络服务。

3.1.2

、为什么是共享存储

共享存储如分布式文件系统在这个 LVS 集群系统是可选项。当网络服务需要有相同的内容,共

享存储是很好的选择,否则每台服务器需要将相同的内容复制到本地硬盘上。当系统存储的内

容越多,这种不共享结构(Shared-nothing Structure)的代价越大,因为每台服务器需要一样大

的存储空间,所有的更新需要涉及到每台服务器,系统的维护代价也很高。

共享存储为服务器组提供统一的存储空间,这使得系统的维护工作比较轻松,如Webmaster只需

要更新共享存储中的页面,对所有的服务器都有效。分布式文件系统提供良好的伸缩性和可用

性,当分布式文件系统的存储空间增加时,所有服务器的存储空间也随之增大。对于大多数

Internet服务来说,它们都是读密集型(Read-intensive)的应用,分布式文件系统在每台服务器

使用本地硬盘作Cache(如2Gbytes的空间),可以使得访问分布式文件系统本地的速度接近于访

问本地硬盘。

3.1.3

、高可用性

集群系统的特点是它在软硬件上都有冗余。系统的高可用性可以通过检测节点或服务进程故障

和正确地重置系统来实现,使得系统收到的请求能被存活的结点处理。通常,我们在调度器上

有资源监视进程来时刻监视各个服务器结点的健康状况,当服务器对ICMP ping不可达时或者她

的网络服务在指定的时间没有响应时,资源监视进程通知操作系统内核将该服务器从调度列表

中删除或者失效。这样,新的服务请求就不会被调度到坏的结点。资源监测程序能通过电子邮

件或传呼机向管理员报告故障,一旦监测到服务进程恢复工作,通知调度器将其加入调度列表

进行调度。另外,通过系统提供的管理程序,管理员可发命令随时将一台机器加入服务或切出

服务,很方便进行系统维护。

现在前端的调度器有可能成为系统的单一失效点。为了避免调度器失效导致整个系统不能工作 ,

我们需要设立调度器的备份。两个心跳进程(Heartbeat Daemon)分别在主、从调度器上运行,

它们通过串口线和UDP等心跳线来相互汇报各自的健康情况。当从调度器不能听得主调度器的

心跳时,从调度器会接管主调度器的工作来提供负载调度服务。这里,一般通过ARP欺骗

(GratuitousARP)来接管集群的Virtual IPAddress。当主调度器恢复时,这里有两种方法,一

是主调度器自动变成从调度器,二是从调度器释放Virtual IPAddress,主调度器收回Virtual IP

Address并提供负载调度服务。然而,当主调度器故障后或者接管后,会导致已有的调度信息丢

失,这需要客户程序重新发送请求。

3.2

、可伸缩 Web

和媒体服务

基于 LVS 可伸缩 Web 和媒体服务的体系结构如图2.2所示:在前端是一个负载调度器,一般采用

IP负载均衡技术来获得整个系统的高吞吐率;在第二层是服务器池, Web 服务和媒体服务分别

运行在每个结点上;第三层是数据存储,通过分布式文件系统使得每个服务器结点共享相同的

数据。集群中结点间是通过高速网络相连的。

图2.2:基于 LVS 的可伸缩 Web 和媒体集群

分布式文件系统提供统一的存储空间,这使得系统的维护工作比较方便,且系统运行比较高效 。

当所有服务器结点超载时,管理员可以很快地加入新的结点来处理请求,而无需将 Web 文档等

复制到结点的本地硬盘上。Webmaster可以看到统一的文档存储空间,维护和更新页面比较方 便 ,

对分布式文件系统中页面的修改对所有的服务器都有效。大的媒体文件(如视频文件)分段存

储在分布式文件系统的多个结点上,可以提高文件系统的性能和文件服务器间的负载均衡。

IP负载调度器(即VS/DR方法,将在下一章详细叙述)可以分别将 Web 服务和媒体服务负载均衡

地分发到各个服务器上,服务器将响应数据直接返回给客户,这样可以极大地提高系统的吞吐

率。

Real公司以其高压缩比的音频视频格式和音频视频播放器RealPlayer而闻名。Real公司正在使用

以上结构将由20台服务器组成的 LVS 可伸缩 Web 和媒体集群,为其全球用户提供 Web 和音频视频

服务。Real公司的高级技术主管声称 LVS 击败所有他们尝试的商品化负载均衡产品。

3.3

、可伸缩 Cache

服务

有效的网络Cache系统可以大大地减少网络流量、降低响应延时以及服务器的负载。但是,若

Cache服务器超载而不能及时地处理请求,反而会增加响应延时。所以,Cache服务的可伸缩性

很重要,当系统负载不断增长时,整个系统能被扩展来提高Cache服务的处理能力。尤其,在主

干上的Cache服务可能需要几个Gbps的吞吐率,单台服务器(如 SUN目前最高端的Enterprise

10000服务器)远不能达到这个吞吐率。可见,通过PC服务器集群实现可伸缩Cache服务是很有

效的方法,也是性能价格比最高的方法。

基于 LVS 可伸缩Cache集群的体系结构如图2.3所示:在前端是一个负载调度器,一般采用IP负载

均衡技术来获得整个系统的高吞吐率;在第二层是Cache服务器池,一般Cache服务器放置在接

近主干Internet连接处,它们可以分布在不同的网络中。调度器可以有多个,放在离客户接近的

地方,可实现透明的Cache服务。

图2.3:基于 LVS 的可伸缩Cache集群

Cache服务器采用本地硬盘来存储可缓存的对象,因为存储可缓存的对象是写操作,且占有一定

的比例,通过本地硬盘可以提高I/O的访问速度。Cache服务器间有专用的多播通道,通过ICP协

议( Internet CacheProtocol)来交互信息。当一台Cache服务器在本地硬盘中未命中当前请求时 ,

它可以通过ICP查询其他Cache服务器是否有请求对象的副本,若存在,则从邻近的Cache服务器

取该对象的副本,这样可以进一步提高Cache服务的命中率。

为150多所大学和地区服务的英国国家Cache网在1999年11月用以上LVS结构实现可伸缩的

Cache集群,只用了原有50多台相互独立Cache服务器的一半,用户反映网络速度跟夏天一样快

(学生放暑假)。可见,通过负载调度可以摸平单台服务器访问的毛刺(Burst ),提高整个系 统

的资源利用率。

3.4

、可伸缩邮件服务

随着Internet用户不断增长,很多ISP面临他们邮件服务器超载的问题。当邮件服务器不能容纳更

多的用户帐号时,有些ISP买更高档的服务器来代替原有的,将原有服务器的信息(如用户邮 件 )

迁移到新服务器是很繁琐的工作,会造成服务的中断;有些ISP设置新的服务器和新的邮件域 名 ,

新的邮件用户放置在新的服务器上,如上海电信现在用不同的邮件服务器public1.sta.net.cn、

public2.sta.net.cn到public9.sta.net.cn放置用户的邮件帐号,这样静态地将用户分割到不同的服务

器上,会造成邮件服务器负载不平衡,系统的资源利用率低,对用户来说邮件的地址比较难记 。

图2.4:基于 LVS 的可伸缩邮件集群

可以利用 LVS 框架实现可伸缩邮件服务。它的体系结构如图2.4所示:在前端是一个采用IP负载

均衡技术的负载调度器;在第二层是服务器池,有 LDAP (Light-weight DirectoryAccess Protocol )

服务器和一组邮件服务器。第三层是数据存储,通过分布式文件系统来存储用户的邮件。集群

中结点间是通过高速网络相连的。

用户的信息如用户名、口令、主目录和邮件容量限额等存储在LDAP服务器中,可以通过HTTPS

让管理员进行用户管理。在各个邮件服务器上运行SMTP(Simple Mail Transfer Protocol )、 POP3

(PostOffice Protocol version 3 )、 IMAP4(Internet MessageAccess Protocolversion 4)和HTTP服

务。SMTP接受和转发用户的邮件,SMTP服务进程查询LDAP服务器获得用户信息,再存储邮

件。POP3和IMAP4通过LDAP服务器获得用户信息,口令验证后,处理用户的邮件访问请求。

SMTP 、 POP3和IMAP4服务进程需要有机制避免用户邮件的读写冲突。HTTP服务是让用户通过

浏览器可以访问邮件。负载调度器将四种服务请求负载均衡地调度到各个服务器上。

系统中可能的瓶颈是LDAP 服务器,对 LDAP服务中B+树的参数进行优化,再结合高端的服务 器 ,

可以获得较高的性能。若分布式文件系统没有多个存储结点间的负载均衡机制,则需要相应的

邮件迁移机制来避免邮件访问的倾斜。

这样,这个集群系统对用户来说就像一个高性能、高可靠的邮件服务器(上海电信只要用一个

邮件域名public.sta.net.cn)。当邮件用户不断增长时,只要在集群中增加服务器结点和存储结点 。

4

、地理分布 LVS

集群的体系结构

由于互联网用户分布在世界各地,通过地理分布的服务器让用户访问就近的服务器,来节省网

络流量和提高响应速度。以下,我们给出地理分布的 LVS 集群系统,通过BGP路由插入使得用

户访问离他们最近的服务器集群,并提供服务器集群之间的负载平衡。

4.1、体系结构

4.2、基于BGP的地理分布服务器集群调度

4.3、服务器集群间的负载均衡

4.1

、体系结构

地理分布 LVS 集群的体系结构如图2.5所示:有三个 LVS 集群系统分布在Internet上,他们一般放

置在不同区域的Internet数据中心(Internet DataCenter)中,例如他们分别放在中国、美国和德

国的三个不同的IDC 中。三个LVS 集群系统都有自己的分布式文件系统,它们的内容是相互复制

的,提供相同的网络服务。它们共享一个VirtualIPAddress来提供网络服务。当用户通过VirtualIP

Address访问网络服务,离用户最近的 LVS 集群提供服务。例如,中国的用户访问在中国的 LVS

集群系统,美国的用户使用美国的 LVS 集群系统,这一切对用户来说是透明的。

图2.5:地理分布 LVS 集群的体系结构

地理分布 LVS 集群系统可以带来以下好处:

使得用户访问离他们最近的系统,对用户来说体验到更快的响应速度,对服务提供商来说节

约网络带宽,降低成本。

避免灾难导致系统中止服务。当一个地点发生地震、火灾等使得系统或者网络连接瘫痪时,

所有的用户访问可以很快由其他地点的 LVS 集群来提供。除了已建立的连接中断以外,这一

切对用户来说都是透明的。

4.2

、基于 BGP

的地理分布服务器集群调度

BGP(BorderGateway Protocol)是用于自治系统(Autonomous Systems)之间交换路由信息的

协议,BGP可以设置路由策略,如政策、安全和经济上的考虑。

我们可以利用BGP协议在Internet的BGP路由器插入到VirtualIPAddress的路由信息。在不同区域

的LVS集群向它附近的BGP路由器广播到Virtual IP Address的路由信息,这样就存在多条到

Virtual IPAddress的路径,Internet的BGP路由器会根据评价函数选出最近的一条路径。这样,我

们可以使得用户访问离他们最近的 LVS 集群。当一个 LVS 集群系统失效时,它的路由信息自然不

会在Internet的BGP路由器中交换,BGP路由器会选择其他到Virtual IPAddress的路径。这样,可

以做到抗灾害性(Disaster Tolerance )。

图2.6:基于BGP的地理分布服务器集群调度例子

下面我们举一个基于BGP的地理分布服务器集群调度例子,它也是我们在实验室中测试的。测

试的例子如图2.6 所示, R11 、 R22分别在不同自治系统AS1和AS2中的Internet 服务提供商( Internet

ServiceProvider ), R31和R32表示在自治系统AS3中两个ISP 。两个 LVS 集群系统分别放置在两个

不同数据中心IDC1和IDC2中,LB1和LB2分别是两个 LVS 集群系统的负载调度器,它们对外提

供网络服务的 IP地址为 10.101.4.1。在第一个集群中,请求被调度到服务器 10.101.5.11和

10.101.5.12执行。在第二个集群中,请求被调度到服务器10.101.6.11和10.101.6.12。10.101.4.1

是在自治系统AS5的网络10.101.4.0/24 中。 LB1上的BGP服务进程将网络10.101.4.0/24的路由信息

广播到邻近的AS1 , LB2上的BGP服务进程将网络10.101.4.0/24的路由信息广播到邻近的AS2中 。

我们在R31端口10.101.3.1相连的BGP路由器上查到AS5的自治系统路径为3→1→5。在与R32端

口10.101.3.9相连的BGP路由器上查到AS5的自治系统路径为3→2→5,并在该路由器上访问

10.101.4.1上提供的 Web 服务,是由服务器10.101.6.11处理的。当我们关掉LB2后,在该BGP路由

器上查到AS5的自治系统路径变为3→1→5。

4.3

、服务器集群间的负载均衡

通过BGP插入路由信息的方法可以使得用户访问邻近的服务器集群,但是用户访问存在突发性 ,

在某个区域的访问高峰可能会导致该区域的服务器集群系统超载,而其他服务器集群系统可能

处于低负载状态,这时与其将请求在超载系统上排队等候,不如将请求送到远处的低负载系统

上执行,可以提高响应速度。例如,中国用户在白天时间的一段访问高峰使得在中国的镜像服

务器集群系统超载,而此时美国是晚上时间其镜像服务器集群系统处于低负载状态。

我们提出通过IP隧道的方法将请求从一个调度器转发到另一个调度器,再调度到真实服务器上

执行。在下一章中将详细描述如何通过IP隧道作IP负载均衡调度。在通过IP隧道转发请求前,

各个服务器集群需要定时交换负载信息(如2分钟交换一次),当确信远处的集群系统处于低负

载状态,再转发请求。例如,当本地集群系统的综合负载大于1.1和远处集群系统的负载小于0.7

时,调度器通过IP隧道将新的请求转发到远处的集群系统。若远处集群系统的负载超过0.7 时 ,

停止转发请求。当本地集群系统的负载降至1.0时,也停止转发请求,由本地服务器处理。这 样 ,

基本上可以避免两个调度器间相互转发一个请求。即使两个调度器间相互转发一个请求报文的

例外情况发生,报文的TTL会降到零,报文被丢掉。

5

、小结

我们分析了现在和将来网络服务的需求,提出可伸缩网络服务的体系结构,分为负载调度器、

服务器池和后端存储三层结构。负载调度器采用IP负载均衡技术和基于内容请求分发技术。它

的实现将在Linux操作系统进行,将一组服务器组成一个高可伸缩的、高可用的服务器,故称之

为Linux VirtualServer。它提供了负载平衡、可伸缩性和高可用性,可以应用于建立很多可伸缩

网络服务,如 Web 、Cache、Mail和Media等服务。

在此基础上,我们给出了地理分布的 LVS 集群系统,通过BGP插入路由信息的方法可以使得用

户访问邻近的服务器集群,通过IP隧道实现服务器集群间的负载均衡,进一步提高响应速度。

地理分布的 LVS 集群系统可以节约网络带宽,改善网络服务质量ÿ

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水月清辉

你的鼓励将是我创造的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值