Think Deep,Work Lean

通过ceph-deploy安装ceph storage cluster

Posted on By zack

前言

官网,ceph安装

实验环境

通过vagrant搭建4台机器node1~4
其中node1,2,3作node节点,在vagrant创建完的机器后,需要打开virtualbox各新增一块磁盘,sdb。 注意:本实验环境node1,2,3,本文中的node1是deploy机器
vagrantfile如下:

## files: Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :
hosts = {
  "node1" => "192.168.0.11",
  "node2" => "192.168.0.12",
  "node3" => "192.168.0.13"
}

Vagrant.configure("2") do |config|
  config.vm.box = "bento/centos-7.2"
  config.vm.box_url = "./vagrant-centos-7.2.box"
  config.vm.provider "virtualbox" do |v|
    v.customize ["modifyvm",:id,"--memory",3072]
  end
  hosts.each do |name, ip|
    config.vm.define name do |nodes|
      nodes.vm.hostname = name
      nodes.vm.network :private_network, ip: ip
      nodes.vm.provision "shell",
        run: "always",
        inline: "sudo ifup enp0s8; export LC_ALL=en_US.UTF-8; export LANG=en_US.UTF-8"
      end
    end
  end

ceph-deploy安装

yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# 配置源,ceph-stable-release变量取值当前稳定版本,如luminous
cat << EOM > /etc/yum.repos.d/ceph.repo
[ceph-noarch]
name=Ceph noarch packages
#baseurl=https://download.ceph.com/rpm-{ceph-stable-release}/el7/noarch
baseurl=https://download.ceph.com/rpm-luminous/el7/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc

但是上面这个源,在yum install ceph

[Ceph]
name=Ceph packages for $basearch
baseurl=http://download.ceph.com/rpm-mimic/el7/$basearch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
priority=1

[Ceph-noarch]
name=Ceph noarch packages
baseurl=http://download.ceph.com/rpm-mimic/el7/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
priority=1

[ceph-source]
name=Ceph source packages
baseurl=http://download.ceph.com/rpm-mimic/el7/SRPMS
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
priority=1

EOM

yum update
yum install ceph-deploy
yum install ntp ntpdate ntp-doc
yum install openssh-server

创建一个ceph deploy user,配置无密码及sudo权限
在每个节点执行
useradd ceph
echo 'ceph' | passwd --stdin ceph
echo "ceph ALL = (root) NOPASSWD:ALL" > /etc/sudoers.d/ceph
chmod 0440 /etc/sudoers.d/ceph 配置sshd可以使用password登录
sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config systemctl reload sshd
配置sudo不需要tty
sed -i 's/Default requiretty/#Default requiretty/' /etc/sudoers

#配置hosts
cat > /etc/hosts<<EOF
192.168.42.100 node1 node1
192.168.42.101 node2 node2
192.168.42.102 node3 node3
EOF

#配免密
#登陆至node1
ssh-keygen
ssh-copy-id node1
ssh-copy-id node2
ssh-copy-id node3

#开防火墙端口
#配置完成后,记得service iptables save
#同理,如果是firewalld类似
# ceph moinitor:6789  
# ceph OSDS: 6800:7300
#iptables -A INPUT -i {iface} -p tcp -s {ip-address}/{netmask} --dport 6789 -j ACCEPT
或
#firewall-cmd --add-port 6789/tcp --permanent
#或者直接关闭iptables,firewalld,selinx
systemctl stop firewalld && systemctl disable firewalld && setenforce 0

至此,这准备阶段已经完成,现在看下这个部署架构

由于是第一次搭建,先创建一个ceph存储集群:一个moinitor+3个ceph OSD。后续如果要扩展,再加第四个OSD,一个metadata 服务,两个mointor。

部署

mkdir my-cluster
cd my-cluster
#创建cluster,指定hostname
#如果在执行时提示无法找到pkg-packages时,需要yum install python-setuptools -y
ceph-deploy new node1 node2 node3

换国内镜像源

export CEPH_DEPLOY_REPO_URL=http://mirrors.163.com/ceph/rpm-mimic/el7
export CEPH_DEPLOY_GPG_URL=http://mirrors.163.com/ceph/keys/release.asc

配置public网络

#cat ceph.conf#在[global]下面加上
public network = 192.168.52.0/24
cluster network = 192.168.42.0/24

接下来执行ceph-deploy install,换作上面的163源后,安装会很快

#就是在对应结点上,安装 yum install ceph ceph-radosgw -y 这两个包
ceph-deploy install node1 node2 node3
#部署monitor和生成keys
ceph-deploy mon create-initial
#复制配置文件和keyring到node节点,方便执行命令时不用指定monitor地址和keyring
ceph-deploy admin node1 node2 node3
ceph-deploy mgr create node2 #该条命令是Deploy a manager daemon. (Required only for luminous+ builds):
#创建三个osd,所谓osd,即存储介质,
ceph-deploy osd create --data /dev/sdb node2
ceph-deploy osd create --data /dev/sdb node3
ceph-deploy osd create --data /dev/sdb node4
#以下,如果在执行健康检查时候,一直没有health_ok,基本上就是时钟不对,需要开启时钟同步。
  1. 创建osd及批量创建osd脚本
    在创建OSD时,要查看系统的磁盘,每块磁盘创建一个OSD,但是若是有盘有分区表DPT,在执行ceph-deploy osd create就会失败,需要dd掉,可通过以下脚本全部删除分区后,直接创建osd;该脚本的实用场景:1.系统分区做了raid,即没有分区表,而其他的盘都有分区,即磁盘为/dev/sdb,则分区为/dev/sdb1,而系统盘/dev/sda则没有分区。
    查看系统有没有raid cat /proc/mdstat
    #!/bin/bash
    set -e
    cp /tmp/osd3.txt /tmp/osd3.txt.bak
    rm -rf /tmp/osd3.txt
    for i in `lsblk -l|grep sd | awk -F' ' '{print $1}'|grep 1|tr -d '1'`;do echo $i >> /tmp/osd3.txt;done
    for i in `cat /tmp/osd3.txt`;do dd if=/dev/zero of=/dev/$i bs=512k count=1; ceph-deploy osd create --data /dev/$i node1;done
    
  2. 在执行ceph-deploy mon create-initial时提示monitor is not yet in quorum,则很有可能是时钟没同步,或是时区不一致
  3. 造成集群状态health_warn:clock skew detected on mon节点的原因有两个,一个是mon节点上ntp服务器未启动,另一个是ceph设置的mon的时间偏差阈值比较小
    #vi ~/my-cluster/ceph.conf
    #在global字段下添加:
    mon clock drift allowed = 2
    mon clock drift warn backoff = 30
    #ceph-deploy --overwrite-conf config push node{1..3}
    #systemctl restart ceph-mon.target
    #ceph -s
    

    安装ntp,两两相互同步

    # yum install ntpd
    # cat /etc/ntp.conf
    driftfile /var/lib/ntp/ntp.drift
    server  192.168.52.94 burst  iburst
    server  192.168.52.98 burst  iburst
    server  127.127.1.0
    fudge   127.127.1.0 stratum 11
    

    参考

  4. yum缓存文件的使用
    /etc/yum.conf配置文件,设置"keepcache=1" 配置文件中的”cachedir”就是用来缓存安装包的具体目录。

待A服务器完成所有配置后,将cachedir指定的目录直接拷贝到其它待安装的服务器上,然后使用”yum -C install [软件包名]”即可使用缓存安装。(-C参数表示使用系统缓存)。

  1. 结果
    [root@node1 my-cluster]# ceph -s
      cluster:
     id:     1165a001-9c43-4f7a-8f51-a8aad26a5c04
     health: HEALTH_OK
      services:
     mon: 3 daemons, quorum node2,node3,node1
     mgr: node2(active), standbys: node3, node1
     osd: 72 osds: 72 up, 72 in
      data:
     pools:   0 pools, 0 pgs
     objects: 0  objects, 0 B
     usage:   75 GiB used, 524 TiB / 524 TiB avail
     pgs:
    
  2. ceph-deploy install 其实就是在对应结点上,安装 ceph ceph-radosgw 这两个包,可直接配置ceph的yum源,配置163的源
    [ceph]
    name=Ceph packages for $basearch
    baseurl=http://mirrors.163.com/ceph/rpm-mimic/el7/$basearch
    enabled=1
    gpgcheck=1
    priority=1
    type=rpm-md
    gpgkey=http://mirrors.163.com/ceph/keys/release.asc
    [ceph-noarch]
    name=Ceph noarch packages
    baseurl=http://mirrors.163.com/ceph/rpm-mimic/el7/noarch
    enabled=1
    gpgcheck=1
    priority=1
    type=rpm-md
    gpgkey=http://mirrors.163.com/ceph/keys/release.asc
    [ceph-source]
    name=Ceph source packages
    baseurl=http://mirrors.163.com/ceph/rpm-mimic/el7/SRPMS
    enabled=0
    gpgcheck=1
    type=rpm-md
    gpgkey=http://mirrors.163.com/ceph/keys/release.asc
    priority=1
    
  3. Yum从光盘安装
    yum --disablerepo=\* --enablerepo=c7-media install -y ntp
    

清理集群

#至此,如果安装失败,需要清除,重新开始
ceph-deploy purge node2 node3 node4
ceph-deploy purgedata node2 node3 node4
ceph-deploy forgetkeys
rm ceph.* -rf
yum remove librados2 libradosstriper1 -y

ceph-deploy purge node2 node3 node1 && ceph-deploy purgedata node2 node3 node1 && ceph-deploy forgetkeys && rm ceph.* -rf

扩展

基础的集群搭建完成后,需要扩展。在node2上增加一个metadata server,在node3和node4上加一个ceph monitor和manager;增加高可靠

#如果要用cephFS,即如果要用文件存储,需要安装这个mds
ceph-deploy mds create node2
#加Monitor,高可用需要,Paxos算法
ceph-deploy mon add node3
ceph-deploy mon add node1
#如果你加了ceph mointor,ceph将开始同步多个Monitor之间的数据,检查monitors状态
ceph quorum_status --format json-pretty
#增加managers,主从模式
ceph-deploy mgr create node3 node1
#查看standby manager,其实是查看ceph,所有的参数。
ssh node2 sudo ceph -s
#增加一个RGW 实例,监听7480
ceph-deploy rgw create node2

开启dashboard

详见

  1. 生成并安装自签名的证书
    # ceph dashboard create-self-signed-cert
    
  2. 生成key pair,并配置给ceph mgr
    # mkdir mgr-dashboard && cd mgr-dashboard/
    # openssl req -new -nodes -x509 -subj "/O=IT/CN=ceph-mgr-dashboard" -days 3650 -keyout dashboard.key -out dashboard.crt -extensions v3_ca
    Generating a 2048 bit RSA private key
    # ls
    dashboard.crt  dashboard.key
    $ ceph config-key set mgr/dashboard/crt -i dashboard.crt
    $ ceph config-key set mgr/dashboard/key -i dashboard.key
    # ceph mgr module disable dashboard
    # ceph mgr module enable dashboard
    

    注意,要是不要想https可以关闭

    ceph config set mgr mgr/dashboard/ssl false
    
  3. 在ceph active mgr上配置server addr和port
    若使用默认的8443端口,则可跳过该步骤!
    # ceph config set mgr mgr/dashboard/server_addr 192.168.52.95
    # 若要配置成默认的,则可以随ceph mgr的节点漂移时发生变化,尽量用默认
    # ceph config set mgr mgr/dashboard/server_addr ::  
    # ceph config set mgr mgr/dashboard/server_port 8443
    # ceph mgr services
    
  4. 生成登陆认证的用户名和密码
    # ceph dashboard set-login-credentials root fitstore
    
  5. 如果是跳板机,需要配置端口转发
    ssh -Nf -L 0.0.0.0:8444:192.168.52.95:8443 <跳板机IP>
    或者
    ssh -C -f -N -g -L 0.0.0.0:8443:192.168.52.98:8443 10.128.151.1
    

效果图

存取对象数据

在集群里面存一个对象数据,必须设置一个对象名字、指定一个pool。客户端检索最新的集群地图并通过CRUSH算法计算出对象到placement group的映射关系,并且动态计算出placement group到OSD之间的绑定。因此如果要找到对象的位置,你只需要知道object name及pool name

echo {Test-data} > testfile.txt
ceph osd pool create mytest 8
rados put {object-name} {file-path} --pool=mytest
rados put test-object-1 testfile.txt --pool=mytest
rados -p mytest ls
ceph osd map {pool-name} {object-name}
ceph osd map mytest test-object-1

实验如下:

echo "fuck fuck!!" > testfile.txt
#创建pool
[root@node2 ~]# ceph osd pool create mytest 8
pool 'mytest' created
#rados put {object name} {file-path} --pool=mytest,存数据
[root@node2 ~]# rados put test-object-1 testfile.txt --pool=mytest
#查看对应pool里的数据
[root@node2 ~]# rados -p mytest ls
test-object-1
#查看它的映射关系
[root@node2 ~]# ceph osd map mytest test-object-1
osdmap e31 pool 'mytest' (5) object 'test-object-1' -> pg 5.74dc35e2 (5.2) -> up ([1,0,2], p1) acting ([1,0,2], p1)
#删除Mytest pool,需要删除两次,让你确认。
[root@node2 ~]# ceph osd pool rm mytest
Error EPERM: WARNING: this will *PERMANENTLY DESTROY* all data stored in pool mytest.  If you are *ABSOLUTELY CERTAIN* that is what you want, pass the pool name *twice*, followed by --yes-i-really-really-mean-it.
[root@node2 ~]# ceph osd map mytest test-object-1
osdmap e31 pool 'mytest' (5) object 'test-object-1' -> pg 5.74dc35e2 (5.2) -> up ([1,0,2], p1) acting ([1,0,2], p1)
#将node1作为测试的机器,在上面先装上ceph
ceph-deploy install node1
ceph-deploy admin node1

这样,node1上就可以对集群执行操作,而不用每次登陆至集群,如

[ceph@node1 my-cluster]$ ssh node2 sudo ceph -s
  cluster:
    id:     35d6c678-5ee5-4741-a3eb-cbad9359d990
    health: HEALTH_OK

  services:
    mon: 3 daemons, quorum node2,node3,node4
    mgr: node2(active), standbys: node3, node4
    osd: 3 osds: 3 up, 3 in

  data:
    pools:   4 pools, 32 pgs
    objects: 219  objects, 1.1 KiB
    usage:   3.0 GiB used, 21 GiB / 24 GiB avail
    pgs:     32 active+clean

掘金上的这篇文章写得也比较好,可以参考 至此,环境初步搭建完毕,如下为搭建三个不同存储方式的步骤。

文件存储

cephFS

官方建议ceph10.x(Jewel)就开始要使用4.x的kernal。

创建文件系统,创建之前mds是standby的,创建之后才是active的

#创建一个pool 64个pg
[root@node2 ~]# ceph osd pool create cephfs_metadata 64
pool 'cephfs_metadata' created
[root@node2 ~]# ceph fs new  cephfs_my cephfs_metadata cephfs_data
new fs with metadata pool 7 and data pool 6
[root@node2 ~]# ceph fs ls
name: cephfs_my, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
[root@node2 ~]# ceph mds stat
cephfs_my-1/1/1 up  {0=node2=up:active}

给要挂载目录的机器创建认证keyring

[root@node2 ceph]# cat /etc/ceph/ceph.client.admin.keyring
[client.admin]
	key = AQBthX9cG7m4GRAAnkylL1zxJCE9NmBrnkrTXQ==
	caps mds = "allow *"
	caps mgr = "allow *"
	caps mon = "allow *"
	caps osd = "allow *"

以上key的值 AQBthX9cG7m4GRAAnkylL1zxJCE9NmBrnkrTXQ== 保存到空白文件,以admin.secret来命名,放到要挂载的目标机器上,然后登陆到这个机器上,执行挂载

[root@node1 ceph]# mount -t ceph 192.168.0.12:6789:/ /mnt/mycephfs/ -o name=admin,secret=AQBthX9cG7m4GRAAnkylL1zxJCE9NmBrnkrTXQ==

提示挂载不上,看/var/log/messages日志,提示如下错误

Mar 15 12:07:19 node1 kernel: libceph: mon0 192.168.0.12:6789 feature set mismatch, my 103b84a842aca < server's 40103b84a842aca, missing 400000000000000
Mar 15 12:07:19 node1 kernel: libceph: mon0 192.168.0.12:6789 missing required protocol features

google该错误,经查是内核版本不支持某特性,提示用命令禁止

ceph osd crush tunables hammer

然后再挂载就正常,原因分析为

[root@node1 ceph]# lsmod |grep rbd
rbd                    73158  0
libceph               244999  2 rbd,ceph
[root@node1 ceph]# uname -a
Linux node1 3.10.0-327.4.5.el7.x86_64 #1 SMP Mon Jan 25 22:07:14 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

这个rbd是内核的,由于内核版本低不支持新的特性,而ceph很多新的特性,看提示的报错信息及code值,禁止这个特性就能挂载成功;另外一种方法是用fuse这个方法,fuse是用户态的,不用内核,虽然性能赶不上内核的rbd,但是在用户态,能够很方便的与ceph社区保持一致并友好更新

块存储

#在admin节点上,用ceph工具创建一个pool,建议用rbd
#在admin节点,用rbd工具对pool作初始化
rbd pool init <pool-name>

# 创建block device image
#rbd create foo --size 4096 --image-feature layering [-m {mon-IP}] [-k /path/to/ceph.client.admin.keyring] [-p {pool-name}]

#映射image到block device
sudo rbd map foo --name client.admin [-m {mon-IP}] [-k /path/to/ceph.client.admin.keyring] [-p {pool-name}]
#用块设备创建文件系统
sudo mkfs.ext4 -m0 /dev/rbd/{pool-name}/foo
#挂载
sudo mkdir /mnt/ceph-block-device
sudo mount /dev/rbd/{pool-name}/foo /mnt/ceph-block-device
cd /mnt/ceph-block-device
#最后,实现开机自动挂载

对象存储

Gateway daemon内嵌了一个civeweb,所以你不用再去安装web server或是配置FastCGI。另外,ceph-deploy可以跟你安装gateway包,生成key,配置数据目录并为你创建一个网关实体。
网络端口:默认7480,防火墙要开此端口

要开启一个ceph object gateway,有以下步骤:

  1. 安装ceph object gateway
    在admin节点的工作目录
    ceph-deploy install --rgw  node2
    
  2. 创建一个object gateway instance
    ceph-depy rgw create node2
    

    发现在执行第一步的时候,实例已经创建并已经开启了7480端口,可检查这个端口,并url访问 http://192.168.0.12:7480,如下: ```xml

anonymous
3. 配置实例:如要修改默认端口
在node2节点的/etc/ceph/ceph.conf下,新加section如

[client.rgw.node2] rgw_frontends=”civetweb port=80”

然后重启rgw服务

systemctl restart ceph-radosgw@rgw.node2.service ``` 然后查看80端口是否被监听,并访问80端口看效果。