本文原本打算实际部署一个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,且节点最好使用btrf或xfs文件格式,ext4格式也兼容但不支持ceph的一些特性;当然,也可以将所有存储节点的硬盘做成一个RAID或LVM池,这样整个集群就只需要运行一个osd进程即可。osd会默认创建三个池:data,metadata与RBD。
1, 两个节点上均配置host
vi /etc/hosts
192.168.1.103 node1
192.168.1.105 clientnode
2,除客户端节点以外的所有节点之间要配置相互免密码ssh访问,且客户端节点配置到所有除它以外节点的单向免密码ssh访问。具体到本文,只需要配置clientnode免密码ssh访问node1即可。具体方法是:先在clientnode用ssh-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
6,创建文件系统并启动,在监控节点运行:
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”
7,监控节点配置好之后,需要监控节点的/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等池的话,如下面机器有sda2与sdb2两块分区,每台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登录
4,只在监控节点上初始化集群:
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¶ms=$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 定义libvirt的xml片断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