【Apache Doris】3.0存算分离|标准部署篇(一)

news2024/11/10 11:30:43

【Apache Doris】3.0存算分离|标准部署篇(一)

  • 一、前提概要
  • 二、环境信息
  • 三、前置准备
  • 四、FoundationDB安装
  • 五、OpenJDK 17安装
  • 六、 Meta Service安装
  • 七、集群安装
  • 八、快速体验

接上 数据架构新篇章:存算一体与存算分离的协同演进。
本文主要分享Apache Doris 3.0存算分离架构的标准部署实践。

一、前提概要

Doris 存算分离架构部署方式示意图如下,共需要 3 个模块参与工作:

  • FE:负责接收用户请求,负责存储库表的元数据,目前是有状态的,未来会和 BE 类似,演化为无状态。
  • BE:无状态化的 Doris BE 节点,负责具体的计算任务。BE 上会缓存一部分 Tablet 元数据和数据以提高查询性能。
  • MS:存算分离模式新增模块,程序名为 doris_cloud,可通过启动不同参数来指定为以下两种角色之一
    • Meta Service:元数据管理,提供元数据操作的服务,例如创建 Tablet,新增 Rowset,Tablet 查询以及 Rowset 元数据查询等功能。
    • Recycler:数据回收。通过定期对记录已标记删除的数据的元数据进行扫描,实现对数据的定期异步正向回收(文件实际存储在 S3 或 HDFS 上),而无须列举数据对象进行元数据对比。

Meta Service 是一种无状态化的服务,依赖了一个高性能分布式事务 KV(即 FoundationDB)来存储元数据,大幅简化了元数据管理流程,同时提供强大的横向的扩展能力。

Doris 存算分离架构依赖于两个外部开源项目,为确保部署顺利,请在开始前预先安装以下依赖:

  • FoundationDB (FDB)
  • OpenJDK17: 需要安装到所有部署 Meta Service 的节点上。

二、环境信息

2.1 硬件信息

  • CPU架构:X86_64

2.2 软件信息

  • Doris版本:3.0.0
  • JDK版本:OpenJDK17
  • FoundationDB:7.1.38
  • 系统:Linux VM-10-6-centos

三、前置准备

动手先,先梳理下安装步骤。

Doris 存算分离模式部署按照模块与分工"自下而上"部署:

  1. 官方手册文档浏览:https://doris.apache.org/zh-CN/docs/dev/compute-storage-decoupled/before-deployment
  2. 存算分离模式机器规划。
  3. 部署 FoundationDB 以及运行环境(JDK17)等基础的依赖,这一步骤不需要 Doris 的编译产出即可完成。
  4. 部署 Meta Service以及 Recycler
  5. 部署 FE 以及 BE
    注意:一套 FoundationDB + Meta Service + Recycler 基础环境可以支撑多个存算分离模式的 Doris 实例(即多套 FE + BE )。

四、FoundationDB安装

通常情况下,需要至少 3 台机器组成一个双副本、允许单机故障的 FoundationDB 集群。如果仅出于开发/测试需要,使用一台机器即可。

本文先以一台测试为例。

4.1 安装包下载

每台机器都需先安装 FoundationDB 服务。可通过以下地址选择一个版本下载 FoundationDB 安装包,目前通常推荐使用 7.1.38 版本。

对于 CentOS (Red Hat) 和 Ubuntu 用户,以下是下载链接:

  • clients-x86_64.rpm
  • server-x86_64.rpm
  • clients-amd64.deb
  • server-amd64.deb

如果需要更高速的下载,也可使用如下镜像链接:

  • clients-x86_64.rpm
  • server-x86_64.rpm
  • clients-amd64.deb
  • server-amd64.deb
-- client
wget https://selectdb-doris-1308700295.cos.ap-beijing.myqcloud.com/toolkit/fdb/foundationdb-clients-7.1.38-1.el7.x86_64.rpm

-- server
wget https://selectdb-doris-1308700295.cos.ap-beijing.myqcloud.com/toolkit/fdb/foundationdb-server-7.1.38-1.el7.x86_64.rpm

4.2 安装部署

可以使用如下命令安装 FoundationDB 程序:

sudo rpm -Uvh foundationdb-clients-7.1.38-1.el7.x86_64.rpm foundationdb-server-7.1.38-1.el7.x86_64.rpm

安装完毕后,在命令行输入 fdbcli 查看是否安装成功。若返回结果显示如下 available 字样,则表示安装成功:

[zhangbinhua@VM-10-6-centos package]$ fdbcli
Using cluster file `/etc/foundationdb/fdb.cluster'.

The database is available.

Welcome to the fdbcli. For help, type `help'.

安装成功后:

  • 默认将启动一个 FoundationDB 服务。
  • 默认集群信息文件 fdb.cluster将存放在/etc/foundationdb/fdb.cluster,默认集群配置文件 foundationdb.conf 将存放在/etc/foundationdb/foundationdb.conf。
  • 默认将数据和日志分别保存在/var/lib/foundationdb/data/和/var/log/foundationdb。
  • 默认将新建一个 FoundationDB 的 user 和 group,数据和日志的路径默认已具备 FoundationDB 的访问权限。

五、OpenJDK 17安装

OpenJDK 17 需安装到所有的节点上,可通过以下链接获取安装OpenJDK 17:
https://download.java.net/java/GA/jdk17.0.1/2a2082e5a09d4267845be086888add4f/12/GPL/openjdk-17.0.1_linux-x64_bin.tar.gz

wget https://download.java.net/java/GA/jdk17.0.1/2a2082e5a09d4267845be086888add4f/12/GPL/openjdk-17.0.1_linux-x64_bin.tar.gz

然后,将下载好的 OpenJDK 安装包直接解压到安装路径即可:

tar xf openjdk-17.0.1_linux-x64_bin.tar.gz

启动 Meta Service 或者 Recycler 之前

export JAVA_HOME=/opt/jdk-17.0.1

六、 Meta Service安装

相比 3.0.0 之前的版本,编译完成的二进制包中(产出)多了 ms 目录。

ms目录将同时用于 Meta Service 和 Recycler 两种进程。 需要注意的是,尽管 Meta Service 和 Recycler 在本质上属于同一程序,但目前需要分别为它们准备独立的二进制文件,以及工作目录。 Meta Service 和 Recycler 两个工作目录除了配置完全一致,使用不同启动参数启动。

要准备两份二进制文件/工作目录,只需使用以下命令从ms目录中拷贝二进制文件至一个新的 Recycler 工作目录re,然后在ms和re的conf子目录下,对端口号等参数按需进行必要修改即可。详细的配置启动会在本文后续章节介绍。

cp -r ms re

6.1 Meta Service配置

# 通常情况下,只需在
./apache-doris-3.0.0-bin-x64/ms/conf 
目录下的默认配置文件 
doris_cloud.conf中修改 brpc_listen_port 
和 fdb_cluster 两个参数。
(Meta Service 配置只需一个配置文件。)

brpc_listen_port = 5000
fdb_cluster = xxx:yyy@127.0.0.1:4500

上述 brpc_listen_port = 5000 是 Meta Service 的默认端口。其中,fdb_cluster 是 FoundationDB 集群的连接信息,通常可从 FoundationDB 所部署机器上的 /etc/foundationdb/fdb.cluster 文件中获得。

6.2 Recycler配置

除了端口外,Recycler 的其他默认配置均与 Meta Service 相同。Recycler 的 bRPC 端口一般采用 5100。

# 通常情况下,只需在
./apache-doris-3.0.0-bin-x64/re/conf  
目录下的默认配置文件 
doris_cloud.conf中修改 brpc_listen_port 
和 fdb_cluster 两个参数。
(Recycler 配置只需一个配置文件。)

brpc_listen_port = 5100
fdb_cluster = xxx:yyy@127.0.0.1:4500

上述 brpc_listen_port = 5100 是 Recycler 的默认端口。其中,fdb_cluster 是 FoundationDB 集群的连接信息,通常可从 FoundationDB 所部署机器上的 /etc/foundationdb/fdb.cluster 文件中获得。

6.3 MS服务启动

Meta Service 和 Recycler 依赖 JAVA 运行环境,并使用 OpenJDK 17。在启动前这两个服务前,请确保已正确设置 export JAVA_HOME 环境变量。

doris_cloud 部署的 bin 目录下提供了启停脚本,调用对应的启停脚本即可完成启停。

6.3.1 启停 Meta Service

# 确保为jdk17的环境
export JAVA_HOME=${path_to_jdk_17}
# 进入meta-service目录
cd ./apache-doris-3.0.0-bin-x64/ms/bin
# 后台启动meta-service
bin/start.sh --meta-service --daemon
# 停止meta-service
bin/stop.sh

此时再查看下ms/log确认

# 滚动打印 finish to collect fdb metric 表示ms启动成功!
tail -100f meta_service.INFO

6.3.2 启停 Recycler

# 进入recycler目录
cd ./apache-doris-3.0.0-bin-x64/re/bin
# 后台启动recycler
bin/start.sh --recycler --daemon
# 停止recycler
bin/stop.sh

此时再查看下re/log确认

# 滚动打印 Periodically log for recycler 表示ms启动成功!
tail -100f recycler.INFO

在成功部署并启动 Meta Service 和 Recycler 之后,Doris 存算分离模式的底座便已完成搭建。

七、集群安装

前文部署的一套 FoundationDB + Meta Service + Recycler 基础环境可以支撑多个存算分离集群,一个存算分离集群又称为一个数仓实例(Instance)。

在存算分离架构下,数仓实例的节点构成信息由 Meta Service 维护(注册 + 变更)。FE、BE 和 Meta Service 交互以实现服务发现和身份验证。创建存算分离集群主要涉及与 Meta Service 的交互,Meta Service 提供了标准的 HTTP 接口进行资源管理操作。

Doris 存算分离模式采用服务发现的机制进行工作,创建存算分离集群可以归纳为以下步骤:

  1. 注册FE/BE:注册声明数仓实例中的 FE 和 BE 节点组成,分别包含哪些机器,以及如何组成集群。
  2. 安装FE/BE:配置并启动所有的 FE 和 BE 节点。
  3. 注册存储后端:注册声明数仓实例以及它的存储后端。

7.1 注册FE/BE

7.1.1 添加FE

存算分离模式下,FE 以及 BE 的节点管理使用的接口相同,仅参数配置不同, 可通过 Meta Service add_cluster 接口先进行 FE 以及 BE 的初始节点添加。

add_cluster 接口的参数列表如下:

以下为添加一个 FE 的示例,cloud_unique_id自定义为

1:sample_instance_id:zbh_cloud_unique_id_sql_server00

# 示例
# 添加 FE
curl '127.0.0.1:5000/MetaService/http/add_cluster?token=greedisgood9999' -d '{
    "instance_id":"sample_instance_id",
    "cluster":{
        "type":"SQL",
        "cluster_name":"RESERVED_CLUSTER_NAME_FOR_SQL_SERVER",
        "cluster_id":"RESERVED_CLUSTER_ID_FOR_SQL_SERVER",
        "nodes":[
            {
                "cloud_unique_id":"1:sample_instance_id:zbh_cloud_unique_id_sql_server00",
                "ip":"172.21.16.21",
                "edit_log_port":12103,
                "node_type":"FE_MASTER"
            }
        ]
    }
}'

# 示例
# 创建成功后,可以通过 get_cluster 返回值 进行确认
curl '127.0.0.1:5000/MetaService/http/get_cluster?token=greedisgood9999' -d '{
    "instance_id":"sample_instance_id",
    "cloud_unique_id":"1:sample_instance_id:cloud_unique_id_sql_server00",
    "cluster_name":"RESERVED_CLUSTER_NAME_FOR_SQL_SERVER",
    "cluster_id":"RESERVED_CLUSTER_ID_FOR_SQL_SERVER"
}'

7.1.2 添加BE

用户可创建一个或多个计算集群,一个计算集群由任意多个 BE 节点组成。 创建计算集群操作也可通过 Meta Service add_cluter 接口进行。

接口描述详见前文 “添加 FE” 章节。

用户可根据实际需求调整计算集群的数量及其所包含的节点数量,不同的计算集群需要使用不同的 cluster_name 和 cluster_id。

如下是创建包含 1 个 BE 的 计算集群:

# 示例
# 添加 BE
curl '127.0.0.1:5000/MetaService/http/add_cluster?token=greedisgood9999' -d '{
    "instance_id":"sample_instance_id",
    "cluster":{
        "type":"COMPUTE",
        "cluster_name":"cluster_name0",
        "cluster_id":"cluster_id0",
        "nodes":[
            {
                "cloud_unique_id":"1:sample_instance_id:cloud_unique_id_compute_node0",
                "ip":"172.21.16.21",
                "heartbeat_port":9455
            }
        ]
    }
}'

# 示例
# 创建成功后,通过 get_cluster 进行确认
curl '127.0.0.1:5000/MetaService/http/get_cluster?token=greedisgood9999' -d '{
    "instance_id":"sample_instance_id",
    "cloud_unique_id":"1:sample_instance_id:cloud_unique_id_compute_node0",
    "cluster_name":"cluster_name0",
    "cluster_id":"cluster_id0"
}'

7.3 安装FE/BE

7.3.1 FE/BE 配置

相较于存算一体模式,存算分离模式下的 FE 和 BE 增加了部分配置,其中:

  • meta_service_endpoint:Meta Service 的地址,需在 FE 和 BE 中填写。
  • cloud_unique_id:根据创建存算分离集群发往 Meta Service add_cluster 请求中的实际值填写即可;Doris 通过该配置的值确定是否在存算分离模式下工作。可自定义!

fe.conf

# 示例
meta_service_endpoint = 127.0.0.1:5000
cloud_unique_id = 1:sample_instance_id:cloud_unique_id_sql_server00

be.conf

下述示例中, meta_service_use_load_balancer 和 enable_file_cache 均可复制,其他配置项需根据实际情况填写。

file_cache_path 是一个 JSON 数组(根据实际缓存盘的个数配置),其各个字段含义如下:

  • path:缓存数据存放路径,类似于存算一体模式下的 storage_root_path
  • total_size:期望使用的缓存空间上限
  • query_limit:单个查询在缓存未命中时最多可淘汰的缓存数据量(为了防止大查询将缓存全部淘汰);因缓存需要存放数据,所以最好使用 SSD 等高性能磁盘作为缓存存储介质。
# 示例
meta_service_endpoint = 127.0.0.1:5000
cloud_unique_id = 1:sample_instance_id:cloud_unique_id_compute_node0
meta_service_use_load_balancer = false
enable_file_cache = true
file_cache_path = [{"path":"/mnt/disk1/doris_cloud/file_cache","total_size":104857600000,"query_limit":10485760000}, {"path":"/mnt/disk2/doris_cloud/file_cache","total_size":104857600000,"query_limit":10485760000}]

7.3.2 FE/BE 启停

Doris 存算分离模式下,FE/BE 启停方式和存算一体模式下的启停方式一致。 存算分离模式属于服务发现的模式,不需通过 alter system add/drop frontend/backend 等命令操作节点。

# 示例
bin/start_be.sh --daemon
bin/stop_be.sh

启动成功后jps可以查看对应新增be进程,并查看./log/be.INFO日志,正常启动日志如下:

bin/start_fe.sh --daemon
bin/stop_fe.sh

启动成功后jps可以查看对应新增fe进程,并查看./log/fe.log日志,正常启动日志如下:

启动后观察日志,如果上述配置均正确,则说明已进入正常工作模式,可通过 MySQL 客户端连接 FE 进行访问。

mysql -uroot -h 10.16.10.6 -P 9030 -p

7.4 注册存储后端

本文以基于 S3 的存算分离模式 Doris 集群为例。

存储后端是 Doris 在存算分离模式中所使用的远程共享存储,可配置一个或多个存储后端,可将不同表存储在不同存储后端上。

基于对象存储的所有属性均为必填项,其中:

  • 使用 MinIO 等支持 S3 协议的对象存储时,需要自行测试连通性以及 AK / SK 的正确性。具体做法可参考使用 AWS CLI 验证 MinIO 是否工作。
  • Bucket 字段的值为 Bucket 名称,不包含 s3:// 等 schema。
  • external_endpoint 保持与 endpoint 值相同即可。
  • 如果使用非云厂商对象存储,region 和 provider 可填写任意值。

# 示例
curl -s "127.0.0.1:5000/MetaService/http/create_instance?token=greedisgood9999" -d \
'{
  "instance_id": "sample_instance_id",
  "name": "sample_instance_name",
  "user_id": "sample_user_id",
  "vault": {
    "obj_info": {
      "ak": "ak_xxxxxxxxxxx",
      "sk": "sk_xxxxxxxxxxx",
      "bucket": "sample_bucket_name",
      "prefix": "sample_prefix",
      "endpoint": "cos.ap-beijing.myqcloud.com",
      "external_endpoint": "cos.ap-beijing.myqcloud.com",
      "region": "ap-beijing",
      "provider": "COS"
    }
  }
}'

创建完成后通过如下语句,在MySQL 客户端连接 FE 进行查看存储后端验证

# MySQL 客户端连接 FE 
mysql -uroot -h 10.16.10.6 -P 9030 -p

# 查看存储后端
SHOW STORAGE VAULT\G

在成功注册FE/BE、安装FE/BE和注册存储后端之后,单节点的Doris存算分离集群构建完成,需要构建多节点Doris存算分离集群的小伙伴可以结合官方文档进行部署。

八、快速体验

MySQL 客户端连接 FE 测验。

8.1 查看计算集群

-- 通过 show clusters 查看当前仓库拥有的所有计算集群。
show clusters;

8.2 创建表

存算分离模式下,建表时在 PROPERTIES 中需要指定 storage_vault_name,则数据会存储在指定 vault name 所对应的存储后端上。建表成功后,该表不允许再修改 storage_vault,即不支持更换存储后端。
storage_vault_name 可以通过 SHOW STORAGE VAULT 查看存储后端的结果进行选择。

-- 创建测试库
create database test;

-- 选择测试库
use test;

-- 创建测试表
CREATE TABLE `test_table` (
  `id` BIGINT NULL,
  `test` VARCHAR(256) NULL
) ENGINE=OLAP
UNIQUE KEY(`id`)
COMMENT '测试表'
DISTRIBUTED BY HASH(`id`) BUCKETS 10
PROPERTIES (
"replication_num" = "1",
"storage_vault_name" = "built_in_storage_vault"
);

8.3 数据写入

-- 生产不建议 INSERT INTO VALUES,仅测试用
INSERT INTO test_table VALUES (1,'TEST01'),(2,'TEST02'),(3,'TEST03');

8.4 查询测试

-- 查验数据完整性
SELECT * FROM test_table;

-- 查询数据准确性
SELECT id,test FROM test_table ORDER BY id LIMIT 1;

至此,Doris 3.0 存算分离|单节点标准部署实践Over。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1952818.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Meta 发布Llama 3.1开源模型 NVIDIA推出AI 代工服务

在这周二,Meta发布了最新的AI模型Llama 3.1,并且是一个开源模型,面向公众免费提供,且提供8B、70B、305B参数版本,模型整体效果可与 GPT-4、GPT-4o、Claude 3.5 Sonnet 等领先的闭源模型相媲美。 此次Llama 3.1 系列改…

Hadoop3.3.5的安装与单机/伪分布式配置

文章目录 一、安装须知二、安装jdk三、安装shh四、安装配置hadoop五、运行hadoop 一、安装须知 本次安装的Hadoop版本为hadoop3.3.5。 在这之前完成了VMware虚拟软件的安装,并安装了Ubuntu22.04,在这基础上进行相关配置。 二、安装jdk 在Ubuntu中使用…

顺序表算法题

在学习了顺序表专题后,了解的顺序表的结构以及相关概念后就可以来试着完成一些顺序表的算法题了,在本篇中将对三道顺序表相关的算法题进行讲解,希望能对你有所帮助,一起加油吧!!! 1.移除元素 2…

Lago - 使用 ClickHouse 扩展事件引擎

本文字数:4540;估计阅读时间:12 分钟 作者:Mathew Pregasen 本文在公众号【ClickHouseInc】首发 本周,我们欢迎来自 Lago 的一篇博客文章,介绍了他们如何使用 ClickHouse 扩展一个事件引擎,并在…

【JavaEE精炼宝库】 网络编程套接字——初识网络编程 | UDP数据报套接字编程

文章目录 一、网络编程基础1.1 网络编程的意义:1.2 网络编程的概念:1.3 网络编程的术语解释:1.4 常见的客户端服务端模型: 二、Socket 套接字2.1 Socket 套接字的概念:2.2 Socket 套接字的分类: 三、UDP数据…

24暑假算法刷题 | Day21 | LeetCode 669. 修剪二叉搜索树,108. 将有序数组转换为二叉搜索树,538. 把二叉搜索树转换为累加树

目录 669. 修剪二叉搜索树题目描述题解 108. 将有序数组转换为二叉搜索树题目描述题解 538. 把二叉搜索树转换为累加树题目描述题解 669. 修剪二叉搜索树 点此跳转题目链接 题目描述 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪…

Mac应用快速启动器:Alfred 5 for Mac 激活版

Alfred 5 是一款专为 macOS 系统设计的效率提升工具。这款软件以其快速启动和高效操作功能著称,通过使用快捷键来呼出输入界面,用户可以快速完成各种任务。 最新版本 Alfred 5.5 引入了一些新功能。其中包括整合了 ChatGPT 和 DALL-E,这意味…

Map的常见API

Map的常见API Map是双列集合的顶层接口,它的功能是全部双列集合都可以继承使用的 Map的遍历方式 map的遍历方式(键找值) package demo3;import java.util.HashMap; import java.util.Map; import java.util.Set;public class a1 {public static void main(String…

如何优化网站以提升UX设计质量

什么叫 UX 设计?UX 设计,即用户体验设计,是指为提升用户体验而进行的产品设计。 UX 在设计中,设计师通过调查和研究用户来掌握用户的需求和喜好,并利用这些信息来设计产品。设计师还会测试产品,以确保它们能…

xftp 如何链接 ubutn

一 如果你的ubutun 没有安装 openssh-server,那么是链接不上的,因此要先在ubutun 上一定要先安装openssh-server sudo apt install openssh-server 二 查看 ubutun 的ip 三 配置 xftp

导入vue3-引入富文本框编辑器-@wangeditor/editor库

效果图 下载依赖包 pureadmin/utils": "2.4.7 wangeditor/editor": "^5.1.23 wangeditor/editor-for-vue": "5.1.12定义公共组件 在src目录下定义 components/ReEditor/index.vue index.ts import editor from "./src/Editor.vue"…

BFS实现迷宫最短路径

结合队列的知识利用 广度优先遍历,通过对能走的路径的记录以及对走过路径的标记,进行多条路搜查 一、理论基础 如下图的迷宫: 选取所走方向(针对某一个位置)下,右,上,左&#xff0…

客户在哪儿AI——做真正管用的大客户获客方案

我们的目标是要打造一个真正“管用”的ToB大客户获客方案。以下是两个100%真实的案例,所有数据均为真实经营数据。一个是证明客户在哪儿AI对市场工作的颠覆性提升,另一个是证明客户在哪儿AI对决策层和销售工作的颠覆性提升。 客户在哪儿AI生产的是企业全…

C++模板——泛型编程

目录 1. 什么是泛型编程 2. 函数模板 2.1 定义格式 2.2 实例化及原理 2.3 参数匹配原则 3. 类模板 3.1 定义格式 3.2 实例化 4. 非类型模板参数 5. 模板的特化 5.1 概念 5.2 函数模板和类模板特化 6. 模板的分离编译 1. 什么是泛型编程 如何实现一个通用的加…

Windows下Pytorch入门深度学习环境安装与配置(CPU版本)

Windows下Pytorch入门深度学习环境安装与配置(CPU版本) 一、安装过程中各个软件的作用(一)Python(二)库 / 包 / package / library(三)PyTorch / Tensorflow(四&#xff…

详解yolov5和yolov8以及目标检测相关面试

一、与yoloV4相比,yoloV5的改进 输入端:在模型训练阶段,使用了Mosaic数据增强、自适应锚框计算、自适应图片缩放基准网络:使用了FOCUS结构和CSP结构Neck网络:在Backbone和最后的Head输出层之间插入FPN_PAN结构Head输出…

计算机二级题--文件 章节

之前写的有文件全部的知识点,这一篇主要针对计算机二级真题的整理。 需要备考计算机二级的小伙伴们先收藏起来吧。整理不易,不过有帮助记得点赞哦 1.相关概念考点: 1.文件指针指向的是文件缓冲区的位置,不是文件在读位置。 2.…

儿童洗衣机哪个牌子好?五大爆款机型倾情分享

在当今繁忙的生活中,儿童洗衣机已成为我们日常生活中不可或缺的家电。但是,面对市场上众多品牌的儿童洗衣机,那么,到底儿童洗衣机哪个牌子好?本次我将在这篇文章中探讨儿童洗衣机的选购策略,以帮助大家找到…

记录unraid docker更新的域名

背景:级联 一、安装内容 unraid更新docker,之前一直失败,修改网络后可以进行安装。 二、查看域名 查看域名,发现是走github的,怪不得有一些docker无法正常更新 三、解决方法 更改代理,这里为unraid的…

智慧教育解决方案

1. 智慧教育解决方案概述 智慧教育解决方案旨在通过教育改革实现四个转变:从以教为主到以学为主,从专业教育到通识与专业教育结合,从课堂教育到课内外结合,以及从结果评价到过程与结果评价结合。 2. 教育三维目标 教育三维目标…