DolphinScheduler跨版本升级1.3.8至3.0.1

这篇具有很好参考价值的文章主要介绍了DolphinScheduler跨版本升级1.3.8至3.0.1。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Refer

  • 遵循历史,依然要感谢各位在网上的输出!升级前还在考虑是否有可参考的文档呢,结果还真有大哥在做,给到了很多支持,感谢!

dolphinscheduler版本1.3跨版本升级到3.0
dolphinscheduler3.0.1官方文档(伪集群部署)
Apache DolphinScheduler v3.0.1 使用手册

  • 注:官网给的备注是集群部署参照伪集群部署

背景

  • 上次安装Dolphin的时候工具只更新到了2.0.3版本,而且更新时间较新,出于稳定性考虑选择了1.3.8版本,该版本对于流程的优化和调度任务的类型都较少(但大致是够用的)。Dolphin的更新迭代一直都很快速,所以其实3.X的版本新增了很多任务支持,包括对于任务的数据质量监控都是集成工具中比较亮眼的功能。所以在原本的基础上预期将1.3.8版本升级到3.X版本。
  • 主要更新的是MySQL,由1.X到3.X的数据变化还是很大的
  • 其余相关升级操作可以参考官方文档,也可以参考该文档,相对的我这里会给出一些我的问题的解决办法哈

基础环境

  1. dolphinscheduler2.0.0(两个版本都需要,有一些信息互补)
  2. dolphinscheduler3.0.1(两个版本都需要,有一些信息互补)
  3. MySQL8.0.16
  4. mysql-connector-java8.0.16(手动下载连接器后添加到master,api、,tools,worker的libs下)
  5. JDK1.8
  6. ZooKeeper3.4.7 (3.4.6+)
  7. 进程树分析:macOS安装pstree;Fedora/Red/Hat/CentOS/Ubuntu/Debian安装psmisc
  8. DolphinScheduler 本身不依赖 Hadoop、Hive、Spark,但如果你运行的任务需要依赖他们,就需要有对应的环境支持
192.168.0.1 192.168.0.2 192.168.0.3
master服务
worker服务
alertServer报警服务
后端api服务

依赖版本升级

  • 总体来说Dolphin这边的git项目拉下来在本地一般都不修改太多,依照自己的需求进行修改即可

修改pom.xml

// 3.0.1内含的POM文件中的基础组件版本,如果有版本区别,建议修改版本后重新打包部署
// 例如hadoop和hive的版本
// 注意:由于mysql-connector的版本在打包中要求的是8.0.16,建议下载8.0.16的驱动
    <properties>
		……
        <zookeeper.version>3.4.14</zookeeper.version>
        <spring.version>5.3.12</spring.version>
        <spring.boot.version>2.5.6</spring.boot.version>
        <java.version>1.8</java.version>
        ……
        <hadoop.version>2.7.3</hadoop.version>
        ……
        <mysql.connector.version>8.0.16</mysql.connector.version>
        ……
        <hive.jdbc.version>2.1.0</hive.jdbc.version>
        ……
    </properties>

版本变更后可以直接maven打包

mvn  -U clean package -Prelease -Dmaven.test.skip=true 

问题解决

  • 我个人的话在打包过程中出现了Strings.isNotEmpty报错没有对应的包,这种都比较好解决
  • 报错位置:src/main/java/org/apache/dolphinscheduler/tools/datasource/dao/ResourceDao.java
  • 报错解决:在dolphinscheduler-tools这个module的pom.xml中添加对应的依赖即可
        <dependency>
           <groupId>org.apache.directory.api</groupId>
           <artifactId>api-all</artifactId>
           <version>1.0.0-M20</version>
       </dependency>

MYSQL升级

1.文件替换

  • 通过3.0.1版本的升级文件夹可以看出每个版本的dolphin都对数据库进行了一些schema的修改,由上面引用的CSDN描述可以发现,2.0版本的和3.0版本中的对应2.0版本位置的配置文件是有区别的,所以进行替换,主要是一些字段的类型变化和增删
  • 位置:/apache-dolphinscheduler-3.0.1-bin/tools/sql/sql/upgrade
    dolphinscheduler升级,大数据,大数据,dophinscheduler,调度工具,升级
  • 示例
    dolphinscheduler升级,大数据,大数据,dophinscheduler,调度工具,升级
  • 命令
## 防止直接粘贴报错,我用了中文哈,记得修改对应位置为本地自己环境的路径
## 文件夹名称有区别也记得修改
cp 你自己的路径/apache-dolphinscheduler-2.0.0-bin/sql/upgrade/2.0.0_schema/mysql/do*  你自己的路径/apache-dolphinscheduler-3.0.1-bin/tools/sql/sql/upgrade/2.0.0_schema/mysql/

cp 你自己的路径/apache-dolphinscheduler-3.0.1-bin/tools/sql/sql/upgrade/2.0.0_schema/mysql/dolphinscheduler_dml.sql 你自己的路径/apache-dolphinscheduler-3.0.1-bin/tools/sql/sql/upgrade/2.0.1_schema/mysql/

2.修改表结构

  • 在下述的三个表中添加下述内容
t_ds_process_definition
# vim 你自己的路径/apache-dolphinscheduler-3.0.1-bin/tools/sql/sql/upgrade/2.0.0_schema/mysql/dolphinscheduler_ddl.sql
# 找到t_ds_process_definition添加下面sql    
alter table t_ds_process_definition_log add `execution_type` tinyint(4) DEFAULT '0' COMMENT 'execution_type 0:parallel,1:serial wait,2:serial discard,3:serial priority';
alter table t_ds_process_definition add `execution_type` tinyint(4) DEFAULT '0' COMMENT 'execution_type 0:parallel,1:serial wait,2:serial discard,3:serial priority';
t_ds_alert
# vim 你自己的路径/apache-dolphinscheduler-3.0.1-bin/tools/sql/sql/upgrade/3.0.0_schema/mysql/dolphinscheduler_ddl.sql
# 注释原有t_ds_alert添加字段操作(原始数据结构中存在该字段)
--ALTER TABLE `t_ds_alert` ADD COLUMN `alert_type` int DEFAULT NULL COMMENT 'alert_type';
ALTER TABLE `t_ds_alert` change `alert_type` `alert_type` int DEFAULT NULL COMMENT 'alert_type';
t_ds_process_instance
#vim 你自己的路径/apache-dolphinscheduler-3.0.1-bin/tools/sql/sql/upgrade/2.0.0_schema/mysql/dolphinscheduler_ddl.sql
alter table t_ds_process_instance add next_process_instance_id int(11) DEFAULT '0' COMMENT 'serial queue next processInstanceId';

3.时间参数修改

  • 这个我目前没有特意尝试
## 你自己的路径/apache-dolphinscheduler-3.0.1-bin/bin/env/dolphinscheduler_env.sh
export SPRING_JACKSON_TIME_ZONE=${SPRING_JACKSON_TIME_ZONE:-GMT+8}
export SPRING_DATASOURCE_URL="jdbc:mysql://x.x.x.x:3306/dolphinscheduler3?&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=GMT%2B8"

4.数据库升级

修改 ./bin/env/dolphinscheduler_env.sh 中的如下配置({user}{password}改成你数据库的用户名和密码),然后运行升级脚本
export DATABASE=${DATABASE:-mysql}
export SPRING_PROFILES_ACTIVE=${DATABASE}
export SPRING_DATASOURCE_URL="jdbc:mysql://127.0.0.1:3306/dolphinscheduler?useUnicode=true&characterEncoding=UTF-8&useSSL=false"
export SPRING_DATASOURCE_USERNAME={user}
export SPRING_DATASOURCE_PASSWORD={password}

执行数据库升级脚本:sh ./tools/bin/upgrade-schema.sh

DOLPHIN安装

  • 只需要在主节点配置,无需进行分发,在后续安装过程中会将对应信息scp到对应位置

zookeeper集群

  • zk集群的安装和启动,我就不赘述了,启动!
./bin/zkServer.sh start

创建用户

可以如官方文档所言,创建dolphinscheduler新用户,并配置免密,也可以使用本地环境中的符合条件的用户,我这里为了方便,直接使用了大数据集群的用户文章来源地址https://www.toymoban.com/news/detail-693020.html

# 创建用户需使用 root 登录
useradd dolphinscheduler
 # 添加密码
echo "dolphinscheduler" | passwd --stdin dolphinscheduler

# 登陆相关用户       
su  dolphinscheduler
# 生成密钥          
ssh-keygen -t rsa
# 远程cp到目标机器  
ssh-copy-id -i 192.168.0.1
ssh-copy-id -i 192.168.0.2
ssh-copy-id -i 192.168.0.3
  
 
# 修改目录权限,使得部署用户对二进制包解压后的 apache-dolphinscheduler-*-bin 目录有操作权限
chown -R dolphinscheduler:dolphinscheduler apache-dolphinscheduler-*-bin

dolphinscheduler_env.sh

  • 配置基本数据环境,如MySQL,ZooKeeper和各类使用的大数据环境的环境变量的base地址
  • 一些任务类型外部依赖路径或库文件,如 JAVA_HOME 和 SPARK_HOME都是在这里定义的
  • 注册中心zookeeper
  • 服务端相关配置,比如缓存,时区设置等
# JAVA_HOME, will use it to start DolphinScheduler server
export JAVA_HOME=${JAVA_HOME:-/usr/local/jdk/}

# Database related configuration, set database type, username and password
export DATABASE=${DATABASE:-mysql}
export SPRING_PROFILES_ACTIVE=${DATABASE}
export SPRING_DATASOURCE_URL='jdbc:mysql://XXXXXXXXXXX:3306/dpscheduler?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true'
export SPRING_DATASOURCE_USERNAME=XXXXXXX
export SPRING_DATASOURCE_PASSWORD=XXXXXXXXXXXXX

# DolphinScheduler server related configuration
export SPRING_CACHE_TYPE=${SPRING_CACHE_TYPE:-none}
export SPRING_JACKSON_TIME_ZONE=${SPRING_JACKSON_TIME_ZONE:-UTC}
export MASTER_FETCH_COMMAND_NUM=${MASTER_FETCH_COMMAND_NUM:-10}

# Registry center configuration, determines the type and link of the registry center
export REGISTRY_TYPE=${REGISTRY_TYPE:-zookeeper}
export REGISTRY_ZOOKEEPER_CONNECT_STRING=${REGISTRY_ZOOKEEPER_CONNECT_STRING:-192.168.0.1:2181,-192.168.0.2:2181,-192.168.0.3:2181}

# Tasks related configurations, need to change the configuration if you use the related tasks.
#export HADOOP_HOME=${HADOOP_HOME:-/opt/soft/hadoop}
#export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-/opt/soft/hadoop/etc/hadoop}
#export SPARK_HOME1=${SPARK_HOME1:-/opt/soft/spark1}
#export SPARK_HOME2=${SPARK_HOME2:-/opt/soft/spark2}
#export PYTHON_HOME=${PYTHON_HOME:-/opt/soft/python}
#export HIVE_HOME=${HIVE_HOME:-/opt/soft/hive}
#export FLINK_HOME=${FLINK_HOME:-/opt/soft/flink}
#export DATAX_HOME=${DATAX_HOME:-/opt/soft/datax}

export HADOOP_HOME=${HADOOP_HOME:-/usr/hadoop}
export HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-/usr/hadoop/etc/hadoop}
#export SPARK_HOME1=${SPARK_HOME1:-/opt/soft/spark1}
export SPARK_HOME2=${SPARK_HOME2:-/usr/spark}
export PYTHON_HOME=${PYTHON_HOME:-/opt/anaconda3/bin/python}
export HIVE_HOME=${HIVE_HOME:-/usr/hive}
export FLINK_HOME=${FLINK_HOME:-/usr/flink}
export SQOOP_HOME=${FLINK_HOME:-/usr/sqoop}
#export DATAX_HOME=${DATAX_HOME:-/opt/soft/datax}


#export PATH=$HADOOP_HOME/bin:$SPARK_HOME1/bin:$SPARK_HOME2/bin:$PYTHON_HOME/bin:$JAVA_HOME/bin:$HIVE_HOME/bin:$FLINK_HOME/bin:$DATAX_HOME/bin:$PATH


export PATH=$HADOOP_HOME/bin:$SPARK_HOME2/bin:$PYTHON_HOME/bin:$JAVA_HOME/bin:$HIVE_HOME/bin:$FLINK_HOME/bin:$SQOOP_HOME/bin:$PATH

install_env.sh

  • 主要配置DolphinScheduler每台机器对应安装哪些服务
  • 注:deployUser记得修改为你本地配置的可SSH免密的用户名称
# ---------------------------------------------------------
# INSTALL MACHINE
# ---------------------------------------------------------
# A comma separated list of machine hostname or IP would be installed DolphinScheduler,
# including master, worker, api, alert. If you want to deploy in pseudo-distributed
# mode, just write a pseudo-distributed hostname
# Example for hostnames: ips="ds1,ds2,ds3,ds4,ds5", Example for IPs: ips="192.168.8.1,192.168.8.2,192.168.8.3,192.168.8.4,192.168.8.5"
ips=${ips:-"192.168.0.1,192.168.0.2,192.168.0.3"}

# Port of SSH protocol, default value is 22. For now we only support same port in all `ips` machine
# modify it if you use different ssh port
sshPort=${sshPort:-"22"}

# A comma separated list of machine hostname or IP would be installed Master server, it
# must be a subset of configuration `ips`.
# Example for hostnames: masters="ds1,ds2", Example for IPs: masters="192.168.8.1,192.168.8.2"
masters=${masters:-"192.168.0.1,192.168.0.2"}

# A comma separated list of machine <hostname>:<workerGroup> or <IP>:<workerGroup>.All hostname or IP must be a
# subset of configuration `ips`, And workerGroup have default value as `default`, but we recommend you declare behind the hosts
# Example for hostnames: workers="ds1:default,ds2:default,ds3:default", Example for IPs: workers="192.168.8.1:default,192.168.8.2:default,192.168.8.3:default"
workers=${workers:-"192.168.0.1:default,192.168.0.3:default"}

# A comma separated list of machine hostname or IP would be installed Alert server, it
# must be a subset of configuration `ips`.
# Example for hostname: alertServer="ds3", Example for IP: alertServer="192.168.8.3"
alertServer=${alertServer:-"192.168.0.2"}

# A comma separated list of machine hostname or IP would be installed API server, it
# must be a subset of configuration `ips`.
# Example for hostname: apiServers="ds1", Example for IP: apiServers="192.168.8.1"
apiServers=${apiServers:-"192.168.0.2"}

# The directory to install DolphinScheduler for all machine we config above. It will automatically be created by `install.sh` script if not exists.
# Do not set this configuration same as the current path (pwd). Do not add quotes to it if you using related path.
installPath=${installPath:-"/opt/dolphinscheduler"}

# The user to deploy DolphinScheduler for all machine we config above. For now user must create by yourself before running `install.sh`
# script. The user needs to have sudo privileges and permissions to operate hdfs. If hdfs is enabled than the root directory needs
# to be created by this user
deployUser=${deployUser:-"hadoop"}

# The root of zookeeper, for now DolphinScheduler default registry server is zookeeper.
zkRoot=${zkRoot:-"/dolphinscheduler"}

安装

  • 配置完成后就可以正式安装了,部署后的运行日志将存放在对应服务的logs文件夹内
  • 看到这里的应该也有一个疑问,为啥没有集群分发的步骤,实际上在install中就会做scp操作,配置目录在install_env.shinstallPath中,会在子节点中创建同名文件夹
  • 路径:./bin/install.sh

登录

  • 由于是迁移,用户信息也会带过去,下边是安装的默认用户名密码哈,迁移的直接使用对应账号密码即可!
浏览器访问地址 http://localhost:12345/dolphinscheduler/ui 
默认用户名:admin
默认密码:dolphinscheduler123

问题

1.迁移后任务报错

  • 安装完可以快乐启动,但是要注意,由于是迁移,所以任务状态和定时任务都是上线状态,并且原有的节点信息会复刻,那!!!一定要先把所有任务停止一下,避免由于在同环境集群升级导致的节点信息报错,这是次要的,避免数据错误啊!
示例
  • 由于节点信息错误导致的任务报错,要修改dolphin里配置的Work分组管理
    dolphinscheduler升级,大数据,大数据,dophinscheduler,调度工具,升级

2.存储未启用

  • ISSUE:https://github.com/apache/dolphinscheduler/issues/11404
  • 按照官网的安装后我的api-server等服务是启动了的,但是由于官网并没有过多描述对于环境的配置导致,嗯,我的hadoop等服务其实是不可用的,最明显的就是资源创建失败,如下
    dolphinscheduler升级,大数据,大数据,dophinscheduler,调度工具,升级
    dolphinscheduler升级,大数据,大数据,dophinscheduler,调度工具,升级
  • 这里就需要修改一些配置
  • 路径:你自己的路径/dolphinscheduler/tools/conf/common.properties
  • 用户:一定要用同上边安装启动统一的用户,避免由于权限问题导致的重复操作!
  • 其他文件:为了配置hadoop,要把HDFS的配置文件core-site.xml和hdfs-site.xml放在上边的同级目录下,也就是你自己的路径/dolphinscheduler/tools/conf/下(这里做过hadoop接口开发的应该都明白哈,这个比较清晰)
  • common.properties内容
在这里插入代码片
### 注释就都省略了哈

# user data local directory path, please make sure the directory exists and have read write permissions
# 预期的配置数据路径
data.basedir.path=/opt/software/dolphinscheduler/data

# resource view suffixs
#resource.view.suffixs=txt,log,sh,bat,conf,cfg,py,java,sql,xml,hql,properties,json,yml,yaml,ini,js

# resource storage type: HDFS, S3, NONE
# 预期使用的存储方式
resource.storage.type=HDFS
# resource store on HDFS/S3 path, resource file will store to this base path, self configuration, please make sure the directory exists on hdfs and have read write permissions. "/dolphinscheduler" is recommended
# 预期使用的存储目录,如果是迁移,一定要跟之前保持一致!!!
# 例如我这边配置的目录在报错后发现是/user/hdfs/resources/XXXXXXXX,由于原始用户是hdfs,原始路径是/user/XXXXX/resources/,所以配置的数据目录要保持一致
resource.storage.upload.base.path=/user

# s3的目录按需配置

# if resource.storage.type=HDFS, the user must have the permission to create directories under the HDFS root path
# 预期配置使用的用户
resource.hdfs.root.user=hadoop
# if resource.storage.type=S3, the value like: s3a://dolphinscheduler; if resource.storage.type=HDFS and namenode HA is enabled, you need to copy core-site.xml and hdfs-site.xml to conf dir
# 如果是单NameNode节点,则是使用对应的ip:port,如果是HA,就用namespace,不需要加端口
resource.hdfs.fs.defaultFS=hdfs://XXXXXXXXX

到了这里,关于DolphinScheduler跨版本升级1.3.8至3.0.1的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Apache DolphinScheduler 官方发布3.2.0版本!大数据调度【重磅更新】

    今天,Apache DolphinScheduler 3.2.0 版本在万众期待中终于发布了!在之前的预告中,包括《重磅预告!Apache DolphinScheduler 3.2.0 新功能“剧透”》、《3.2.0 版本预告!Apache DolphinScheduler API 增强相关功能》、《3.2.0 版本预告!远程日志解决 Worker 故障获取不到日志的问题》,以及《

    2024年01月17日
    浏览(57)
  • 3.2.0 版本预告!Apache DolphinScheduler API 增强相关功能

    Apache DolphinScheduler 3.2.0 版本即将发布,在此之前,为了让用户提前了解到大家所期待的新功能,我们制作了视频来”剧透“一些核心新发布。此前,我们比较全面地”剧透“的 3.2.0 版本的新功能,这次,我们来聚焦 API 增强,看看是不是能满足你的需求! 点击视频看详情:

    2024年02月13日
    浏览(37)
  • Apache DolphinScheduler 3.1.8 版本发布,修复 SeaTunnel 相关 Bug

    近日,Apache DolphinScheduler 发布了 3.1.8 版本。此版本主要基于 3.1.7 版本进行了 bug 修复,共计修复 16 个 bug, 1 个 doc, 2 个 chore。 其中修复了以下几个较为重要的问题: 修复在构建 SeaTunnel 任务节点的参数时错误的判断条件 修复 SeaTunnel 任务运行模式默认为运行,无法选择空值的

    2024年02月13日
    浏览(47)
  • Apache DolphinScheduler 3.0.6 发布,或将是最后一个 3.0.X 版本

      Apache DolphinScheduler 于近日发布了 3.0.6 版本,主要针对 3.0.5 重要 bug 进行修复。如果之后没有发现重大问题,3.0.6 将会是 3.0.x 最后一个版本。   Master 重新连接 zk 后 slot 没有正常更新 #14014 父工作流失败时 subprocess 没有正常结束 #14087 下载地址:https://dolphinscheduler.apache.org/

    2024年02月07日
    浏览(51)
  • 海豚调度 DolphinScheduler(2.x和3.x版本) 本地环境搭建,方便本地调式代码

    💡 本系列文章是 DolphinScheduler 由浅入深的教程,涵盖搭建、二开迭代、核心原理解读、运维和管理等一系列内容。适用于想对 DolphinScheduler了解或想要加深理解的读者。 祝开卷有益。 大数据学习指南 DolphinScheduler 的开源版本有不少的 BUG,所以在公司生产使用的话,需要做二

    2024年02月11日
    浏览(53)
  • 【大数据进阶第三阶段之DolphinScheduler学习笔记】DolphinScheduler(海豚调度)的部署指南

    参考官网部署方式:https://dolphinscheduler.apache.org/zh-cn/docs/3.1.3/guide/installation/standalone 部署方式:单机部署,伪集群部署,集群部署。 如果是新手,想要体验 DolphinScheduler 的功能,推荐使用Standalone方式体检。如果你是在生产中使用,推荐使用 集群部署或者 kubernetes。 Standalone

    2024年01月22日
    浏览(45)
  • 记 DolphinScheduler 3.0.1数据质量使用

    环境要求spark 2.4.0: worker-server/conf/common.properties中配置数据质量jar包,名称不确定时可以去worker-server/libs目录下确认下: 重启DolphinScheduler,在工作流中选择数据质量任务,填写相关参数,注意最后一定要添加执行数据质量任务的主类参数,否则会报加载不到主类的问题:

    2024年02月09日
    浏览(26)
  • Apache DolphinScheduler:深入了解大数据调度工具

    Apache DolphinScheduler 是一个分布式易扩展的可视化DAG工作流任务调度开源系统。适用于企业级场景,提供了一个可视化操作任务、工作流和全生命周期数据处理过程的解决方案。 Apache DolphinScheduler 旨在解决复杂的大数据任务依赖关系,并为应用程序提供数据和各种 OPS 编排中的

    2024年01月22日
    浏览(51)
  • 作业帮基于 DolphinScheduler 的数据开发平台实践

    摘要 随着任务数量、任务类型需求不断增长,对我们的数据开发平台提出了更高的要求。本文主要分享我们将调度引擎升级到 Apache DolphinScheduler 的实践经验,以及对数据开发平台的一些思考。 首先介绍下我们的大数据平台架构: 数据计算层承接了全公司的数据开发需求,负

    2024年02月03日
    浏览(35)
  • dolphinscheduler 3.0.1 数据源中心及使用

    🔼上一集:dolphinscheduler 3.0.1数据质量 *️⃣主目录:dolphinscheduler 3.0.1功能梳理及源码解读 🔽下一集:dolphinscheduler 3.0.1 监控中心(上):服务管理 2.0常见数据库都支持,MySQL、PostgreSQL、Oracle、SQLServer、Hive,这样都验证过,都支持,Spark是不支持的,2.0没开发spark数据库组件,

    2023年04月08日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包