ELK日志系统

ELK日志系统

ELKFK

是一套完整的日志集中处理方案

E:elasticSearck ES 分布式索引行非关系数据库。存储logstash输出的日志,全文检索引擎,保存的格式是json格式

L:logstash 基于java语言开发的,数据收集引擎。日志的收集,可以对数据进行过滤,分析,汇总以及标注格式输出

K:kiabana 是es的可视化工具。对es存储的数据进行可视化展示,分析和检索

在这里插入图片描述

F:filebeat 轻量级开源日志文件数据收集器。logstash占用系统资源比较大,属于重量级。有了filebeat可以节省资源,可以通过filebeat和logstash实现远程数据收集。

filebeat不能对数据进行标准输出,不能输出位es格式的数据,所以需要logstash把filebeat数据做标准化处理

在这里插入图片描述

K:kafka 消息队列

1 es取主从和数据模式
node.master: true

es数据库的主从类型 true false

node.data: true

数据节点,是否保存数据,logstash发送数据,节点是否接受以及保存。

es如何创建,修改,删除数据 数据管理

通过http的方式

post方式修改数据

创建数据

curl -X PUT "localhost:9200/index-demo/test/1?pretty&pretty’ -H ‘content-Type: application/json’ -d
‘{“user”:“zhangsan”,“mesg”:“hello world”}’

对应的就是本地数据库的地址ip+端口

index-demo

创建索引分片的名称

test

数据的名称

1

数据的id字段

?pretty&pretty

参数设定位json格式

-d

数据的具体内容

“user”:“zhangsan”,“mesg”:“hello world”

修改数据:

curl -X PUT "localhost:9200/index-demo/test/1?pretty&pretty’ -H ‘content-Type: application/json’ -d
‘{“user”:“zhangsan”,“mesg”:“hello world”}’

curl -X POST ‘localhost:9200/index-demo/test/1/_update?pretty’ -H ‘Content-Type: application/json’ -d ‘{ “doc”: { “user”: “zhangsan”, “mesg”: “hello1 world1” } }’

删除:

curl -X DELETE "localhost:9200/index-demo/test/1?pretty&pretty’ -H ‘content-Type: application/json’ -d
‘{“user”:“zhangsan”,“mesg”:“hello1world1”}’

安装elk图形界面部署
cd /etc/logstash/conf.d/
vim system.conf
input{
        file{
                path =>"/var/log/messages"
                type =>"system"
                start_position =>"beginning"
                #从头开始beginning,从结尾开始end
        }
}
output{
        elasticsearch {
                hosts=>["192.168.39.30:9200","192.168.39.50:9200"]
                index =>"system-%{+YYYY.MM.dd}"
        }

}
logstash -f system.conf --path.data /opt/test2 &
cd /opt
rpm -ivh kibana-6.7.2-x86_64.rpm
vim /etc/kibana/kibana.yml
2行	取消注释
7行	取消注释改为server.host: "0.0.0.0"
28行	取消注释改为elasticsearch.hosts: ["http://192.168.39.30:9200","http://192.168.39.50:9200"]
37行	取消注释
96行	取消注释logging.dest: /var/log/kibana.log
113行	改为i18n.locale: "zh-CN"

touch /var/log/kibana.log
chown kibana:kibana /var/log/kibana.log
chmod 777 /var/log/messages
systemctl restart kibana.service 
systemctl enable kibana.service
netstat -antp | grep 5601

网页输入http://192.168.39.60:5601
点击左边管理,索引模式
输入system*,下一步,创建
点击左边discover查看日志

API接口:
软件内部代码之间通信的接口 代码的连接 代码之间调用的接口

端口是对外提供访问程序的内存接口

filebeat:
1、可以在本机收集日志

2、也可以远程收集日志

3、轻量级的日志收集系统 可以在非java环境运行

logstash是在jvm环境中运行,资源消耗很大,启动一个logstash要消耗500M左右的内存

filebeat只消耗10M左右

The logstash hosts

hosts:[“192.168.39.50:5045”]

5044 logstash默认的端口

只要是logstash主机上没有被占用的端口都可以使用。大于1024.

特定程序的日志收集

192.168.39.30	node1	安装Elasticsearch,Elasticsearch-head,node,phantomjs
192.168.39.50	node2	安装Elasticsearch,Elasticsearch-head,node,phantomjs
192.168.39.60	APACHE	安装Logstash
192.168.39.31	filebeat	安装filebeat,http,nginx,mysql
node1,node2,logstash安装参考elk1文档

filebeat
yum -y install mysqld,httpd,nginx
cd /opt
tar -xf filebeat-6.7.2-linux-x86_64.tar.gz
mv filebeat-6.7.2-linux-x86_64.tar.gz filebeat
cd filebeat
vim filebeat.yml
20行
- type: log
  enabled: true
  paths:
    - /var/log/nginx/access.log
    - /var/log/nginx/error.log
  tags: ["nginx"]
  fields:
    service_name: 192.168.39.31_nginx
    log_type: nginx
    from: 192.168.39.31
- type: log
  enabled: true
  paths:
    - /usr/local/mysql/data/mysql_general.log
  tags: ["mysql"]
  fields:
    service_name: 192.168.39.31_mysql
    log_type: mysql
    from: 192.168.39.31
- type: log
  enabled: true
  paths:
    - /var/log/httpd/access_log
    - /var/log/httpd/error_log
  tags: ["http"]
  fields:
    service_name: 192.168.39.31_http
    log_type: http
    from: 192.168.39.31
166行	注释output,hosts
179行
output.logstash:
  # The Logstash hosts
  hosts: ["192.168.39.60:5046"]

vim /etc/nginx/nginx.conf
 38     server {
 39         listen       8888;
 40         listen       [::]:8888;
 41         server_name  _;
 42         root         /usr/share/nginx/html;
 
Apache服务器
cd /etc/logstash/conf.d
vim nmh_5046.conf
input{
        beats {
                port => "5046"
        }

}
output{
        if "nginx" in [tags] {
                elasticsearch {
                hosts=>["192.168.39.30:9200","192.168.39.50:9200"]
                index =>"%{[fields][service_name]}-%{+YYYY.MM.dd}"
                }
        }
        if "mysql" in [tags] {
                elasticsearch {
                hosts=>["192.168.39.30:9200","192.168.39.50:9200"]
                index =>"%{[fields][service_name]}-%{+YYYY.MM.dd}"
                }
        }
        if "http" in [tags] {
                elasticsearch {
                hosts=>["192.168.39.30:9200","192.168.39.50:9200"]
                index =>"%{[fields][service_name]}-%{+YYYY.MM.dd}"
                }
        }

}
filebeat服务器
nohup ./filebeat -e -c filebeat.yml > filebeat.out &
Apache服务器
logstash -f nginx_61.conf --path.data /opt/test9 &
网页输入192.168.39.30:9100
输入192.168.39.30:9200查看是否有nginx,mysql,http
查看索引

nohup ./filebeat -e -c filebeat.yml> filebeat.out &
-e:输出到标准输出
-c:指定配置文件
nohup:在系统的后台运行,不会因为终端的关闭导致程序停止运行

kafka 带入集群当中

zookeeper集群+kafka集群

zookeeper是一个开源的,分布式的,为了分布式架构协调服务的apache的项目

保存元数据

zookeeper的工作机制:

观察者模式设计的分布式服务器管理架构。

负载存储和管理元数据,记录集群的变化。保存集群变化的信息。

在这里插入图片描述

zookeeper的特点

1、在集群中分为领导者和追随者,组成的集群

2、只要有半数以上的节点正常工作,整个zookeeper就可以正常工作。zookeeper集群在部署时一般选在奇数台

3、全局数据一致,每个zookeeper不论是领导者还是追随者,在访问他们的数据时都是一致的

4、数据更新的原子性,一次更新数据,要么都成功,要么都失败

5、数据更新的实时性6

6、领导者追随者根据投票产生

选举机制:

A B C

1、服务器A启动 发起一次选举,A会投自己一票。A有一票,不够半数。选举无法完成。A进行looking

2、服务器B启动,再发起一次选举,服务器B也投自己一票,服务器A和服务器B会做一个比较,myid,谁的myid大,如果A比B小,A会把票改投给B,2票,B自动当选为leader

3、C启动,自动成为追随者

192.168.39.31
192.168.39.32
192.168.39.33
zookeeper选举
三台同步
systemctl stop firewalld
setenforce 0
ntp ntp.aliyun.com
ntpdate ntp.aliyun.com
date
cd /opt
yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
java -version
托文件
tar -xf apache-zookeeper-3.5.7-bin.tar.gz 
ls
mv apache-zookeeper-3.5.7-bin zookeeper
cd zookeeper/
ll
cd conf/
ll
cp zoo_sample.cfg zoo.cfg
ll
vim zoo.cfg
11行	dataDir=/opt/zookeeper/data
	 dataLogDir=/opt/zookeeper/logs
14行  server.1=192.168.39.31:3188:3288
	 server.2=192.168.39.32:3188:3288
	 server.3=192.168.39.33:3188:3288
mkdir /opt/zookeeper/logs
mkdir /opt/zookeeper/data
echo 1 > /opt/zookeeper/data/myid
vim /etc/init.d/zookeeper
#!/bin/bash
#chkconfig:2345 20 90
#description:Zookeeper Service Control Script
ZK_HOME='/opt/zookeeper'
case $1 in
start)
	echo "---------- zookeeper 启动 ------------"
	$ZK_HOME/bin/zkServer.sh start
;;
stop)
	echo "---------- zookeeper 停止 ------------"
	$ZK_HOME/bin/zkServer.sh stop
;;
restart)
	echo "---------- zookeeper 重启 ------------"
	$ZK_HOME/bin/zkServer.sh restart
;;
status)
	echo "---------- zookeeper 状态 ------------"
	$ZK_HOME/bin/zkServer.sh status
;;
*)
    echo "Usage: $0 {start|stop|restart|status}"
esac

//	设置开机自启
chmod +x /etc/init.d/zookeeper
chkconfig --add zookeeper

//分别启动 Zookeeper
service zookeeper start

//查看当前状态
service zookeeper status

chmod +x /etc/init.d/zookeeper 
chkconfig --add zookeeper
service zookeeper start
service zookeeper status

server.1=192.168.39.31:3188:3288
server.2=192.168.39.32:3188:3288
server.3=192.168.39.33:3188:3288

server.1 数字id也就是服务器对应的myid

192.168.39.31 服务器ip地址

3188:zookeeper集群内部通信的端口

3288:重新选举端口,万一leader挂了。用这个端口进行内部通信,选举新的leader

kafka概述:

消息队列:MQ

在高并发环境下,同步的请求来不及处理,请求太多造成阻塞

比如说大量请求并发到数据库,too many connection报错

消息队列,使用异步处理方式,可以缓解系统处理请求的压力。

在这里插入图片描述

kafka的作用:

1、异步处理

2、系统解耦

每个系统之间独立运行,互相之间没有必然的依赖关系。

微服务架构中的通信对于解耦来说至关重要

各个微服务之间独立运行,分别处理各自的请求和消息。提高整个系统的吞吐量和处理能力

尤其是电商的订单系统,网站的工单系统,典型的一个消息队列场景

3、负载均衡

消息队列的负载均衡:把任务发送到多个消费者,多个生产者可以并行处理队列中的消息。

4、流量控制和限流

通过延迟放方法,处理生产速率和消费者的处理速度(代理控制)

5、数据同步和分发

跨系统的数据同步和日志收集

6、任务调度和定时任务

7、实时数据处理

8、备份和回复

消息队列的模式

1、点对点 一对一 消费者消费完数据之后,生产者会自动清除已消费的数据

一个生产者对应一个消费者(淘汰)

2、发布/订阅模式(一对多,观察者模式,消费者数据在消费完之后不会被清除(保留一段时间))

生产者发布一个消息,可以是一个消费者使用,也可以是多个消费者同时使用(主流)

kafka就是发布/订阅模式的消费队列。RabbitMQ也是发布/订阅模式的消息队列。小集群的内部使用

大数据的实时处理领域

kafka的特性

高吞吐量,低延迟

每秒可以处理几十万条数据,延迟只有几毫秒

集群的可扩展性(热扩展)

消息的持久化:生产者发布的消息可以保存到磁盘当中,防止数据丢失(有时间限制)

容错性:挂了一个可以继续使用

高并发:数千个客户端可以同时读写

kafka的组件:

1、tpoic 主题,kafka的基本单元,所有生产者发布的消息都是发到主题

消费者订阅主题,然后消费生产者发布的消息

生产者 生产者把消息发布到主题

消费者 订阅主题,消费生产者发布的消息

分区:每个主题都可以分成多个分区,每个分区都是数据的有序子集

分区当中保留数据,按照偏移量来有序的存储数据,消费者可以根据偏移量来消费指定分区当中的消息(一般不用)

偏移量:消息在分区当中的唯一标识,跟踪和定位消息所在位置,消费者可以根据偏移量来处理信息

分区还有备份的作用:我们在创建主题时创建分区,创建分区时要指定副本数

分区和我们执行的集群机器数量一般是保持一致

副本:备份分区中的消息。最少要2个,互为备份。

经纪人(broker):经纪人处理生产者和消费者的请求(kafka)元数据(zookeeper)

zookeeper:保存元数据。

kafka的工作流程:

生产者将消息发布到指定的主题,每个消息都附带一个key和value

主题是有多个分区的,生产者将消息写入一个分区(带偏移量)

经纪人(kafka)分配和处理生产者的发布请求,偏移量也是经纪人分配(在分区中是唯一)。

消费者订阅主题,获取全量的消费者的消费信息(默认模式),也可以从指定的分区获取消息(代码完成,一般不用)

生产者发布的消息会在本地保留一段时间,防止消费者延迟或者处理速度国漫,导致没有成功消费。保留时间:7天

kafka-topics.sh --create --bootstrap-server 192.168.39.31:9092,192.168.39.32:9092,192.168.168.39.33:9092 --replication-factor 2 --partition 3 --topic test1

–replication-factor 2:创建分区的副本数,最少2个

–partition 3:分区数

–topic test1:主题名称

192.168.39.31
192.168.39.32
192.168.39.33
三台同时
tar -xf kafka_2.13-3.4.1.tgz 
mv kafka_2.13-3.4.1 /usr/local/kafka
cd /usr/local/kafka/config/
vim server.properties
24 broker.id=0      每台主机必须不一样
34 listeners=PLAINTEXT://192.168.39.31:9092	每台地址跟本机相同

44 num.network.threads=3
#broker处理网络请求的线程数,一般不动
47 num.io.threads=8
#处理磁盘读写的线程数,数制一定大于磁盘数量
51 socket.send.buffer.bytes=102400
#发送套接字的缓冲区的大小
54 socket.receive.buffer.bytes=102400
#接收套接字缓冲区的大小
57 socket.request.max.bytes=104857600
#请求套接字缓冲区的大小
63 log.dirs=/usr/local/kafka/logs
64 #日志存放路径
68 num.partitions=1
69 #创建主题时,经纪人指定的分区数,如果指定的分区数不同,这个值可以覆盖
106 log.retention.hours=168
107 #消息的本地持久化保留的时间,168小时
126 zookeeper.connect=192.168.39.31:2181,192.168.39.32:2181,192.168.38.33:2181

vim /etc/profile
export KAFKA_HOME=/usr/local/kafka
export PATH=$PATH:$KAFKA_HOME/bin
source /etc/profile

vim /etc/init.d/kafka
#!/bin/bash
#chkconfig:2345 22 88
#description:Kafka Service Control Script
KAFKA_HOME='/usr/local/kafka'
case $1 in
start)
	echo "---------- Kafka 启动 ------------"
	${KAFKA_HOME}/bin/kafka-server-start.sh -daemon ${KAFKA_HOME}/config/server.properties
;;
stop)
	echo "---------- Kafka 停止 ------------"
	${KAFKA_HOME}/bin/kafka-server-stop.sh
;;
restart)
	$0 stop
	$0 start
;;
status)
	echo "---------- Kafka 状态 ------------"
	count=$(ps -ef | grep kafka | egrep -cv "grep|$$")
	if [ "$count" -eq 0 ];then
        echo "kafka is not running"
    else
        echo "kafka is running"
    fi
;;
*)
    echo "Usage: $0 {start|stop|restart|status}"
esac

service kafka start
netstat -antp | grep 9092

kafka-topics.sh --create --bootstrap-server 192.168.39.31:9092,192.168.39.32:9092,192.168.39.33:9092 --replication-factor 2 --partitions 3 --topic test1
#创建主题

kafka-console-producer.sh --broker-list 192.168.39.31:9092,192.168.39.32:9092,192.168.39.33:9092 --topic test1
#生产者创建消息

kafka-console-consumer.sh --bootstrap-server 192.168.39.31:9092,192.168.39.32:9092,192.168.39.33:9092 --topic test1 --from-beginning
#消费者消费生产者创建的消息

kafka-topics.sh --describe --bootstrap-server 192.168.39.31:9092,192.168.39.32:9092,192.168.39.33:9092
#查询集群中的主题详细信息

kafka-topics.sh --list --bootstrap-server 192.168.39.31:9092,192.168.39.32:9092,192.168.39.33:9092
#列出Kafka集群中当前存在的所有主题

总结:

zookeeper就是总结集群的元数据

kafka的工作流程

组件的作用

kafka的消息堆积该如何解决:

消费者出现了延迟或者处理能力太差,导致消息堆积

1、减少kafka持久化的保存时间

2、修改主题的分区数,扩大分区的数量,提高消费者获取的通道

3、可以指定多个消费者共同工作,处理消息的挤压

elk+f+kafka

image-20240806090943017
192.168.39.30	es1 	Elasticsearch+Elasticsearch-head+phantomjs+node
192.168.39.50 	es2 	Elasticsearch+Elasticsearch-head+phantomjs+node
192.168.39.60 	logstash+kibana
192.168.39.31 	zookeeper+kafka
192.168.39.32 	zookeeper+kafka
192.168.39.33 	zookeeper+kafka
192.168.39.40 	filebeat+nginx


192.168.39.40

cd /usr/local/filebeat
vim filebeat.yml
filebeat.prospectors:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/access_log
  tags: ["access"]
  
- type: log
  enabled: true
  paths:
    - /var/log/nginx/error_log
  tags: ["error"]
  
#添加输出到 Kafka 的配置
161行
output.kafka:
  enabled: true
  hosts: ["192.168.39.31:9092","192.168.39.32:9092","192.168.39.33:9092"]    #指定 Kafka 集群配置
  topic: "nginx"    #指定 Kafka 的 topic
  
#启动 filebeat
nohup ./filebeat -e -c filebeat.yml> filebeat.out &

192.168.39.60
部署 ELK,在 Logstash 组件所在节点上新建一个 Logstash 配置文件
cd /etc/logstash/conf.d/
vim kafka.conf
input {
    kafka {
        bootstrap_servers => "192.168.39.31:9092,192.168.39.32:9092,192.168.39.33:9092"  
		#kafka集群地址
        topics  => "nginx"     
		#拉取的kafka的指定topic
        type => "nginx_kafka"  
		#指定 type 字段
        codec => "json"        
		#解析json格式的日志数据
		auto_offset_reset => "latest"  
		#拉取最近数据,earliest为从头开始拉取
		decorate_events => true   
		#传递给elasticsearch的数据额外增加kafka的属性数据
    }
}

output {
  if "access" in [tags] {
    elasticsearch {
      hosts => ["192.168.39.30:9200","192.168.39.50:9200"]
      index => "nginx_access-%{+YYYY.MM.dd}"
    }
  }
  
  if "error" in [tags] {
    elasticsearch {
      hosts => ["192.168.39.30:9200","192.168.39.50:9200"]
      index => "nginx_error-%{+YYYY.MM.dd}"
    }
  }
  
}

#启动 logstash
logstash -f kafka.conf --path.data /opt/test9 &


4.浏览器访问 http://192.168.39.60:5601 登录 Kibana,
单击“Create Index Pattern”按钮添加索引“filebeat_test-*”,单击 “create” 按钮创建,
单击 “Discover” 按钮可查看图表信息及日志信息。

RSYNC 远程同步

上行 客户端同步到服务端

下行 服务端同步到客户端

开源的快速备份的工具,一般是系统 自带的

可以在不同主机之间同步整个目录树(目录)

在远程同步的任务中,负责发起rsync的叫做发起端,也就是服务端,负责响应的同步请求的,就是客户端

rsync的特点:
1、支持拷贝文件,链接文件等等

2、可以同步整个目录

3、可以支持保留源文件或者目录的权限等等

4、可以实现增量同步

同步方式

1、完整备份

2、增量备份
常用的选项:

1、-a 归档模式,保留权限

2、-v 显示同步的详细过程

3、-z 压缩,在传输的过程中对文件进行压缩

4、-H 同步硬连接

5、–delete 同步删除文件

6、-l 同步连接文件

7、-r 递归,所有

inotify-tools

inotify 实时监控

inotify watch 监控文件系统的变化

inotify wait 监控修改,创建,移动,删除,属性修改(权限,所有者,所属组)如果有变动,立即输出结果

inotifywait -mrq -e modify,create,move,delete,attrib /opt/xy102
m 持续监控
r 递归整个目录 只要变化包含子目录的变化全部记录
q 简化输出信息
e 指定监控的事件,

test1	上行
test2	下行

test1
rpm -q rsync
vim /etc/rsyncd.conf
uid = root
gid = root
use chroot = yes
#是否禁锢在源目录
address = 192.168.39.34
port 873
#监听地址
# max connections = 4
pid file = /var/run/rsyncd.pid
log file = /var/log.rsyncd.log
hosts allow = 192.168.39.0/24
#允许访问的客户端的ip地址
dont compress = *.gz *.bz2 *.tgz *.zip *.rar *.z
#在传输过程中,不再进行压缩的文件类型
[test]
#共享模块的名称,后续通过模块的名称来进行同步
path = /opt/test
#源目录,就是同步的目录
#comment = test
#备注信息
read only = no
#源目录,客户端可以读,也可以写
auth users = backuper
#授权登录的账户名称
secrets file = /etc/rsyncd_users.db
#授权登录账户的密码文件

vim /etc/rsyncd_users.db
backuper:123456

chmod 600 /etc/rsyncd_users.db
cd /opt
ll
mkdir /opt/test
chmod 777 /opt/test/
netstat -antp | grep 873
systemctl restart rsyncd

test2
tar -xf inotify-tools-3.14.tar.gz、
yum -y install make
cd inotify-tools-3.14/
./configure
make -j 4 && make
cd /opt
mkdir xy102
chmod 777 /opt/xy102/
inotifywait -mrq -e modify,create,move,delete,attrib /opt/xy102
#另开同一台test2可以在/opt/xy102同步操作
cd /opt/xy102
vim inotify.sh
#!/bin/bash
inotify_cmd="inotifywait -mrq -e modify,create,move,delete,attrib /opt/xy102"
rsync_cmd="rsync -azH --delete --password-file=/etc/server.pass /opt/xy102 backuper@192.168.39.34::test/"
$inotify_cmd | while read DIRECTORY EVENT FILE
do
  if [ $(pgrep rsync | wc -l ) -le 0 ]
  then
    $rsync_cmd
  fi
done

chmod 777 inotify.sh
./inotify.sh

#!bin/bash

inotify_cmd=“inotifywait -mrq -e modify,create,move,delete,attrib /opt/xy102”

rsync_cmd=“rsync -azH --delelte --passwd-file=/etc/server.pass /opt/xy102 backuper@192.168.39.34::test”

.tar.gz、
yum -y install make
cd inotify-tools-3.14/
./configure
make -j 4 && make
cd /opt
mkdir xy102
chmod 777 /opt/xy102/
inotifywait -mrq -e modify,create,move,delete,attrib /opt/xy102
#另开同一台test2可以在/opt/xy102同步操作
cd /opt/xy102
vim inotify.sh
#!/bin/bash
inotify_cmd=“inotifywait -mrq -e modify,create,move,delete,attrib /opt/xy102”
rsync_cmd=“rsync -azH --delete --password-file=/etc/server.pass /opt/xy102 backuper@192.168.39.34::test/”
$inotify_cmd | while read DIRECTORY EVENT FILE
do
if [ $(pgrep rsync | wc -l ) -le 0 ]
then
$rsync_cmd
fi
done

chmod 777 inotify.sh
./inotify.sh


#!bin/bash

inotify_cmd="inotifywait -mrq -e modify,create,move,delete,attrib /opt/xy102"

rsync_cmd="rsync -azH --delelte --passwd-file=/etc/server.pass /opt/xy102 backuper@192.168.39.34::test"

--delete	全同步,将两个文件中不同的文件将其删除
  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值