当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 1 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : (转KVM分布式共享存储解决方案-sheepdog
帖子发表于 : 2011-04-29 13:59 

注册: 2007-08-04 22:09
帖子: 213
系统: ArchLinux
送出感谢: 0 次
接收感谢: 0 次
介绍

今天在调研分布式文件系统时,非常偶然的机会看到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


_________________
Twitter: http://twitter.com/muxueqz
福建Linux用户组(FJLug)
聊逍遥兮容与: http://muxueqz.gitcafe.com


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 1 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译