[优化篇]OpenStack的Cinder后端存储技术——GlusterFS(1)

题记

上一篇已经介绍了OpenStack的Cinder后端使用NFS存储技术,为什么要使用NFS呢?一般情况下,如果你的网络是千兆网络,在如果你考虑性能的要求,存储设置到宿主机本地硬盘效率会更好,例如我们可以在计算节点上安装cinder-volume服务,然后在本地硬盘创建NFS,这样效率会更好,但是对于存储来说,数据安全是用户最关心的,如果我本机的环境出现问题,那么数据就会有丢失的可能,所以,将数据独立存储到某一个环境中要比放在同一个环境中保险的多。但是数据独立存储,例如专门搞一个存储节点,用户又会觉得这个存储节点坏了,不是还是有问题么?所以我们可能需要一种分布式存储来解决这个问题,现在支持OpenStack的Cinder的分布式存储技术有很多,包括本篇介绍的GlusterFS和Ceph,前者实现也比较简单。

原理

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

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

[优化篇]OpenStack的Cinder后端存储技术——GlusterFS(1)_第1张图片

特点

扩展性和高性能
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接口。

环境

操作系统:Ubuntu 14.04 LTS
两台机器搭建GlusterFS集群
192.168.3.180 Controller
192.168.3.181 Compute
192.168.3.182 Network
192.168.3.185 Cinder
192.168.3.10 fs1
192.168.3.11 fs2

集群部署

1、分别在fs1和fs2安装glusterfs-server软件

root@fs1:~# apt-get install glusterfs-server 

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

3、启动GlusterFS服务(Ubuntu安装之后会自动启动)

root@fs1:~# service glusterfs-server restart
glusterfs-server stop/waiting
glusterfs-server start/running, process 1708

4、分别在fs1和fs2创建分布式存储

root@fs1:~# mkdir -p /data/fs1

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

root@fs2:~# gluster peer probe fs1

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)

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

查看卷信息

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

常见故障解决方案

注意:以下问题并不是我遇到的,但是记录下来,仅供参考!部分环境可能是CentOS或者RedHat

问题1

[root@localhost ~]# gluster peer status
Connection failed. Please check if gluster daemon is operational.

原因:未开启glusterd服务
解决方法:开启glusterd服务
/etc/init.d/glustefs-server start

问题2

[root@localhost ~]# gluster peer probe 192.168.230.130
peer probe: failed: Probe returned with unknown errno 107

原因:日志中打印[2014-05-15 15:55:25.929461] I [glusterd-handler.c:2836:glusterd_probe_begin] 0-glusterd:Unable to find peerinfo for host: 192.168.230.130 (24007)
防火墙没开启24007端口
解决方法:开启24007端口或者关掉防火墙
/sbin/iptables -I INPUT -p tcp –dport 24007 -j ACCEPT # 开启24007端口
/etc/init.d/iptables stop # 关掉防火墙

注:
也可以使用主机名来代替IP,修改/etc/hosts文件实现
gluster peer probe server-130

问题3
volume create volume1 192.168.230.135:/tmp/brick1
volume create: volume2: failed
不能只使用一个server上的brick创建volume,需要至少两个brick,或者在client主机(这里为192.168.230.134)上使用一个brick创建volume。

gluster> volume create volume1 192.168.230.134:/tmp/brick1 force  
volume create: volume1: success: please start the volume to access data  
gluster> volume info  

Volume Name: volume1  
Type: Distribute  
Volume ID: b01a2c29-09a6-41fd-a94e-ea834173a6a3  
Status: Created  
Number of Bricks: 1  
Transport-type: tcp  
Bricks:  
Brick1: 192.168.230.134:/tmp/brick1  

gluster>  

gluster> volume create volume2 192.168.230.134:/tmp/brick2  192.168.230.135:/tmp/brick2 force  
volume create: volume2: success: please start the volume to access data  
gluster> volume info  

Volume Name: volume1  
Type: Distribute  
Volume ID: b01a2c29-09a6-41fd-a94e-ea834173a6a3  
Status: Created  
Number of Bricks: 1  
Transport-type: tcp  
Bricks:  
Brick1: 192.168.230.134:/tmp/brick1  

Volume Name: volume2  
Type: Distribute  
Volume ID: 4af2e260-70ce-49f5-9663-9c831c5cf831  
Status: Created  
Number of Bricks: 2  
Transport-type: tcp  
Bricks:  
Brick1: 192.168.230.134:/tmp/brick2  
Brick2: 192.168.230.135:/tmp/brick2  

问题4
创建一个volume后删除,再使用同名的brick创建volume失败。

gluster> volume create test 192.168.230.134:/tmp/brick1 force    
volume create: test: success: please start the volume to access data    
gluster> volume info     

Volume Name: test    
Type: Distribute    
Volume ID: c29f75d2-c9f5-4d6f-90c5-c562139ab9cd    
Status: Created    
Number of Bricks: 1    
Transport-type: tcp    
Bricks:    
Brick1: 192.168.230.134:/tmp/brick1    
gluster> volume delete test force    
Usage: volume delete <VOLNAME>    
gluster> volume delete test    
Deleting volume will erase all information about the volume. Do you want to continue? (y/n) y    
volume delete: test: success    
gluster> volume create test 192.168.230.134:/tmp/brick1 force    
volume create: test: failed: /tmp/brick1 or a prefix of it is already part of a volume  

因为volume delete时并未删掉create时创建的目录,需要手动删除后再使用。

你可能感兴趣的:([优化篇]OpenStack的Cinder后端存储技术——GlusterFS(1))