[WIP] Fedora 17上部署Ceph ( by quqi99 )

时间:2023-01-05 07:06:30

[WIP] Fedora 17上部署Ceph( by quqi99 )

作者:张华  发表于:2013-09-03
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明

( http://blog.csdn.net/quqi99)


       本文原本打算实际部署一个two-nodeceph环境的,但在中途运行”cephdf”命令时报错AttributeError:/lib64/librados.so.2: undefined symbol:rados_create2”折腾了半天没解决,算了,时间有限,再说也清楚了ceph的理论和实际使用过程,等我真需要用到它的时候或者ceph出稳定版了有机会再接着做完本实验吧。那么本文仅供参考,其中使用ceph的大致步骤是对的,但中间的细节有可能是错的,不必深究

另外,本文中的全部操作使用root用户,因为在执行mkcephfs命令的时候ceph会通过免密码的ssh去同步配置文件,但它默认使用的是root用户,我还没找到哪个配置项可以更改这个默认用户,所以先用的是root用户。

  最后,因为网上很多文章讲ceph都是用至少用3台机器来配置monitor节点的,这很好理解,因为领导者选举算法Paxos在保证HA时要求最小是3台,但我知道和Paxos类似的算法Zap协议(ZooKeeper用它)也配置在1台机器上做测试用也是可以的。因为我没有那么多机器,物理机器也没那好的性能允许我搞这么多虚机另外时间也有限也怕麻烦。理论上我认为可以在一台机器上完成ceph的安装配置,但实际行不行由于我没把实验做完我不确定。

 有知道上述三个问题答案的同学可以告诉我,先谢谢啦。

先说说我打算的拓扑,一台机器运行ceph客户端,其他的mds,monitor, osd就全安装到另外一台机器上了。 

  • clientnode, 192.168.0.105,运行ceph客户端,因为ceph已经加到了Linux内核之中,所以在编译内核时须选上ceph

  • node1, 192.168.0.103, 运行mds&monitor,osd,如果机器多的话,可以将mds&monitor再单独安装在一台机器上,所有的存储节点均应运行osd,且节点最好使用btrfxfs文件格式,ext4格式也兼容但不支持ceph的一些特性;当然,也可以将所有存储节点的硬盘做成一个RAIDLVM池,这样整个集群就只需要运行一个osd进程即可。osd会默认创建三个池:data,metadataRBD

1, 两个节点上均配置host

vi /etc/hosts

192.168.1.103 node1

192.168.1.105 clientnode

2,除客户端节点以外的所有节点之间要配置相互免密码ssh访问,且客户端节点配置到所有除它以外节点的单向免密码ssh访问。具体到本文,只需要配置clientnode免密码ssh访问node1即可。具体方法是:先在clientnodessh-keygen命令生成密钥,然后再运行下列命令配置免密码ssh访问:

clinetnode上执行:ssh-copy-idroot@node1

node1上执行: ssh-copy-id root@node1

3,源码安装mds/monitor/osd,从git下载源码须运行gitsubmodule update --init”命令准备源码树gitclone https://github.com/ceph/ceph.git

或者从这里(http://ceph.com/download/ceph-0.66.tar.gz)下载源码包,

如果想通过rpm包安装的话,可参见:http://ceph.com/docs/master/install/rpm/

4, 编译源码,

sudo yum install gccgcc-c++ make automake libtool libuuid libuuid-devel nss-develcryptopp cryptopp-devel fuse-devel libatomic_ops-devel libeditlibedit-devel snappy snappy-devel leveldb leveldb-devel libaiolibaio-devel boost-devel expat expat-devel btrfs-progskeyutils-libs-devel gperftools-libs libcurl-devel libxml2-devel fcgifcgi-devel python-flask python-argparse


./autogen.sh

CXXFLAGS="-g -O2"./configure --with-nss --without-tcmalloc

make #若是多核处理器,例2核,可通过使用make-j4命令多线程加速编译

sudomake install

5, 配置文件,除客户节点外,所有节点的配置文件应该是完全一样的

sudo cp src/sample.ceph.conf/usr/local/etc/ceph/ceph.conf

sudo cp src/sample.fetch_config/usr/local/etc/ceph/fetch_config

sudo cp src/init-ceph /etc/init.d/ceph

我使用的/usr/local/etc/ceph/ceph.conf文件内容为:

; Ceph conf file!

; use semi-colon to put a comment!

[global]

auth supported = cephx

keyring = /etc/ceph/keyring.admin

[mds]

keyring = /etc/ceph/keyring.$name

[mds.0]

host = node1

[osd]

osd data = /srv/ceph/osd$id

osd journal = /srv/ceph/osd$id/journal

osd journal size = 512

osd class dir = /usr/lib/rados-classes

keyring = /etc/ceph/keyring.$name

; working with ext4

filestore xattr use omap = true

; solve rbd data corruption

filestore fiemap = false



osd mkfs type = btrfs

osd mount options btrfs = rw,noatime

[osd.0]

host = node1

devs = /dev/nova-volumes/lv-ceph

[mon]

mon data = /srv/ceph/mon$id

[mon.0]

host = node1

mon addr = 192.168.1.103:6789



如果有多个存储节点,可以依次加[mds.0],[mds.1], [mds.2] ...类似。并且领导者选择算法一般还是要求至少3台机器的,但我没那么多机器,记得ZooKeeper中的领导者选择算法也可以用一个机器的,所以我们试试用一个机器行不行。

还要创建上面用到的目录:sudomkdir -p /srv/ceph/{osd0,mon0}

另外上述“devs=/dev/nova-volumes/lv-ceph”中存储设备可以是磁盘分区(如/dev/sda1),也可以是逻辑卷(如/dev/nova-volumes/lv-ceph),下面我们用文件来模拟物理磁盘。

sudo dd if=/dev/zeroof=/bak/images/nova-volumes.img bs=1M seek=20k count=0

sudo vgcreate nova-volumes $(sudo losetup --show-f /bak/images/nova-volumes.img)

sudo vgdisplay

sudo lvcreate -L1G -nlv-ceph nova-volumes

sudo lvdisplay

sudo mkfs.btrfs /dev/nova-volumes/lv-ceph

,创建文件系统并启动,在监控节点运行:

modprobe btrfs

mkcephfs -a -c/usr/local/etc/ceph/ceph.conf --mkbtrfs

报错“errorcreating empty object store in /srv/ceph/osd0: (22) Invalidargument”,那是需要将/srv/ceph/{osd0,mon0}目录的内容先清空。

sudo chmod +r/etc/ceph/keyring.admin

service ceph start

报错“cephNo filesystem type defined!”,请确保配置文件中存在下列配置:

osd mkfs type =btrfs

osd mount optionsbtrfs = rw,noatime

报错“ImportError:No module named ceph_argparse”

exportPYTHONPATH=$PYTHONPATH:/bak/openstack/ceph/src/pybind

报错“AttributeError:/lib64/librados.so.2: undefined symbol: rados_create2”

,监控节点配置好之后,需要监控节点的/etc/ceph/user/local/etc/ceph两个目录scp同步到所有其他存储节点。我们这里因为只有一台机器,就没有这个步骤了。

8, 查看状态

ceph -k/etc/ceph/keyring.admin -c /usr/local/etc/ceph/ceph.conf health

ceph status

ceph df

9, 客户端挂载,其中钥匙secret/etc/ceph/keyring.admin文件中的内容

mkdir /mnt/ceph

mount -t ceph<ceph_mds_ip>:/ /mnt/ceph -v -oname=admin,secret=AQCXnKhRgMltJRAAi0WMqr+atKFPaIV4Aja4hQ==


虽没做完试验,我们先把使用它的步骤疏理完,做到心中有数:

1,如果不用RAID,LVM等池的话,如下面机器有sda2sdb2两块分区,每台host有几块分区就要定义几个osd.X,如下:

[osd.11]
    host = ceph1
    cluster addr = 10.X.X.1:6800
    public addr = 192.168.X.X.1:6801
    devs = /dev/sda2
[osd.12]
    host = ceph1
    cluster addr = 10.X.X.1:6802
    public addr = 192.168.X.X.1:6802
    devs = /dev/sdb2

2,然后须mount到相应的/srv/ceph/osdXX目录(可在/etc/fstab中定义)

mkdir -p /srv/ceph/{mon1,osd1{1,2}}
/dev/sda2 /srv/ceph/osdX1 xfs rw,noexec,nodev,noatime,nodiratime,barrier=0 0 0
/dev/sdb2 /srv/ceph/osdX2 xfs rw,noexec,nodev,noatime,nodiratime,barrier=0 0 0

3, 除客户端以外的所有节点中配置免ssh登录

,只在监控节点上初始化集群:

mkcephfs-a -c /etc/ceph/ceph.conf

它会根据配置文件中的[mon.x]段配置领导者选择算法所用的数据库。

    [mon.1]
    host = ceph1
 mon addr = 192.168.X.1:6789
5, 监控节点启动ceph所有进程,service ceph start
6, 监控节点检查ceph状态,ceph -k /etc/ceph/keyring.admin -c /etc/ceph/ceph.conf health
 显然,这块也要求所有节点配置ntp服务。
7, ceph集群中创建RBD池和卷
 modprobe rbd
 key位于keyring.admin文件中,可用命令查看:
 ceph-authtool --print-key /etc/ceph/keyring.admin | tee client.admin
 ceph默认会创建三个池:data, metadata, rbd, 可用rados lspools命令查看
  创建池,rados mkpool nova
 池中创建逻辑卷,rbd --pool nova create –size 1024 rbd-test
 列出逻辑卷, rbd --pool nova ls
 mount逻辑卷,
 rbd map rbd-test –pool nova –secret client.admin #key关联
 mkfs.btrfs /dev/rbd0 #分区
 mount /dev/rbd0 /mnt #挂载
8, RADOS gateway,能够提供REST API,首先为apache配置fastcgi, 然后在/etc/ceph/ceph.conf文件中加一段,因为所有节点的配置应该完全一样,注意配完之后同步所有的节点。

[client.radosgw.gateway]        
        host = ceph1.fqdn.tld
        keyring = /etc/ceph/keyring.radosgw.gateway
        rgw socket path = /tmp/radosgw.sock
        log file = /var/log/ceph/radosgw.log
apache的配置/etc/apache/site-available/radosgw

<VirtualHost *:80>        
        ServerName ceph1.fqdn.tld
        ServerAdmin root@ceph1
        DocumentRoot /var/www

        # rewrting rules only need for amazon s3
        RewriteEngine On
        RewriteRule ^/([a-zA-Z0-9-_.]*)([/]?.*) /s3gw.fcgi?page=$1&params=$2&%{QUERY_STRING} [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]

        FastCgiExternalServer /var/www/s3gw.fcgi -socket /tmp/radosgw.sock
        <IfModule mod_fastcgi.c>
                <Directory /var/www>
                        Options +ExecCGI
                        AllowOverride All
                        SetHandler fastcgi-script
                        Order allow,deny
                        Allow from all
                        AuthBasicAuthoritative Off
                </Directory>
        </IfModule>

        AllowEncodedSlashes On
        ErrorLog /var/log/apache2/error.log
        CustomLog /var/log/apache2/access.log combined
        ServerSignature Off
</VirtualHost>
创建fcgi脚本/var/www/s3gw.fcgi, 
 exec /usr/bin/radosgw -c /etc/ceph/ceph.conf -n client.radosgw.gateway
 chmod +x /var/www/s3gw.fcgi
enable RADOS网关并禁用掉默认的,a2ensite radosgw && a2ensite default
创建key, 
 ceph-authtool --create-keyring /etc/ceph/keyring.radosgw.gateway
 chmod +r /etc/ceph/keyring.radosgw.gateway
 ceph-authtool /etc/ceph/keyring.radosgw.gateway -n client.radosgw.gateway --gen-key
 ceph-authtool -n client.radosgw.gateway --cap osd 'allow rwx' --cap mon 'allow r' /etc/ceph/keyring.radosgw.gateway
 ceph -k /etc/ceph/keyring.admin auth add client.radosgw.gateway -i /etc/ceph/keyring.radosgw.gateway
启动服务: service ceph restart && service apache2 restart && service radosgw start
测试REST API
  如创建一个用户,radosgw-admin user create --uid="testuser" --display-name="First User"
9,与openstack集成,nova-volume是块存储,所以它可以使用RDB块。
生成nova使用的key,
 ceph-authtool --create-keyring /etc/ceph/keyring.nova
 chown nova:nova /etc/ceph/keyring.nova
 ceph-authtool --gen-key --name client.nova --cap mon 'allow r' --cap osd 'allow rwx pool=nova' /etc/ceph/keyring.nova
key也拷到admin key
 ceph -k /etc/ceph/keyring.admin auth add client.nova -i /etc/ceph/keyring.nova
查询到key, ceph-authtool --print-key /etc/ceph/keyring.nova -n client.nova
 定义libvirtxml片断security.xml,然后执行:virsh secret-define --file secret.xml
 
<secret ephemeral='no' private='no'>   
   <usage type='ceph'>
     <name>client.nova secret</name>
   </usage>
</secret>
 nova.conf中添加配置:
--volume_driver=nova.volume.driver.RBDDriver
--rbd_pool=nova
--rbd_user=nova
--rbd_secret_uuid=<83890793-e8c7-a481-6a0d-68e5d2538330>
 只在监控节点的/etc/default/nova-common中添加:export CEPH_ARGS="--id nova"
 sudo -u nova CEPH_ARGS="--id nova" rados lspools
 在所有节点中的/etc/ceph/ceph.conf添加:

[client.nova]   
   keyring = /etc/ceph/keyring.nova
 这时候就可以在nova中创建卷了:
    nova volume-create --display_name first-rbd-volume 5
 nova volume-list



Reference:

http://ceph.com/w/index.php?title=Installing_on_RedHat_or_CentOS&redirect=no

http://blog.csdn.net/pc620/article/details/9002045

https://wiki.debian.org/OpenStackCephHowto

http://www.openstack.cn/p276.html