Elasticsearch-8.11.1 (2+1)HA(高可用)集群部署

目录

一、环境描述

二、安装 ES

2.1 下载Elasticsearch

2.2 解压Elasticsearch

2.3 创建es服务账号/密码

2.3 修改服务器配置

2.4 配置节点

2.4.1 配置说明

2.4.2 配置高可用集群

2.4.2.1 maser节点服务配置

2.4.2.2 node1 节点服务配置

2.4.2.3 node2 节点服务配置

2.4.2.3 node3 节点服务配置

2.4.2.3 node4 节点服务配置

2.4.3 服务启动

2.4.4 验证服务启动有没有成功

2.4.4.1 ps查看有没有es进程

2.4.4.2 访问服务

三、部署Kibana

3.1 下载Kibana

3.2 解压

3.3 配置Kibana

3.4  给账号密码做目录授权

3.5 启动服务

3.6 访问Kibana

四、安装Head 插件

4.1 下载Head插件

4.2 修改Gruntfile.js文件

4.3 修改ES配置文件

4.3 安装head 服务

4.4 启动服务

4.5 访问Head

五、ES集群安全

5.1 集群安全策略

5.1.1 版本支持

5.1.2 支持的策略

5.2 不同策略的实现

5.2.1 Minimal security(最低安全等级)配置

5.2.1.1 Minimal security配置步骤

5.2.1.1.1 启动Security

5.2.1.1.2 重启节点服务

5.2.1.1.2 创建用户密码

5.2.1.1.3 配置Kibana的账号信息

5.2.2 Basic security(基本安全等级)配置

5.2.2.1 适用范围和概念

5.2.2.2 配置步骤

5.2.2.2.1 配置文件 elasticsearch.yml

5.2.2.2.2 生成密钥文件

5.2.2.2.3 为节点颁发证书

5.2.2.2.4 把证书拷贝的每个节点

5.2.2.2.5 启动所有节点

5.2.2.2.6 设置集群密码

5.2.2.2.7 配置Kibana

5.2.3 基本安全+HTTPS

5.2.3.1 前置条件

5.2.3.2 配置步骤

5.2.3.2.1 保证每个节点的服务处于停止状态

5.2.3.2.2 生成证书签名文件

5.2.3.2.2.1 当询问您是否要生成 CSR 时,请输入 n

5.2.3.2.2.2 当询问您是否要使用现有 CA 时,输入 y

5.2.3.2.2.3 输入您的 CA 的路径

5.2.3.2.2.4 输入您的 CA 的密码

5.2.3.2.2.5 输入证书的到期值

5.2.3.2.2.6 当询问您是否要为每个节点生成一个证书时,输入 y

5.2.3.2.2.7 出现提示时,输入集群中第一个节点的名称

5.2.3.2.2.8 输入用于连接到您的第一个节点的所有主机名

5.2.3.2.2.9 输入客户端可用于连接到您的节点的 IP 地址

5.2.3.2.3 设置私钥密码

5.2.3.2.3.1 解压elasticsearch-ssl-http.zip文件

5.2.3.2.3.3 修改 elasticsearch.yml 文件

5.2.3.2.3.4 复制证书到config目录中

5.2.3.2.3.5 把私钥密码添加到 Elasticsearch 的安全设置中

5.2.3.3 启动节点服务

5.2.3.4 配置Kibana

5.2.3.4.1 拷贝证书到config下

5.2.3.4.2 修改Kibana配置


一、环境描述

系统环境描述:本教程基于CentOS 8.0版本虚拟机

es集群规划:

节点Master(主节点/候选节点)Master(紧选举)Data(数据节点)KibanaIP
master*192.168.31.215
node1*192.168.31.8
node2**192.168.31.9
node3*192.168.31.167
node4*192.168.31.154

软件版本:
Elasticsearch    8.11.1
kibana      8.11.1

二、安装 ES

2.1 下载Elasticsearch

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.11.1-linux-x86_64.tar.gz

2.2 解压Elasticsearch

tar -zxvf elasticsearch-8.11.1-linux-x86_64.tar.gz

mv  elasticsearch-8.11.1 /usr/local/

2.3 创建es服务账号/密码

#ES无法通过root账号启动服务
(elastic/xiaoning)
# 创建账号
useradd elastic

# 创建密码
passwd elastic

# 给账号密码做目录授权
chown -R elastic:elastic /usr/local/elasticsearch-8.11.1

2.3 修改服务器配置

vim  /etc/security/limits.conf

hard nofile 65536
soft nofile 65636
elastic soft memlock unlimited
elastic hard memlock unlimited

vim /etc/sysctl.conf

vm.max_map_count=262144
vm.swappiness=0
#重启
sysctl -p

ulimit -l unlimited

提示:以上操作,所有节点都需要操作

2.4 配置节点

2.4.1 配置说明

cluster.name:集群名称,节点根据集群名称确定是否是同一个集群。

node.name:节点名称,集群内唯一。

node.roles:[ data, master, voting_only ],node.roles配置项如果没有显式的配置,那么当前节点拥有所有角色(master、data、ingest、ml、remote_cluster_client、transform)。如果你放开了注释,或者手动显式添加了 node.roles配置项,那么当前节点仅拥有此配置项的中括号中显式配置的角色,没有配置的角色将被阉割。因此如果在不熟悉角色配置的情况下,不要轻易修改角色配置值, 切勿画蛇添足 。

network.host:节点对外提供服务的地址以及集群内通信的ip地址

bootstrap.memory_lock: Swapping对性能和节点稳定性非常不利,应该不惜一切代价避免。它可能导致GC持续几分钟而不是几毫秒,并且可能导致节点响应缓慢甚至与集群断开连接。在弹性分布式系统中,使用Swap还不如让操作系统杀死节点效果更好。可以通过设置 bootstrap.memory_lock: true 以防止任何 Elasticsearch 堆内存被换出。

http.port:对外提供服务的端口号

discovery.seed_hosts: 集群初始化的种子节点,可配置部分或全部候选节点,大型集群可通过嗅探器发现剩余节点,考试环境配置全部节点即可

cluster.initial_master_nodes:节点初始 active master节点, 必须是有master角色的节点,即必须是候选节点,但并不是必须配置所有候选节点。生产模式下启动新集群时,必须明确列出应在第一次选举中计算其选票的候选节点。第一次成功形成集群后,cluster.initial_master_nodes从每个节点的配置中删除设置。重新启动集群或向现有集群添加新节点时,请勿使用此设置。

2.4.2 配置高可用集群

2.4.2.1 maser节点服务配置
vim elasticsearch.yml

cluster.name: ning_cluster
node.name: ning_cluster_node-1
node.roles: [master]
path.data: /usr/local/elasticsearch-8.11.1/data
path.logs: /usr/local/elasticsearch-8.11.1/logs
bootstrap.memory_lock: true
network.host: 192.168.31.215
http.port: 9200
transport.port: 9300
xpack.security.enabled: false
discovery.seed_hosts: ["192.168.31.215:9300", "192.168.31.8:9300","192.168.31.9:9300", "192.168.31.167:9300","192.168.31.154:9300"]
cluster.initial_master_nodes: ["ning_cluster_node-1"]
2.4.2.2 node1 节点服务配置
vim elasticsearch.yml

cluster.name: ning_cluster
node.name: ning_cluster_node-2
node.roles: [master]
path.data: /usr/local/elasticsearch-8.11.1/data
path.logs: /usr/local/elasticsearch-8.11.1/logs
bootstrap.memory_lock: true
network.host: 192.168.31.8
http.port: 9200
transport.port: 9300
xpack.security.enabled: false
discovery.seed_hosts: ["192.168.31.215:9300", "192.168.31.8:9300","192.168.31.9:9300", "192.168.31.167:9300","192.168.31.154:9300"]
cluster.initial_master_nodes: ["ning_cluster_node-1"]
2.4.2.3 node2 节点服务配置
vim elasticsearch.yml

cluster.name: ning_cluster
node.name: ning_cluster_node-3
node.roles: [master,data,voting_only]
path.data: /usr/local/elasticsearch-8.11.1/data
path.logs: /usr/local/elasticsearch-8.11.1/logs
bootstrap.memory_lock: true
network.host: 192.168.31.9
http.port: 9200
transport.port: 9300
xpack.security.enabled: false
discovery.seed_hosts: ["192.168.31.215:9300", "192.168.31.8:9300","192.168.31.9:9300", "192.168.31.167:9300","192.168.31.154:9300"]
cluster.initial_master_nodes: ["ning_cluster_node-1"]
2.4.2.3 node3 节点服务配置
vim elasticsearch.yml

cluster.name: ning_cluster
node.name: ning_cluster_node-4
node.roles: [data]
path.data: /usr/local/elasticsearch-8.11.1/data
path.logs: /usr/local/elasticsearch-8.11.1/logs
bootstrap.memory_lock: true
network.host: 192.168.31.167
http.port: 9200
transport.port: 9300
xpack.security.enabled: false
discovery.seed_hosts: ["192.168.31.215:9300", "192.168.31.8:9300","192.168.31.9:9300", "192.168.31.167:9300","192.168.31.154:9300"]
cluster.initial_master_nodes: ["ning_cluster_node-1"]
2.4.2.3 node4 节点服务配置
vim elasticsearch.yml

cluster.name: ning_cluster
node.name: ning_cluster_node-5
node.roles: [data]
path.data: /usr/local/elasticsearch-8.11.1/data
path.logs: /usr/local/elasticsearch-8.11.1/logs
bootstrap.memory_lock: true
network.host: 192.168.31.154
http.port: 9200
transport.port: 9300
xpack.security.enabled: false
discovery.seed_hosts: ["192.168.31.215:9300", "192.168.31.8:9300","192.168.31.9:9300", "192.168.31.167:9300","192.168.31.154:9300"]
cluster.initial_master_nodes: ["ning_cluster_node-1"]

2.4.3 服务启动

#前台进程

./bin/elasticsearch

#后台启动 守护进程

./bin/elasticsearch -d

#推荐方式(保存进程号 不占用窗口,并且方便杀进程):

./bin/elasticsearch -d -p pid

2.4.4 验证服务启动有没有成功

2.4.4.1 ps查看有没有es进程
ps -ef|grep elastic
2.4.4.2 访问服务

直接浏览器输入:

http://192.168.31.8:9200/

出现以上内容则说明启动成功。

提示:所有节点都需要执行上述命令

三、部署Kibana

3.1 下载Kibana

wget https://artifacts.elastic.co/downloads/kibana/kibana-8.11.1-linux-x86_64.tar.gz

3.2 解压

tar -zxvf kibana-8.11.1-linux-x86_64.tar.gz

3.3 配置Kibana

server.port: 5601
server.host: "192.168.31.9"
elasticsearch.hosts: ["192.168.31.215:9200", "192.168.31.8:9200","192.168.31.9:9200", "192.168.31.167:9200","192.168.31.154:9200"]

3.4  给账号密码做目录授权

chown -R elastic:elastic /usr/local/kibana-8.11.1

3.5 启动服务

./bin/kibana

3.6 访问Kibana

浏览器直接访问:http://192.168.31.9:5601/

四、安装Head 插件

4.1 下载Head插件

https://github.com/mobz/elasticsearch-head

4.2 修改Gruntfile.js文件

#添加
hostname:'*',

4.3 修改ES配置文件

#ES配置文件中设置允许跨域
vim elasticsearch.yml

http.cors.enabled: true
http.cors.allow-origin: "*"

4.3 安装head 服务

进入 elasticsearch-head 解压目录,执行命令

npm install

4.4 启动服务

执行命令:

npm run start

4.5 访问Head

浏览器直接输入:http://localhost:9100

五、ES集群安全

5.1 集群安全策略

5.1.1 版本支持

不同版本对 Security 的支持不同,对于 ES 6.8 及之前版本,需要手动安装 x-pack,对于7.X以上版本 X-Pack 已经内置,所以不需要额外的操作。

5.1.2 支持的策略

不同环境对集群安全的策略等级要求不同,主要区别在于你是开发环境还是生产集群环境。ES提供了三个不同等级的安全策略:最低安全等级、基本安全等级、基本安全 + HTTPS
就实际而言,在处于 ES 学习 或者本地开发模式下,是可以关闭 Security 功能的,因为如果是以学习为目的,不存在所谓的数据安全问题,因为数据即便被删除也是没关系的。而如果在学习或开发模式下也开启安全策略,意味着你需要频繁的跟密码较劲,实属没必要。

5.2 不同策略的实现

5.2.1 Minimal security(最低安全等级)配置

5.2.1.1 Minimal security配置步骤
5.2.1.1.1 启动Security
vim vim elasticsearch.yml

xpack.security.enabled: true

5.2.1.1.2 重启节点服务
# kill -9 [pid]
./bin/elasticsearch -d -p pid

提示:单节点环境下,能启动成功,集群环境的安全策略最低要求配置成基本安全等级模式,所以这里是启动不了的,过不了集群的安全检查,会直接报错

5.2.1.1.2 创建用户密码
./bin/elasticsearch-setup-passwords interactive

提示:单节点环境下,可以按照这个步骤,集群环境下,需要完成Basic security(基本安全等级)配置后才能创建

5.2.1.1.3 配置Kibana的账号信息

提示:单节点环境下,可以按照这个步骤,集群环境下,需要完成Basic security(基本安全等级)配置后才能配置Kibana账号信息

5.2.2 Basic security(基本安全等级)配置

5.2.2.1 适用范围和概念

最低安全配置仅适用于单节点服务,而不符合集群的最低安全要求。如果集群有多个节点,那么您必须在节点之间配置 TLS。如果您不启用 TLS,无法启动生产集群。

传输层依赖双向 TLS 对节点进行加密和认证。正确应用 TLS 可确保恶意节点无法加入集群并与其他节点交换数据。虽然在 HTTP 层实现用户名和密码身份验证对于保护本地集群很有用,但节点之间的通信安全需要 TLS。

Transport 协议是 Elasticsearch 节点用于相互通信的协议的名称。此名称特定于 Elasticsearch,用于区分传输端口(默认 9300)和 HTTP 端口(默认 9200)。节点使用传输端口相互通信,REST 客户端使用 HTTP 端口与 Elasticsearch 通信。

5.2.2.2 配置步骤
5.2.2.2.1 配置文件 elasticsearch.yml
# 开启ssl访问请求头配置(head访问需要)
http.cors.allow-headers: Authorization,X-Requested-With,Content-Length,Content-Type
#配置SSL证书
xpack.security.transport.ssl.enabled: true

#设置验证模式为:certificate
xpack.security.transport.ssl.verification_mode: certificate

#设置证书路径
xpack.security.transport.ssl.key: certs/elastic-certificates.key
xpack.security.transport.ssl.certificate: certs/elastic-certificates.crt
xpack.security.transport.ssl.certificate_authorities: certs/ca.crt
5.2.2.2.2 生成密钥文件

提示:

1、删除各个es节点$ELASTICSEARCH_HOME/config目录下的elasticsearch.keystore文件
2、清空各个es节点$ELASTICSEARCH_HOME/ 下的data和log目录

./bin/elasticsearch-certutil ca --pem --out ca.zip --days 36500 -s

5.2.2.2.3 为节点颁发证书
#解压ca.zip
unzip ca.zip

# 颁发证书
./bin/elasticsearch-certutil cert --ca-cert ca/ca.crt --ca-key ca/ca.key --pem --name elastic-certificates --out elastic-certificates.zip --days 36500 -s

5.2.2.2.4 把证书拷贝的每个节点

#每个节点的config文件夹下,新建一个certs目录

mkdir certs

#拷贝文件到节点的cert目录下

#解压证书文件
unzip elastic-certificates.zip
#拷贝到certs文件夹下
cp ca/* elastic-certificates/* config/certs

# 拷贝给其他机器
scp config/certs/* elastic@node1:/usr/local/elasticsearch-8.11.1/config/certs/

scp config/certs/* elastic@node2:/usr/local/elasticsearch-8.11.1/config/certs/

scp config/certs/* elastic@node3:/usr/local/elasticsearch-8.11.1/config/certs/

scp config/certs/* elastic@node4:/usr/local/elasticsearch-8.11.1/config/certs/
5.2.2.2.5 启动所有节点
5.2.2.2.6 设置集群密码
bin/elasticsearch-setup-passwords interactive

elastic xiaoning
apm_system xiaoning
kibana_system xiaoning
logstash_system xiaoning
beats_system xiaoning
remote_monitoring_user xiaoning

5.2.2.2.7 配置Kibana
# 配置账号密码
vim kibana.yml

elasticsearch.username: "kibana_system"
elasticsearch.password: "xiaoning"

5.2.3 基本安全+HTTPS

在生产环境中,如果没有基于HTTPS上启用 TLS,那么部分安全功能会无法使用,比如Token和API密钥。

官方文档参考:

Set up basic security for the Elastic Stack plus secured HTTPS traffic | Elasticsearch Guide [8.11] | Elastic

5.2.3.1 前置条件

启用 HTTPS 必须要配置集群 Security,即基础集群安全策略。

5.2.3.2 配置步骤
5.2.3.2.1 保证每个节点的服务处于停止状态
5.2.3.2.2 生成证书签名文件
./bin/elasticsearch-certutil http

提示:
此命令会生成一个 .zip文件,其中包含用于 Elasticsearch 和 Kibana 的证书和密钥。每个文件夹都包含一个 README.txt 解释如何使用这些文件。

5.2.3.2.2.1 当询问您是否要生成 CSR 时,请输入 n

5.2.3.2.2.2 当询问您是否要使用现有 CA 时,输入 y

5.2.3.2.2.3 输入您的 CA 的路径

elastic-stack-ca.p12这是您为集群生成 的文件的绝对路径

5.2.3.2.2.4 输入您的 CA 的密码
5.2.3.2.2.5 输入证书的到期值

您可以输入年、月或日的有效期。例如,输入 90D90 天.

5.2.3.2.2.6 当询问您是否要为每个节点生成一个证书时,输入 y

每个证书都有自己的私钥,并针对特定的主机名或 IP 地址颁发.

5.2.3.2.2.7 出现提示时,输入集群中第一个节点的名称

使用生成节点证书时使用的相同节点名称.

5.2.3.2.2.8 输入用于连接到您的第一个节点的所有主机名

这些主机名将作为 DNS 名称添加到证书的主题备用名称 (SAN) 字段中。
列出用于通过 HTTPS 连接到集群的每个主机名和变体

5.2.3.2.2.9 输入客户端可用于连接到您的节点的 IP 地址

到此,证书生成完成,可以看到生成的证书名称

5.2.3.2.3 设置私钥密码
5.2.3.2.3.1 解压elasticsearch-ssl-http.zip文件
unzip elasticsearch-ssl-http.zip

5.2.3.2.3.3 修改 elasticsearch.yml 文件
#启用 HTTPS
xpack.security.http.ssl.enabled: true
#指定 http.p12 安全证书的位置
xpack.security.http.ssl.keystore.path: http.p12
5.2.3.2.3.4 复制证书到config目录中
#拷贝到本机
cp elasticsearch/http.p12 config/
# 拷贝给其他机器

scp elasticsearch/http.p12 elastic@node1:/usr/local/elasticsearch-8.11.1/config/

scp elasticsearch/http.p12 elastic@node2:/usr/local/elasticsearch-8.11.1/config/

scp elasticsearch/http.p12 elastic@node3:/usr/local/elasticsearch-8.11.1/config/

scp elasticsearch/http.p12 elastic@node4:/usr/local/elasticsearch-8.11.1/config/
5.2.3.2.3.5 把私钥密码添加到 Elasticsearch 的安全设置中
#每个节点都需要执行,每个节点的密码可以设置的并不一样,生产环境可以做好密码记录,这里我为了方便,就设置一样了
./bin/elasticsearch-keystore add xpack.security.http.ssl.keystore.secure_password
输入密码:xiaoning
5.2.3.3 启动节点服务
5.2.3.4 配置Kibana
5.2.3.4.1 拷贝证书到config下
scp kibana/elasticsearch-ca.pem elastic@node2:/usr/local/kibana-8.11.1/config
5.2.3.4.2 修改Kibana配置
vim kibana.yml

elasticsearch.ssl.certificateAuthorities:[config/elasticsearch-ca.pem]

elasticsearch.hosts: ["https://192.168.31.215:9200", "https://192.168.31.8:9200","https://192.168.31.9:9200", "https://192.168.31.167:9200","https://192.168.31.154:9200"]

以上之后,kibana 与Elasticsearch之间的SSL加密通道传输就完成了。

好了,本次分享就到这里,如果帮助到大家,欢迎大家点赞+关注+收藏,有疑问也欢迎大家评论留言!

  • 33
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Elasticsearch是一个基于Lucene的搜索服务器,提供分布式多用户能力的全文搜索引擎,支持RESTful接口,我们可以使用它来进行数据的存储、检索和分析等操作。下面是ElasticSearch2.4.6的安装部署以及集群部署ElasticSearch-head等插件的安装。 ## 安装部署 ### 1. 下载ElasticSearch2.4.6 从官网下载ElasticSearch2.4.6:https://www.elastic.co/downloads/past-releases/elasticsearch-2-4-6 ### 2. 解压缩 将下载好的文件解压缩到指定目录: ``` tar -xzvf elasticsearch-2.4.6.tar.gz -C /usr/local/ ``` ### 3. 修改配置文件 修改`/usr/local/elasticsearch-2.4.6/config/elasticsearch.yml`文件,主要修改以下几项: ``` cluster.name: my-elasticsearch-cluster node.name: my-elasticsearch-node-1 network.host: 0.0.0.0 http.port: 9200 ``` 其中`cluster.name`表示集群名称,`node.name`表示节点名称,`network.host`表示绑定的IP地址,`http.port`表示http监听端口。 ### 4. 启动ElasticSearch 运行以下命令启动Elasticsearch: ``` cd /usr/local/elasticsearch-2.4.6/bin/ ./elasticsearch ``` ### 5. 验证安装 使用浏览器访问`http://localhost:9200/`,如果返回以下信息则表示安装成功: ``` { "name" : "my-elasticsearch-node-1", "cluster_name" : "my-elasticsearch-cluster", "version" : { "number" : "2.4.6", "build_hash" : "5376dca9f70f3abef96a77f4bb22720ace8240fd", "build_timestamp" : "2017-07-18T12:17:44Z", "build_snapshot" : false, "lucene_version" : "5.5.4" }, "tagline" : "You Know, for Search" } ``` ## 集群部署 ### 1. 修改配置文件 在每个节点的`/usr/local/elasticsearch-2.4.6/config/elasticsearch.yml`文件中添加以下内容: ``` cluster.name: my-elasticsearch-cluster node.name: my-elasticsearch-node-1 network.host: 0.0.0.0 http.port: 9200 discovery.zen.ping.unicast.hosts: ["192.168.1.101", "192.168.1.102", "192.168.1.103"] ``` 其中`discovery.zen.ping.unicast.hosts`表示集群中所有节点的IP地址列表。 ### 2. 启动节点 分别在每个节点上启动Elasticsearch: ``` cd /usr/local/elasticsearch-2.4.6/bin/ ./elasticsearch ``` ### 3. 验证集群 使用浏览器访问`http://localhost:9200/_cat/nodes?v`,如果返回以下信息则表示集群启动成功: ``` ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name 192.168.1.101 34 98 3 0.00 0.01 0.05 mdi * my-elasticsearch-node-1 192.168.1.102 36 99 0 0.00 0.01 0.05 mdi - my-elasticsearch-node-2 192.168.1.103 31 98 2 0.00 0.01 0.05 mdi - my-elasticsearch-node-3 ``` ## ElasticSearch-head等插件的安装 ### 1. 安装Node.js和npm ElasticSearch-head是一个基于浏览器的Elasticsearch集群管理工具,需要安装Node.js和npm才能使用。使用以下命令安装Node.js和npm: ``` sudo apt-get update sudo apt-get install nodejs npm ``` ### 2. 安装ElasticSearch-head 使用以下命令安装ElasticSearch-head: ``` sudo npm install -g grunt-cli git clone git://github.com/mobz/elasticsearch-head.git cd elasticsearch-head npm install ``` ### 3. 启动ElasticSearch-head 使用以下命令启动ElasticSearch-head: ``` grunt server & ``` 打开浏览器,访问`http://localhost:9100/`,即可打开ElasticSearch-head界面。 至此,ElasticSearch2.4.6的安装部署以及集群部署ElasticSearch-head等插件的安装完成。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值