柴少鹏的官方网站 技术在分享中进步,水平在学习中升华

KVM使用分布式文件系统

一、GlusterFS在KVM虚拟化中的应用

http://www.51niux.com/?id=154   #已经记录了GlusterFS的搭建过程,这里KVM使用一下创建虚拟机。

# gluster volume create kvm_store stripe 2 replica 2 192.168.1.103:/data01/gfsdata 192.168.1.104:/data01/gfsdata 192.168.1.105:/data01/gfsdata  192.168.1.106:/data01/gfsdata 192.168.1.107:/data01/gfsdata 192.168.1.108:/data01/gfsdata  192.168.1.103:/data02/gfsdata  192.168.1.103:/data02/gfsdata   #创建分布条带复制卷,虚拟镜像文件保存2份。

#注:GlusterFS的条带、分布和brick添加时候的顺序有关系,为了尽量容错,添加的时候,应将不同服务器的brick交叉添加。

# gluster volume info

Volume Name: kvm_store
Type: Distributed-Striped-Replicate
Volume ID: 47b5ba43-d202-48d8-a51a-7e8b1ad1e68a
Status: Started
Snapshot Count: 0
Number of Bricks: 2 x 2 x 2 = 8
Transport-type: tcp
Bricks:
Brick1: 192.168.1.103:/data01/gfsdata
Brick2: 192.168.1.104:/data01/gfsdata
Brick3: 192.168.1.105:/data01/gfsdata
Brick4: 192.168.1.106:/data01/gfsdata
Brick5: 192.168.1.107:/data01/gfsdata
Brick6: 192.168.1.108:/data01/gfsdata
Brick7: 192.168.1.103:/data02/gfsdata
Brick8: 192.168.1.104:/data02/gfsdata
Options Reconfigured:
transport.address-family: inet
performance.readdir-ahead: on
nfs.disable: on

# gluster volume status kvm_store   #查看卷的状态

Status of volume: kvm_store
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick 192.168.1.103:/data01/gfsdata         49154     0          Y       8854 
Brick 192.168.1.104:/data01/gfsdata         49154     0          Y       5899 
Brick 192.168.1.105:/data01/gfsdata         49153     0          Y       6517 
Brick 192.168.1.106:/data01/gfsdata         49153     0          Y       4865 
Brick 192.168.1.107:/data01/gfsdata         49153     0          Y       5952 
Brick 192.168.1.108:/data01/gfsdata         49153     0          Y       11482
Brick 192.168.1.103:/data02/gfsdata         49155     0          Y       8873 
Brick 192.168.1.104:/data02/gfsdata         49155     0          Y       5918 
Self-heal Daemon on localhost               N/A       N/A        Y       8893 
Self-heal Daemon on 192.168.1.104           N/A       N/A        Y       5938 
Self-heal Daemon on 192.168.1.105           N/A       N/A        Y       6537 
Self-heal Daemon on 192.168.1.106           N/A       N/A        Y       4886 
Self-heal Daemon on 192.168.1.107           N/A       N/A        Y       5972 
Self-heal Daemon on 192.168.1.108           N/A       N/A        Y       11502
 
Task Status of Volume kvm_store
------------------------------------------------------------------------------
There are no active volume tasks

1.1通过Libvirt使用虚拟机

通过Libvirt使用虚拟机,是我们常用的一种KVM的使用方式,需要配置下GlusterFS。

# cat /etc/glusterfs/glusterd.vol

option rpc-auth-allow-insecure on  #加上这么一句

# service glusterd restart  #重启下glusterd服务
# gluster volume set kvm_store server.allow-insecure on  #打开我们创建的kvm_store卷的server.allow-insecure属性。

# gluster volume set kvm_store storage.owner-uid 107  #设置卷UID是qemu用户的uid

# gluster volume set kvm_store storage.owner-gid 107  #设置卷的GID

# gluster volume stop kvm_store
# gluster volume start kvm_store

# gluster volume set kvm_store auth.allow 192.168.1.*  #指定哪些节点可以挂在kvm_store卷,这里指定192.168.1网段可以挂载,这里要注意,不支持多行,多行的话就是覆盖最后一行会是最新的,比如你又再auth.allow 192.168.1.102,就会覆盖掉之前的设置,可以用逗号隔开设置多个条件,如:# gluster volume set kvm_store auth.allow 192.168.1.101,192.168.1.102,这时候只能192.168.1.101-102能挂载kvm_store卷

# gluster volume info #查看下配置是否生效

Volume Name: kvm_store
Type: Distributed-Striped-Replicate
Volume ID: 47b5ba43-d202-48d8-a51a-7e8b1ad1e68a
Status: Started
Snapshot Count: 0
Number of Bricks: 2 x 2 x 2 = 8
Transport-type: tcp
Bricks:
Brick1: 192.168.1.103:/data01/gfsdata
Brick2: 192.168.1.104:/data01/gfsdata
Brick3: 192.168.1.105:/data01/gfsdata
Brick4: 192.168.1.106:/data01/gfsdata
Brick5: 192.168.1.107:/data01/gfsdata
Brick6: 192.168.1.108:/data01/gfsdata
Brick7: 192.168.1.103:/data02/gfsdata
Brick8: 192.168.1.104:/data02/gfsdata
Options Reconfigured:
auth.allow: 192.168.1.101,192.168.1.102
storage.owner-gid: 107
storage.owner-uid: 107
server.allow-insecure: on
nfs.disable: on
performance.readdir-ahead: on
transport.address-family: inet

然后将虚拟机的.xml文件的磁盘那里修改为(但是直接不用修改这里,就用fuse方式挂载到本地目录,然后img镜像指定到本地目录就可以了,就是下面的宿主机本地挂载的方式):

<disk type='network' device='disk'>  #磁盘type为network类型
  <driver name='qemu' type='qcow2' cache='none'/>   #使用qcow2格式吧,空间占用是跟着实际占用走的,在镜像传输的时候也会很快。
   <source protocol='gluster' name='kvm_store/test3.img'>  #指定协议为Gluster,指定卷名称和镜像名称
    <host name='192.168.1.104' port='24007'/>    #指定GlusterFS服务,域名主机名IP都可以,指定TCP端口
   </source>

博文来自:www.51niux.com

1.2 宿主机本地挂载使用GlusterFS

#mount -t glusterfs 192.168.1.103:/kvm_store  /kvmtest

图片.png

#查看已经挂载上了

然后这个/kvmtest就跟本地目录一样了,通过VNC创建虚拟机直接把镜像文件存到这个目录下就可以了。也可以通过qemu-img先提交创建好qcow2格式的镜像,然后虚拟机镜像创建的时候加载下这个镜像。

1.3 通过QEMU使用GlusterFS

# /usr/bin/qemu-img create gluster+tcp://192.168.1.104:24007/kvm_store/test5.img 100G -f qcow2   #这是创建了一个test2.img镜像,大小是100G,格式是qcow2

Formatting 'gluster+tcp://192.168.1.104:24007/kvm_store/test5.img', fmt=qcow2 size=107374182400 encryption=off cluster_size=65536 lazy_refcounts=off  #显示信息

#QEMU从1.3版本开始就支持GlusterFS,用qemu-img create命令指明使用Gluster协议、TCP方式、GlusterFS服务器端口、GlusterFS卷名称、需要创建虚拟机镜像的名称。

# /usr/bin/qemu-img info gluster+tcp://192.168.1.104:24007/kvm_store/test5.img  #查看下创建镜像的信息

image: gluster+tcp://192.168.1.104:24007/kvm_store/test5.img
file format: qcow2
virtual size: 100G (107374182400 bytes)
disk size: 194K
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false

# /usr/libexec/qemu-kvm --enable-kvm -m 1024 -drive file=gluster://192.168.1.104/kvm_store/test5.img -vnc :15 -cdrom /opt/CentOS-6.8-x86_64-bin-DVD1.iso  #通过qemu-kvm命令可以直接启动虚拟机,vnc端口就是:15,这就得通过VNC来连接了。

图片.png

#就直接跳到安装界面了,然后就像光盘安装那样搞了。

博文来自:www.51niux.com

二、MooseFS在KVM中的应用

http://www.51niux.com/?id=141   #在前面已经介绍过了,比较适合大文件的存储,我们镜像一般都比较大,所以很合适镜像存储,它是OpenStack指定的镜像存储方式之一。

# /usr/local/mfs/bin/mfsmount  /data -H 192.168.1.101   #直接进行挂载,默认是2份副本

图片.png

#如通过VNC调用libvirtd创建虚拟机的时候,磁盘直接指向我们创建的挂载盘就可以了。

MFS因为读性能好,管理节点单点,非常适合做虚拟化的镜像存储文件系统,只需要在每台宿主机上面安装客户端,挂载就可以使用了。但是MFS不适合用于虚拟化的后端存储,主要是因为管理节点是单点,出现问题的时候,会影响整个虚拟化系统的可用性。

图片.png

#克隆也是没问题的,但是由于测试的机器用的是默认的raw格式,所以克隆起来很慢,也就是克隆到100G虽然实际占用很小,所以模板机就要使用qcow2格式了,这样能很快克隆。

图片.png

#启动也是没问题的,因为文件系统用的是稀疏存储的方式,虽然系统上面看是100G,但是实际占用空间很小是随着使用量的增长而增长的。

# chmoc +x /etc/rc.local

# cat /etc/rc.local   #做好开机自动挂载,这样宿主机就算挂了再启动也能将MFS挂载到本地

/usr/local/mfs/bin/mfsmount  /data -H 192.168.1.101

博文来自:www.51niux.com

三、Ceph 在KVM中的应用

http://www.51niux.com/?id=161   #记录了Ceph集群的搭建,以及客户端如何使用Ceph。

官网文档:http://docs.ceph.org.cn/rbd/libvirt/    #记录了libvirt如何使用Ceph RBD模式

这里主要记录下Librbd方式使用Ceph RBD.

3.1 升级安装QEMU使其支持Librbd(下面这种方法已经源指向不对找不到rpm包文件,所以算废弃掉了,就是记录一以前有过这种方式)

将Ceph RBD设备直接作为KVM虚拟机的硬盘,需要通过Librbd库,如果安装的QEMU用户空间程序没有添加Librbd支持,所以要使用的话,可以手工编译QEMU或者使用Ceph官网提供的已经编译好的rpm包,下面是yum方式:

#   yum -y install yum-plugin-priorities
#cat /etc/yum.repos.d/ceph-extras.repo  #下面repo源文件里面的内容
[ceph-extras]
name=Ceph Extras Packages
baseurl=http://ceph.com/packages/ceph-extras/rpm/centos6/\$basearch
enabled=1
priority=2
gpgcheck=1
type=rpm-md
gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc
[ceph-extras-noarch]
name=Ceph Extras noarch
baseurl=http://ceph.com/packages/ceph-extras/rpm/centos6/noarch
enabled=1
priority=2
gpgcheck=1
type=rpm-md
gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc
[ceph-extras-source]
name=Ceph Extras Sources
baseurl=http://ceph.com/packages/ceph-extras/rpm/centos6/SRPMS
enabled=1
priority=2
gpgcheck=1
type=rpm-md
gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc

#rpm -Uvh   #安装第三方源
# yum remove qemu-kvm qemu-kvm-tools qemu-img  #移除系统中已经安装的QEMU程序
# yum clean all
# yum install qemu-kvm qemu-kvm-tools qemu-img  #安装Ceph定制的QEMU程序
# yum install qemu-guest-agent qemu-guest-agent-win32

#上面这种方法应该是不能了,这里就是记录一下以前有这种方式。Centos7.2 已经支持了不用上面的操作,我这里用的是Centos 7.2的操作系统。

3.2  KVM端安装Libvirt

Libvirt是一套用于管理、操作虚拟机的常用的工具集。它支持多种虚拟化引擎。前面我们已经安装过了。

#yum install libvirt

3.3 在Moniter上创建存储池并设置权限

# ceph osd pool create vmpool 192 192  #在Ceph Moniter上创建用于虚拟机的vmpool(存储池)

# ceph auth get-or-create client.libvirt mon 'allow r' osd 'allow class-read object_prefix rbd_children,allow rwx pool=vmpool'  #创建client.libvirt账户,并授予vmpool存储的访问权限。

[client.libvirt]
    key = AQDwL4xZQyJsDBAAzQ5SGAtQAcalIzo2QEIdhw==

#将ceph.conf和ceph.client.admin.keyring复制到客户端的/etc/ceph/目录下面

3.4 客户端(KVM宿主机)的操作

# yum install ceph -y

#qemu-img  create -f rbd rbd:vmpool/192.168.1.118.img 40G  #在vmpool存储池下面创建一个40G虚拟机镜像文件,镜像文件名称是192.168.1.118.img

# cat secret.xml   #创建一个这样的xml文件

<secret ephemeral='no' private='no'>
<usage type='ceph'>
<name>client.libvirt secret</name>
</usage>
</secret>

# virsh secret-define --file secret.xml   #在客户端为client.libvirt生成一个密码,后面会用到这个uuid

Secret 49a96fbe-e1f4-480d-a5bb-8b077e047e08

3.5 在Ceph Moniter上查看client.libvirt的key并为virsh授权

# ceph auth get-key client.libvirt   #查看clent.libvirt的key,KVM宿主机也就是客户端如果有keying文件的话也是可以看得,一般给客户端比较低的权限。

AQDwL4xZQyJsDBAAzQ5SGAtQAcalIzo2QEIdhw==

3.6 KVM宿主机上面创建虚拟机

#virsh secret-set-value --secret 49a96fbe-e1f4-480d-a5bb-8b077e047e08 --base64 AQDwL4xZQyJsDBAAzQ5SGAtQAcalIzo2QEIdhw==  #为virsh授权

secret 值设定

图片.png

图片.png#如果是vm虚拟机测试的话,注意安装完虚拟机之后检查这里是否是硬盘位第一个引导设备,不然可能开机找不到Boot引导。

# virsh edit 192.168.1.118   #配置文件磁盘位置是不一样的

   <disk type='network' device='disk'>    #磁盘类型是network的
       <driver name='qemu' type='raw'/>
      <auth username='libvirt'>       #libvirt用户是之前创建的Client的名字
        <secret type='ceph' uuid='49a96fbe-e1f4-480d-a5bb-8b077e047e08'/>   #类型是ceph类型,uuid是上面通过xml文件生成的密码
      </auth>
      <source protocol='rbd' name='vmpool/192.168.1.118.img'>   #这里指向的是虚拟机的硬盘文件的路径
        <host name='192.168.1.103' port='6789'/>                #定义的host name分别是Ceph集群的3个Monitor服务器的地址
        <host name='192.168.1.104' port='6789'/>
        <host name='192.168.1.105' port='6789'/>
      </source>
      <target dev='vda' bus='virtio'/>
        <boot order='1'/>      #这句话也挺有用的,如果是vm环境,不加这句话话你安装完虚拟机发现开机还是走光盘安装找不到boot,那是因为你选择的是光盘启动是第一个选项,所以创建完这里要设置一下是硬盘启动。
      <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>  #这里如果你拿不准或者老是设置失败,可以不设置保存后libvirt会给你自动生成一个
    </disk>

#然后开启虚拟机,虚拟机就能进行正常的安装或者启动了。

各种硬盘类型的设置:http://www.libvirt.org/formatdomain.html#elementsDisks    #这里面都有配置举例,还有其他的说明。

3.7 通过快照功能创建虚拟机

官方文档:http://docs.ceph.org.cn/rbd/rbd-snapshot/

首先先了解下虚拟机快照的操作:

# rbd snap create vmpool/192.168.1.118.img@192.168.1.118.img.snap01   #创建虚拟机硬盘192.168.1.118.img的快照,快照在vmpool存储池中,命名为192.168.1.118.img.snap01

# rbd snap ls vmpool/192.168.1.118.img   #列出192.168.1.118.img的快照列表
SNAPID NAME                         SIZE
     5 192.168.1.118.img.snap01 40960 MB

# rbd snap rollback vmpool/192.168.1.118.img@192.168.1.118.img.snap01  #回滚快照,前提是要先关闭虚拟机,不然img镜像是只读状态不让回滚

# rbd snap rm  vmpool/192.168.1.118.img@192.168.1.118.img.snap01  #删除快照,要用 rbd 删除一快照,指定 snap rm 选项、存储池名、映像名和快照名。Ceph OSDs 异步地删除数据所以删除快照后不会立即释放磁盘空间。

# rbd snap purge vmpool/192.168.1.118.img  #要用 rbd 删除某个映像的所有快照,指定 snap purge 选项、存储池名和映像名。

通过RBD镜像快照创建虚拟机

# qemu-img  convert -f qcow2 -O raw /home/demo.img rbd:vmpool/demo.img  #/home/demo.img是我们本地已经做好的一个有操作系统的模板镜像文件,现在我们将它传到ceph的vmpool存储池中

# rbd info vmpool/demo.img   #查看镜像信息

rbd image 'demo.img':
    size 20480 MB in 5120 objects
    order 22 (4096 kB objects)
    block_name_prefix: rbd_data.10db238e1f29
    format: 2   #默认格式已经是2了,1格式已经被废弃了。
    features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
    flags:

# rbd snap create vmpool/demo.img@demo.img.v1  #创建模板快照

# rbd snap protect vmpool/demo.img@demo.img.v1  #锁定模板快照,因为后续的克隆操作都是这个快照基础上做增量,所以这个快照不能删除。只适用于 format 2 格式的映像。

# rbd info vmpool/demo.img@demo.img.v1  #查看快照信息

rbd image 'demo.img':
    size 20480 MB in 5120 objects
    order 22 (4096 kB objects)
    block_name_prefix: rbd_data.10db238e1f29
    format: 2
    features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
    flags: 
    protected: True  #已经是保护起来了

# rbd clone vmpool/demo.img@demo.img.v1 vmpool/192.168.1.130.img   #若不指定 object size,会采用父映像的值。克隆映像的大小和父快照相同。我这里就简单克隆一个镜像文件。

# virsh dumpxml 192.168.1.118 >/opt/demo.xml  #导出一份带有disk位置是rbd模式的xml文件

# uuidgen  #生成一个uuid值

c0eb9999-528c-4371-a9a2-60c955b1a73e
#cd /opt

# cp demo.xml 192.168.1.130.xml
# cat /etc/libvirt/qemu/192.168.1.130.xml  #下面是要修改的部分

<name>192.168.1.130</name>  #域名称要换
<uuid>c0eb9999-528c-4371-a9a2-60c955b1a73e</uuid>
<source protocol='rbd' name='vmpool/192.168.1.130.img'>
 <mac address='52:54:00:8c:76:f8'/>   #要换一个mac地址

# cp 192.168.1.130.xml /etc/libvirt/qemu/

#  virsh create /etc/libvirt/qemu/192.168.1.130.xml

#然后虚拟机的网络环境一配置一台虚拟机就创建完成了

图片.png

#这种克隆创建虚拟机的过程是非常快的。

3.8 Ceph在KVM虚拟化环境中的应用注意事项

虚拟机硬盘以qcow2格式运行在CephFS上不是很稳定。

Ceph在KVM中的适用场景:使用CephFS作为虚拟机的集中备份、使用Librbd将虚拟机直接运行在Ceph RBD上、将Ceph RBD作为外挂云硬盘提供给虚拟机。

使用CephFS集中备份虚拟机

       对于Ceph节点机的选择,选择大硬盘,每台节点机至少配置3个网口,其中两个万兆网口,一个千兆网口。两个万兆网口,一个作为Ceph集群内部交换数据使用,另一个作为Ceph集群对外提供存储设备使用;千兆网口专门作管理Ceph集群使用。如果条件允许的话,除管理网口之外,都使用双网口绑定,连接到不同的交换机,交换机作堆叠。这样不仅能提高吞吐,还可以避免网口的单点故障。Ceph节点的硬盘都是单盘挂载。

      Ceph集群的网络,特别是用于Ceph内部数据同步的网口,连接在同一台交换机下,尽量避免过多地跨交换机造成性能下降。Ceph集群默认存储池的副本是3份,所以至少需要3台Ceph节点才能组成一个状态健康的存储集群。

     计算集群实际容量的时候,至少考虑一台Host宕机之后,剩余的容量足够存储所有的数据。这样即使一台Host宕机,也可以是让Ceph自动修复问题,恢复整个集群健康的状态。

使用Librbd将虚拟机运行在Ceph RBD

       使用Librbd将虚拟机直接运行在Ceph RBD上,适用于那些对磁盘I/O要求一般的业务,对于超高I/O压力的DB类的应用,这类虚拟机不适合运行在Ceph RBD上。比较适合的应用包括Web站点等对I/O要求不高的应用。

       对外提供服务器的Ceph Public网络必须使用两个,做多网卡绑定。宿主机连接Ceph集群的网口同样需要使用两网卡做绑定(不过一般我们都是做Bond0模式)。做网卡绑定很重要,因为虚拟机硬盘都在Ceph RBD中,如果网络出问题,所有的虚拟机内部都会报I/O读/写错误。

       使用Ceph RBD运行虚拟机,不建议再默认CRUSH策略下再使用CephFS,一旦CephFS有写压力,Ceph RBD虚拟机的性能下降很明显,可以配置CRUSH算法,将虚拟机所在的Ceph RBD存储池限定在指定的OSD中。

在CephFS上创建qcow2文件作为云硬盘

在CephFS上直接创建qcow2格式的硬盘文件,然后直接挂载到虚拟机中作为云硬盘来使用,用于备份或者运行磁盘I/O不高的应用。其中最主要优势在于容量可以不限制扩充,在虚拟机迁移过程中也不需要复制数据。

作者:忙碌的柴少 分类:KVM 浏览:3476 评论:0
留言列表
发表评论
来宾的头像