分布式文件存储Minio学习入门

2023-11-09

一、分布式文件系统应用场景

互联网海量非结构化数据的存储需求。电商图片、视频、网盘文件、社交图片。
分布式文件存储系统Minio与FastDFS的区别。FastDFS文件名是自动生成的。

1. Minio介绍

MinIO是一个开源的对象存储服务。兼容亚马逊S3云存储服务接口。适合存储大量非结构化数据,eg:图片、视频、日志文件、备份数据、容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几K到最大5T不等。
MinIO是一个非常轻量的服务,可以很简单的和其他应用结合,类似NodeJS、Redis或者MySQL。
中文官方网站:http://minio.org.cn/

Minio优点

  • 部署简单:一个single二进制文件即是一切,还可支持各种平台
  • minio支持海量存储,可按zone扩展,支持单个对象最大5TB
  • 兼容Amazon S3,充分考虑开发人员的需求和体验
  • 低冗余且磁盘损坏高容忍,标准且最高的数据荣誉系数为2(即存储一个1M的数据,实际占用2M),但在任意n/2块disk损坏的情况下依赖可以读出数据(n为一个纠删码集合中的disk数量)。并且这种损坏恢复是基于单个对象的,而不是基于整个存储卷的。
  • 读写性能优异

2. MinIO的基础概念、

  • Object: 存储到MinIO的基本对象,如文件、字节流等
  • Bucket: 用来存储Object的逻辑空间。每个Bucket之间的数据是相互隔离的。对于客户端来说,相当于一个存放文件的顶层文件夹。(隔离的作用)
  • Drive: 即存储数据的磁盘,在Minio启动时,以参数的方式传入。Minio中所有的对象数据都会存储在Drive中。
  • Set: 即一组Drive的集合,分布式部署根据集群规模自动划分一个或多个Set,每个Set中的Dirve分布位置不同。一个对象存储在一个Set上。
    • 一个对象存储在一个Set上
    • 一个集群划分为多个Set
    • 一个Set包含的Drive数量固定,默认由系统根据集群规模计算
    • 一个Set中的Drive尽可能分布在不同的节点上。

3. 纠删码ES(Erasure Code)

MinIO使用纠删码机制来保证高可用,使用HighWayHash来处理数据损坏。关于纠删码,简单的说即通过计算,将丢失的数据还原,可以将n份原始数据,增加m份数据。并能通过n+m份中的任意n份数据,还原为原始数据。
即如果有任意小于m份的数据失败,仍可以通过剩下的数据还原。

4. 存储形式

文件对象上传到Minio,会在对应的数据磁盘中,以Bucket名称为目录,文件名为下一级目录,文件名下为part.1和xl.meta,前者为编码数据块及校验块,后者是元数据文件。

5. 存储方案

在这里插入图片描述

二、Docker部署单机Minio

  1. 参考官方文档:https://min.io/docs/minio/container/index.html
    在这里插入图片描述
  2. 命令启动
    这里我们用的是docker,所以需要将命令换成docker run
λ docker search minio
λ docker pull minio/minio
docker run -p 9000:9000 -p 9090:9090 --name minio -v D:\docker\minio\data:/data -e "MINIO_ROOT_USER=admin" -e "MINIO_ROOT_PASSWORD=admin123" minio/minio server /data --console-address ":9090"
# 下面是多行模式的
docker run -d 	\ 	# 后台启动
	-p 9000:9000  \	# api
	-p 9090:9090  \	# 访问地址
	--name minio 
	-v D:\docker\minio\data:/data  \		#映射数据文件
	-e "MINIO_ROOT_USER=admin"  \		#账号
	-e "MINIO_ROOT_PASSWORD=admin123"  \		#密码
	minio/minio server /data --console-address ":9090"	#指定访问端口9090不变更

启动控制台打印内容:
在这里插入图片描述

  1. 访问:http://localhost:9090/login 账号:admin,密码:admin123

  2. 创建存储桶,并上传文件测试,查看映射磁盘目录的变化。
    在这里插入图片描述
    这里我参考的版本是说单台没有启用纠删码存储的即为源文件,而我这里docker启动的却存储的是

    λ tree
    D:\docker\minio\data
    └─test1
        └─Doc1.docx
            └─f9014ffb-63fd-4f5d-a250-fbccf131f87d
    

三、minio纠删码模式部署

minio使用纠删码(erasure code)与校验和(checksum)来保护数据不受硬件故障和无声数据损坏。即使丢失一半(n/2)数据的硬盘,仍然可以恢复数据。当有一半的磁盘损坏时数据无法上传,必须存在2n+1块才可以。

  1. docker 部署
docker run -p 9000:9000 -p 9090:9090 --name minio -v D:\docker\minio\data1:/data1 -v D:\docker\minio\data2:/data2 -v D:\docker\minio\data3:/data3 -v D:\docker\minio\data4:/data4  -v D:\docker\minio\data5:/data5 -v D:\docker\minio\data6:/data6 -v D:\docker\minio\data7:/data7 -v D:\docker\minio\data8:/data8 -e "MINIO_ROOT_USER=admin" -e "MINIO_ROOT_PASSWORD=admin123" minio/minio server /data{1...8} --console-address ":9090"

docker run -d 	\ 	# 后台启动
	-p 9000:9000  \	# api
	-p 9091:9091  \	# 访问地址
	--name minio 
	-v D:\docker\minio\data1:/data1 \
	-v D:\docker\minio\data2:/data2 \
	-v D:\docker\minio\data3:/data3 \
	-v D:\docker\minio\data4:/data4 \
	-v D:\docker\minio\data5:/data5 \
	-v D:\docker\minio\data6:/data6 \
	-v D:\docker\minio\data7:/data7 \
	-v D:\docker\minio\data8:/data8 \
	-e "MINIO_ROOT_USER=admin"  \		#账号
	-e "MINIO_ROOT_PASSWORD=admin123"  \		#密码
	minio/minio server /data{1...8} --console-address ":9091"	#指定访问端口9090不变更

四、分布式集群部署

分布式minio可以将多块硬盘组成一个对象存储服务。由于硬盘分布在不同的节点上,分布式minio避免了单点故障。
在这里插入图片描述

分布式存储可靠性常用方法

分布式存储,关键点在于数据可靠性、完整性、不丢失损坏。只有在可靠的前提下才追求一致性、高可用、高性能。

冗余

冗余即对存储的数据进行备份,当数据丢失、损坏,可以使用副本进行恢复。而备份份数决定了可靠性。可靠性是允许丢失其中一部分数据。当前分布式系统中采用该模式的,eg:Hadoop的文件系统(3个副本)、Redis集群、Mysql主备。

校验

校验即通过校验码的计算方式,对丢失损坏的数据进行校验、还原。注意:这里有两个作用,一个校验通过对数据进行校验和计算,可以检查数据的完整性,检查数据是否损坏、更改,在数据传输中使用。二是恢复还原,通过对数据结合校验码计算,还原丢失损坏的数据,在保证可靠性的前提下减少冗余。eg:单机硬盘存储的RAID技术、纠删码技术。

分布式Minio优势

  • 数据保护:分布式minio采用纠删码来防范多个节点宕机和位衰减(bit rot)。分布式minio最少需要4个磁盘,使用分布式minio自动引入纠删码。
  • 高可用:单机minio存在单点故障。而如果一个有N块硬盘的分布式minio,只要有n/2块硬盘可用,则数据安全可读。可写需要n/2+1。
  • 一致性:minio在分布式和单机模式下,所有写操作都严格遵守read-after-write一致性。

运行分布式minio

启动一个分布式minio实例,只需要把硬盘位置作为参数传给minio server命令即可,然后在其他节点运行相同命令。

  • 分布式minio所有节点需要同样的access密钥和secret密钥以保证所有节点可以建立连接。新版(MINIO_ROOT_USER、MINIO_ROOT_PASSWORD)
  • 分布式 minio使用磁盘必须干净无数据。
  • 分布式minio节点时间差不得超过3秒,可以使用NTP来保证时间同步。
    在这里插入图片描述
    在这里插入图片描述

使用docker compose部署minio

version: '3.7'

# Settings and configurations that are common for all containers
x-minio-common: &minio-common
  image: minio/minio:latest
  command: server --console-address ":9001" http://minio{1...4}/data{1...2}
  expose:
    - "9000"
    - "9001"
  environment:
    MINIO_ROOT_USER: minio
    MINIO_ROOT_PASSWORD: minio123
  healthcheck:
    test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
    interval: 30s
    timeout: 20s
    retries: 3

# starts 4 docker containers running minio server instances.
# using nginx reverse proxy, load balancing, you can access
# it through port 9000.
services:
  minio1:
    <<: *minio-common
    hostname: minio1
    volumes:
      - data1-1:/data1
      - data1-2:/data2

  minio2:
    <<: *minio-common
    hostname: minio2
    volumes:
      - data2-1:/data1
      - data2-2:/data2

  minio3:
    <<: *minio-common
    hostname: minio3
    volumes:
      - data3-1:/data1
      - data3-2:/data2

  minio4:
    <<: *minio-common
    hostname: minio4
    volumes:
      - data4-1:/data1
      - data4-2:/data2

  nginx:
    image: nginx:1.19.2-alpine
    hostname: nginx
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    ports:
      - "9000:9000"
      - "9001:9001"
    depends_on:
      - minio1
      - minio2
      - minio3
      - minio4

## By default this config uses default local driver,
## For custom volumes replace with volume driver configuration.
volumes:
  data1-1:
  data1-2:
  data2-1:
  data2-2:
  data3-1:
  data3-2:
  data4-1:
  data4-2:

五、Minio客户端使用

MinIO Client(MC)为ls、cat、cp、mirror、diff、find等unix命令提供了一种替代方案。

ls 			#	列出文件和文件夹。
mb			#	创建一个存储桶或一个文件夹。
cat			#	显示文件和对象内容。
pipe		#	将一个STDIN重定向到一个对象或者文件或者STDOUT。
share		#	生成用于共享的URL。
cp			#	拷贝文件和对象。
mirror		#	给存储桶和文件夹做镜像。
find		#	基于参数查找文件。
diff		#	对两个文件夹或者存储桶比较差异。
rm			#	删除文件和对象。
events		#	管理对象通知。
watch		#	监视文件和对象的事件
policy		#	管理访问策略。
config		#	管理mc配置文件。
update		#	检查软件更新。
version		# 	输出版本信息。

http://docs.minio.org.cn/minio/baremetal/reference/minio-cli/minio-mc.html

docker 中使用MC

启动控制台

λ docker pull minio/mc
λ docker run -it --name mc --entrypoint=/bin/sh minio/mc
λ docker start -i mc

配置管理

# 查询mc host配置
mc config host ls
# 添加minio服务
mc config host add minio-server http://172.17.0.3:9090 admin admin123
# 删除host
mc config host remove minio-server

文件管理

# 上传下载
mc cp 源文件地址 目标地址
mc rm 文件地址

Bucket管理

# 创建桶
mc mb hostname / bucketName
eg:mc mb minio-server /bucket01
# 删除桶 --force表示强制删除
mc rb hostname  /bucketName
eg:mc rb --force minio-server /bucket02

admin管理

service		# 服务重启并停止所有MinIO服务器
update		# 更新所有MinIO服务器
info		# 显示MinIO服务器信息
user		# 管理用户
group		# 管理小组
policy		# MinIO服务器中定义的策略管理
config		# MinIO服务器配置管理
heal		# 修复MinIO服务器上的磁盘,存储桶和对象
profile		# 生成概要文件数据以进行调试
top			# 提供MinIo的顶部统计信息
trace		# 跟踪显示MinIO服务器的http跟踪
console			# 控制台显示MinIo服务器的控制台日志
prometheus		# Prometheus管理Prometheus配置
kms				# kms执行KMS管理操作

六、Minio整合SpringBoot

1. 编写MinioConfig类

@Data
@Configuration
@ConfigurationProperties(prefix = "minio")
public class MinioConfig {
    private String url;
    private String username;
    private String pwd;

    @Bean
    public MinioClient getMinioClient() {
        MinioClient minioClient = MinioClient.builder().endpoint(this.getUrl())
                .credentials(this.getUsername(), this.getPwd())
                .build();
        return minioClient;
    }
}

2. 编写application.yml

minio:
  url: http://localhost:9000
  username: admin
  pwd: admin123
  bucket: test
server:
  port: 8888
spring:
  servlet:
    multipart:
      max-file-size: 100MB
      max-request-size: 500MB

3. 编写Controller测试类(查询、下载、上传)

@RestController
@Slf4j
public class MinioController {
    @Autowired
    private MinioClient minioClient;

    @Value("${minio.bucket}")
    private String bucketName;

    @GetMapping("/list")
    public List<Object> list() throws Exception {
        Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder()
                .bucket(bucketName).build());
        ArrayList<Object> list = new ArrayList<>();
        Iterator<Result<Item>> iterator = results.iterator();
        while (iterator.hasNext()) {
            Item item = iterator.next().get();
            list.add(JSONUtil.parse(this.format(item.objectName(), item.size())));
        }
        return list;
    }

    @GetMapping("/download/{fileName}")
    public void download(HttpServletResponse resp, @PathVariable("fileName") String fileName) throws Exception {
        StatObjectResponse stat = minioClient.statObject(StatObjectArgs.builder()
                .bucket(bucketName).object(fileName).build());
        resp.setContentType(stat.contentType());
        resp.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
        GetObjectResponse object = minioClient.getObject(GetObjectArgs.builder()
                .bucket(bucketName).object(fileName).build());
        IOUtils.copy(object, resp.getOutputStream());
    }

    @GetMapping("/delete/{fileName}")
    public String delete(@PathVariable("fileName") String fileName) {
        try {
            minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(fileName).build());
        } catch (Exception e) {
            e.printStackTrace();
            return "删除失败!" + e.getMessage();
        }
        return "删除成功!";
    }

    @GetMapping("/upload")
    public String upload(MultipartFile[] files) throws IOException {
        if (files == null || files.length == 0) {
            return "上传文件不能为空!";
        }
        InputStream ins = null;
        try {
            ArrayList<String> fileNames = new ArrayList<>(files.length);
            for (MultipartFile file : files) {
                String filename = file.getOriginalFilename();
                fileNames.add(filename);
                ins = file.getInputStream();
                ObjectWriteResponse response = minioClient.putObject(PutObjectArgs.builder()
                        .bucket(bucketName).object(filename)
                        .stream(ins, file.getSize(), -1)
                        .contentType(file.getContentType())
                        .build());
            }
        } catch (Exception e) {
            e.printStackTrace();
            return "上传失败!" + e.getMessage();
        } finally {
            if (ins != null) {
                ins.close();
            }
        }
        return "上传成功!";
    }

    private String format(String objectName, long size) {
        return String.format("{'fileName':'%s','fileSize':'%d'}", objectName, size);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分布式文件存储Minio学习入门 的相关文章

  • 【计算机毕业设计】病房管理系统

    当下 如果还依然使用纸质文档来记录并且管理相关信息 可能会出现很多问题 比如原始文件的丢失 因为采用纸质文档 很容易受潮或者怕火 不容易备份 需要花费大量的人员和资金来管理用纸质文档存储的信息 最重要的是数据出现问题寻找起来很麻烦 并且修改
  • 【计算机毕业设计】实验室预约管理

    身处网络时代 随着网络系统体系发展的不断成熟和完善 人们的生活也随之发生了很大的变化 人们在追求较高物质生活的同时 也在想着如何使自身的精神内涵得到提升 而读书就是人们获得精神享受非常重要的途径 为了满足人们随时随地只要有网络就可以看书的要
  • 【计算机毕业设计】个人日常事务管理系统

    进入21世纪网络和计算机得到了飞速发展 并和生活进行了紧密的结合 目前 网络的运行速度以达到了千兆 覆盖范围更是深入到生活中的角角落落 这就促使 管理系统的发展 管理系统可以实现远程处理事务 远程工作信息和随时追踪工作的状态 网上管理系统给
  • 用户数据中的幸存者偏差

    幸存者偏差 Survivorship bias 是一种常见的逻辑谬误 意思是没有考虑到筛选的过程 忽略了被筛选掉的关键信息 只看到经过筛选后而产生的结果 先讲个故事 二战时 无奈德国空防强大 盟军战机损毁严重 于是军方便找来科学家统计飞机受
  • 白帽子如何快速挖到人生的第一个漏洞 | 购物站点挖掘商城漏洞

    本文针对人群 很多朋友们接触安全都是通过书籍 网上流传的PDF 亦或是通过论坛里的文章 但可能经过了这样一段时间的学习 了解了一些常见漏洞的原理之后 对于漏洞挖掘还不是很清楚 甚至不明白如何下手 可能你通过 sql labs 初步掌握了sq
  • python超详细基础文件操作【建议收藏】

    文章目录 前言 发现宝藏 1 文件操作 1 1 文件打开与关闭 1 1 1 打开文件 1 1 2 关闭文件 1 2 访问模式及说明 2 文件读写 2 1 写数据 write 2 2 读数据 read 2 3 读数据 readlines 2
  • 基于java的学生宿舍管理系统设计与实现

    基于java的学生宿舍管理系统设计与实现 I 引言 A 研究背景和动机 基于Java的学生宿舍管理系统设计与实现的研究背景和动机 在数字化时代的推动下 学生宿舍管理系统已经成为了管理学生宿舍的重要工具 学生宿舍管理系统能够帮助管理者更好地管
  • 基于java的饮食分享平台系统设计与实现

    基于java的饮食分享平台系统设计与实现 I 引言 A 研究背景和动机 近年来 随着人们生活水平的提高和健康意识的增强 饮食健康已经成为越来越多人的关注焦点 因此 一个方便快捷的饮食分享平台就显得尤为重要 基于Java的饮食分享平台系统设计
  • 利用CHAT写实验结论

    问CHAT 通过观察放置在玻璃表面上的单个水滴 人们可以观察到水滴充当成像系统 探究这样一个透镜的放大倍数和分辨率 CHAT回复 实验报告标题 利用玻璃表面的单一水滴观察成像系统的放大倍数和分辨率 一 实验目的 通过对比和测量 研究和探索玻
  • 【计算机毕业设计】趵突泉景区的智慧导游小程序_5ztvv

    当今社会已经步入了科学技术进步和经济社会快速发展的新时期 国际信息和学术交流也不断加强 计算机技术对经济社会发展和人民生活改善的影响也日益突出 人类的生存和思考方式也产生了变化 传统趵突泉景区的智慧导游采取了人工的管理方法 但这种管理方法存
  • CAP与BASE理论

    CAP与BASE理论 CAP 一个分布式系统最多只能同时满足一致性 Consistency 可用性 Availability 和分区容错性 Partition tolerance 这三项中的两项 C一致性 状态的一致性 缓存 数据库 集群等
  • 计算机Java项目|基于SSM的微课学习系统

    作者主页 编程指南针 作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智
  • 毕业设计:基于python人脸识别系统 LBPH算法 sqlite数据库 (源码)✅

    博主介绍 全网粉丝10W 前互联网大厂软件研发 集结硕博英豪成立工作室 专注于计算机相关专业 毕业设计 项目实战6年之久 选择我们就是选择放心 选择安心毕业 感兴趣的可以先收藏起来 点赞 关注不迷路 毕业设计 2023 2024年计算机毕业
  • 温室气体排放更敏感的模型(即更高的平衡气候敏感性(ECS))在数年到数十年时间尺度上也具有更高的温度变化(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Python代码 数据
  • 【GRNN-RBFNN-ILC算法】【轨迹跟踪】基于神经网络的迭代学习控制用于未知SISO非线性系统的轨迹跟踪(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 2 1 第1部分 2 2 第2部分
  • Cortex-M3与M4权威指南

    处理器类型 所有的ARM Cortex M 处理器是32位的精简指令集处理器 它们有 32位寄存器 32位内部数据路径 32位总线接口 除了32位数据 Cortex M处理器也可以有效地处理器8位和16位数据以及支持许多涉及64位数据的操作
  • 肿瘤的转录调控:Cell子刊揭示原发性肝癌中转录因子活性的全基因组图谱|国自然热点

    转录调控的研究历史比较长 相关研究在近十年来仍一直增长 也是近年来高分文章的焦点之一 在2023年最佳国自然 中标 研究热点 转录调控中标率高达189 作为国自然热点之一的肿瘤微环境的研究在近几年也一直处于上升趋势 转录调控在肿瘤发生 发展
  • Python 使用 NoSQL 数据库的优选方案

    NoSQL 数据库因其高性能 可扩展性和灵活性而风靡一时 然而 对于 Python 程序员而言 选择合适的 NoSQL 数据库可能会令人困惑 因为有多种选择可供选择 那么 哪种 NoSQL 数据库最适合 Python 呢 2 解决方案 根据
  • RabbitMQ环境配置

    文章目录 安装Erlang 安装RabbitMQ 安装Erlang 下载地址 http erlang org download otp win64 25 3 2 7 exe 安装RabbitMQ 下载地址 https www rabbitm
  • Minio:如何获得正确的链接以在html上显示图像

    我需要从 Minio 存储桶获取图像 但无法显示该图像 我发现问题出在链接上 即使用浏览器也无法打开它 所以 问题来了 GET 净 ERR CONNECTION REFUSED 我用于上传该文件的代码 包主 import context l

随机推荐

  • aviator表达式教程

    Aviator是一个轻量级 高性能的Java表达式执行引擎 它动态地将表达式编译成字节码并运行 特性包括 支持绝大多数运算操作符 包括算术操作符 关系运算符 逻辑操作符 位运算符 正则匹配操作符 三元表达式 支持操作符优先级和括号强制设定优
  • 微信小程序开发前端基础知识

    文章目录 一 简介 1 是什么 2 为什么 二 准备工作 1 环境准备 1 1 注册账号 1 2 获取APPID 1 3 开发工具 2 创建微信小程序 三 组件 1 目录及其作用介绍 2 页面操作 3 view 块级元素 4
  • Oracle Calendar

    声明 本文为转载 如果有侵犯知识版本 请通知本人 本人将即刻停止侵权行为 参考网址 http code geekinterview com oracle oracle calendar sql html 1 SELECT Initcap T
  • ROS:bag数据包内容提取——雷达点云数据和imu数据

    通常在利用ros采集传感器数据时 我们会得到一个包含多个传感器数据的bag数据包 下面将会介绍从bag数据包提取雷达点云数据和imu数据的方法 系统版本 Ubuntu20 04 ROS版本 Noetic 先觉条件 查看bag数据包中雷达点云
  • Python爬虫从入门到精通:(17)协程_Python涛哥

    协程 本节的概念需要重点理解和实际操作 我们需要安装asynico库 pip install asyncio 学习之前我们先来看下这段代码 import time def get request url print 正在请求的url url
  • nginx---四层七层代理

    理论部分 所谓四层负载均衡 也就是主要通过报文中的目标地址和端口 再加上负载均衡设备设置的服务器选择方式 决定最终选择的内部服务器 它一般走的是tcp udp协议 所谓七层负载均衡 也称为 内容交换 也就是主要通过报文中的真正有意义的应用层
  • 2022年4月23日第十三届省赛蓝桥杯真题答案_python_第五题_统计未被污染的海域

    第五题如约而至哈 和第六题差不多 但比第六题简单 好 上题目 题目 有一片海域划分为N M个方格 其中有些海域已被污染 用0表示 有些海域没被污染 用1表示 请问这片N M海域中有几块是没被污染的独立海域 没被污染的独立海域是指该块海域上下
  • Obsidian流程图

    下载的obsidian进行安装时自动在C盘建立文件夹 但是该文件夹大小不大 关于在obsidian中安装插件 参考以下文章进行操作 https zhuanlan zhihu com p 403001135 我自己弄mermaid这个插件时
  • CSDN不再更新,后续文章在掘金发布

    掘金地址 方大可的主页
  • 用手机版python爬虫_Python爬虫也能用手机进行抓包?没错!这个技巧我只告诉你...

    今天要说说怎么在我们的手机抓包 我们知道了 HTTP 的请求方式 以及在 Chrome 中摸清了一些套路 但是 除了对数据进行解析之外 有时候我们想 对请求的数据或者响应的数据进行篡改 怎么做呢 我们经常在用的手机 手机里面的数据 怎么对它
  • Memcached 学习笔记(三)——多节点测试

    Memcached 学习笔记 三 多节点测试 一 启动两个 或者多个 节点 memcached d p 11212 u nobody c 1024 m 64 memcached d p 11213 u nobody c 1024 m 64
  • 跳跃列表(skipList)、压缩列表(zipList)和快速列表(quicklist)

    跳跃列表 skipList 压缩列表 zipList 和快速列表 quicklist 都是Redis底层重要的数据结构 跳跃列表 skipList Redis使用跳跃表作为有序集合键的底层实现之一 通过在每个节点中维持多个指向其他节点的指针
  • python信号端点检测_python的webrtc库实现语音端点检测

    引言 语音端点检测最早应用于电话传输和检测系统当中 用于通信信道的时间分配 提高传输线路的利用效率 端点检测属于语音处理系统的前端操作 在语音检测领域意义重大 但是目前的语音端点检测 尤其是检测 人声 开始和结束的端点始终是属于技术难点 各
  • 网站被DDOS攻击怎么办?防护经验!

    为了能够及时发现ddos攻击 下面我们就详细介绍一下网站受ddos攻击的症状 网站遇到ddos攻击的表现之一 服务器CPU被大量占用 ddos攻击其实是一种恶意性的资源占用攻击 攻击者利用肉鸡或者攻击软件对目标服务器发送大量的无效请求 导致
  • AngularJS的使用总结

    1 AngularJS是一个前端JavaScript框架 它可通过
  • 无法使用域名访问服务器,但IP访问正常

    具体判断方法和解决办法 问题判断 在电脑的windows系统左下角点击 开始 运行 输入 cmd 确定 然后在弹出的命令提示符界面输入命令 nslookup 空格 域名 若命令结果中域名指向的ip和服务器实际公网ip一致 那么问题产生的原因
  • C语言 cortex-A7核 点LED灯 (附 汇编实现、使用C语言 循环实现、使用C语言 封装函数实现【重要、常用】)

    1 汇编实现 text global start start LED1点灯 gt PE10 RCC章节初始化 CC INIT 1 使能GPIOE组控制器 通过RCC MP AHB4ENSETR寄存器设置GPIOE组使能0x50000A28
  • C++11多线程之条件变量

    文章目录 一 关于多线程的同步 二 初始条件变量 三 关于条件变量的例题 四 生产者消费者模型 一 关于多线程的同步 函数被调用 分配相应的栈帧 进行现场保护 void func char c char filename 20 sprint
  • elementUI table组件渲染问题

    elementUI table组件渲染问题 1 问题 问题描述 页面内 使用选项卡 进行内容显示的切换 切换后 原本高度合适的表格出现白边 以及滚动条 检查Dom会发现 el table组件内 发现了一个类名为 is scrolling n
  • 分布式文件存储Minio学习入门

    文章目录 一 分布式文件系统应用场景 1 Minio介绍 Minio优点 2 MinIO的基础概念 3 纠删码ES Erasure Code 4 存储形式 5 存储方案 二 Docker部署单机Minio 三 minio纠删码模式部署 四