Sheepdog(牧羊犬分布式文件系统) 安装简介

介绍

今天在调研分布式文件系统时,非常偶然的机会看到sheepdog ,然后接着又看到KVM这个关键字,让我异常兴奋,这不是我一直在找的KVM镜像存储的分布式存储系统吗,原来KVM/Qemu最近已经开始对其进行了开发,并在Qemu 0.13.0版本后加入了与sheepdog的支持,太佩服国外的开源贡献者。

sheepdog(牧羊犬) 官方网站:http://www.osrg.net/sheepdog/

Sheepdog is a distributed storage system for KVM. It provides highly available block level storage volumes that can be attached to KVM virtual machines. Sheepdog scales to several hundreds nodes, and supports advanced volume management features such as snapshot, cloning, and thin provisioning.
安装步骤
1,环境准备

corosync-1.3.0.tar.gz sheepdog-0.2.0.tar.gz
2,安装corosync

corosync 是linux 集群管理的引擎,具体请参看官网
点击隐藏
SHELL CODE
$ tar -xzvf corosync-1.3.0.tar.gz
$ cd corosync-1.3.0
$ ./autogen.sh
$ ./configure
$ sudo make install
3,qemu 0.13的安装 (略)
4,sheepdog安装
点击隐藏
SHELL CODE
$ tar -xzvf sheepdog-0.2.0.tar.gz
$ cd sheepdog-0.2.0
$ ./autogen.sh
$ ./configure
$ sudo make install

这时可能会出现linux/signalfd.h 这个文件找不到,以及后续会出现signalfd undefined reference 的错误,我的系统是CentOS ,出现了这种错误,出现这种情况的话,我简单的解决方法是对signalfd进行模拟,这点我参考了qemu的有关实现,
具体是在sheep/work.c中加入以下代码:
代码太长,我贴到最后了,请参看附件
5,sheepdog的具体使用

1> 配置/etc/corosync/corosync.conf
mv /etc/corosync/corosync.conf.example /etc/corosync/corosync.conf
同时修改,bindnetaddr字段为自己的ip地址,mcastaddr(怎么修改暂时不清楚,应该是广播的地址,保持默认值即可)
2> 启动corosync
# corosync {注:需要是root账户}
3> 如果是ext3文件系统,需要加入user_xattr
点击隐藏
SHELL CODE
mount -o remount,user_xattr /

4> 启动Sheep
点击隐藏
SHELL CODE
# sheep ~/store_dir <span style="color: #ff6600;">#不能是相对路径,相对路径会出错</span>
# collie cluster format --copies=3

5> 查看状态
点击隐藏
SHELL CODE
# collie node list
# collie cluster info
# colli vdi list

6> 创建镜像
点击隐藏
SHELL CODE
# qemu-img create sheepdog:Alice 256G
# qemu-img convert ~/amd64.raw sheepdog:Bob

不过我在Convert时一直提示不成功,error while writing
查找原因:通过查看sheep.log日志文件,可以发现时由于Too Many open files 错误提示,原来是打开太多文件所造成的,因为sheepdog对文件进行4M进行分片的,这样会导致大量的文件打开,而一般的系统进程最多的文件数是1024 所以就这个错误!
解决方法:ulimit -n 4096 {或者更大的值} 这样修改只是在目前会话中有效,需要长久生效,请参看这篇文章
总结

sheepdog作为一个新的项目,感觉还是挺不错的,刚好弥补了开源虚拟化中有关镜像存储的问题,为后续的虚拟机迁移做准备,目前sheepdog暂时还未支持migrate ,不过看它的TODO LIST 下一步已经开始做了,系统能够尽快做出来,下一步主要是看下它的源码,因为很多地方会出现诡异的错误的,还需要解决呀!

本文地址:http://www.yaronspace.cn/blog/index.php/archives/1065

附件代码:
点击隐藏
C CODE
#ifndef _SIGNALFD
#include


/*
* include/linux/signalfd.h
*
* Copyright (C) 2007 Davide Libenzi
*
*/

/* For O_CLOEXEC and O_NONBLOCK */
#include


/* Flags for signalfd4. */
#define SFD_CLOEXEC O_CLOEXEC
#define SFD_NONBLOCK O_NONBLOCK

struct signalfd_siginfo {
__u32 ssi_signo;
__s32 ssi_errno;
__s32 ssi_code;
__u32 ssi_pid;
__u32 ssi_uid;
__s32 ssi_fd;
__u32 ssi_tid;
__u32 ssi_band;
__u32 ssi_overrun;
__u32 ssi_trapno;
__s32 ssi_status;
__s32 ssi_int;
__u64 ssi_ptr;
__u64 ssi_utime;
__u64 ssi_stime;
__u64 ssi_addr;

/*
* Pad strcture to 128 bytes. Remember to update the
* pad size when you add new members. We use a fixed
* size structure to avoid compatibility problems with
* future versions, and we leave extra space for additional
* members. We use fixed size members because this strcture
* comes out of a read(2) and we really don't want to have
* a compat on read(2).
*/
__u8 __pad[48];
};

void qemu_set_cloexec(int fd)
{
int f;
f = fcntl(fd, F_GETFD);
fcntl(fd, F_SETFD, f | FD_CLOEXEC);
}
struct sigfd_compat_info
{
sigset_t mask;
int fd;
};

static void *sigwait_compat(void *opaque)
{
struct sigfd_compat_info *info = opaque;
int err;
sigset_t all;

sigfillset(&amp;all);
sigprocmask(SIG_BLOCK, &amp;all, NULL);

do {
siginfo_t siginfo;

err = sigwaitinfo(&amp;info-&gt;mask, &amp;siginfo);
if (err == -1 &amp;&amp; errno == EINTR) {
err = 0;
continue;
}

if (err &gt; 0) {
char buffer[128];
size_t offset = 0;

memcpy(buffer, &amp;err, sizeof(err));
while (offset &lt; sizeof(buffer)) {
ssize_t len;

len = write(info-&gt;fd, buffer + offset,
sizeof(buffer) - offset);
if (len == -1 &amp;&amp; errno == EINTR)
continue;

if (len &lt;= 0) {
err = -1;
break;
}

offset += len;
}
}
} while (err &gt;= 0);

return NULL;
}

static int qemu_signalfd_compat(const sigset_t *mask)
{
pthread_attr_t attr;
pthread_t tid;
struct sigfd_compat_info *info;
int fds[2];

info = malloc(sizeof(*info));
if (info == NULL) {
errno = ENOMEM;
return -1;
}

if (pipe(fds) == -1) {
free(info);
return -1;
}

qemu_set_cloexec(fds[0]);
qemu_set_cloexec(fds[1]);

memcpy(&amp;info-&gt;mask, mask, sizeof(*mask));
info-&gt;fd = fds[1];

pthread_attr_init(&amp;attr);
pthread_attr_setdetachstate(&amp;attr, PTHREAD_CREATE_DETACHED);

pthread_create(&amp;tid, &amp;attr, sigwait_compat, info);

pthread_attr_destroy(&amp;attr);

return fds[0];
}
#endif
来自yaronspace.cn 本文链接:http://www.yaronspace.cn/blog/index.php/archives/1065
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值