rbd快照管理、rbd快照克隆原理与实现、rbd镜像开机自动挂载、ceph文件系统、对象存储、配置对象存储客户端、访问Dashboard
day04
day04快照快照克隆开机自动挂载ceph文件系统使用MDS对象存储配置服务器端配置客户端访问Dashborad
快照
- 快照可以保存某一时间点时的状态数据
- 快照是映像在特定时间点的只读逻辑副本
- 希望回到以前的一个状态,可以恢复快照
- 使用镜像、快照综合示例
# 1. 在rbd存储池中创建10GB的镜像,名为img1
[root@client1 ~]# rbd --help # 查看子命令
[root@client1 ~]# rbd help create # 查看子命令create的帮助
[root@client1 ~]# rbd create img1 --size 10G
[root@client1 ~]# rbd list
img1
[root@client1 ~]# rbd info img1
rbd image 'img1':
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: fa91208bfdaf
block_name_prefix: rbd_data.fa91208bfdaf
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Sat Dec 17 10:44:17 2022
access_timestamp: Sat Dec 17 10:44:17 2022
modify_timestamp: Sat Dec 17 10:44:17 2022
# 2. 在客户端使用镜像img1,将其挂载到/mnt
[root@client1 ~]# rbd list
img1
[root@client1 ~]# rbd map img1
/dev/rbd0
[root@client1 ~]# mkfs.xfs /dev/rbd0
[root@client1 ~]# mount /dev/rbd0 /mnt/
[root@client1 ~]# rbd showmapped
id pool namespace image snap device
0 rbd img1 - /dev/rbd0
[root@client1 ~]# df -h /mnt/
Filesystem Size Used Avail Use% Mounted on
/dev/rbd0 10G 105M 9.9G 2% /mnt
# 3. 向/mnt中写入数据
[root@client1 ~]# cp /etc/hosts /mnt/
[root@client1 ~]# cp /etc/passwd /mnt/
[root@client1 ~]# ls /mnt/
hosts passwd
# 4. 创建img1的快照,名为img1-sn1
[root@client1 ~]# rbd snap create img1 --snap img1-sn1
Creating snap: 100% complete...done.
[root@client1 ~]# rbd snap ls img1
SNAPID NAME SIZE PROTECTED TIMESTAMP
4 img1-sn1 10 GiB Sat Dec 17 10:46:07 2022
# 5. 删除/mnt/中的数据
[root@client1 ~]# rm -f /mnt/*
# 6. 通过快照还原数据
[root@client1 ~]# umount /mnt/
[root@client1 ~]# rbd unmap /dev/rbd0
[root@client1 ~]# rbd help snap rollback # 查看子命令帮助
# 回滚img1到快照img1-sn1
[root@client1 ~]# rbd snap rollback img1 --snap img1-sn1
# 重新挂载
[root@client1 ~]# rbd map img1
/dev/rbd0
[root@client1 ~]# mount /dev/rbd0 /mnt/
[root@client1 ~]# ls /mnt/ # 数据还原完成
hosts passwd
- 保护快照,防止删除
[root@client1 ~]# rbd help snap protect
# 保护镜像img1的快照img1-sn1
[root@client1 ~]# rbd snap protect img1 --snap img1-sn1
[root@client1 ~]# rbd snap rm img1 --snap img1-sn1 # 不能删
- 删除操作
# 1. 取消对快照的保护
[root@client1 ~]# rbd snap unprotect img1 --snap img1-sn1
# 2. 删除快照
[root@client1 ~]# rbd snap rm img1 --snap img1-sn1
# 3. 卸载块设备
[root@client1 ~]# umount /dev/rbd0
# 4. 取消映射
[root@client1 ~]# rbd unmap img1
# 5. 删除镜像
[root@client1 ~]# rbd rm img1
快照克隆
- 不能将一个镜像同时挂载到多个节点,如果这样操作,将会损坏数据
- 如果希望不同的节点,拥有完全相同的数据盘,可以使用克隆技术
- 克隆是基于快照的,不能直接对镜像克隆
- 快照必须是受保护的快照,才能克隆
- 克隆流程
创建
保护
克隆
镜像
快照
受保护的快照
克隆的镜像
- 给多个客户端生成数据相同的数据盘
# 1. 创建名为img2的镜像,大小10GB
[root@client1 ~]# rbd create img2 --size 10G
# 2. 向镜像中写入数据
[root@client1 ~]# rbd map img2
/dev/rbd0
[root@client1 ~]# mkfs.xfs /dev/rbd0
[root@client1 ~]# mount /dev/rbd0 /mnt/
[root@client1 ~]# for i in {1..20}
> do
> echo "Hello World $i" > /mnt/file$i.txt
> done
[root@client1 ~]# ls /mnt/
file10.txt file15.txt file1.txt file5.txt
file11.txt file16.txt file20.txt file6.txt
file12.txt file17.txt file2.txt file7.txt
file13.txt file18.txt file3.txt file8.txt
file14.txt file19.txt file4.txt file9.txt
# 3. 卸载镜像
[root@client1 ~]# umount /mnt/
[root@client1 ~]# rbd unmap img2
# 4. 为img2创建名为img2-sn1快照
[root@client1 ~]# rbd snap create img2 --snap img2-sn1
# 5. 保护img2-sn1快照
[root@client1 ~]# rbd snap protect img2 --snap img2-sn1
# 6. 通过受保护的快照img2-sn1创建克隆镜像
[root@client1 ~]# rbd clone img2 --snap img2-sn1 img2-sn1-1
[root@client1 ~]# rbd clone img2 --snap img2-sn1 img2-sn1-2
# 7. 查看创建出来的、克隆的镜像
[root@client1 ~]# rbd ls
img2
img2-sn1-1
img2-sn1-2
# 8. 不同的客户端挂载不同的克隆镜像,看到的是相同的数据
[root@client1 ~]# rbd map img2-sn1-1
/dev/rbd0
[root@client1 ~]# mkdir /data
[root@client1 ~]# mount /dev/rbd0 /data
[root@client1 ~]# ls /data
file10.txt file15.txt file1.txt file5.txt
file11.txt file16.txt file20.txt file6.txt
file12.txt file17.txt file2.txt file7.txt
file13.txt file18.txt file3.txt file8.txt
file14.txt file19.txt file4.txt file9.txt
[root@ceph1 ~]# yum install -y ceph-common
[root@ceph1 ~]# rbd map img2-sn1-2
/dev/rbd0
[root@ceph1 ~]# mkdir /data
[root@ceph1 ~]# mount /dev/rbd0 /data/
[root@ceph1 ~]# ls /data/
file10.txt file15.txt file1.txt file5.txt
file11.txt file16.txt file20.txt file6.txt
file12.txt file17.txt file2.txt file7.txt
file13.txt file18.txt file3.txt file8.txt
file14.txt file19.txt file4.txt file9.txt
- 查询镜像和快照
# 查看快照信息
[root@client1 ~]# rbd info img2 --snap img2-sn1
rbd image 'img2':
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
snapshot_count: 1
id: d46eed84bb61
block_name_prefix: rbd_data.d46eed84bb61
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Sat Dec 17 10:58:05 2022
access_timestamp: Sat Dec 17 10:58:05 2022
modify_timestamp: Sat Dec 17 10:58:05 2022
protected: True # 受保护
# 查看克隆的快照
[root@client1 ~]# rbd info img2-sn1-2
rbd image 'img2-sn1-2':
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: d48fe3d6559e
block_name_prefix: rbd_data.d48fe3d6559e
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Sat Dec 17 10:59:53 2022
access_timestamp: Sat Dec 17 10:59:53 2022
modify_timestamp: Sat Dec 17 10:59:53 2022
parent: rbd/img2@img2-sn1 # 父对象是rbd池中img2镜像的img2-sn1快照
overlap: 10 GiB
-
合并父子镜像
- img2-sn1-2是基于img2的快照克隆来的,不能独立使用。
- 如果父镜像删除了,子镜像也无法使用。
- 将父镜像内容合并到子镜像中,子镜像就可以独立使用了。
# 把img2的数据合并到子镜像img2-sn1-2中
[root@client1 ~]# rbd flatten img2-sn1-2
# 查看状态,它就没有父镜像了
[root@client1 ~]# rbd info img2-sn1-2
rbd image 'img2-sn1-2':
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: d48fe3d6559e
block_name_prefix: rbd_data.d48fe3d6559e
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Sat Dec 17 10:59:53 2022
access_timestamp: Sat Dec 17 10:59:53 2022
modify_timestamp: Sat Dec 17 10:59:53 2022
# 删除父镜像,如果镜像正在被使用,则先取消
[root@client1 ~]# umount /data/
[root@client1 ~]# rbd unmap img2-sn1-1
# 1. 删除镜像img2-sn1-1
[root@client1 ~]# rbd rm img2-sn1-1
# 2. 取消img2-sn1的保护
[root@client1 ~]# rbd snap unprotect img2 --snap img2-sn1
# 3. 删除img2-sn1快照
[root@client1 ~]# rbd snap rm img2 --snap img2-sn1
# 4. 删除img2
[root@client1 ~]# rbd rm img2
# 因为img2-sn1-2已经是独立的镜像了,所以它还可以使用
# ceph1上的镜像没有受到影响
[root@ceph1 ~]# cat /data/file1.txt
Hello World 1
开机自动挂载
# 1. 准备镜像
[root@client1 ~]# rbd create img1 --size 10G
[root@client1 ~]# rbd map img1
/dev/rbd0
[root@client1 ~]# mkfs.xfs /dev/rbd0
# 2. 设置开机自动挂载
[root@client1 ~]# vim /etc/ceph/rbdmap # 指定要挂载的镜像及用户名、密钥
rbd/img1 id=admin,keyring=/etc/ceph/ceph.client.admin.keyring
[root@client1 ~]# vim /etc/fstab # 追加
/dev/rbd/rbd/img1 /data xfs noauto 0 0
# noauto的意思是,等rbdmap服务启动后,再执行挂载
# 3. 启动rbdmap服务
[root@client1 ~]# systemctl enable rbdmap --now
# 4. reboot后查看结果
[root@client1 ~]# df -h /data/
Filesystem Size Used Avail Use% Mounted on
/dev/rbd0 10G 105M 9.9G 2% /data
ceph文件系统
- 文件系统:相当于是组织数据存储的方式。
- 格式化时,就是在为存储创建文件系统。
- Linux对ceph有很好的支持,可以把ceph文件系统直接挂载到本地。
- 要想实现文件系统的数据存储方式,需要有MDS组件
使用MDS
-
元数据就是描述数据的属性。如属主、属组、权限等。
-
ceph文件系统中,数据和元数据是分开存储的
-
新建存储池
- 归置组PG:存储池包含PG。PG是一个容器,用于存储数据。
- 为了管理方便,将数量众多的数据放到不同的PG中管理,而不是直接把所有的数据扁平化存放。
- 通常一个存储池中创建100个PG。
-
创建ceph文件系统
# 1. 新建一个名为data1的存储池,目的是存储数据,有100个PG
[root@client1 ~]# ceph osd pool create data01 100
# 2. 新建一个名为metadata1的存储池,目的是存储元数据
[root@client1 ~]# ceph osd pool create metadata01 100
# 3. 创建名为myfs1的cephfs,数据保存到data1中,元数据保存到metadata1中
[root@client1 ~]# ceph fs new myfs01 metadata01 data01
# 4. 查看存储池
[root@client1 ~]# ceph osd lspools
1 .mgr
2 rbd
3 data01
4 metadata01
[root@client1 ~]# ceph df
--- RAW STORAGE ---
CLASS SIZE AVAIL USED RAW USED %RAW USED
hdd 180 GiB 180 GiB 206 MiB 206 MiB 0.11
TOTAL 180 GiB 180 GiB 206 MiB 206 MiB 0.11
--- POOLS ---
POOL ID PGS STORED OBJECTS USED %USED MAX AVAIL
.mgr 1 1 449 KiB 2 1.3 MiB 0 57 GiB
rbd 2 32 7.1 MiB 43 22 MiB 0.01 57 GiB
data01 3 94 0 B 0 0 B 0 57 GiB
metadata01 4 94 0 B 0 0 B 0 57 GiB
# 5. 查看文件系统
[root@client1 ~]# ceph fs ls
name: myfs01, metadata pool: metadata01, data pools: [data01 ]
# 6. 启动MDS服务
[root@client1 ~]# ceph orch apply mds myfs01 --placement="2 ceph1 ceph2"
# 7. 查看部署结果
[root@client1 ~]# ceph -s
cluster:
id: a4b69ab4-79dd-11ed-ae7b-000c2953b002
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph1,ceph3,ceph2 (age 92m)
mgr: ceph1.gmqorm(active, since 92m), standbys: ceph3.giqaph
mds: 1/1 daemons up, 1 standby # mds服务信息
osd: 9 osds: 9 up (since 92m), 9 in (since 4d)
...略...
- 客户端使用cephfs
# 挂载文件系统需要密码。查看密码
[root@client1 ~]# cat /etc/ceph/ceph.client.admin.keyring
[client.admin]
key = AQBmhINh1IZjHBAAvgk8m/FhyLiH4DCCrnrdPQ==
# -t 指定文件系统类型。-o是选项,提供用户名和密码
[root@client1 ~]# mkdir /mydata
[root@client1 ~]# mount.ceph 192.168.88.13:/ /mydata -o name=admin,secret=AQC5u5ZjnTA1ERAAruLAI8F1W1nyOgxZSx0UXw==
[root@client1 ~]# df -h /mydata/
Filesystem Size Used Avail Use% Mounted on
192.168.88.13:/ 57G 0 57G 0% /mydata
对象存储
配置服务器端
- 需要专门的客户端访问
- 键值对存储方式
- 对象存储需要rgw组件
- 安装部署
# 1. 在ceph1/ceph2上部署rgw服务,名为myrgw
[root@client1 ~]# ceph orch apply rgw myrgw --placement="2 ceph1 ceph2" --port 8080
[root@client1 ~]# ceph -s
cluster:
id: a4b69ab4-79dd-11ed-ae7b-000c2953b002
health: HEALTH_OK
services:
mon: 3 daemons, quorum ceph1,ceph3,ceph2 (age 101m)
mgr: ceph1.gmqorm(active, since 6h), standbys: ceph3.giqaph
mds: 1/1 daemons up, 1 standby
osd: 9 osds: 9 up (since 6h), 9 in (since 5d); 1 remapped pgs
rgw: 2 daemons active (2 hosts, 1 zones) # rgw信息
...略...
配置客户端
- ceph对象存储提供了一个与亚马逊S3(Amazon Simple Storage Service)兼容的接口
- 在S3中,对象被存储在一个称作桶(bucket)的器皿中。这就好像是本地文件存储在目录中一样。
# 1. 安装amazon S3 cli工具(客户端工具)
[root@client1 ~]# yum install -y awscli
# 2. 在ceph中创建一个用户
[root@client1 ~]# radosgw-admin user create --uid=testuser --display-name="Test User" --email=test@tedu.cn --access-key=12345 --secret=67890
# 3. 初始化客户端
[root@client1 ~]# aws configure --profile=ceph
AWS Access Key ID [None]: 12345
AWS Secret Access Key [None]: 67890
Default region name [None]: # 回车
Default output format [None]: # 回车
# 4. 创建名为testbucket的bucket,用于存储数据
[root@client1 ~]# vim /etc/hosts # 添加以下内容
192.168.88.11 ceph1
192.168.88.12 ceph2
192.168.88.13 ceph
[root@client1 ~]# aws --profile=ceph --endpoint=http://ceph1:8080 s3 mb s3://testbucket
# 5. 上传文件
[root@client1 ~]# aws --profile=ceph --endpoint=http://ceph1:8080 --acl=public-read-write s3 cp /etc/hosts s3://testbucket/hosts.txt
# 6. 查看bucket中的数据
[root@client1 ~]# aws --profile=ceph --endpoint=http://ceph1:8080 s3 ls s3://testbucket
2022-12-17 17:05:58 241 hosts.txt
# 7. 下载数据
[root@client1 ~]# wget -O zhuji http://ceph1:8080/testbucket/hosts.txt
访问Dashborad
- 通过浏览器访问
https://192.168.88.11:8443,用户名为admin,密码是安装时指定的123456。
知识点思维导图:FlowUs 息流 - 新一代生产力工具
相关文章:
rbd快照管理、rbd快照克隆原理与实现、rbd镜像开机自动挂载、ceph文件系统、对象存储、配置对象存储客户端、访问Dashboard
day04 day04快照快照克隆开机自动挂载ceph文件系统使用MDS对象存储配置服务器端配置客户端访问Dashborad 快照 快照可以保存某一时间点时的状态数据快照是映像在特定时间点的只读逻辑副本希望回到以前的一个状态,可以恢复快照使用镜像、快照综合示例 # 1. 在rbd存…...
vue、vuex、vue-router初学导航配合elementui及vscode快捷键
目录 一、vue资源 1.vue知识库汇总 2.vuejs组件 3.Vue.js 组件编码规范 目标 #目录 #基于模块开发...
Elasticsearch:使用 ELSER 释放语义搜索的力量:Elastic Learned Sparse EncoderR
问题陈述 在信息过载的时代,根据上下文含义和用户意图而不是精确的关键字匹配来查找相关搜索结果已成为一项重大挑战。 传统的搜索引擎通常无法理解用户查询的语义上下文,从而导致相关性较低的结果。 解决方案:ELSER Elastic 通过其检索模型…...
MySQL数据库分库分表备份(shell脚本)
创建目录 mkdir /server/scripts 一、使用脚本实现分库备份 1、创建脚本并编写 [rootlocalhost scripts]# vim bak_db_v1.sh #!/bin/bash ######################################### # File Name:bak_db_v1.sh # Version: V1.0 # Author:Shen QL # Email:17702390000163.co…...
建造者设计模式go实现尝试
文章目录 前言代码结果总结 前言 本文章尝试使用go实现“建造者”。 代码 package mainimport ("fmt" )// 产品1。可以有不同的毫无相关的产品,这里只举一个 type Product1 struct {parts []string }// 产品1逻辑。打印组成产品的部分 func (p *Product…...
创建交互式用户体验:探索JavaScript中的Prompt功能
使用JavaScript中的Prompt功能:创建交互式用户体验 在前端开发中,JavaScript的prompt()函数是一个强大而有用的工具,它可以创建交互式的用户体验。无论是接收用户输入、进行简单的验证还是实现高级的交互功能,prompt()函数都能胜…...
自然语言处理从入门到应用——LangChain:提示(Prompts)-[提示模板:基础知识]
分类目录:《自然语言处理从入门到应用》总目录 语言模型以文本作为输入,这段文本通常被称为提示(Prompt)。通常情况下,这不仅仅是一个硬编码的字符串,而是模板、示例和用户输入的组合。LangChain提供了多个…...
OpenPCDet调试出现的问题
Open3d遇到的问题,解决方案 1.ModuleNotFoundError: No module named ‘pcdet’ 原因:没有编译安装pcdet。 解决:进入openpcdet项目根目录,修改setup.py权限,并编译: sudo chmod 777 setup.py python set…...
【业务功能篇58】Springboot + Spring Security 权限管理 【下篇】
4.2.2.3 SpringSecurity工作流程分析 SpringSecurity的原理其实就是一个过滤器链,内部包含了提供各种功能的过滤器。这里我们可以看看入门案例中的过滤器。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KjoRRost-1690534711077)(http…...
VBA技术资料MF34:检查Excel自动筛选是否打开
【分享成果,随喜正能量】聪明人,抬人不抬杠;傻子,抬杠不抬人。聪明人,把别人抬得很高,别人高兴、舒服了,看你顺眼了,自然就愿意帮你!而傻人呢?不分青红皂白&a…...
spring扩展点
在Spring框架中,有多个扩展点(Extension Point)可用于自定义和扩展应用程序的行为。这些扩展点允许开发人员介入Spring的生命周期和行为,并提供了灵活性和可定制性。以下是一些常见的Spring扩展点: BeanPostProcessor&…...
Skin Shader 使用自动生成的Thickness
Unity2023.2的版本,Thickness 自动化生成,今天测试了一把,确实不错。 1.Render 设置 在Project Settings->Graphics->HDRP Global Settings中 Frame Setting->Rendering->Compute Thickness 打开 2.Layer设置 2.1添加Layer&…...
Docker中的网络
文章目录 网络网桥(bridge)创建网桥接口hostnonecontaineroverlayoverlay底层原理 网络 网桥(bridge) 在Docker中,网桥(Bridge)是一种网络驱动,用于实现Docker容器之间和容器与宿主…...
SRS开源代码框架,协程库state-threads的使用
本章内容解读SRS开源代码框架,无二次开发,以学习交流为目的。 SRS是国人开发的流媒体服务器,C语言开发,本章使用版本:https://github.com/ossrs/srs/tree/5.0release。 目录 SRS协程库ST的使用源码ST协程库测试SrsAut…...
【QT 网络云盘客户端】——登录界面功能的实现
目录 1.注册账号 2.服务器ip地址和端口号设置 3. 登录功能 4.读取配置文件 5.显示主界面 1.注册账号 1.点击注册页面,将数据 输入 到 用户名,昵称,密码,确认密码,手机,邮箱 的输入框中, 点…...
【复盘与分享】第十一届泰迪杯B题:产品订单的数据分析与需求预测
文章目录 题目第一问第二问2.1 数据预处理2.2 数据集分析2.2.1 训练集2.2.2 预测集 2.3 特征工程2.4 模型建立2.4.1 模型框架和评价指标2.4.2 模型建立2.4.3 误差分析和特征筛选2.4.4 新品模型 2.5 模型融合2.6 预测方法2.7 总结 结尾 距离比赛结束已经过去两个多月了。 整个过…...
X - Transformer
回顾 Transformer 的发展 Transformer 最初是作为机器翻译的序列到序列模型提出的,而后来的研究表明,基于 Transformer 的预训练模型(PTM) 在各项任务中都有最优的表现。因此,Transformer 已成为 NLP 领域的首选架构&…...
ubuntu下畅玩Seer(via wine)
第一步:安装wine 部分exe文件的运行需要32位的指令集架构,需要向Ubuntu系统中添加一个新的架构(i386),以支持32位的软件包。因为在64位的Ubuntu系统中,默认情况下只能安装和运行64位的软件。 通过添加i386…...
第五章:Spring下
第五章:Spring下 5.1:AOP 场景模拟 创建一个新的模块,spring_proxy_10,并引入下面的jar包。 <packaging>jar</packaging><dependencies><dependency><groupId>junit</groupId><artifactI…...
在CSDN学Golang云原生(Kubernetes基础)
一,k8s集群安装和升级 安装 Golang K8s 集群可以参照以下步骤: 准备环境:需要一组 Linux 服务器,并在每台服务器上安装 Docker 和 Kubernetes 工具。初始化集群:使用 kubeadm 工具初始化一个 Kubernetes 集群。例如&…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
