Linux-LVM逻辑卷管理

news2024/11/15 19:32:21

一、背景

        Linux运维过程中大家有没有想过生产环境服务器磁盘分区如果数据量越来越膨胀(这些都是重要数据,不能删除),那么此时如何来应对这个问题呢?   既要不影响正在运行的程序,同时也不能中断关机等操作。

        这么一想就很蛋疼了。假设你运行的是kafka或者mysql数据库、或者其他有状态的服务,由于之前规划存在问题或者突然情况,导致数据增长速率超过你的预期,就会出现需要分区需要扩容的情况了。

        LVM逻辑卷的机制是其中一种可以满足在线热扩容、对应用程序无关、安全的磁盘管理机制,也许可以满足你的需求。LVM(逻辑卷管理)是一种灵活的存储管理技术,允许用户将一个或多个物理硬盘的分区组合起来,形成一个物理卷集合,从而可以更灵活地管理和分配磁盘空间。

        说白了就是,应用层只管对接抽象的数据结构,无须关心底层实现,底层实际容量变动对上层无感。  接下来让我们一起来看看,LVM逻辑卷该如何使用.

        为了实现分区动态扩容机制,前期进行分区选型的时候,要根据情况判断,是否需要使用LVM方式划分分区方便后面应对动态扩容的需求,普通分区方式直接挂载,无法做到动态扩容。

二、LVM的整体实现原理

1、基本术语

  1. PE(Physical Extent):物理扩展单元

    • 定义:PE 是 LVM 中的基本分配单位,它是组成卷组(VG)的基本单元。
    • 大小:PE 的大小通常是 4MB,默认情况下是固定的,但可以根据需要进行配置。
    • 作用:PE 是物理卷(PV)上分配给逻辑卷(LV)的最小单位,逻辑卷由多个 PE 组成。
  2. PV(Physical Volume):物理卷

    • 定义:PV 是指用来创建卷组的一个或多个磁盘分区或整个磁盘。
    • 作用:PV 是 LVM 的基础,它包含了用于 LVM 的存储空间。物理卷可以是硬盘上的一个分区或整个磁盘。
    • 创建:使用 pvcreate 命令将一个或多个磁盘分区或整个磁盘转换为物理卷。
  3. VG(Volume Group):卷组

    • 定义:VG 是由一个或多个物理卷组成的集合,它提供了一个可以划分成多个逻辑卷的空间池。
    • 作用:VG 是 LVM 中的逻辑容器,它将多个物理卷组合在一起,提供了一个统一的存储池,可以在其中创建逻辑卷。
    • 创建:使用 vgcreate 命令创建卷组,并指定一个或多个物理卷作为成员。
  4. LV(Logical Volume):逻辑卷

    • 定义:LV 是在卷组内部定义的一个存储区域,它可以动态地调整大小,并且独立于底层物理存储设备。
    • 作用:LV 类似于传统的文件系统,但是提供了更多的灵活性和可扩展性。逻辑卷可以跨越多个物理卷。
    • 创建:使用 lvcreate 命令创建逻辑卷,并指定卷组和大小。

2、关系图(PV、VG、LV、PE)

        PV作为物理存储层,组成为VG抽象资源池,LV从VG中按需申请获取存储容量,不够则继续可以从VG中申请扩容,底层如何扩容,PV之间如果组织存储等等,应用层LV不需要关心、上层对下层变动无感、透明。

        如果后期需要扩容,只需要继续往VG里面添加PV,VG存在足够容量,LV就能继续从VG资源池中拿到存储容量。从而实现,分区实时在线动态热扩容的目的。 再也不怕磁盘空间不足的问题了。

三、扩容实操

1、创建PV

存在一个空白的硬盘: /dev/sdb,  直接使用这个/dev/sdb全部转换为一个PV(切割PE的过程).

pvcreate /dev/sdb

2、创建VG且添加PV

创建VG名称为: my-vg, 并且将/dev/sdb这个PV加入到VG资源池:

vgcreate my-vg /dev/sdb

3、创建LV,从VG获取存储容量

   创建LV名称为: my-lv, 并且从my-vg申请10G的存储空间.

lvcreare -n my-lv -L 10G my-vg

4、格式化LV,创建文件系统

    针对my-lv创建文件系统,文件系统类型是xfs. 

mkfs.xfs /dev/my-vg/my-lv

5、挂载LV卷到目录挂载点,实现文件写入/读取

  挂载:   mount /dev/my-vg/my-lv   /data/,   测试写文件、读文件完全没问题.

 mount /dev/my-vg/my-lv   /data/

6、扩容LV卷大小,实现动态扩容

     假设此时我们的10G存储不够了,那么可以实现实时动态无感扩容,对上层进程无感扩容,不影响业务程序和服务。

      1、LV扩容的前提那肯定是看VG资源池是否充足对吧, 巧妇难为无米之炊, VG没容量肯定申请不下来。

       2、执行lvextend扩容命令: lvextend -L +8G /dev/my-vg/my-lv

lvextend -L +10G /dev/my-vg/my-lv

       3、扩容成功后,df -h /data/ 查看容量还是10G而不是18G?  先不慌, 虽然LV扩容了,但是之前创建的文件系统是针对10G的LV当时识别的。 需要重新识别的过程

xfs_growfs /data/  #重新识别文件系统

        最后df -h /data/查看,发现容量已经扩容为18G. 

四、Centos7操作系统默认分区形式是LVM

        安装Centos7操作系统,如果选择默认分区则就是使用LVM管理硬盘的.

        查看操作系统的挂载情况和磁盘情况:

        可以发现 / 根分区, 挂载的是一个LV不是普通分区。 这样我们的/分区可以动态扩容,只要再插入一台硬盘,将硬盘制作为PV, PV加入到这个VG, LV再从VG申请容量就可以完成/分区扩容的目的。 很方便,再也不怕/分区满了.

五、总结

1、涉及到的相关命令

1、PV

创建PV:  pvcreate    例子: pvcreate /dev/sdb /dev/sdc

删除PV: pvremove

查看PV:  pvs、pvdisplay(更加详细的信息)

2、VG

创建VG:  vgcreate     例子: vgcreare myvg /dev/sdb /dev/sdc

删除VG: vgremove

查看VG:  vgs、vgdisplay(更加详细的信息)

3、LV

创建LV:  lvcreate      例子: lvcreate -n mylv -L 2G myvg

删除LV: lvremove

查看LV:  lvs、lvdisplay(更加详细的信息)

扩容:      lvextend      例子:  lvextend -L +10G /dev/myvg/mylv

4、更新文件系统扩容信息

针对 EXT2、EXT3、EXT4文件系统类型:   resize2fs /dev/myvg/mylv

针对XFS文件系统类型:   xfs_growfs /data/

创建文件系统:    mkfs.xfs /dev/myvg/mylv

2、LVM相关总结

        记住一个原则就是,这种动态扩容存储相关的,大部分的核心思想就是将上层依赖的东西,依赖于一个抽象层而非实际存储层,因为依赖抽象层以后,抽象层可以不动,底层无论怎么变都是无感、透明的,这样扩展性强。  我的容量不够直接每次都加硬盘(PV)即可,我的容量可以一直扩下去。

        包括像K8S的PV、PVC这些存储机制,大家想想是不是有异曲同工之妙。 后端PV存储类型、容量大小都不需要关心, 应用只需要申请PVC, 拿到存储空间就行,我管你后端是NFS还是Ceph、还是其它存储方式,我应用层能用就行,这个不归应用层管,对应用层透明的。

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

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

相关文章

力扣-96.不同的二叉搜索树 题目详解

题目: 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 二叉搜索树介绍: 二叉搜索树是一个有序树: 若它的左子树不空,则左子树上所有结点的值均小于它…

凸优化学习(3)——对偶方法、KKT条件、ADMM

🍅 写在前面 👨‍🎓 博主介绍:大家好,这里是hyk写算法了吗,一枚致力于学习算法和人工智能领域的小菜鸟。 🔎个人主页:主页链接(欢迎各位大佬光临指导) ⭐️近…

【pyenv】pyenv安装版本超时的解决方案

目录 1、现象 2、分析现象 3、手动下载所需版本 4、存放到指定路径 5、重新安装 6、pip失败(做个记录,未找到原因) 7、方法二修改环境变量方法 7.1 设置环境变量 7.2 更新 7.3 安装即可 8、方法三修改XML文件 前言:研…

【Android】Room—数据库的基本操作

引言 在Android开发中,数据持久化是一个不可或缺的部分。随着应用的复杂度增加,选择合适的数据存储方式变得尤为重要。Room数据库作为Android Jetpack架构组件之一,提供了一种抽象层,使得开发者能够以更简洁、更安全的方式操作SQ…

PCIe进阶之TL:First/Last DW Byte Enables Rules Traffic Class Field

1 First/Last DW Byte Enables Rules & Attributes Field 1.1 First/Last DW Byte Enables Rules Byte Enable 包含在 Memory、I/O 和 Configuration Request 中。本文定义了相应的规则。Byte Enable 位于 header 的 byte 7 。对于 TH 字段值为 1 的 Memory Read Request…

【算法篇】哈希类(笔记)

目录 一、常见的三种哈希结构 二、LeetCode 练习 1. 有效的字母异位词 2. 两个数组的交集 3. 快乐数 4. 两数之和 5. 四数相加II 6. 赎金信 7. 三数之和 8. 四数之和 一、常见的三种哈希结构 当想使用哈希法来解决问题的时候,一般会选择如下三种数据…

java中的注解原理是什么?

Java中的注解(Annotations)是一种用于提供元数据的机制。它可以通过在代码中添加注解的形式,将一些额外的信息嵌入到代码里。注解本质上不会改变程序的实际逻辑行为,但是可以帮助开发工具、编译器、框架等获取这些元数据&#xff…

短信验证码倒计时 (直接复制即可使用) vue3

需求&#xff1a; 要实现一个获取验证码的需求&#xff0c;点击获取验证码60秒内不可以重复点击&#xff0c;方式有两种可以直接复制使用&#xff1b; 效果图 实现方案 方案1 (单个文件内使用比较推荐) <el-button :disabled"codeDisabled" click.stop"h…

SQL进阶的技巧:如何实现某列的累计乘积?

0 场景描述 在做数据处理的时候,尤其是复利累积的时候,有时候会有这样一场景,通过某种条件找到一列数据[X1,X2,X3...Xn],然后想要求y=X1X2X3...Xn。下面给出一个具体案例来详细解释这一问题,如下图所示,每个组的name值只有2个(2个A/B/C),当name=A or C时,price为value…

鸡蛋检测系统源码分享

鸡蛋检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

python webapi上传文件

一、安装 pip install Flask 二、 编写上传文件接口webapi.py http://127.0.0.1:5000/upload from flask import Flask,request from werkzeug.utils import secure_filename import uuidapp Flask(__name__)app.route(/) def hello_world():return Hello, World!app.post(…

MySQl篇(基本介绍)(持续更新迭代)

目录 一、为什么要使用数据库 1. 以前存储数据的方式 2. 什么是数据库 3. 采用的数据库的好处 4. 如何理解数据库、数据库管理系统、SQL 5. 如何理解数据是有组织的存储 6. 现在的数据库 二、关系型数据系统 1. 什么是关系型数据库 2. 关系型数据库特点 3. 关系型数据…

p11 日志,元数据,进程的查看

直接运行docker run -d centos这个时候回启动容器&#xff0c;但是因为容器里面没有前台进程所以这个时候docker会把没用的进程给停止掉&#xff0c;可以看到docker ps命令没有查看到任何的正在运行的容器 但是如果说你使用 -it命令进入到了容器里面&#xff0c;这个他就不会…

并发编程 - 锁(属性修饰符 atomic)

引言 在多线程编程中&#xff0c;数据一致性是一个必须解决的问题。多个线程同时访问同一片共享数据时&#xff0c;极易发生竞争条件&#xff08;race conditions&#xff09;&#xff0c;导致数据的不一致性&#xff0c;甚至程序崩溃。为了解决这些问题&#xff0c;我们需要引…

Vulnhub:BlueSky

靶机下载地址 信息收集 主机发现 nmap扫描攻击机同网段存活主机。 nmap 192.168.31.0/24 -Pn -T4 靶机ip&#xff1a;192.168.31.171。 端口扫描 nmap 192.168.31.171 -A -p- -T4 开放端口22,8080。 目录扫描 访问8080端口&#xff0c;如图&#xff0c;是tomcat管理页面…

Vue3.0组合式API:使用reactive()、ref()创建响应式代理对象

1、reactive() 方法 reactive() 方法用于将定义的 JavaScript 对象转换为响应式对象。 使用方法&#xff1a; <script setup> //第一步&#xff1a;导入函数 import { reactive } from vue;//第二步&#xff1a;创建响应式对象 const data reactive(对象类型的数据);…

prompt实用技巧-AI+Mermaid【酷炫钉钉文档】

AI 新技能&#xff0c;最近 chatGPTo1 发布后模型能力出现了新的跨越&#xff0c;之前模型的一本正经的胡说八道幻想模式&#xff0c;让AI 对待理科推理明显弱于文案的 AGI 的生成。 prompt engineer 工程师程序员的福音 prompt 内容如下&#xff0c; 按照以上格式生成创建公…

C++ Primer Plus(速记版)-类和数据抽象

第十二章 类 在 C 中&#xff0c;用类来定义自己的抽象数据类型。 12.1. 类的定义和声明 12.1.1. 类定义&#xff1a;扼要重述 最简单地说&#xff0c;类就是定义了一个新的类型和一个新作用域。 类成员 类成员可以是属性、方法或类型别名。 成员可以是公有&#xff08;publ…

CPU 缓存的局部性特性

CPU 缓存的局部性特性是现代处理器中用来提高程序执行效率的重要原理。局部性特性是指程序在运行时&#xff0c;其数据和指令的访问具有一定的规律性&#xff0c;主要体现在时间局部性和空间局部性两方面。利用这些规律&#xff0c;CPU 可以更高效地管理缓存&#xff0c;减少从…

github远程仓库环境搭建及使用

目录 1、创建一台虚拟机 centos 源的配置 备份源 修改源 重新加载缓存 安装软件 配置epel 2、关闭防火墙和selinux 关闭防火墙 临时关闭SELinux 永久关闭SELinux&#xff1a;编辑SELinux的配置文件 配置文件的修改内容 3、git是本地仓库&#xff0c;linux系统中一…