KVM使用分布式文件系统
一、GlusterFS在KVM虚拟化中的应用
http://blog.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
#查看已经挂载上了
然后这个/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来连接了。
#就直接跳到安装界面了,然后就像光盘安装那样搞了。
博文来自:www.51niux.com
二、MooseFS在KVM中的应用
http://blog.51niux.com/?id=141 #在前面已经介绍过了,比较适合大文件的存储,我们镜像一般都比较大,所以很合适镜像存储,它是OpenStack指定的镜像存储方式之一。
# /usr/local/mfs/bin/mfsmount /data -H 192.168.1.101 #直接进行挂载,默认是2份副本
#如通过VNC调用libvirtd创建虚拟机的时候,磁盘直接指向我们创建的挂载盘就可以了。
MFS因为读性能好,管理节点单点,非常适合做虚拟化的镜像存储文件系统,只需要在每台宿主机上面安装客户端,挂载就可以使用了。但是MFS不适合用于虚拟化的后端存储,主要是因为管理节点是单点,出现问题的时候,会影响整个虚拟化系统的可用性。
#克隆也是没问题的,但是由于测试的机器用的是默认的raw格式,所以克隆起来很慢,也就是克隆到100G虽然实际占用很小,所以模板机就要使用qcow2格式了,这样能很快克隆。
#启动也是没问题的,因为文件系统用的是稀疏存储的方式,虽然系统上面看是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://blog.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 值设定
#如果是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
#然后虚拟机的网络环境一配置一台虚拟机就创建完成了
#这种克隆创建虚拟机的过程是非常快的。
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不高的应用。其中最主要优势在于容量可以不限制扩充,在虚拟机迁移过程中也不需要复制数据。