您的位置:首页 > 运维架构

OpenStack的Cinder后端存储技术——GlusterFS

2017-12-02 16:00 381 查看


原理

提起分布式存储,简单的说,就是我可以建立一个多节点的分布式存储集群,对用户来说我可能只存储到某一个路径下,但是系统会自动往其他节点进行复制,也就是其实你的数据复制了N份(按照你的节点来说),这样即使有一个节点出现问题,也不影响其他节点的数据,这样就达到了存储高可用性的目的,当然这种方式最大的优点就是不需要花费额外费用,使用廉价的硬件资源就可以满足需求。

GlusterFS采用模块化、堆栈式的架构,可通过灵活的配置支持高度定制化的应用环境,比如大文件存储、海量小文件存储、云存储、多传输协议应用等。每个功能以模块形式实现,然后以积木方式进行简单的组合,即可实现复杂的功能。比如,Replicate模块可实现RAID1,Stripe模块可实现RAID0,通过两者的组合可实现RAID10和RAID01,同时获得高性能和高可靠性。如下图所示:




特点

扩展性和高性能 

GlusterFS利用双重特性来提供几TB至数PB的高扩展存储解决方案。Scale-Out架构允许通过简单地增加资源来提高存储容量和性能,磁盘、计算和I/O资源都可以独立增加,支持10GbE和InfiniBand等高速网络互联。Gluster弹性哈希(Elastic Hash)解除了GlusterFS对元数据服务器的需求,消除了单点故障和性能瓶颈,真正实现了并行化数据访问。

高可用性 

GlusterFS可以对文件进行自动复制,如镜像或多次复制,从而确保数据总是可以访问,甚至是在硬件故障的情况下也能正常访问。自我修复功能能够把数据恢复到正确的状态,而且修复是以增量的方式在后台执行,几乎不会产生性能负载。GlusterFS没有设计自己的私有数据文件格式,而是采用操作系统中主流标准的磁盘文件系统(如EXT3、ZFS)来存储文件,因此数据可以使用各种标准工具进行复制和访问。

全局统一命名空间 

全局统一命名空间将磁盘和内存资源聚集成一个单一的虚拟存储池,对上层用户和应用屏蔽了底层的物理硬件。存储资源可以根据需要在虚拟存储池中进行弹性扩展,比如扩容或收缩。当存储虚拟机映像时,存储的虚拟映像文件没有数量限制,成千虚拟机均通过单一挂载点进行数据共享。虚拟机I/O可在命名空间内的所有服务器上自动进行负载均衡,消除了SAN环境中经常发生的访问热点和性能瓶颈问题。

弹性哈希算法 

GlusterFS采用弹性哈希算法在存储池中定位数据,而不是采用集中式或分布式元数据服务器索引。在其他的Scale-Out存储系统中,元数据服务器通常会导致I/O性能瓶颈和单点故障问题。GlusterFS中,所有在Scale-Out存储配置中的存储系统都可以智能地定位任意数据分片,不需要查看索引或者向其他服务器查询。这种设计机制完全并行化了数据访问,实现了真正的线性性能扩展。

弹性卷管理 

数据储存在逻辑卷中,逻辑卷可以从虚拟化的物理存储池进行独立逻辑划分而得到。存储服务器可以在线进行增加和移除,不会导致应用中断。逻辑卷可以在所有配置服务器中增长和缩减,可以在不同服务器迁移进行容量均衡,或者增加和移除系统,这些操作都可在线进行。文件系统配置更改也可以实时在线进行并应用,从而可以适应工作负载条件变化或在线性能调优。

基于标准协议 

Gluster存储服务支持NFS, CIFS, HTTP, FTP以及Gluster原生协议,完全与POSIX标准兼容。现有应用程序不需要作任何修改或使用专用API,就可以对Gluster中的数据进行访问。这在公有云环境中部署Gluster时非常有用,Gluster对云服务提供商专用API进行抽象,然后提供标准POSIX接口。

--------------------------------------------------------------------------------------------------------------------------------


集群部署

1、分别在fs1和fs2安装glusterfs-server软件
root@fs1:~# apt-get install glusterfs-server
1

2、分别在fs1和fs2机器的/etc/hosts里面添加IP和机器名的映射关系
root@fs1:~# cat /etc/hosts
127.0.0.1   localhost
192.168.3.10    fs1
192.168.3.11    fs2
1
2
3
4

3、启动GlusterFS服务(Ubuntu安装之后会自动启动)
root@fs1:~# service glusterfs-server restart
glusterfs-server stop/waiting
glusterfs-server start/running, process 1708
1
2
3

4、分别在fs1和fs2创建分布式存储
root@fs1:~# mkdir -p /data/fs1
1

5、添加集群节点 

由于GlusterFS是一种无中心的模式,任何节点都是对等的,支持横向扩展,我们可以从任意一台节点操作,添加其他节点集群。例如我在fs2操作,添加fs1为glusterfs集群。建议使用机器名。
root@fs2:~# gluster peer probe fs1
1

6、查看集群状态
root@fs2:~# gluster peer status
Number of Peers: 1

Hostname: 192.168.3.10
Uuid: 9bc2b23c-4e7f-4da9-9a24-c570f753066c
State: Peer in Cluster (connected)
1
2
3
4
5
6

7、创建分布式卷

五种类型的volume可以被创建:
Distributed:分布式卷,文件通过hash算法随机的分布到由bricks组成的卷上。
Replicated:复制式卷,类似raid1,replica数必须等于volume中brick所包含的存储服务器数,可用性高。
Striped:条带式卷,类似与raid0,stripe数必须等于volume中brick所包含的存储服务器数,文件被分成数据块,以Round
Robin的方式存储在bricks中,并发粒度是数据块,大文件性能好。
Distributed Striped:分布式的条带卷,volume中brick所包含的存储服务器数必须是stripe的倍数(>=2倍),兼顾分布式和条带式的功能。
Distributed Replicated:分布式的复制卷,volume中brick所包含的存储服务器数必须是 replica 的倍数(>=2倍),兼顾分布式和复制式的功能。

创建命令参考
gluster volume create demo replica 2 fs1:/data/fs1 f2:/data/fs2
1

查看卷信息
root@fs2:~# gluster volume info demo

Volume Name: demo
Type: Replicate
Volume ID: 68c6b6b1-80cc-4c60-af45-68279e4ad2f5
Status: Started
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: 192.168.3.10:/data/fs1
Brick2: 192.168.3.11:/data/fs2

---------------------------------------------------------------------------------------------------------------------------------


1 nova与glusterfs结合

在所有计算节点上,把创建成功的,glusterfs共享出来的volume,挂在到/var/lib/nova/instances目录:

[html] view
plain copy

mount -t glusterfs <本机IP>:/instances /var/lib/nova/instances    

chown -R nova:nova /var/lib/nova/instances  


2 glance与glusterfs结合

在控制节点上,把创建成功的,glusterfs共享出来的volume,挂在到/var/lib/glance/images目录:

[html] view
plain copy

mount -t glusterfs <本机IP>:/images /var/lib/glance/images    

chown -R glance:glance /var/lib/glance/images  

添加images、instances到fstab自动挂载

[python] view
plain copy

192.168.4.131:/images   /var/lib/glance/images   glusterfs  defaults,_netdev,backupvolfile-server=controller2,backupvolfile-server=compute01   0 0  

192.168.4.131:/instances   /var/lib/nova/instances   glusterfs  defaults,_netdev,backupvolfile-server=controller2,backupvolfile-server=compute01   0 0  

使用backupvolfile起到了高可用性,避免单点故障


3 cinder与glusterfs结合


3.1 cinder常用的三种后端

(1)本地创建逻辑卷lvm后端
(2)glusterfs后端
(3)使用openstack中第三方驱动的IP-SAN,型号为IBM Storwize系列

cinder.conf配置如下:

[html] view
plain copy

[DEFAULT]  

enabled_backends = lvm,glusterfs,ibm   

[lvm]  

volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver  

volume_backend_name=LVM  

volume_group = cinder-volumes  

iscsi_protocol = iscsi  

iscsi_helper = lioadm   

[glusterfs]   

volume_driver=cinder.volume.drivers.glusterfs.GlusterfsDriver   

volume_backend_name=GlusterFS   

glusterfs_shares_config=/etc/cinder/shares.conf   

glusterfs_mount_point_base=/var/lib/cinder/glusterfs   

[ibm]   

volume_driver = cinder.volume.drivers.ibm.storwize_svc.StorwizeSVCDriver   

san_ip = 172.28.21.10   

san_login = superuser   

san_password = 123456   

storwize_svc_volpool_name = vtt1   

storwize_svc_connection_protocol = iSCSI   

volume_backend_name=IBM  


3.2 GlusterFS

块存储服务中,GlusterFS Driver官方文档:

    https://docs.openstack.org/liberty/config-reference/content/GlusterFS-driver.html
    https://docs.openstack.org/ocata/config-reference/block-storage/drivers/glusterfs-driver.html


0 安装glusterfs服务器

在cinder节点192.168.4.130上,安装glusterfs客户端软件

[html] view
plain copy

# apt-get install glusterfs-client  

在存储节点network:192.168.4.131和存储节点compute:192.168.4.132上,创建volume:

[python] view
plain copy

<pre code_snippet_id="2400625" snippet_file_name="blog_20170523_6_165233" name="code" class="python"><span style="font-family: Arial, Helvetica, sans-serif;">root@network:~# gluster peer status  

Number of Peers: 1  

  

Hostname: compute  

Uuid: 007468f2-9bb8-4b92-aff4-57bbc87dad57  

State: Peer in Cluster (Connected)  

root@network:~# gluster volume create volumes replica 2 network:/glusterfs/volumes1 compute:/glusterfs/volumes1 network:/glusterfs/volumes2 compute:/glusterfs/volumes2  

root@network:~# gluster volume info volumes  

Volume Name: volumes  

Type: Distributed-Replicate  

Volume ID: 54e699ca-6e46-4648-8548-d7d843adc1aa  

Status: Started  

Snapshot Count: 0  

Number of Bricks: 2 x 2 = 4  

Transport-type: tcp  

Bricks:  

Brick1: network:/glusterfs/volumes1  

Brick2: compute:/glusterfs/volumes1  

Brick3: network:/glusterfs/volumes2  

Brick4: compute:/glusterfs/volumes2  

Options Reconfigured:  

transport.address-family: inet  

performance.readdir-ahead: on  

nfs.disable: on  

</span></pre>  

<pre></pre>  


1 在cinder节点,cinder-volume端配置内容如下

[html] view
plain copy

[DEFAULT]  

enabled_backends = glusterfs  

[glusterfs]                                                          #最后添加  

volume_driver = cinder.volume.drivers.glusterfs.GlusterfsDriver      #驱动    

glusterfs_shares_config = /etc/cinder/shares.conf                    #glusterfs存储  

glusterfs_mount_point_base = /var/lib/cinder/volumes                 #挂载点  

Configuration option = Default valueDescription
[DEFAULT]
glusterfs_backup_mount_point
 = 
$state_path/backup_mount
(StrOpt) Base dir containing mount point for gluster share.
glusterfs_backup_share
 = 
None
(StrOpt) GlusterFS share in <hostname|ipv4addr|ipv6addr>:<gluster_vol_name> format. Eg: 1.2.3.4:backup_vol
glusterfs_mount_point_base
 = 
$state_path/mnt
(StrOpt) Base dir containing mount points for gluster shares.
glusterfs_shares_config
 = 
/etc/cinder/glusterfs_shares
(StrOpt) File with the list of available gluster shares
nas_volume_prov_type
 = 
thin
(StrOpt) Provisioning type that will be used when creating volumes.


2. 配置glusterfs存储配置

在/etc/cinder/shares.conf文件中配置上卷信息:

[html] view
plain copy

# cat /etc/cinder/shares.conf   

192.168.4.131:/openstack_cinder  

文件中添加glusterfs卷信息,注意该文件的权限,所属组

[html] view
plain copy

root@controller:~# chown -R cinder:cinder /etc/cinder/shares.conf   

root@controller:~# ll /etc/cinder/shares.conf   

-rw-r--r-- 1 cinder cinder 34 May 17 16:49 /etc/cinder/shares.conf  

root@controller:~# chown -R cinder:cinder /var/lib/cinder/*  

root@controller:~# ll /var/lib/cinder/volumes/  


3. 重启cinder-volume服务

[html] view
plain copy

# service cinder-volume restart  

检查日志信息,看是否有错误/var/log/cinder/volume.log

重启服务后,使用mount查看信息:

[python] view
plain copy

192.168.4.131:/openstack_cinder on /var/lib/cinder/volumes/16b81d8d542fdbf4d70330bb672e9714 type fuse.glusterfs (rw,default_permissions,allow_other,max_read=131072)  


4. controller节点检查服务状态

controller节点的/etc/cinder/cinder.conf文件中添加内容

[python] view
plain copy

[glusterfs]  

volume_driver=cinder.volume.drivers.glusterfs.GlusterfsDriver  

  

查看服务状态:  

# cinder service-list  

+------------------+----------------------+------+---------+-------+----------------------------+-----------------+  

|      Binary      |         Host         | Zone |  Status | State |         Updated_at         | Disabled Reason |  

+------------------+----------------------+------+---------+-------+----------------------------+-----------------+  

| cinder-scheduler |      controller      | nova | enabled |   up  | 2017-05-17T09:35:38.000000 |        -        |  

|  cinder-volume   | controller@glusterfs | nova | enabled |   up  | 2017-05-17T09:35:43.000000 |        -        |  

+------------------+----------------------+------+---------+-------+----------------------------+-----------------+  


5. controller建立type

[html] view
plain copy

root@controller:~# cinder type-create glusterfs  

+--------------------------------------+-----------+-------------+-----------+  

|                  ID      |  Name   | Description | Is_Public |  

+--------------------------------------+-----------+-------------+-----------+  

| ffd4caf8-2b0f-48d8-aaea-488339922914 | glusterfs |    -    |  True   |  

+--------------------------------------+-----------+-------------+-----------+  


6. controller配置cinder-type和volume_backend_name联动

[html] view
plain copy

root@controller:~# cinder type-key glusterfs set volume_backend_name=glusterfs  

#查看type的设置情况

[html] view
plain copy

root@controller:~# cinder extra-specs-list  

+--------------------------------------+-----------+----------------------------------------+  

|       ID                  |   Name   |        extra_specs            |  

+--------------------------------------+-----------+----------------------------------------+  

| ffd4caf8-2b0f-48d8-aaea-488339922914 | glusterfs | {u'volume_backend_name': u'glusterfs'} |  

+--------------------------------------+-----------+----------------------------------------+  


7. 重启controller的cinder服务

[html] view
plain copy

root@controller:~# service cinder-scheduler restart  

cinder-scheduler stop/waiting  

cinder-scheduler start/running, process 27121  

root@controller:~# service cinder-api restart  

cinder-api stop/waiting  

cinder-api start/running, process 27157  


8 创建cinder volume

[html] view
plain copy

root@controller:~# cinder create --display-name "test1" --volume-type glusterfs 10        #执行cinder type的类型  

  

root@controller:~# cinder show 59e2e560-6633-45f4-9d73-6f7ea62c06ef  

+---------------------------------------+--------------------------------------+  

|                Property               |                Value                 |  

+---------------------------------------+--------------------------------------+  

|              attachments              |                  []                  |  

|           availability_zone           |                 nova                 |  

|                bootable               |                false                 |  

|          consistencygroup_id          |                 None                 |  

|               created_at              |      2017-05-17T09:19:47.000000      |  

|              description              |                 None                 |  

|               encrypted               |                False                 |  

|                   id                  | 59e2e560-6633-45f4-9d73-6f7ea62c06ef |  

|                metadata               |                  {}                  |  

|            migration_status           |                 None                 |  

|              multiattach              |                False                 |  

|                  name                 |                test1                 |  

|         os-vol-host-attr:host         |    controller@glusterfs#GlusterFS    |  

|     os-vol-mig-status-attr:migstat    |                 None                 |  

|     os-vol-mig-status-attr:name_id    |                 None                 |  

|      os-vol-tenant-attr:tenant_id     |   27a967778eb84f5296258809de65f15e   |  

|   os-volume-replication:driver_data   |                 None                 |  

| os-volume-replication:extended_status |                 None                 |  

|           replication_status          |               disabled               |  

|                  size                 |                  10                  |  

|              snapshot_id              |                 None                 |  

|              source_volid             |                 None                 |  

|                 status                |              available               |  

|                user_id                |   73b742285a6049d5a806d34c2020a1e1   |  

|              volume_type              |               glusterfs              |  

+---------------------------------------+--------------------------------------+  


9 查看两个集群节点的存储内容

[html] view
plain copy

root@network:~# ls /glusterfs/*  

/glusterfs/brick1:  

volume-59e2e560-6633-45f4-9d73-6f7ea62c06ef  

  

/glusterfs/brick2:  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: