具有DRBD9和Proxmox的可信存储(第2部分:iSCSI + LVM)

图片


上一篇文章中,我研究了使用DRBD和Proxmox创建容错NFS服务器的可能性。 事实证明还不错,但是我们不会为获得桂冠而休息,现在我们将尝试从存储中“榨出所有果汁”。


在本文中,我将告诉您如何以这种方式创建容错iSCSI目标,我们将使用LVM将其切成小块并将其用于虚拟机。


这种方法将减少负载并提高数次访问数据的速度,这在不需要竞争性访问数据的情况下(例如,当您需要为虚拟机组织存储时)特别有用。


关于DRBD的几句话


DRBD是一个相当简单和成熟的解决方案,第八版代码被用作Linux内核的一部分。 实际上,它代表网络镜像RAID1。 第九版引入了对具有两个以上节点的仲裁和复制的支持。


实际上,它允许您将多个物理节点上的块设备组合到一个公用共享网络中。


使用DRBD,您可以实现非常有趣的配置。 今天我们将讨论iSCSI和LVM。


更多关于他的,你可以通过阅读我的学习以前的文章中 ,我在那里所描述的决定。


关于iSCSI的几句话


iSCSI是网络上的块设备传送协议。


与NBD不同,它支持授权,可以毫无问题地解决网络故障,并支持许多其他有用的功能,最重要的是,它具有非常好的性能。


它的实现方式很多,其中一些也包含在内核中,对其配置和连接没有特殊的要求。


关于LVM的几句话


值得一提的是,LINBIT为Proxmox提供了自己的解决方案,它应该开箱即用,并可以实现类似的结果,但是在本文中,我不想只关注Proxmox并描述一些适​​用于Proxmox和Proxmox的通用解决方案。在此示例中,proxmox仅用作容器编排的一种方式,实际上,您可以将其替换为另一种解决方案,例如,在Kubernetes中使用目标启动容器。


特别是对于Proxmox,它仅使用自己的标准驱动程序就可以与共享LUN和LVM正常工作。


LVM的优点包括以下事实:它的使用不是革命性的新事物,并且无法充分磨合,但是相反,它显示出干燥稳定性,这通常是存储所需的。 值得一提的是,LVM在其他环境中非常活跃,例如在OpenNebula或Kubernetes中,并得到了很好的支持。


因此,您将获得仅在使用现成的驱动程序即可用于不同系统(不仅在proxmox中)的通用存储,而无需使用文件进行任何特殊修改。


不幸的是,在选择存储解决方案时,您总是必须做出一些妥协。 因此,在这里,这种解决方案不会像Ceph那样给您带来灵活性。
虚拟磁盘的大小受LVM组的大小限制,并且必须重新分配为特定虚拟磁盘标记的区域-这大大提高了访问数据的速度,但不允许进行精简配置(当虚拟磁盘占用的空间少于实际空间时)。 值得一提的是,使用快照时LVM的性能下降很多,因此通常消除了自由使用快照的可能性。


是的,LVM支持没有此缺点的精简配置池,但是不幸的是,它们只能在单个节点的上下文中使用,并且无法将一个精简配置池共享到群集中的多个节点中。


尽管存在这些缺点,但由于其简单性,LVM仍然不允许竞争对手绕过它并将其完全推离战场。


LVM的开销很小,仍然提供了非常快速,稳定和相当灵活的解决方案。


一般方案


  • 我们有三个节点
  • 每个节点都有一个分布式drbd设备
  • 在drbd设备的顶部,启动了具有iSCSI目标的LXC容器
  • 目标连接到所有三个节点。
  • 已在连接的目标上创建一个LVM组
  • 如有必要, LXC容器可以与iSCSI目标一起移动到另一个节点

客制化


我们现在想出了主意,让我们继续执行。


默认情况下 Linux内核提供 drbd的第八个版本 ,不幸的是它不适合我们,我们需要安装模块的第九个版本。


连接LINBIT存储库并安装所需的一切:


wget -O- https://packages.linbit.com/package-signing-pubkey.asc | apt-key add - echo "deb http://packages.linbit.com/proxmox/ proxmox-5 drbd-9.0" \ > /etc/apt/sources.list.d/linbit.list apt-get update && apt-get -y install pve-headers drbd-dkms drbd-utils drbdtop 

  • pve-headers -必要的内核头文件的模块组装
  • drbd-dkms -DKMS格式的内核模块
  • drbd-utils基本的DRBD管理实用程序
  • drbdtop是仅用于DRBD的交互式工具,如top

安装模块后,检查是否一切正常:


 # modprobe drbd # cat /proc/drbd version: 9.0.14-1 (api:2/proto:86-113) 

如果在命令的输出中看到第八个版本 ,则出了点问题,并且树内内核模块已加载。 检查dkms status找出原因。


我们拥有的每个节点都将在常规分区之上运行相同的drbd设备 。 首先,我们需要为每个节点上的drbd准备本节。


这样的分区可以是任何块设备 ,可以是lvm,zvol,磁盘分区或整个磁盘。 在本文中,我将使用单独的nvme磁盘,并在drbd下使用一个分区: /dev/nvme1n1p1


值得注意的是,设备名称有时会更改,因此最好立即养成对设备使用恒定符号链接的习惯。


查找符号链接/dev/nvme1n1p1可以如下:


 # find /dev/disk/ -lname '*/nvme1n1p1' /dev/disk/by-partuuid/847b9713-8c00-48a1-8dff-f84c328b9da2 /dev/disk/by-path/pci-0000:0e:00.0-nvme-1-part1 /dev/disk/by-id/nvme-eui.0000000001000000e4d25c33da9f4d01-part1 /dev/disk/by-id/nvme-INTEL_SSDPEKKA010T7_BTPY703505FB1P0H-part1 

我们在所有三个节点上描述我们的资源:


 # cat /etc/drbd.d/tgt1.res resource tgt1 { meta-disk internal; device /dev/drbd100; protocol C; net { after-sb-0pri discard-zero-changes; after-sb-1pri discard-secondary; after-sb-2pri disconnect; } on pve1 { address 192.168.2.11:7000; disk /dev/disk/by-partuuid/95e7eabb-436e-4585-94ea-961ceac936f7; node-id 0; } on pve2 { address 192.168.2.12:7000; disk /dev/disk/by-partuuid/aa7490c0-fe1a-4b1f-ba3f-0ddee07dfee3; node-id 1; } on pve3 { address 192.168.2.13:7000; disk /dev/disk/by-partuuid/847b9713-8c00-48a1-8dff-f84c328b9da2; node-id 2; } connection-mesh { hosts pve1 pve2 pve3; } } 

建议使用单独的网络进行drbd同步。


现在为drbd创建元数据并运行它:


 # drbdadm create-md tgt1 initializing activity log initializing bitmap (320 KB) to all zero Writing meta data... New drbd meta data block successfully created. success # drbdadm up tgt1 

在所有三个节点上重复这些步骤,并检查状态:


 # drbdadm status tgt1 role:Secondary disk:Inconsistent pve2 role:Secondary peer-disk:Inconsistent pve3 role:Secondary peer-disk:Inconsistent 

现在,我们的不一致磁盘位于所有三个节点上,这是因为drbd不知道应将哪个磁盘作为原始磁盘。 我们必须将其中一个标记为“ 主要”,以便其状态与其他节点同步:


 drbdadm primary --force tgt1 drbdadm secondary tgt1 

此后, 同步将立即开始:


 # drbdadm status tgt1 role:Secondary disk:UpToDate pve2 role:Secondary replication:SyncSource peer-disk:Inconsistent done:26.66 pve3 role:Secondary replication:SyncSource peer-disk:Inconsistent done:14.20 

我们不必等待它完成,我们可以并行执行其他步骤。 它们可以在任何节点上执行,而不管其在DRBD中本地磁盘的当前状态如何。 所有请求将自动重定向到状态为UpToDate的设备。


不要忘记在节点上激活drbd服务的自动运行


 systemctl enable drbd.service 

配置LXC容器


我们省略由三个节点组成的Proxmox集群的配置部分,该部分在官方Wiki中有充分描述


如前所述,我们的iSCSI目标将在LXC容器中工作 。 我们将继续在设备上的容器/dev/drbd100 ,我们刚刚创建的。


首先,我们需要在其上创建一个文件系统


 mkfs -t ext4 -O mmp -E mmp_update_interval=5 /dev/drbd100 

默认情况下, Proxmox在文件系统级别包括多重安装保护 ,原则上我们可以不用它,因为 默认情况下,DRBD具有其自身的保护,它仅禁止该设备使用第二个主要对象,但谨慎并不会伤害我们。


现在下载Ubuntu模板:


 # wget http://download.proxmox.com/images/system/ubuntu-16.04-standard_16.04-1_amd64.tar.gz -P /var/lib/vz/template/cache/ 

并从中创建我们的容器:


 pct create 101 local:vztmpl/ubuntu-16.04-standard_16.04-1_amd64.tar.gz \ --hostname=tgt1 \ --net0=name=eth0,bridge=vmbr0,gw=192.168.1.1,ip=192.168.1.11/24 \ --rootfs=volume=/dev/drbd100,shared=1 

在此命令中,我们指示容器的根系统将位于设备/dev/drbd100并添加参数shared=1以允许容器在节点之间迁移


如果出现问题,您可以随时通过Proxmox界面或在/etc/pve/lxc/101.conf容器/etc/pve/lxc/101.conf中对其进行/etc/pve/lxc/101.conf


Proxmox将解压缩模板并为我们准备容器根系统 。 之后,我们可以启动我们的容器:


 pct start 101 

配置iSCSI目标。


在所有目标中 ,我选择istgt ,因为它具有最高的性能并且可以在用户空间中工作。


现在,我们登录到容器:


 pct exec 101 bash 

安装更新和istgt


 apt-get update apt-get -y upgrade apt-get -y install istgt 

创建一个我们将通过网络提供的文件:


 mkdir -p /data fallocate -l 740G /data/target1.img 

现在我们需要为istgt /etc/istgt/istgt.conf编写一个配置:


 [Global] Comment "Global section" NodeBase "iqn.2018-07.org.example.tgt1" PidFile /var/run/istgt.pid AuthFile /etc/istgt/auth.conf MediaDirectory /var/istgt LogFacility "local7" Timeout 30 NopInInterval 20 DiscoveryAuthMethod Auto MaxSessions 16 MaxConnections 4 MaxR2T 32 MaxOutstandingR2T 16 DefaultTime2Wait 2 DefaultTime2Retain 60 FirstBurstLength 262144 MaxBurstLength 1048576 MaxRecvDataSegmentLength 262144 InitialR2T Yes ImmediateData Yes DataPDUInOrder Yes DataSequenceInOrder Yes ErrorRecoveryLevel 0 [UnitControl] Comment "Internal Logical Unit Controller" AuthMethod CHAP Mutual AuthGroup AuthGroup10000 Portal UC1 127.0.0.1:3261 Netmask 127.0.0.1 [PortalGroup1] Comment "SINGLE PORT TEST" Portal DA1 192.168.1.11:3260 [InitiatorGroup1] Comment "Initiator Group1" InitiatorName "ALL" Netmask 192.168.1.0/24 [LogicalUnit1] Comment "Hard Disk Sample" TargetName disk1 TargetAlias "Data Disk1" Mapping PortalGroup1 InitiatorGroup1 AuthMethod Auto AuthGroup AuthGroup1 UseDigest Auto UnitType Disk LUN0 Storage /data/target1.img Auto 

重启istgt:


 systemctl restart istgt 

这样就完成了目标设置


HA设置


现在我们可以去HA-经理 kofiguratsii。 让我们为设备创建一个单独的HA组:


 ha-manager groupadd tgt1 --nodes pve1,pve2,pve3 --nofailback=1 --restricted=1 

我们的资源将仅在为此组指定的节点上工作。 将我们的容器添加到该组:


 ha-manager add ct:101 --group=tgt1 --max_relocate=3 --max_restart=3 

建议和调优


广播电视

如上文所述,始终建议使用单独的网络进行复制。 强烈建议使用10 Gb网络适配器 ,否则会遇到端口速度问题。
如果复制似乎足够慢,请尝试使用DRBD的某些选项。 这是配置,我认为这是我的10G网络的最佳配置:


 # cat /etc/drbd.d/global_common.conf global { usage-count yes; udev-always-use-vnr; } common { handlers { } startup { } options { } disk { c-fill-target 10M; c-max-rate 720M; c-plan-ahead 10; c-min-rate 20M; } net { max-buffers 36k; sndbuf-size 1024k; rcvbuf-size 2048k; } } 

您可以从官方DRBD文档中获取有关每个参数的更多信息


开启iSCSI

由于我们不使用多路径,因此在我们的情况下,建议在客户端上禁用定期连接检查, 并建议/etc/iscsi/iscsid.conf增加会话恢复的等待超时。


 node.conn[0].timeo.noop_out_interval = 0 node.conn[0].timeo.noop_out_timeout = 0 node.session.timeo.replacement_timeout = 86400 

使用方法


Proxmox


生成的iSCSI目标可以立即连接到Proxmox,而不必忘记取消选中直接使用LUN



之后立即可以在其之上创建LVM,请不要忘记选中共享框:



其他环境


如果计划在不同的环境中使用此解决方案,则在有两种实现时,可能需要为LVM安装集群扩展。 CLVMlvmlockd


设置CLVM sovesm不容易,而且需要一个工作集群管理器。
作为第二种方法, lvmlockd尚未经过全面测试,并且刚刚开始出现在稳定的存储库中。


我建议阅读有关LVM中阻塞的出色文章


当将LVMProxmox一起使用时 不需要添加群集,因为卷管理是由proxmox本身提供的,它可以独立更新和监视LVM元数据。 官方文档明确指出, OpenNebula也是如此。

Source: https://habr.com/ru/post/zh-CN417597/


All Articles