HBASE 数据模型、HBASE架构(基础架构、RegionServer 架构、写流程 、MemStore Flush 、读流程、Compaction、Split)

HBase部署完成,Web UI界面无法打开有效解决方法 问题: 1、HBase已经部署完成,jps查看进程都存在,但HMaster总会闪退。 2、16010的界面无法打开(拒绝链接) 3、三台节点的16030界面显示如下(regionserver只在初始化) 问题分析:本人遇到此问题时,查询到有很多的解决方法,但都无效,且这些解决方案都模棱两可,没有直接说明。 经本人查看日志显示znode data == null 解决方法: hadoop的配置文件core-site.xml中: <property&gt... 阅读详情

前言

  HBase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库


1. 数据模型

In HBase, data is stored in tables, which have rows and columns. it can be helpful to think of an HBase table as a multi-dimensional map.

(1) NameSpace

  命名空间,类似于关系型数据库的database概念,每个命名空间下有多个表。HBase有两个自带的命名空间,分别是hbase和default,hbase中存放的是HBase内置的表,default表是用户默认使用的命名空间
  命名空间的主要作用包括进行配额管理、安全管理(用户对命名空间和表的操作权限划分)

(2) Table

  类似于关系型数据库的表概念。不同的是,HBase定义表时只需要声明列族即可,不需要声明具体的列。这意味着,往HBase写入数据时,字段可以动态、按需指定。因此,和关系型数据库相比,HBase能够轻松应对字段变更的场景

(3) Row

  HBase表中的每行数据都由一个RowKey和多个Column(列)组成,数据是按照RowKey的字典顺序存储的,并且查询数据时只能根据RowKey进行检索

(4) Column Family

  HBase中的每个列都由Column Family(列族)和Column Qualifier(列限定符)进行限定,如 info:name,info:age。建表时,只需指明列族,而列限定符无需预先定义
注:

Physically, all column family members are stored together on the filesystem. Because tunings and storage specifications are done at the column family level, it is advised that all column family members have the same general access pattern and size characteristics.

(5) Cell

  由{rowkey, column Family:column Qualifier, time Stamp} 唯一确定的单元。cell中的数据全部是字节码形式存贮

注:
Time Stamp
  用于标识数据的不同版本(version),每条数据写入时,系统会自动为其加上该字段,其值为写入HBase的时间


2. HBASE架构

2.1 基础架构

架构角色:
1)Region Server
  Region Server为 Region的管理者,其实现类为HRegionServer,主要作用:操作数据:get, put, delete;操作Region:splitRegion、compactRegion
2)Master
  Master是所有Region Server的管理者,其实现类为HMaster,主要作用:操作表:create, delete, alter;操作RegionServer:分配regions到每个RegionServer,监控每个RegionServer的状态,负载均衡和故障转移
3)Zookeeper
  HBase通过Zookeeper实现master的高可用、RegionServer的监控、元数据的入口以及集群配置的维护等
4)HDFS
  HDFS为Hbase提供最终的底层数据存储服务,同时为HBase提供高可用的支持

在这里插入图片描述

2.2 RegionServer 架构

1)StoreFile
  保存实际数据的物理文件,StoreFile以Hfile的形式存储在HDFS上。每个Store会有一个或多个StoreFile(HFile),数据在每个StoreFile中都是有序的
2)MemStore
  写缓存,由于HFile中的数据要求是有序的,所以数据是先存储在MemStore中,排好序后,等到达刷写时机才会刷写到HFile,每次刷写都会形成一个新的HFile
3)WAL
  由于数据要经MemStore排序后才能刷写到HFile,但把数据保存在内存中会有很高的概率导致数据丢失,为了解决这个问题,数据会先写在一个叫做Write-Ahead logfile的文件中,然后再写入MemStore中。所以在系统出现故障的时候,数据可以通过这个日志文件重建
4)BlockCache
  读缓存,每次查询出的数据会缓存在BlockCache中,方便下次查询

在这里插入图片描述

2.3 写流程

1)Client先访问zookeeper,获取hbase:meta表位于哪个Region Server;

2)访问对应的Region Server,获取hbase:meta表,根据读请求的namespace:table/rowkey,查询出目标数据位于哪个Region Server中的哪个Region中。并将该table的region信息以及meta表的位置信息缓存在客户端的meta cache,方便下次访问;

scan 'hbase:meta'

在这里插入图片描述
webui查看:
在这里插入图片描述

3)与目标Region Server进行通讯;

4)将数据顺序写入(追加)到WAL;

5)将数据写入对应的MemStore,数据会在MemStore进行排序;

6)向客户端发送ack;

7)等达到MemStore的刷写时机后,将数据刷写到HFile。

在这里插入图片描述

2.4 MemStore Flush

1.Memstore级别
  当某个memstore的大小达到了hbase.hregion.memstore.flush.size(默认值128M),其所在region的所有memstore都会刷写

2.HRegion级别
  当Region中memstore的大小达到了hbase.hregion.memstore.flush.size(默认值128M)* hbase.hregion.memstore.block.multiplier(默认值4)时,会阻止继续往该memstore写数据

Without an upper-bound, memstore fills such that when it flushes the resultant flush files take a long time to compact or split, or worse, we OOME.

3.HRegionServer级别
  当region server中memstore的总大小达到java_heapsize*hbase.regionserver.global.memstore.size(默认值0.4)*hbase.regionserver.global.memstore.size.lower.limit(默认值0.95),region会按照其所有memstore的大小顺序(由大到小)依次进行刷写。直到region server中所有memstore的总大小减小到上述值以下

  当region server中memstore的总大小达到java_heapsize*hbase.regionserver.global.memstore.size(默认值0.4)时,会阻止继续往所有的memstore写数据

4.HLog级别
  当WAL文件的数量超过hbase.regionserver.max.logs,region会按照时间顺序依次进行刷写,直到WAL文件数量减小到hbase.regionserver.max.logs以下(该属性名已经废弃,现无需手动设置,最大值为32)

5.定期刷写
  到达自动刷写的时间,也会触发memstore flush。自动刷新的时间间隔由该属性进行配置hbase.regionserver.optionalcacheflushinterval(默认1小时) 指当前MemStore最后一次编辑的时间

6.手动刷写
  通过命令 flush

在这里插入图片描述

2.5 读流程

1)Client先访问zookeeper,获取hbase:meta表位于哪个Region Server

2)访问对应的Region Server,获取hbase:meta表,根据读请求的namespace:table/rowkey,查询出目标数据位于哪个Region Server中的哪个Region中。并将该table的region信息以及meta表的位置信息缓存在客户端的meta cache,方便下次访问

3)与目标Region Server进行通讯;

4)分别在MemStore和Store File(HFile)中查询目标数据,并将查到的所有数据进行合并。此处所有数据是指同一条数据的不同版本(time stamp)或者不同的类型(Put/Delete)

5)将查询到的新的数据块(Block,HFile数据存储单元,默认大小为64KB)缓存到Block Cache(LRU算法 最近最少使用)

6)将合并后的最终结果返回给客户端
在这里插入图片描述
在这里插入图片描述

2.6 StoreFile Compaction

  由于memstore每次刷写都会生成一个新的HFile,且同一个字段的不同版本(timestamp)和不同类型(Put/Delete)有可能会分布在不同的HFile中,因此查询时需要遍历所有的HFile。为了减少HFile的个数,以及清理掉过期和删除的数据,会进行StoreFile Compaction。
  Compaction分为两种,分别是Minor Compaction和Major Compaction:
  Minor Compaction会将临近的若干个较小的HFile合并成一个较大的HFile,并清理掉部分过期和删除的数据;
  Major Compaction会将一个Store下的所有的HFile合并成一个大HFile,并且会清理掉所有过期和删除的数据

Major Compaction生产环境中一般关闭,手动合并 compact命令

  <property>
    <name>hbase.hregion.majorcompaction</name>
    <value>604800000</value>
    <description>Time between major compactions, expressed in milliseconds. Set to 0 to disable
      time-based automatic major compactions. User-requested and size-based major compactions will
      still run. This value is multiplied by hbase.hregion.majorcompaction.jitter to cause
      compaction to start at a somewhat-random time during a given window of time. The default value
      is 7 days, expressed in milliseconds. If major compactions are causing disruption in your
      environment, you can configure them to run at off-peak times for your deployment, or disable
      time-based major compactions by setting this parameter to 0, and run major compactions in a
      cron job or by another external mechanism.</description>
  </property>
    <property>
    <name>hbase.hregion.majorcompaction.jitter</name>
    <value>0.50</value>
    <description>A multiplier applied to hbase.hregion.majorcompaction to cause compaction to occur
      a given amount of time either side of hbase.hregion.majorcompaction. The smaller the number,
      the closer the compactions will happen to the hbase.hregion.majorcompaction
      interval.</description>
  </property>
    <property>
    <name>hbase.hstore.compactionThreshold</name>
    <value>3</value>
    <description> If more than this number of StoreFiles exist in any one Store
      (one StoreFile is written per flush of MemStore), a compaction is run to rewrite all
      StoreFiles into a single StoreFile. Larger values delay compaction, but when compaction does
      occur, it takes longer to complete.</description>
  </property>

在这里插入图片描述

注:
  flush只清理内存中过期删除的数据,不会访问磁盘中的数据;

2.7 Region Split (可能存在数据倾斜的问题,一般通过预分区手动)

  默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的Region Server,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的Region Server
Region Split时机:
1.当1个region中的某个Store下所有StoreFile的总大小超过hbase.hregion.max.filesize,该Region就会进行拆分(0.94版本之前)。
2.当1个region中的某个Store下所有StoreFile的总大小超过Min(initialSize*R^3 ,hbase.hregion.max.filesize"),该Region就会进行拆分。其中initialSize的默认值为2*hbase.hregion.memstore.flush.size,R为当前Region Server中属于该Table的Region个数(0.94版本之后)

具体的切分策略为:
第一次split:1^3 * 256 = 256MB
第二次split:2^3 * 256 = 2048MB
第三次split:3^3 * 256 = 6912MB
第四次split:4^3 * 256 = 16384MB > 10GB,因此取较小的值10GB
后面每次split的size都是10GB
3.Hbase 2.0引入了新的split策略:如果当前RegionServer上该表只有一个Region,按照2 * hbase.hregion.memstore.flush.size分裂,否则按照hbase.hregion.max.filesize分裂
在这里插入图片描述


HBase中MemStore flush的源码解析 flush请求的发出: HRegion会调用requestFlush()触发flush行为,flush发生在每一处region可能发生变化的地方,包括region有新数据写入,客户端调用了put/increment/batchMutate等接口。 hbase.hregion.memstore.block.multiplier是个乘数因子,默认值是4,该值会乘上hbase.hregion.mem 阅读详情

相关推荐

手把手教你用Python处理MAHNOB-HCI多模态数据集(含脑电EEG/眼动/视频数据同步实战)

本文详细介绍了如何使用Python处理MAHNOB-HCI多模态数据集,涵盖脑电(EEG)、眼动追踪和视频数据的同步解析与对齐。通过MNE-Python、pandas和OpenCV等工具,实现从BDF、TSV到XML格式的高效处理,解决时间轴对齐难题,助力情感计算与人机交互研究。

weixin_30998797的博客 367

HBase启动时有进程,webUI不显示HRegionServer

HBase启动时有进程,webUI不显示HRegionServer 问题描述:启动Hbase以后,Hmaster和HRegionServer进程都存在,但是web上没有HRegionServer没有信息,并且会提示一串英文(大概意思是负载均衡没有启用) 解决办法:hadoop进入安全模式了,hadoop dfsadmin -safemode leave用这个命令离开安全模式就可以了。 ...

清盏涂墨衣 1912

Feko仿真GPS微带天线学习笔记

为了优化方便,使参数变量化,所以定义几个变量在CADFEKO左侧浏览器中如图所示定义变量,如下表贴片的尺寸切角尺寸feed =-6.4馈电点距坐标原点的距离sub_w=45基板的宽度sub_d=45基板的长度sub_h=5基板的高度epsR=5.6介电常数损耗角正切。

qq_36521926的博客 3988

HBase数据模型

行中的数据以列族的形式组织,列族可以理解为具有相似属性或语义的列的集合。单元格是一个行、列、时间戳和数据值的组合,数据值可以是任意类型的字节数组。数据模型的完整示例,包括表的创建、数据的插入、查询和删除等操作。它通过表、行、列族和列的层次结构来组织数据,并使用行键进行快速的数据访问。数据模型的代码案例,包括表的创建、数据的插入、查询和删除等操作。的数据模型原理和使用方法,可以更好地发挥其优势,构建高性能和可靠的大型分布式应用。的数据模型理论和原理,并提供一个完整的代码注释案例,同时对参数进行介绍。

互联网知识分享 2077

Python爬虫:无账号无限制获取企查查信息

无限制企查查爬虫 ​通过网上爬虫获取了全国所有企业,然后就需要补充企业信息,首先想到的就是企查查,启信宝等专业网站,最终选择了企查查,尝试了多种方法: 1、selenium爬虫,绕过企查查的登录验证,但账号和IP限制太大,最终放弃 2、通过requests直接请求+cookies,遇到了cookie有效期和限制问题 不断的尝试和修改参数,最终发现一种有效方式selenium+ wep 只需要IP代理,不需要账号,没有限制,因为是没有登录,拿到的信息有限,能展示的都能获取。 一、初始化..

攻城狮的家园 1万+

从UC3842的FB脚到COMP脚:一次讲透反激电源两种光耦反馈接法的选择与实战

本文深入探讨了UC3842 PWM控制器在反激式开关电源设计中的两种光耦反馈接法:FB脚与COMP脚方案。通过分析信号极性差异、稳定性特点及动态响应性能,提供场景化选型指南和可靠性设计要点,帮助工程师优化反馈环路设计,提升系统稳定性与效率。特别针对TL431和PC817等关键元件在温度漂移、老化衰减等实际问题给出解决方案。

weixin_28717683的博客 704

HBase数据模型解析

HBase数据模型解析 HBase 是一种列存储模式与键值对存储模式结合的 NoSQL 数据库,它具有灵活的数据模型,不仅可以基于键进行快速查询,还可以实现基于值、列名等的全文遍历和检索。 HBase 可以实现自动的数据分片,用户不需要知道数据存储在哪个节点上,只要说明检索的要求,系统会自动进行数据的查询和反馈。 HBase 的基本概念 HBase 不支持关系模型,它可以根据用户的需求提供更灵活和可扩展的表设计。与传统的关系型数据库类似,HBase 也是以表的方式组织数据,应用程序将数据存于 HBase 的

张俊杰 的博客 4028

【MATLAB/Simulink】从模型到飞行:基于PX4与Rflysim的无人机MBD实战指南

本文详细介绍了基于MATLAB/Simulink与PX4、Rflysim的无人机模型开发与飞行控制实战指南。通过MBD(基于模型设计)方法,从建模、仿真到代码生成与硬件部署,实现无人机开发的高效闭环。文章涵盖开发环境搭建、动力学建模、控制算法实现及测试验证全流程,为无人机开发者提供实用技巧与优化建议。

weixin_30181209的博客 410

HBase Web UI

HBase 简介 Apache HBase™ is the Hadoop database, a distributed, scalable, big data store. 应用场景(Use Case): -存储大数据billions of rows X millions of columns (TB/PB) -实时-随机读取以及写入real-time random write/re...

tianyeshiye 8073

怎么用phpstudy制作网站

随着实践的深入,你会逐渐掌握更多高级技巧和技术,让你的网站变得更加完善和吸引人。现在你已经成功设置了你的本地Web服务器环境,接下来我们将指导你如何利用这个环境来创建一个简单的PHP网页项目。为了使网站更加动态且功能丰富,我们需要学会如何让PHP脚本与MySQL数据库交互。为了让网站看起来更专业美观,可以考虑引入CSS样式表来定制网页布局及视觉效果。当你对本地开发的网站感到满意后,下一步就是将其发布到互联网上供他人访问了。让我们进一步扩展我们的网站,加入一个简单的用户注册与登录系统。

2401_87999399的博客 6573

【GB28181】wvp-GB28181-pro部署安装教程(Ubuntu平台)

初始环境安装。

废人一枚的博客 5079

HBase写流程深度解析:从客户端请求到数据持久化

fill:#333;important;important;fill:none;root(HBase写流程)定位ZK → meta表 → 目标Region写入WAL(顺序写)MemStore(内存写)返回客户端成功异步Flush刷盘Compaction合并Split分裂HBase写数据是一个"先日志后内存"的两阶段提交,返回即成功,后续异步持久化的高效流程。掌握了写流程,你就能针对性地进行写入性能调优,让HBase的写操作既快又稳!思考题。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 3318

数字逻辑Fundamentals of Digital Logic with Verilog Design | 3rd Edition Solutins Chapter 2(step by step)

数字逻辑第二章习题和详细步骤 2-1 ~ 2-78

weixin_62651190的博客 2305

HBase 在日常中的使用

HBase是一个底层基于HDFS存储、开源的、面向列(Column-Oriented)、适合存储海量非结构化数据或半结构化数据的、具备高可靠性、高性能、可灵活扩展伸缩的、支持实时数据读写的分布式存储系统。关于存储在HBase 的表特征有:表:一个表通常可以有上亿行,上百万列;面向列:面向列(族)的存储;稀疏:表中为空(null)的列不占用存储空间。

m0_60315945的博客 775

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

大数据技术之HBase进阶(4)

每一个 region 维护着 startRow 与 endRowKey,如果加入的数据符合某个 region 维护的 rowKey 范围,则该数据交给这个 region 维护。那么依照这个原则,我们可以将数据所要投放的分区提前大致的规划好,以提高 HBase 性能。1)手动设定预分区2)生成 16 进制序列预分区3)按照文件中设置的规则预分区aaaabbbbccccdddd4)使用 JavaAPI 创建预分区// 1.获取配置类// 2.给配置类添加配置// 3.获取连接。

qq_45115959的博客 1716

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

HBase进阶——文件的合并、 MemStore Flush、StoreFile Compaction、 Region Split、高可用与预分区介绍

本文主要介绍HBase如何进行分区与数据处理等等操作,在 HBase 中 HMaster 负责监控 HRegionServer 的生命周期,均衡 RegionServer 的负载, 如果 HMaster 挂掉了,那么整个 HBase 集群将陷入不健康的状态,并且此时的工作状态并 不会维持太久。所以 HBase 支持对 HMaster 的高可用配置。每一个 region 维护着 StartRow 与 EndRow,如果加入的数据符合某个 Region 维护的 RowKey 范围,则该数据交给这个 Reg

张小鱼的博客 1629

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

HBase读写流程深度解析:从客户端到RegionServer的数据之旅

本文深度解析HBase读写流程,从客户端到RegionServer的数据处理全过程。详细介绍了元数据定位、数据检索、写入路径及后台机制如Compaction和Region Split,并提供了性能调优的实战经验,帮助开发者优化HBase集群性能。

weixin_30733003的博客 437

Hbase高级

目录RegionServer 架构写流程总结读流程MemStore FlushStoreFile CompactionRegion Split RegionServer 架构 1)StoreFile 保存实际数据的物理文件,StoreFile以Hfile的形式存储在HDFS上。每个Store会有一个或多个StoreFile(HFile),数据在每个StoreFile中都是有序的。 2)MemStore 写缓存,由于HFile中的数据要求是有序的,所以数据是先存储在MemStore中,排好序后,等到达刷写时

Knight 670

HBase进阶学习

RegionServer架构 1)StoreFile 保存实际数据的物理文件,Store以Hfile的形式存储在HDFS上。每个Store都会有一个或者多个StoreFile(HFile),数据在每个StoreFile中都是有序的。 2)MemStore 写缓存,由于HFile中的数据要求室友虚的,所以数据是先存储在MemStore中,拍好序之后,等到达刷写时机才会刷写到Hfile,每次刷写都会形成一个新的HFile。 3)WAL 由于数据要经过MemStore排序之后才能刷写到HFile,但是把数据保存

M_Ene的学习日志 368

Java大数据-HBase读写流程、MemStore Flush、StoreFile Compaction、Region Split

一、写流程 (1)Client 先访问 zookeeper,获取 hbase:meta 表位于哪个 Region Server (2)访问对应的 Region Server,获取 hbase:meta 表,根据读请求的 namespace:table/rowkey, 查询出目标数据位于哪个 Region Server 中的哪个 Region 中。并将该 table 的 region 信息以 及 meta 表的位置信息缓存在客户端的 meta cache,方便下次访问 (3)与目标 Region .

godkzz的博客 262

HBase基础总结(上)

第一章 HBase简介 1.1 HBase定义 HBase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库。 1.2 HBase数据模型 逻辑上,HBase的数据模型同关系型数据库很类似,数据存储在一张表中,有行有列。但从HBase的底层物理存储结构(K-V)来看,HBase更像是一个multi-dimensional map。 1.2.1 HBase逻辑结构 1.2.2 HBase物理存储结构 1.2.3 数据模型 1)Name Space 命名空间,类似于关系型数据库的database概念,

qq_43797434的博客 544

Hbase工作流程

3.当memstore大小达到一定阈值(默认128M)后,会启动flush线程,将内存数据排序落盘到hdfs上,生成Hflie,当hflie数据量过多的时候,一般大于三个,开始进行合并操作,将多个文件合并成一个大的Hflie。4.当Region总的大小超阈值 (默认 10GB),会触发分裂动作,region一分为二,更新meta表,原来的region下线;当溢写的文件过多时,会触发文件的合并(Compact)操作,合并有两种方式(major,minor) major(大合并):合并该。

qq_51942901的博客 729

HBase 入门学习

这意味着,往 HBase写入数据时,字段可以动态、按需指定。因此,和关系型数据库相比,HBase能够轻松应对字段变更的场景。(3)RowHBase 表中的每行数据都由一个RowKey和多个 Column(列)组成,数据是按照 RowKey的。

weixin_44361163的博客 931

Hbase学习笔记(四)——存储的三个机制(Flush、Compact、Split)

Hbase——存储的三个机制一、Flush二、Compact三、Split 一、Flush 当MemStore中的数据量达到阈值,就将数据Flush到HDFS中,以Storefile形式存储。 触发条件: 当某个store中的memstore的存储达到 128M hbase.hregion.memstore.flush.size = 134217728 当整个region所使用的...

AidenBrett7的博客 685

hbase 删除列族下的某一列_HBase

HBase 是一种分布式、可扩展、支持海量数据存储的NoSQL 数据库。逻辑结构物理存储结构数据模型逻辑上,HBase的数据模型同关系型数据库很类似,数据存储在一张表中,有行有列。HBase的底层物理存储结构(K-V)。Name Space命名空间,类似于关系型数据库的 DatabBase 概念,每个命名空间下有多个表。HBase 有两个自带的命名空间,分别是 hbase和 defaul...

weixin_39679718的博客 2322

Hbase Region Server整体架构

Region Server的整体架构 本文主要介绍Region的整体架构,后续再慢慢介绍region的各部分具体实现和源码 RegionServer逻辑架构图 RegionServer职责 1、 监听协作,通过zk来侦听master、meta位置、集群状态等信息的变化,更新本地数据。 2、 管理region的offline、online、open、cl...

anzuo0211的专栏 408
上一篇: YARN 切换ResourceManager主备
下一篇: hbase DDL(创建删除命名空间、表) DML(增改 查 以及 删除 DeleteFamily DeleteColumn Delete) API
但行益事莫问前程
但行益事莫问前程 新星创作者: 数据库技术领域 新星创作者: 数据库技术领域
博客等级 码龄7年 8490粉丝 225原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

但行益事莫问前程

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

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

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

打赏作者

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

抵扣说明:

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

余额充值