文档章节

EMC开源产品rexray

kellydestiny
 kellydestiny
发布于 2016/03/23 20:03
字数 1033
阅读 110
收藏 2

rexray是EMC推出的一个为docker容器分配persistent volume的一款开源插件,最近在做这方面的二次开发项目,所以对这个插件总结一下:

在rexray的rexray/drivers/文件夹下,有三个目录,分别代表rexray目前所支持的几种driver:比如

os中:

const providerName = "linux"

type driver struct{
    r *core.RexRay
}

storage中有以下几种产品的driver:

亚马逊的EWS:

const providerName = "ec2"

type driver struct{
    instanceDocument *instanceIdentityDocument
    ec2Instance      *ec2.EC2
    r                *core.RexRay
}

谷歌的GCE:

const providerName = "gce"

type driver struct {
    currentInstanceID string
    client            *compute.Service
    r                 *core.RexRay
    zone              string
    project           string
}

EMC的isilon:

const providerName = "Isilon"

type driver struct {
    client *isi.Client
    r      *core.RexRay
}

openstack:

 const providerName = "Openstack"
 
 type driver struct {
     provider             *gophercloud.ProviderClient
     client               *gophercloud.ServiceClient
     clientBlockStorage   *gophercloud.ServiceClient
     clientBlockStoragev2 *gophercloud.ServiceClient
     region               string
     availabilityZone     string
     instanceID           string
     r                    *core.RexRay
}


rackspace:

const providerName = "Rackspace"

type driver struct {
    provider           *gophercloud.ProviderClient
    client             *gophercloud.ServiceClient
    clientBlockStorage *gophercloud.ServiceClient
    region             string
    instanceID         string
    r                  *core.RexRay

EMC的scaleio:

const providerName = "ScaleIO"

type driver struct {
    client           *goscaleio.Client
    system           *goscaleio.System
    protectionDomain *goscaleio.ProtectionDomain
    storagePool      *goscaleio.StoragePool
    sdc              *goscaleio.Sdc
    r                *core.RexRay
}

virtualbox:

const providerName = "virtualbox"

type driver struct {
    virtualbox *vbox.VirtualBox
    machine    *vbox.Machine
    r          *core.RexRay
    m          sync.Mutex
}

    EMC的vmax:

const providerName = "VMAX"

type driver struct {
    client *govmax.SMIS
    arrayID    string
    volPrefix  string
    instanceID string
    vmh        *govmax.VMHost
    r          *core.RexRay
}

 EMC的xtremio:

const providerName = "XtremIO"

type driver struct {
    client           *xtio.Client
    initiator        xtio.Initiator
    volumesSig       string
    lunMapsSig       string
    initiatorsSig    string
    volumesByNaa     map[string]xtio.Volume
    initiatorsByName map[string]xtio.Initiator
    r                *core.RexRay
}

Volume中:

const providerName            = "docker"

type driver struct {
    r *core.RexRay
}

以上,所有类型的driver都实现了下面这个接口:

type Driver interface {
    Name() string
    Init(rexray *RexRay) error
}

在引入所有driver所在的包时,都会在init函数中执行下面这个步骤:

core.RegisterDriver(providerName, newDriver)

package core中,RegisterDriver函数如下所示:

func RegisterDriver(driverName string, ctor NewDriver) {
    driverCtors[driverName] = ctor
}

其中,driverCtors的类型为:

driverCtors map[string]NewDriver

这样,以上所有driver实例都会被存放在driverCtors中。


下面首先看一下os。

对于os,定义了两个接口,如下所示:

type OSDriver interface {
        Driver
	GetMounts(string, string) (MountInfoArray, error)
	Mounted(string) (bool, error)
	Unmount(string) error
	Mount(string, string, string, string) error
	Format(string, string, bool) error
}

type OSDriverManager interface {
	OSDriver
	Drivers() <-chan OSDriver
}

os的driver实例(Linux)实现了上面的OSDriver这个接口。

下面是针对os driver的manager。

type odm struct {
    rexray  *RexRay
    drivers map[string]OSDriver
}

其中,odm实现了OSDriverManager、OSDriver、Driver这几个接口。


对于,storage:

type StorageDriver interface {
    Driver
    GetVolumeMapping() ([]*BlockDevice, error)
    GetInstance() (*Instance, error)
    GetVolume(volumeID, volumeName string) ([]*Volume, error)
    GetVolumeAttach(volumeID, instanceID string) ([]*VolumeAttachment, error)
    CreateSnapshot(。。。
    GetSnapshot(volumeID, snapshotID, snapshotName string) ([]*Snapshot, error)
    RemoveSnapshot(snapshotID string) error
    CreateVolume(
    RemoveVolume(volumeID string) error
    GetDeviceNextAvailable() (string, error)
    AttachVolume(。。。
    DetachVolume(runAsync bool, volumeID string, instanceID string, force bool) error
    CopySnapshot(。。。

虽然没有仔细看每一个srotage driver的代码,但是我相信每一个storage driver的实例都应该实现了StorageDriver接口。

type StorageDriverManager interface {
    StorageDriver
    Drivers() <-chan StorageDriver
    GetInstances() ([]*Instance, error)
}

下面是针对storage driver的manager

type sdm struct {
    rexray  *RexRay
    drivers map[string]StorageDriver
}

其中,sdm实现了Driver、StorageDriver、StorageDriverManager这几个接口。


对于volume:

type VolumeDriver interface {
    Driver
    Mount(。。。
    Unmount(volumeName, volumeID string) error
    Path(volumeName, volumeID string) (string, error)
    Create(volumeName string, opts VolumeOpts) error
    Remove(volumeName string) error
    Get(volumeName string) (VolumeMap, error)
    List() ([]VolumeMap, error)
    Attach(volumeName, instanceID string, force bool) (string, error)
    Detach(volumeName, instanceID string, force bool) error
    NetworkName(volumeName, instanceID string) (string, error)
}

volume实例(provider=docker)实现了VolumeDriver这个接口。

type VolumeDriverManager interface {
    VolumeDriver
    Drivers() <-chan VolumeDriver
    UnmountAll() error
    RemoveAll() error
    DetachAll(instanceID string) error
}

type vdm struct {
    rexray       *RexRay
    drivers      map[string]VolumeDriver
    m            sync.Mutex
    mapUsedCount map[string]*int
}

vdm实现了上面的Driver、VolumeDriver、VolumeDriverManager这三个接口。



Rexray是统一的存储管理平台,其具体结构如下所示:

type RexRay struct {
    Config  gofig.Config
    OS      OSDriverManager
    Volume  VolumeDriverManager
    Storage StorageDriverManager
    Context string
    drivers map[string]Driver
}

下面的步骤将会把所有的driver实例添加到RexRay实例的drivers属性中:

for name, ctor := range driverCtors {
    r.drivers[name] = ctor()
    log.WithField("driverName", name).Debug("constructed driver")
}

下面的步骤则是将RexRay实例中的每一个driver实例进行初始化:

od := map[string]OSDriver{}
vd := map[string]VolumeDriver{}
sd := map[string]StorageDriver{}
for n, d := range r.drivers {
    switch td := d.(type) {
    case OSDriver:
        if gotil.StringInSlice(n, osDrivers) {
            if err := d.Init(r); err != nil {
                log.WithFields(log.Fields{
                    "driverName": n,
                    "error":      err}).Debug("error initializing driver")
                 }
             od[n] = td
         }
     case VolumeDriver: 
           if gotil.StringInSlice(n, volDrivers) { 
               if err := d.Init(r); err != nil {
                   。。。
               vd[n] = td
         }
     case StorageDriver:
         if gotil.StringInSlice(n, storDrivers) {
             if err := d.Init(r); err != nil {
                 。。。
              sd[n] = td
         }


r.OS = &odm{
    rexray:  r,
    drivers: od,
}
r.Volume = &vdm{
    rexray:  r,
    drivers: vd,
}
r.Storage = &sdm{
    rexray:  r,
    drivers: sd,
}

完成以上的初始化步骤后,假设rexray开始工作则对应的流程以getVolume为例:

1、allVolumes, err := c.r.Storage.GetVolume(c.volumeID, c.volumeName)

2、c.r.Storage为sdm的实例,即执行func (r *sdm) GetVolume(volumeID, volumeName string) ([]*Volume, error)

3、for _, d := range r.drivers {

        return d.GetVolume(volumeID, volumeName)

   即执行具体的storage的GetVolume方法

4、以ECS为例,即

    resp, err := d.ec2Instance.Volumes(volumeList, filter)

© 著作权归作者所有

上一篇: Docker Image
kellydestiny
粉丝 1
博文 25
码字总数 9730
作品 0
武汉
程序员
私信 提问
docker使用rexray基于ceph做共享存储

docker使用rexray基于ceph做共享存储 背景   Docker Swarm使得分布式、集群的搭建部署速度提升了指数级别,原本的部署方式可能要用一天的时间,改用docker部署后可以减少到十分钟以内。  ...

anddyson
2018/05/16
0
0
Rex-Ray配置VirtualBox backend

【1】Installation REX-Ray 【2】然后创建并编辑 REX-Ray 的配置文件 /etc/rexray/config.yml 【3】在VirtualBox宿主机上启动vboxwebsrv服务 【4】关闭 VirtualBox 的登录认证: 【5】在关机...

云启
09/16
0
0
EMC 发布面向超大规模数据中心的开源项目

2015 年 12 月 10 日,北京时间 —— EMC 公司兑现其为开源社区带来重要新贡献的承诺,(NYSE:EMC) 今天发布RackHD™ (Rack ‘H’ ‘D’),这是一个平台无关 (独立于平台) 的技术堆栈,旨在解...

oschina
2015/12/10
5.8K
7
你所不知道的 EMC 开源的那些事

很多人都知道 EMC 这个公司,知道它是一家全球顶尖的存储产品供应商,但是很多人却不知道 EMC 也是一位开源先锋。 前一段时间去参加 EMC World 2016大会[1],在大会上的见闻了种种新技术,也...

oschina
2016/05/25
4.8K
3
谈DELL收购EMC

谈DELL收购EMC EMC 从到高大上到姥姥不痛舅舅不爱,EMC结局并非偶然,而是必然,IBM,Sun都是它的前车之鉴。再有前车之间参考的情况下,EMC已经积重难返,被DELL收购可能是最好的结局。 这些...

neo-chen
2015/10/14
405
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
今天
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
11
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
12
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
昨天
11
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部