我是靠谱客的博主 暴躁钢笔,最近开发中收集的这篇文章主要介绍大数据Hadoop之——DorisDB介绍与环境部署(StarRocks),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

    • 一、Apache Doris 和 DorisDB、StarRocks之间的关系
    • 二、StarRocks概述
      • 1)特征
      • 2)适用场景
        • 1、OLAP 多维分析
        • 2、实时数据仓库
        • 3、高并发查询
        • 4、统一分析
    • 三、StarRocks架构
      • 1)FE(Frontend)
      • 2)BE(Backend)
    • 四、数据管理
    • 五、StarRocks环境部署
      • 1)前期准备
        • 1、机器与角色信息
        • 2、关闭交换区swap
        • 3、修改Overcommit
        • 4、安装jdk
      • 2)部署 FE 节点
        • 1、下载并解压安装包
        • 2、配置 FE 节点
        • 3、启动 FE 节点
        • 4、检查FE
        • 5、访问FE WebUI页面
        • 6、部署 FE 节点的高可用集群(添加 FE 节点)
          • 【第一步】从已部署的机器上copy一份部署包并设置环境变量
          • 【第二步】通过mysql客户端添加FE节点
          • 【第三步】启动FE节点
          • 【第四步】查看集群状态
        • 7、停止 FE 节点
      • 3)配置 BE 节点
        • 1)从已部署的机器上copy一份部署包并设置环境变量
        • 2)创建数据路径
        • 3)配置 EB 节点
        • 4)添加 BE 节点
        • 5)启动 BE 节点
        • 6)查看 BE 节点信息
      • 4)部署 Broker 节点
        • 1、配置 Broker 节点
        • 2、添加 Broker 节点
        • 3、启动 Broker 节点
        • 4、查看Broker节点信息

一、Apache Doris 和 DorisDB、StarRocks之间的关系

  • Doris 最早是解决百度凤巢统计报表的专用系统,随着百度业务的飞速发展对系统进行了多次迭代,逐渐承担起百度内部业务的统计报表和多维分析需求。2013 年,我们把 Doris 进行了 MPP 框架的升级,并将新系统命名为 Palo ,2017 年我们以百度 Palo 的名字在 GitHub 上进行了开源,2018 年贡献给 Apache 基金会时,由于与国外数据库厂商重名,因此选择用回最初的名字,这就是 Apache Doris 的由来。
  • 2020 年 2 月,百度 Doris 团队的个别同学离职创业,基于 Apache Doris做了自己的商业化闭源产品 DorisDB ,这就是 StarRocks 的前身。

【总结】Doris属于百度的,Apache Doris是有百度贡献给Apache 的,DorisDB是百度前员工基于Apache Doris做的商业版本属于另外的公司,后面因为版权的问题,将DorisDB改名为StarRocks,所以StarRocks和DorisDB是属于一个产品,一个公司的。不知道小伙伴,还记不记得另外一个产品的经历跟Doris的经历非常的相似,那就是presto。这里主要讲StarRocks,因为StarRocks更新迭代很快,活跃度也高。

Apache Doris GitHub地址:https://github.com/apache/doris
Apache Doris 官网文档:https://doris.apache.org/docs/get-starting/get-starting.html

StarRocks GitHub地址:https://github.com/StarRocks/starrocks
StarRocks官方文档:https://docs.starrocks.com/zh-cn/main/introduction/StarRocks_intro

二、StarRocks概述

StarRocks 是一款高性能分析型数据仓库,使用向量化MPP(Massively Parallel Processing:大规模并行处理) 架构、可实时更新的列式存储引擎等技术实现多维、实时、高并发的数据分析。StarRocks 既支持从各类实时和离线的数据源高效导入数据,也支持直接分析数据湖上各种格式的数据。StarRocks 兼容 MySQL 协议,可使用 MySQL 客户端和常用 BI 工具对接。同时 StarRocks 具备水平扩展,高可用,高可靠,易运维等特性。广泛应用于实时数仓、OLAP 报表、数据湖分析等场景。

在这里插入图片描述

1)特征

  • 原生向量化 SQL 引擎: StarRocks 采用向量化技术,充分利用 CPU 的并行计算能力,在多维分析中实现亚秒级的查询返回,比之前的系统快 5 到 10 倍。
  • 标准 SQL: StarRocks 支持 ANSI SQL 语法(完全支持 TPC-H 和 TPC-DS)。它还与 MySQL 协议兼容。可以使用各种客户端和 BI 软件来访问 StarRocks。
  • 智能查询优化: StarRocks 可以通过 CBO(Cost Based Optimizer)优化复杂查询。有了更好的执行计划,数据分析效率会大大提高。
  • 实时更新: StarRocks的更新模型可以根据主键进行upsert/delete操作,在并发更新的同时实现高效查询。
  • 智能物化视图: StarRocks的物化视图可以在数据导入过程中自动更新,在执行查询时自动选择。
  • 直接查询数据湖中的数据:StarRocks 允许直接访问来自 Apache Hive™、Apache Iceberg™ 和 Apache Hudi™ 的数据,而无需导入。
  • 资源管理:该特性允许 StarRocks 限制查询的资源消耗,实现同一集群内租户之间的资源隔离和高效使用。
  • 易于维护:简单的架构使 StarRocks 易于部署、维护和横向扩展。StarRocks 敏捷调整查询计划,在集群扩容或扩容时均衡资源,在节点故障下自动恢复数据副本。
  • 列式存储:StarRocks实现了列式存储引擎,数据以按列的方式进行存储。通过这样的方式,相同类型的数据连续存放。一方面,数据可以使用更加高效的编码方式,获得更高的压缩比,降低存储成本。另一方面,也降低了系统读取数据的IO总量,提升了查询性能。此外,在大部分OLAP场景中,查询只会涉及部分列。相对于行存,列存只需要读取部分列的数据,能够极大地降低磁盘IO吞吐。
  • 原子性:StarRocks的存储引擎在数据导入时能够保证每一次操作的ACID。一个批次的导入数据生效是原子性的,要么全部导入成功,要么全部失败。并发进行的各个事务相互之间互不影响,对外提供Snapshot Isolation的事务隔离级别。
  • 支持Upsert 类操作:StarRocks存储引擎不仅能够提供高效的 Append 操作,也能高效的处理 Upsert 类操作。使用 Delete-and-insert 的实现方式,通过主键索引快速过滤,消除了读取时 Sort merge 操作,同时还可以充分利用其他二级索引。可以在大量更新的场景下,仍然可以保证查询的极速性能。

2)适用场景

StarRocks 可以满足企业级用户的多种分析需求,包括 OLAP 多维分析定制报表实时数据分析Ad-hoc 数据分析等。

1、OLAP 多维分析

利用 StarRocks 的 MPP 框架和向量化执行引擎,用户可以灵活的选择雪花模型星型模型宽表模型或者预聚合模型。适用于灵活配置的多维分析报表,业务场景包括:

  • 用户行为分析

  • 用户画像、标签分析、圈人

  • 高维业务指标报表

  • 自助式报表平台

  • 业务问题探查分析

  • 跨主题业务分析

  • 财务报表

  • 系统监控分析

2、实时数据仓库

StarRocks 设计和实现了 Primary-Key 模型,能够实时更新数据并极速查询,可以秒级同步 TP 数据库的变化,构建实时数仓,业务场景包括:

  • 电商大促数据分析

  • 物流行业的运单分析

  • 金融行业绩效分析、指标计算

  • 直播质量分析

  • 广告投放分析

  • 管理驾驶舱

  • 探针分析APM(Application Performance Management)

3、高并发查询

StarRocks 通过良好的数据分布特性,灵活的索引索引以及物化视图等特性,可以解决面向用户侧的分析场景,业务场景包括:

  • 广告主报表分析

  • 零售行业渠道人员分析

  • SaaS 行业面向用户分析报表

  • Dashboard 多页面分析

4、统一分析

  • 通过使用一套系统解决多维分析、高并发查询、预计算、实时分析查询等场景,降低系统复杂度和多技术栈开发与维护成本。

  • 使用StarRocks 来统一数据湖和数据仓库,将高并发和实时要求性很高的业务放在StarRocks中分析,把数据湖上的分析使用StarRocks外表查询,统一使用 StarRocks 管理湖仓数据。

三、StarRocks架构

在这里插入图片描述
StarRocks的架构简洁,整个系统的核心只有FE(Frontend)BE(Backend)两类进程,不依赖任何外部组件,方便部署与维护。同时,FE和BE模块都可以在线水平扩展,元数据和数据都有副本机制,确保整个系统无单点。

1)FE(Frontend)

Frontend是StarRocks的前端节点,负责管理元数据管理客户端连接进行查询规划查询调度等工作。FE根据配置会有两种角色:FollowerObserver

  • Follower会通过类Paxos的BDBJE协议选主出一个Leader(实现选主需要集群中有半数以上的Follower实例存活),只有Leader会对元数据进行写操作。非Leader节点会自动的将元数据写入请求路由到Leader节点。每次元数据写入时,必须有多数Follower成功才能确认是写入成功。
  • Observer不参与选主操作,只会异步同步并且回放日志,主要用于扩展集群的查询并发能力。每个FE节点都会在内存保留一份完整的元数据,这样每个FE节点都能够提供无差别的服务。

2)BE(Backend)

Backend是StarRocks的后端节点,负责数据存储以及SQL执行等工作。

四、数据管理

Table数据划分 + Tablet三副本的数据分布如下图:
在这里插入图片描述

  • 在StarRocks里,一张表的数据会被拆分成多个Tablet,而每个Tablet都会以多副本的形式存储在BE节点中
  • StarRocks通过分区、分桶两种划分方式将Table划分成Tablet。
  • 通过分区机制(Sharding),一张表可以被划分成多个分区,如将一张表按照时间来进行分区,粒度可以是一天,或者一周等。
  • 一个分区内的数据可以根据一列、或者多列进行分桶,将数据切分成多个Tablet。
  • 用户可以自行指定分桶的大小。StarRocks会管理好每个Tablet副本的分布信息。
  • 由于一张表被切分成了多个Tablet,StarRocks在执行SQL语句时,可以对所有Tablet实现并发处理,从而充分的利用多机、多核提供的计算能力。
  • 在BE节点规模发生变化时,比如在扩容、缩容时,StarRocks可以做到无需停止服务,直接完成节点的增减
  • StarRocks支持Tablet多副本存储,默认副本数为三个。多副本够保证数据存储的高可靠,以及服务的高可用

五、StarRocks环境部署

StarRocks的集群部署分为两种模式:

  • 第一种是使用命令部署
  • 第二种是使用 StarRocksManager 自动化部署。自动部署的版本只需要在页面上简单进行配置、选择、输入后批量完成,并且包含Supervisor进程管理、滚动升级、备份、回滚等功能。因 StarRocksManager并未开源,因此我们只能使用命令部署。

StarRocks 支持以 Docker 镜像和二进制安装包形式手动部署于集群中。这里讲二进制安装,后面也会讲k8s安装,请耐心等待~

端口列表
在这里插入图片描述

1)前期准备

1、机器与角色信息

IP角色
192.168.0.113/192.168.0.120FE、Broker
192.168.0.114BE、Broker
192.168.0.115BE 、Broker
192.168.0.116FE、Broker

【温馨提示】节点数最好是基数,但是我这里资源不太够,所以就2+2了。这里的192.168.0.120是VPI。其实这里不需要用到VIP。但是启动FE时,可能会使用VIP192.168.0.120。

2、关闭交换区swap

# 临时关闭;关闭swap主要是为了性能考虑
# 0值会命令内核不要使用swap,只有当free和文件使用的内存页数量少于一个zone的高水位,才会使用swap。
echo 0 | sudo tee /proc/sys/vm/swappiness
swapoff -a

# 永久关闭,调整 swappiness 参数
sed -ri 's/.*swap.*/#&/' /etc/fstab
vi /etc/sysctl.conf
# 修改 vm.swappiness 的修改为 0
vm.swappiness=0

# 使配置生效
sysctl -p                                            

3、修改Overcommit

echo 1 | sudo tee /proc/sys/vm/overcommit_memory

4、安装jdk

官网下载:https://www.oracle.com/java/technologies/downloads/

百度云下载

链接:https://pan.baidu.com/s/1-rgW-Z-syv24vU15bmMg1w
提取码:8888

cd /opt/software/
tar -xf jdk-8u212-linux-x64.tar.gz

# 在文件加入环境变量/etc/profile
export JAVA_HOME=/opt/software/jdk1.8.0_212
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# source加载
source /etc/profile
# 查看jdk版本
java -version

2)部署 FE 节点

FE 是StarRocks的前端节点,负责管理元数据,管理客户端连接,进行查询规划,查询调度等工作。就是管理节点。

1、下载并解压安装包

cd /opt/software
wget https://download.starrocks.com/zh-CN/download/request-download/35/StarRocks-2.2.2.tar.gz
# 解压
tar -xzvf StarRocks-2.2.2.tar.gz

# 设置环境变量/etc/profile
export STARROCKS_HOME=/opt/software/StarRocks-2.2.2

source /etc/profile

# 创建元数据目录
mkdir $STARROCKS_HOME/fe/meta

2、配置 FE 节点

注意:当一台机器拥有多个 IP 地址时,需要在 FE 配置文件 conf/fe.conf 中设置 priority_networks,为该节点设定唯一 IP。

${STARROCKS_HOME}/fe/conf/fe.conf文件中配置如下内容:

# 修改元数据目录。
meta_dir = /opt/software/StarRocks-2.2.2/meta
# 修改配置,网段,自动发现IP
priority_networks = 192.168.0.0/24
# 添加 Java 目录
JAVA_HOME = /opt/software/jdk1.8.0_212
# 修改JVM内存,默认是8G,根据自己机器自定义,默认是-Xmx8192m,这里我修改成Xmx512m,这里有两段配置,jdk 9+使用JAVA_OPTS_FOR_JDK_9
JAVA_OPTS="-Dlog4j2.formatMsgNoLookups=true -Xmx512m -XX:+UseMembar -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -Xloggc:$STARROCKS_HOME/log/fe.gc.log.$DATE"

# For jdk 9+, this JAVA_OPTS will be used as default JVM options
JAVA_OPTS_FOR_JDK_9="-Dlog4j2.formatMsgNoLookups=true -Xmx512m -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -Xlog:gc*:$STARROCKS_HOME/log/fe.gc.log.$DATE:time"

如需在生产环境中对集群进行详细优化配置,参考 FE 参数配置。

3、启动 FE 节点

${STARROCKS_HOME}/fe/bin/start_fe.sh --daemon

【温馨提示】如果由于端口被占用导致 FE 启动失败,可修改配置文件 fe/conf/fe.conf 中的端口号 http_port

4、检查FE

通过查看日志 fe/log/fe.log 确认 FE 是否启动成功。

tail -f ${STARROCKS_HOME}/fe/log/fe.log

通过运行 jps 命令查看 Java 进程,确认 StarRocksFe 进程是否存在。

jps

通过mysql客户端查看节点信息

yum -y install mysql

# 用户名为 root,密码为空
mysql -h 192.168.0.113 -P9030 -uroot
# 查看 FE 状态。
SHOW PROC '/frontends'G

在这里插入图片描述

5、访问FE WebUI页面

通过在浏览器访问 FE ip:http_port(默认 http_port 为 8030),进入 StarRocks 的 WebUI,用户名为 root,密码为空

http://192.168.0.113:8030

在这里插入图片描述

6、部署 FE 节点的高可用集群(添加 FE 节点)

【温馨提示】FE节点之间的时钟相差不能超过5s, 使用NTP协议校准时间。一台机器上只可以部署单个FE节点。所有FE节点的http_port需要相同。

【第一步】从已部署的机器上copy一份部署包并设置环境变量
scp -r jdk1.8.0_212 StarRocks-2.2.2 k8s-master2-168-0-116:/opt/software/

# 设置环境变量
# 在文件加入环境变量/etc/profile
export JAVA_HOME=/opt/software/jdk1.8.0_212
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export STARROCKS_HOME=/opt/software/StarRocks-2.2.2

# source加载
source /etc/profile
【第二步】通过mysql客户端添加FE节点

使用MySQL客户端连接已有的FE, 添加新实例的信息,信息包括角色、ip、port:

# 添加FOLLOWER 类型节点
# mysql> ALTER SYSTEM ADD FOLLOWER "host:port";
# 或者添加OBSERVER 类型节点,不参与选举
# mysql> ALTER SYSTEM ADD OBSERVER "host:port";
mysql -h 192.168.0.113 -P9030 -uroot
ALTER SYSTEM ADD FOLLOWER "192.168.0.116:9010";

host为机器的IP,如果机器存在多个IP,需要选取priority_networks里的IP,例如priority_networks=192.168.1.0/24 可以设置使用192.168.1.x 这个子网进行通信。port为edit_log_port,默认为9010。

如出现错误,需要删除FE,应用下列命令:

#alter system drop follower "fe_host:edit_log_port";
#alter system drop observer "fe_host:edit_log_port";

alter system drop follower "192.168.0.116:9010";
alter system drop observer "192.168.0.116:9010";
【第三步】启动FE节点

FE节点之间需要两两互联才能完成复制协议选主, 投票,日志提交和复制等功能。 添加到已有集群的新FE节点首次启动时,需要指定现有集群中的一个节点作为helper节点, 从该节点获得集群的所有FE节点的配置信息,才能建立通信连接,因此首次启动需要指定–helper参数:

cd $STARROCKS_HOME/fe
# ./bin/start_fe.sh --helper host:port --daemon
./bin/start_fe.sh --helper 192.168.0.120:9010 --daemon

host为helper节点的IP,如果有多个IP,需要选取priority_networks里的IP。port为edit_log_port,默认为9010。

当FE再次启动时,无须指定–helper参数,因为FE已经将其他FE的配置信息存储于本地目录, 因此可直接启动:

./bin/start_fe.sh --daemon

【温馨提示】如果启动失败了,删除元数据目录下的文件重新启动。

cd $STARROCKS_HOME/fe
./bin/stop_fe.sh --daemon
rm -fr meta/*

# 重新启动
./bin/start_fe.sh --helper 192.168.0.120:9010 --daemon
【第四步】查看集群状态
mysql -h 192.168.0.113 -P9030 -uroot
SHOW PROC '/frontends'G

在这里插入图片描述

主要关注上面标注的三个指标,IsMaster:代表是否时主节点,Role:代表角色,节点类型,Alive:代表节点正常

web UI:http://192.168.0.113:8030/system
在这里插入图片描述
在这里插入图片描述

7、停止 FE 节点

./bin/stop_fe.sh --daemon

3)配置 BE 节点

1)从已部署的机器上copy一份部署包并设置环境变量

# 在 k8s-master2-168-0-113节点上执行copy操作
cd /opt/software
scp -r jdk1.8.0_212 StarRocks-2.2.2 k8s-master2-168-0-114:/opt/software/

# 设置环境变量
# 在文件加入环境变量/etc/profile
export JAVA_HOME=/opt/software/jdk1.8.0_212
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export STARROCKS_HOME=/opt/software/StarRocks-2.2.2

# source加载
source /etc/profile

2)创建数据路径

mkdir -p $STARROCKS_HOME/be/storage

3)配置 EB 节点

 vi $STARROCKS_HOME/be/conf/be.conf
 
priority_networks = 192.168.0.0/24
storage_root_path = /opt/software/StarRocks-2.2.2/be/storage

4)添加 BE 节点

通过 MySQL 客户端将 BE 节点添加至 StarRocks 集群。

yum -y install mysql

mysql -h 192.168.0.113 -P9030 -uroot
# ALTER SYSTEM ADD BACKEND "host:port";
ALTER SYSTEM ADD BACKEND "192.168.0.114:9050";

【温馨提示】host 需要与 priority_networks 相匹配,本机IP,port 需要与 be.conf 文件中的设置的 heartbeat_service_port 相同,默认为 9050。

如添加过程出现错误,需要通过以下命令将该 BE 节点从集群移除。

# ALTER SYSTEM decommission BACKEND "host:port";
ALTER SYSTEM decommission BACKEND "192.168.0.114:9050";

5)启动 BE 节点

cd $STARROCKS_HOME/be
bin/start_be.sh --daemon

6)查看 BE 节点信息

mysql -h 192.168.0.113 -P9030 -uroot

SHOW PROC '/backends'G

在这里插入图片描述
添加另外一个BE节点,部署跟上面一样

#【第一步】 从已的be节点copy一份
cd /opt/software
scp -r jdk1.8.0_212 StarRocks-2.2.2 k8s-node2-168-0-115:/opt/software/

# 【第一步】设置环境变量
# 在文件加入环境变量/etc/profile
export JAVA_HOME=/opt/software/jdk1.8.0_212
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export STARROCKS_HOME=/opt/software/StarRocks-2.2.2

# source加载
source /etc/profile

#【第三步】清空数据路径下的文件
rm -fr $STARROCKS_HOME/be/storage/*


# 【第四步】添加 BE 节点
yum -y install mysql
mysql -h 192.168.0.113 -P9030 -uroot
ALTER SYSTEM ADD BACKEND "192.168.0.115:9050";

# 【第五步】启动 BE 节点
cd $STARROCKS_HOME/be && bin/start_be.sh --daemon

#【第六步】查看EB节点状态
mysql -h 192.168.0.113 -P9030 -uroot
SHOW PROC '/backends'G

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4)部署 Broker 节点

通过部署的 Broker,StarRocks 可读取对应数据源(如HDFS、S3)上的数据,利用自身的计算资源对数据进行预处理和导入。除此之外,Broker 也被应用于数据导出,备份恢复等功能。

1、配置 Broker 节点

cd $STARROCKS_HOME/apache_hdfs_broker

修改 Broker 节点配置文件 conf/apache_hdfs_broker.conf。因默认配置即可启动集群,以下示例并未修改 Broker 点配置。您可以直接复制自己的 HDFS 集群配置文件并粘贴至 conf 路径下

2、添加 Broker 节点

您可通过 MySQL 客户端连接 StarRocks 以添加或删除 Broker 节点。

mysql -h 192.168.0.113 -P9030 -uroot

# ALTER SYSTEM ADD BROKER broker1 "172.16.xxx.xx:8000";
# 说明:默认配置中,Broker 节点的端口为 8000。

ALTER SYSTEM ADD BROKER broker1 "192.168.0.113:8000";
ALTER SYSTEM ADD BROKER broker1 "192.168.0.114:8000";
ALTER SYSTEM ADD BROKER broker1 "192.168.0.115:8000";
ALTER SYSTEM ADD BROKER broker1 "192.168.0.116:8000";

3、启动 Broker 节点

cd $STARROCKS_HOME/
./apache_hdfs_broker/bin/start_broker.sh --daemon

4、查看Broker节点信息

mysql -h 192.168.0.113 -P9030 -uroot
SHOW PROC "/brokers"G

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


DorisDB介绍与环境部署就先到这里了,其实StarRocks部署还是非常简单的,后续会有更多关于StarRocks的文章,请小伙伴耐心等待哦~

最后

以上就是暴躁钢笔为你收集整理的大数据Hadoop之——DorisDB介绍与环境部署(StarRocks)的全部内容,希望文章能够帮你解决大数据Hadoop之——DorisDB介绍与环境部署(StarRocks)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部