万猫学社_社区达人页

个人头像照片
万猫学社
已加入开发者社区1806
勋章 更多
个人头像照片
专家博主
专家博主
个人头像照片
星级博主
星级博主
个人头像照片
技术博主
技术博主
个人头像照片
门派掌门
门派掌门
成就
已发布155篇文章
7条评论
已回答4个问题
0条评论
已发布0个视频
github地址
技术能力
兴趣领域
  • Java
  • 程序员
  • 微服务
擅长领域
  • Java
    高级

    能力说明:

    精通JVM运行机制,包括类生命、内存模型、垃圾回收及JVM常见参数;能够熟练使用Runnable接口创建线程和使用ExecutorService并发执行任务、识别潜在的死锁线程问题;能够使用Synchronized关键字和atomic包控制线程的执行顺序,使用并行Fork/Join框架;能过开发使用原始版本函数式接口的代码。

  • 微服务
    中级

    能力说明:

    熟悉微服务常用开放框架,理解Spring、Spring Boot,以及Spring Cloud的概念和不同,对Spring Cloud Alibaba有较为全面的认知。对Istio具备基础运维能力,掌握基本组件的知识。

  • 数据库
    中级

    能力说明:

    可对MySQL数据库进行备份与恢复,可较为熟练的使用SQL语句进行单表多表查询等操作,可快速上手阿里云RDS MySQL数据库,可进行MySQL云数据库的创建、设置、数据迁移等工作。了解常见NOSQL数据库,如MongoDB、Redis、Memcached的概念、安装、配置等相关基础知识。

技术认证

暂时未有相关云产品技术能力~

微信搜索「万猫学社」关注后回复「电子书」,免费获取12本Java必读技术书籍。
暂无精选文章
暂无更多信息

2022年03月

  • 03.15 14:41:02
    发表了文章 2022-03-15 14:41:02

    是什么让我节省了60%的编码时间?在SpringBoot中使用MyBatisGenerator

    业务需求不断变更,数据库表结构不断修改,是我们逃不出的宿命。工欲善其事,必先利其器,是时候祭出神器了:MyBatis Generator(简称:MBG),它是一个用于所有版本MyBatis的代码自动生成器。它可以根据数据库的表自动为项目生产对应的实体类、Mapper、DAO,包括简单CRUD数据库操作(创建、查询、更新、删除)。解放了我们的双手,不必做重复性的机械工作。节省下不少时间,不用再苦哈哈的加班了,还可以和妹纸去约会。(前提是你得先有个妹纸🤐)
  • 03.15 14:39:59
    发表了文章 2022-03-15 14:39:59

    5分钟快速了解MySQL索引的各种类型

    索引是数据库存储引擎用于快速查找到指定数据的一种数据结构。 可以用新华字典做类比:如果新华字典中对每个字的详细解释是数据库中表的记录,那么按部首或拼音等排序的目录就是索引,使用它可以让我们快速查找的某一个字详细解释的位置。
  • 03.15 14:39:07
    发表了文章 2022-03-15 14:39:07

    面试官:怎么做JDK8的内存调优?

    面试官:怎么做JDK8的内存调优?看着面试官真诚的眼神,心中暗想看起来年纪轻轻却提出如此直击灵魂的问题。擦了擦额头上汗😓,我稍微调整了一下紧张的情绪😥,对面试官说:
  • 03.14 14:16:39
    发表了文章 2022-03-14 14:16:39

    图文详解压力测试工具JMeter的安装与使用

    压力测试是目前大型网站系统的设计和开发中不可或缺的环节,通常会和容量预估等工作结合在一起,穿插在系统开发的不同方案。压力测试可以帮助我们及时发现系统的性能短板和瓶颈问题,在这个基础在上再进行针对性的性能优化,也可以帮助我们预估系统的承载能力,使我们能根据其做出一些应对措施。
  • 03.14 11:28:59
    发表了文章 2022-03-14 11:28:59

    图文详解在Windows系统中安装JDK

    图文详解在Windows系统中安装JDK,进入Oracle官方网站的下载页面:
  • 03.14 11:28:19
    发表了文章 2022-03-14 11:28:19

    「高频面试题」并发编程的特性是什么?

    「高频面试题」并发编程的特性是什么?
  • 03.14 11:27:56
    发表了文章 2022-03-14 11:27:56

    RocketMQ延迟消息的代码实战及原理分析

    在RocketMQ中,支持延迟消息,但是不支持任意时间精度的延迟消息,只支持特定级别的延迟消息。如果要支持任意时间精度,不能避免在Broker层面做消息排序,再涉及到持久化的考量,那么消息排序就不可避免产生巨大的性能开销。
  • 03.11 14:10:44
    发表了文章 2022-03-11 14:10:44

    「高频面试题」Java虚拟机内存分为哪几个区域?

    Java虚拟机内存分为哪几个区域?
  • 03.11 14:09:53
    发表了文章 2022-03-11 14:09:53

    「高频面试题」面向对象的基本特性是什么?

    面向对象的基本特性是什么?
  • 03.11 14:09:08
    发表了文章 2022-03-11 14:09:08

    通俗易懂的阿里Sentinel源码分析:如何向控制台发送心跳包?

    // 在Env类的静态代码块中, // 触发了一系列初始化操作, // 其中就包括发送心跳包的初始化。 // 如果Env类一直没有被用到, // 那么不会触发该初始操作。 // 这也印证了官方的“确保客户端有访问量, // 才开始向控制台发送心跳包”的说法, // 因为有访问量就会用到Env类。

2022年02月

  • 02.09 09:50:03
    发表了文章 2022-02-09 09:50:03

    「高频面试题」面向对象的基本原则是什么?

    面向对象的基本原则是什么?
  • 02.09 09:48:57
    发表了文章 2022-02-09 09:48:57

    从零开始学习Prometheus监控报警系统

    Prometheus是一个开源的监控报警系统,它被纳入了由谷歌发起的Linux基金会旗下的云原生基金会,并成为仅次于Kubernetes的第二大开源项目。
  • 02.09 09:43:36
    发表了文章 2022-02-09 09:43:36

    Java笔试真题及参考答案

    使用Swing实现一个窗口程序,窗口包括一个菜单栏,请按以下要求实现相应功能。
  • 02.08 18:01:01
    发表了文章 2022-02-08 18:01:01

    80%码农都难以逃脱的痛,你中招了嘛?

    各位家人们,在忘我搬砖和享受“福报”的时候,有没有感觉到手腕手指在隐隐作痛?对于码农来说,手腕手指酸痛早就习以为常,不过,这可是个危险信号,你可能患上了
  • 02.08 18:00:32
    发表了文章 2022-02-08 18:00:32

    运用惰性删除和定时删除实现可过期的localStorage缓存

    使用localStorage可以在浏览器中存储键值对的数据。经常被和localStorage一并提及的是sessionStorage,它们都可以在当浏览器中存储键值对的数据。但是它们之间的区别是:存储在localStorage的数据可以长期保留;而当页面会话结束(也就是当页面被关闭)时,存储在sessionStorage的数据会被清除。
  • 02.08 17:59:55
    发表了文章 2022-02-08 17:59:55

    头条面试居然跟我扯了半小时的Semaphore

    一个长头发、穿着清爽的小姐姐,拿着一个崭新的Mac笔记本向我走来,看着来势汹汹,我心想着肯定是技术大佬吧!但是我也是一个才华横溢的人,稳住我们能赢。

2022年01月

  • 01.29 11:24:20
    发表了文章 2022-01-29 11:24:20

    学妹教你并发编程的三大特性:原子性、可见性、有序性

    在并发编程中有三个非常重要的特性:原子性、有序性,、可见性,学妹发现你对它们不是很了解,她很着急,因为理解这三个特性对于能够正确地开发高并发程序有很大的帮助,接下来的面试中也极有可能被问到,小学妹就忍不住开始跟你逐一介绍起来
  • 01.29 11:23:17
    发表了文章 2022-01-29 11:23:17

    腾讯面试居然跟我扯了半小时的CountDownLatch

    一个长头发、穿着清爽的小姐姐,拿着一个崭新的Mac笔记本向我走来,看着来势汹汹,我心想着肯定是技术大佬吧!但是我也是一个才华横溢的人,稳住我们能赢。
  • 01.29 11:22:33
    发表了文章 2022-01-29 11:22:33

    一条命令解决macmnsvc.exe占用8081端口的问题

    无法杀掉macmnsvc.exe进程,一条命令解决macmnsvc.exe占用8081端口的问题!
  • 01.28 16:07:46
    发表了文章 2022-01-28 16:07:46

    想要年薪百万,阿里Sentinel支持RESTful接口都搞不定?

    在Spring MVC或者Spring Boot中的RESTful接口中,有大量的@PathVariable注解,也就是把参数放在URL里。但是在Sentinel中把每一次请求的URL作为唯一的资源名,进行匹配和流量控制的,这就造成了一个接口是一个资源却被当作多个资源看待,无法达到流量控制的目的。
  • 01.28 16:05:58
    发表了文章 2022-01-28 16:05:58

    Outlook无法启动一直显示“正在启动”的解决方法

    今天早上打开电脑以后,就打开Outlook2016了,一直显示这个界面:
  • 01.28 15:59:51
    发表了文章 2022-01-28 15:59:51

    冬季实战营第二期 之 Linux常用文件权限命令详解

    Linux系统中常用的文件目录管理和文件权限管理命令
  • 01.26 15:23:31
    发表了文章 2022-01-26 15:23:31

    冬季实战营第一期 之 安装并配置MySQL

    MySQL是最流行的RDBMS(Relational Database Management System:关系数据库管理系统)之一,原开发者为瑞典的MySQL AB公司,该公司于2008年被昇阳微系统(Sun Microsystems)收购。2009年,甲骨文公司(Oracle)收购昇阳微系统公司,MySQL成为Oracle旗下产品。
  • 01.26 09:39:09
    发表了文章 2022-01-26 09:39:09

    阿里面试居然跟我扯了半小时的CyclicBarrier

    一个大腹便便,穿着格子衬衫的中年男子,拿着一个贴满Logo的Mac向我走来,看着稀少的头发,我心想着肯定是顶级技术大牛吧!但是我也是一个才华横溢的人,稳住我们能赢。
  • 01.26 09:38:36
    发表了文章 2022-01-26 09:38:36

    三分钟快速搭建分布式高可用的Redis集群

    Redis Cluster是Redis在3.0版本正式推出的专用集群方案,有效地解决了Redis分布式方面的需求。当单机内存、并发、流量等遇到瓶颈的时候,可以采用这种Redis Cluster方案进行解
  • 01.26 09:37:13
    发表了文章 2022-01-26 09:37:13

    一篇文章彻底理解Redis持久化:RDB和AOF

    Redis对数据的操作都是基于内存的,当遇到了进程退出、服务器宕机等意外情况,如果没有持久化机制,那么Redis中的数据将会丢失无法恢复。有了持久化机制,Redis在下次重启时可以利用之前持久化的文件进行数据恢复。理解和掌握Redis的持久机制,对于Redis的日常开发和运维都有很大帮助,也是在大厂面试经常被问到的知识点。Redis支持的两种持久化机制:
  • 01.24 16:59:16
    发表了文章 2022-01-24 16:59:16

    最通俗易懂的Redis发布订阅及代码实战

    除了使用List实现简单的消息队列功能以外,Redis还提供了发布订阅的消息机制。在这种机制下,消息发布者向指定频道(channel)发布消息,消息订阅者可以收到指定频道的消息,同一个频道可以有多个消息订阅者,如下图:
  • 01.24 16:58:38
    发表了文章 2022-01-24 16:58:38

    一分钟快速搞懂Redis的慢查询分析

    慢查询,顾名思义就是比较慢的查询,但是究竟是哪里慢呢?首先,我们了解一下Redis命令执行的整个过程:
  • 01.24 16:58:00
    发表了文章 2022-01-24 16:58:00

    HTTP协议经典面试题整理及答案详解

    无论你是Java、PHP开发者,还是运维人员,只要从事互联网行业,面试时都可能被问到HTTP协议相关知识。历时多天的呕心沥血,为你总结了HTTP协议的经典面试题。由于涉及内容比较繁杂不方便记忆,建议收藏起来,时不时看一遍或者面试前突击复习。
  • 01.19 10:39:27
    发表了文章 2022-01-19 10:39:27

    死磕Lambda表达式(六):Consumer、Predicate、Function复合

    这次我们来介绍一下其他的复合Lambda表达式:
  • 01.19 10:38:51
    发表了文章 2022-01-19 10:38:51

    死磕Lambda表达式(五):Comparator复合

    JDK不仅提供的这些函数式接口,其中一些接口还为我们提供了实用的默认方法,这次我们来介绍一下Comparator复合。
  • 01.19 10:38:16
    发表了文章 2022-01-19 10:38:16

    死磕Lambda表达式(四):常用的函数式接口

    在Java8支持Lambda表达式以后,为了满足Lambda表达式的一些典型使用场景,JDK为我们提供了大量常用的函数式接口。它们主要在 java.util.function 包中,下面简单介绍几个其中的接口及其使用示例。
  • 01.19 10:37:45
    发表了文章 2022-01-19 10:37:45

    死磕Lambda表达式(三):更简洁的Lambda

    编译器可以通过函数式接口推断出Lambda表达式的参数类型,所以在编写Lambda表达式时,可以省略参数类型。比如:
  • 01.19 10:33:42
    发表了文章 2022-01-19 10:33:42

    死磕Lambda表达式(二):Lambda的使用

    函数式接口就是有且仅有一个抽象方法的接口。上面提到的`Comparator<T>`接口,虽然有很多默认方法,但有且仅有一个抽象方法`compare`,所以它仍然是一个函数式接口。
  • 01.19 10:32:52
    发表了文章 2022-01-19 10:32:52

    死磕Lambda表达式(一):初识Lambda

    Lambda表达式是表示可传递匿名函数的一种简洁方式,Lambda表达式没有名称,但是有参数列表、函数主体、返回类型,还可能有一个可以抛出的异常列表。它是Java8新增的特性,有了它我
  • 01.19 10:31:48
    发表了文章 2022-01-19 10:31:48

    二叉树面试题:前中序求后序、中后序求前序

    在面试时,避免不了的会遇到一些数据结构的面试题,今天我们就来了解一下二叉树的经典面试题:
  • 01.19 10:31:16
    发表了文章 2022-01-19 10:31:16

    五分钟后,你将真正理解MySQL事务隔离级别!

    在SQL标准中定义了四种隔离级别,每一种级别都定义了一个事务所做的修改,在另外一个事务内和事务间,哪些是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。
  • 01.19 10:25:01
    发表了文章 2022-01-19 10:25:01

    详细解析Redis中的布隆过滤器及其应用

    之前的布隆过滤器可以使用Redis中的位图操作实现,直到Redis4.0版本提供了插件功能,Redis官方提供的布隆过滤器才正式登场。布隆过滤器作为一个插件加载到Redis Server中,就会给Redis提供了强大的布隆去重功能。
  • 01.19 10:24:13
    发表了文章 2022-01-19 10:24:13

    春眠不觉晓,Redis数据类型知多少?String,List,Set,SortedSet,Hash,Bitmap,HyperLogLogs

    Redis不是一个简单的键值对存储,它实际上是一个支持各种类型数据结构的存储。在传统的键值存储中,是将字符串键关联到字符串值,但是在Redis中,这些值不仅限于简单的字符串,还可以支持更复杂的数据结构。下面就是Redis支持的数据结构:
  • 01.19 10:23:38
    发表了文章 2022-01-19 10:23:38

    一篇文章快速搞懂Java虚拟机的栈帧结构

    栈帧(Stack Frame),就是Java虚拟机中的虚拟机栈(Virtual Machine Stack)的基本元素,它也是用于支持Java虚拟机进行方法调用和方法执行背后的数据结构,了解了它就可以更好地理解Java虚拟机执行引擎是如何运行的。
  • 01.19 10:22:49
    发表了文章 2022-01-19 10:22:49

    面试真题:求100万内的质数

    一个头发稀少、穿着格子衬衣的中年男子走了进来,把手里拿的MAC放在桌子上,对我说:“我会用电脑记录面试过程,你不要介意啊”。
  • 01.19 10:21:59
    发表了文章 2022-01-19 10:21:59

    Java中三目运算符不为人知的坑

    以下代码可能有什么错误?
  • 01.19 10:20:36
    发表了文章 2022-01-19 10:20:36

    月薪过万必会的:双亲委托模型

    对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在JVM中的唯一性。可是有这么多种的类加载器,如何保证一个类在JVM中的唯一性呢?为了解决这个问题,双亲委托模型(Parents Delegation Model)应运而生,它就是下图所展示的类加载器之间的层次关系:
  • 01.19 10:19:35
    发表了文章 2022-01-19 10:19:35

    Java虚拟机内存结构及编码实战

    在Java的开发过程中,因为有JVM自动内存管理机制,不再需要像在C、C++开发那样手动释放对象的内存空间,不容易出现内存泄漏和内存溢出的问题。但是,正是由于把内存管理的权利交给了
  • 01.19 10:18:45
    发表了文章 2022-01-19 10:18:45

    CAT中实现异步请求的调用链查看

    CAT(Central Application Tracking),是美团点评基于 Java 开发的一套开源的分布式实时监控系统。美团点评基础架构部希望在基础存储、高性能通信、大规模在线访问、服务治理、实时监控、容器化及集群智能调度等领域提供业界领先的、统一的解决方案,CAT 目前在美团点评的产品定位是应用层的统一监控组件,在中间件(RPC、数据库、缓存、MQ 等)框架中得到广泛应用,为各业务线提供系统的性能指标、健康状况、实时告警等服务。
  • 01.19 10:18:04
    发表了文章 2022-01-19 10:18:04

    写给大忙人看Hadoop完全分布式集群搭建

    Hadoop一般有三种运行模式,分别是
  • 01.19 10:15:30
    发表了文章 2022-01-19 10:15:30

    一篇文章彻底搞懂JVM加载中初始化的时机

    JVM类加载过程分为几个阶段,分别是加载、验证、准备、解析和初始化。其中,
  • 01.19 10:14:12
    发表了文章 2022-01-19 10:14:12

    详解在Linux系统中安装Tomcat

    本文以在CentOS 7.6中安装Tomcat8.5为例进行安装,其他系统和版本都是大同小异的。
  • 01.19 10:13:21
    发表了文章 2022-01-19 10:13:21

    Java虚拟机的类加载机制全面解析

    JVM把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被JVM直接使用的Java类型,这就是JVM的类加载机制。
  • 发表了文章 2024-01-15

    使用 Apache PDFBox 操作PDF文件

  • 发表了文章 2024-01-15

    【AI帮我写代码,上班摸鱼不是梦】手摸手图解CodeWhisperer的安装使用

  • 发表了文章 2024-01-15

    Spring Boot 的事务控制及示例代码

  • 发表了文章 2024-01-10

    3分钟快速了解使用Java进行对称加密

  • 发表了文章 2024-01-10

    怎么Java进行MD5摘要加密?

  • 发表了文章 2024-01-10

    【从零开始学微服务】08.引入微服务架构的时机

  • 发表了文章 2024-01-09

    【从零开始学微服务】07.微服务常用的开发框架

  • 发表了文章 2024-01-09

    【从零开始学微服务】06.微服务架构的建设思路

  • 发表了文章 2024-01-09

    【从零开始学微服务】05.微服务的优势和不足

  • 发表了文章 2024-01-08

    【从零开始学微服务】04.微服务架构的特点

  • 发表了文章 2024-01-08

    【从零开始学微服务】03.软件架构的演化过程

  • 发表了文章 2024-01-08

    【从零开始学微服务】02.初识微服务

  • 发表了文章 2024-01-05

    【从零开始学微服务】01.微服务的过去与现在

  • 发表了文章 2024-01-05

    深入理解Istio流量管理的熔断配置

  • 发表了文章 2022-08-10

    在 Istio 服务网格内连接外部 MySQL 数据库

  • 发表了文章 2022-08-10

    一张图快速了解 Istio 的 EnvoyFilter

  • 发表了文章 2022-08-10

    在Istio中,到底怎么获取 Envoy 访问日志?

  • 发表了文章 2022-08-09

    5个 Istio 访问外部服务流量控制最常用的例子,你知道几个?

  • 发表了文章 2022-08-09

    10个 Istio 流量管理 最常用的例子,你知道几个?

  • 发表了文章 2022-08-09

    图解VirtualBox安装CentOS 7

正在加载, 请稍后...
滑动查看更多
  • 回答了问题 2022-04-22

    使用 Docker 基本命令构建和运行镜像时,如何使用 docker run 命令运行镜像?

    docker run :创建一个新的容器并运行一个命令

    语法

    docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
    
    

    OPTIONS说明:

    -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;

    -d: 后台运行容器,并返回容器ID;

    -i: 以交互模式运行容器,通常与 -t 同时使用;

    -P: 随机端口映射,容器内部端口随机映射到主机的端口

    -p: 指定端口映射,格式为:主机(宿主)端口:容器端口

    -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;

    --name="nginx-lb": 为容器指定一个名称;

    --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;

    --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;

    -h "mars": 指定容器的hostname;

    -e username="ritchie": 设置环境变量;

    --env-file=[]: 从指定文件读入环境变量;

    --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;

    -m :设置容器使用内存最大值;

    --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;

    --link=[]: 添加链接到另一个容器;

    --expose=[]: 开放一个端口或一组端口;

    --volume , -v: 绑定一个卷

    实例 使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx。

    docker run --name mynginx -d nginx:latest
    

    使用镜像nginx:latest以后台模式启动一个容器,并将容器的80端口映射到主机随机端口。

    docker run -P -d nginx:latest
    
    

    使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data。

    docker run -p 80:80 -v /data:/data -d nginx:latest
    
    

    绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.1 的 80 端口上。

    $ docker run -p 127.0.0.1:80:8080/tcp ubuntu bash
    
    

    使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。

    runoob@runoob:~$ docker run -it nginx:latest /bin/bash
    root@b8573233d675:/#
    
    踩0 评论0
  • 回答了问题 2022-04-22

    使用 Docker 基本命令构建和运行镜像时,如何使用 docker rm 命令删除容器?

    docker rm :删除一个或多个容器。

    语法

    docker rm [OPTIONS] CONTAINER [CONTAINER...]
    

    OPTIONS说明:

    -f :通过 SIGKILL 信号强制删除一个运行中的容器。

    -l :移除容器间的网络连接,而非容器本身。

    -v :删除与容器关联的卷。

    实例:

    强制删除容器 db01、db02:

    docker rm -f db01 db02
    
    

    移除容器 nginx01 对容器 db01 的连接,连接名 db:

    docker rm -l db
    
    

    删除容器 nginx01, 并删除容器挂载的数据卷:

    docker rm -v nginx01
    
    

    删除所有已经停止的容器:

    docker rm $(docker ps -a -q)
    
    踩0 评论0
  • 回答了问题 2022-04-22

    如何实现分层存储?

    基于 Block Device 的分层存储方案

    该方案完整地实现了以上提到的分层存储中所有的工作,包括虚拟化,IO 性能统计以及数据的迁移。

    方案结构

    该方案的结构包括一个 Linux 设备驱动程序和若干用户态的控制程序,如图 3 所示。 驱动程序实现存储设备的虚拟化,IO 性能监测统计以及数据的迁移; 用户态控制程序负责创建、删除虚拟设备,手动触发数据迁移,以及设置获取设备状态。 该方案由于 Storage Tiering 所有的功能都在 Linux 内核实现,且需要维护虚拟设备到物理设备的地址映射表,以及保证数据一致性,所以实现难度和工作量比较大,但可扩展性和灵活性也相对较大。

    image.png

    方案实现

    该方案的实现主要包括以下内容:

    1、管理设备的注册 管理设备主要用于与用户态程序的 IOCTL 交互,可以是一个字符设备或者 Misc 设备。Linux 下可以通过 register_chrdev 或 misc_register 注册,并实现所需要的 IOCTL 接口。

    2、虚拟块设备的创建 用户态控制程序通过 IOCTL 向控制设备发起创建虚拟设备的请求,并传入所有的物理磁盘(DEV1,DEV2)的参数,如设备名,磁盘大小,虚拟磁盘的块大小等;驱动程序收到该请求后,进行必要的参数检查,然后调用 register_blkdev 创建一个新的块设备(VDEV)。并设置新设备的相关参数,如 IO 处理函数,队列大小,设备容量等。

    3、虚拟设备地址与物理设备地址映射 虚拟设备地址到物理设备的地址映射表在虚拟设备创建是被初始化,并在数据迁移过程中被修改。 虚拟设备和物理设备都被分成固定大小的块,块大小可以固定或通过 IOCTL 由用户指定,但一旦确定,不能更改,一个 Block 是热度统计以及数据迁移的最小单位;每个 Block 包含若干个 sector(512 Byte)。 当 VDEV 收到一个 bio,可以由 bi_sector 和 bi_size 找出所对应的 VDEV 的 Block 以及 Block 内的偏移量,通过查询映射表,找到各个 VDEV Block 所对应的物理设备以及 Block,然后读取物理设备 Block 内的偏移量,如图 4 所示。 地址映射表以及其他的元数据需要存储在物理设备上,以便机器重启时能重构这个虚拟的块设备,且需要采取一定的备份策略,防止断电或磁盘损坏造成数据丢失。

    4、IO 热度统计 IO 热度统计也以 Block 为基本单位,每个 Block 内的任何一个 sector 被访问,该 Block 的热度都为增加。由于大 IO 以及顺序 IO 在性能在传统硬盘和 SSD 上的差异并不是特别大,所以在进行热度统计是应该考虑排除大 IO 和顺序 IO。

    5、数据迁移 可以采用自动方式或手动方式。自动方式由驱动内的定时器驱动,每隔一定的时间,启动数据迁移的扫描,将 IO 热度统计中的热数据向高性能存储设备迁移,冷数据向低性能存储设备迁移;手动方式由用户指定,将某块数据向高性能存储设备迁移或低性能设备迁移。手动数据迁移方式增加了更大的灵活性和可扩展性。

    image.png

    开源实现

    BTier 基于 Block Device 的分层存储方案的开源实现。BTier 最大支持 16 个设备的虚拟化,这些设备被 BTier 简单地捆绑成一个 btier 块设备,因此,其中任何一个设备的失效,都会导致整个 btier 的失效。 编译并以模块形式安装 BTier 之后,会创建一个名为 tiercontrol 的字符设备; 然后使用 BTier 提供的 btier_setup 应用可以创建一个新的块设备 btiera,然后就可以对 btiera 设备进行所有块设备的读写操作,包括分区和创建文件系统。 BTier 还提供了丰富的 sysfs 接口,进行控制和信息获取,如数据迁移的开关,间隔时间,IO 统计信息等。 不过 BTier 每个 Tier 层仅支持 1 个物理设备,同层多个设备的虚拟化需要借助其他的方法,在虚拟化上面,BTier 还有可以改善的空间。

    基于 LVM 的分层存储方案

    Linux 的逻辑卷管理(LVM)提供了存储虚拟化,可以将多个物理卷(PV)建成一个卷组(VG),然后再在 VG 里创建虚拟卷(VG)。而且 LVM 提供了在不同物理卷之间迁移数据的 API。因此,基于 LVM 的分层存储方案借助 LVM 的虚拟化和数据迁移的能力,实现会更简单。

    方案结构

    该方案中,数据一致性的问题以及数据迁移时 IO 中断的问题都由 LVM 进行处理,重点在于如何分析并统计 IO 的热度信息,并且不涉及内核态的开发。该方案的结构如图所示。

    image.png

    方案实现

    该方案的实现主要包括以下内容:

    1、创建虚拟设备 使用 pvcreate 将所有的物理磁盘创建成物理卷(PV);再使用 vgcreate 将所有的 VG 创建成一个卷组(VG);最后使用 lvcreate 在创建出来的 VG 上建虚拟卷。

    2、IO 热度统计 IO 热度统计可以使用 blktrace 工具,或者实现一个设备驱动来检测 IO 的热度。使用 blkparse 可以解析 blktrace 的输出,然后分析这些 IO 的分布以及读写频度,从而得到 IO 的热度统计信息。

    4、数据迁移 根据 IO 的热度统计信息,使用 LVM 提供的 pvmove 工具,可以在属于同一个 VG 里的不同 PV 之间进行数据迁移,将热数据和冷数据分布存放在不同的物理卷上。

    开源实现

    LVMTS(LVM Tired Storage)是一个使用 SSD 和 HDD 来创建混合存储的方案,完全在用户态实现,主要由几个守护进程构成。 Lvmtscd 负责监测 blktrace 的输出并统计块设备的访问频度,并将这些统计信息记录在文件中; Lvmtsd 负责根据用户配置的信息,启动其他的守护进程,并完成数据迁移。 实际使用中发现,LVMTS 并不是太稳定,而且在 IO 分析统计上并不是太完善,可开发的空间仍然很大。

    踩0 评论0
  • 回答了问题 2022-04-20

    程序员35岁后的出路

    1.送外卖 image.png

    2.开网约车 image.png

    3.回老家种地 image.png

    4.摆地摊卖煎饼果子 image.png

    踩0 评论0
正在加载, 请稍后...
滑动查看更多
正在加载, 请稍后...
暂无更多信息