Ceph-deploy 搭建Ceph分布式存储系统

Ceph-deploy 搭建Ceph分布式存储系统

Ceph版本为mimic Ceph-deploy版本为2.0.1


环境准备

安装Ceph-deploy管理节点

(在管理节点上)添加Ceph仓库到Ceph-deploy管理节点,然后安装Ceph-deploy

  1. 添加版本密钥和源
    export CEPH_DEPLOY_GPG_URL=http://mirrors.163.com/ceph/keys/release.asc·
    export CEPH_DEPLOY_REPO_URL=http://mirrors.163.com/ceph/debian-mimic
  2. 更新仓库
    sudo apt update
  3. 检查python是否安装,若无,则执行
    sudo apt-get install python-minimal
  4. 安装Ceph-deploy
    sudo apt-get install ceph-deploy
  5. 安装ntp(在各个节点上都应当安装ntp以防止因时间偏移产生的问题)
    sudo apt install ntp
  6. 安装SSH服务器(在各个节点上都应当安装SSH服务器)
    sudo apt install openssh-server

节点配置

ceph-deploy支持通过–username 参数,使admin在使用免密sudo权限的用户于远程节点上部署ceph时可以免除密码输入(不推荐)

  1. 为每个Ceph节点创建一个专用于ceph的用户
    ssh {user}@{remote-node-ip}
    sudo useradd -d /home/{username} -m {username}
    sudo passwd {username}

  2. 确保新创建的用户拥有sudo权限
    echo "{username} ALL=(root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/{username}
    sudo chmod 0440 /etc/sudoers.d/{username}
    在使用以上命令,特别是chmod命令对sudoer.d进行权限修改时,必须加以注意,错误地修改了sudoers.d的权限将可能造成无法使用sudo,届时需要root密码重新修改sudoers.d的权限

  3. 开启免密SSH

    • 构造SSH密钥(不要使用sudo或root用户)
      ssh-keygen
    • 把管理节点的公钥分发到各个Ceph节点
      {username}为在主机名为{node hostname}的节点上添加的专用于Ceph的新用户
      ssh-copy-id {username}@{node hostname}
    • 为了方便起见,修改~/.ssh/config文件
      Host {hostname}
      hostname {hostname}
      user {username}
    • 修改hosts,把远程节点ip及hostname加入,对应~/.ssh/config文件中的host
      vim /etc/hosts
    • 修改本机hostname
      vim /etc/hostname
  4. 检查网络连通性

    • 开放所需的端口,需要保证MON使用的6789端口及OSD使用的6800:7300端口范围
      sudo iptables -A INPUT -i {iface} -p -tcp -s {ip-address}/netmask --dport 6789 -j ACCEPT
    • ping 前面设置的各主机,检查是否有主机名解析问题

建立存储集群

  1. 在管理节点上建立目录用以保存ceph-deploy生成的配置文件与密钥环
    mkdir {clustername}
    cd {clustername}
    在使用管理节点进行集群管理时应尽量在该目录下执行管理命令,否则可能出现无法获取配置文件的错误
  2. 创建集群(在{clustername}目录下)
    ceph-deploy new {initial-monitors}
    创建初始监视器,一般监视器个数为奇数个以达到仲裁状态
  3. 为各节点安装Ceph
    ceph-deploy install {ceph-node}[...]
  4. 初始化初始监视器,收集集群密钥
    ceph-deploy mon create-initial
    完成这个步骤后,{clustername}目录下应当有如下密钥环
  • ceph.client.admin.keyring
  • ceph.bootstrap-mgr.keyring
  • ceph.bootstrap-osd.keyring
  • ceph.bootstrap-mds.keyring
  • ceph.bootstrap-rgw.keyring
  • ceph.bootstrap-rgw.keyring
  • ceph.bootstrap-rbd.keyring
  • ceph.bootstrap-rbd-mirror.keyring
    若执行失败且报错"Unable to find /etc/ceph/ceph.client.admin.keyring"则需要检查ceph.conf里的监视器IP是否对各个节点都是可达的
  1. 通过ceph-deploy把管理节点的配置文件和管理密钥拷贝到各个节点,以告知各个节点当前集群监视器地址与管理密钥环
    ceph-deploy admin {ceph-nodes}
    ceph-deploy push {ceph-nodes}
    推送位置一般为各目标主机下的/etc/ceph目录
  2. 部署manager
    ceph-deploy mgr create {ceph-nodes}
    一般来说mgr旨在对集群进行监控管理,是配置Dashboard可视化监控必不可少的组件,分担了一部分mon的压力。
  3. 添加OSD
  • 目前不建议一个磁盘上有多个OSD,在准备在某一个磁盘上部署OSD时需要该磁盘空闲且无重要数据(因为需要执行擦除操作,删除分区表)
    擦除磁盘
    ceph-deploy disk zap {ceph-node} /dev/{disk}
    倘若出现擦除失败,设备正忙,则需要到节点上将对应的磁盘重新恢复为未分区的disk,若是由拆除OSD留下的LVM占用,则参见后续文档
    创建OSD
    ceph-deploy osd create {ceph-node} --data /dev/{disk}
  1. 检查
  • 至此,Ceph作为存储集群最基本的架构便已经出现了,MON-node,admin-node,OSD-node,MGR-node,由于角色划分是基于守护进程类型不同而划分的,所以一个节点可以同时拥有多个角色,一般来说不建议MON与OSD共存。此时已可以使用如下命令查看集群的运行状态
    ceph -s
    在mgr配置完成前,执行该命令不会获得data的具体数据,会显示全是0。
    倘若出现[errno 22] error connecting to the cluster这样的报错,需要在sudo下执行状态查看命令

建立CephFS

  1. 查看Linux内核版本
    倘若Linux内核版本低于4.5 则无法使用较新版本Ceph的内核挂载功能
    lsb_release -a
    uname -r
  2. 在管理节点上,使用ceph-deploy安装ceph到客户节点
    ceph-deploy install {ceph-client-node}
    *部署时要确认集群正在运行且至少有一个MDS在运行
  3. 创建MDS
    *在存储集群之上构建CephFS,需要配置元数据服务器MDS。
    ceph-deploy mds create {ceph-node}
  4. 创建filesystem(在管理节点执行)
    ceph osd pool create cephfs_data <pg_num>ceph osd pool create cephfs_metadata <pg_num>
    `ceph fs new {fs_name} cephfs_metadata cephfs_data
    根据调研发现,存储池无法在filesystem建立之后加入(cep mds add_data_pool命令在新版本中被移除),建立fs至少需要两个存储池
  5. 将文件系统挂载到客户节点上(FUSE方式)
    创建挂载目录后再进行挂载
    sudo mkdir ~/mycephfs
    显式指明密钥环位置后挂载
    sudo ceph-fuse -k ./ceph.client.admin.keyring -m {cephfs-node-name}:6789 ~/mycephfs

部署Dashboard

  1. 查看ceph状态,找出active 的mgr
    ceph -s
    mgr必须状态为Active
  2. 生成并安装自签名的证书
    ceph dashboard create-self-signed-cert
  3. 生成密钥对,配置给Ceph mgr
    mkdir mgr-dashboard
    cd mgr-dashboard
    openssl req -new nodes -x509
    应当生成CA自签证书
    ceph mgr module disable dashboard
    ceph mgr module enable dashboard
    • 在Active的Ceph mgr上配置地址和端口(默认是8443)
      ceph config set mgr mgr/dashboard/server_addr {address}
      ceph config set mgr mgr/dashboard/server_port {port}
    • 查看dashboard地址信息
      ceph mgr services
    • 设置登陆认证用的用户名和密码
      ceph dashboard set-login-credentials {username} {password}
      如后续需配置为外网访问,则要在有外网IP的机器上配置端口转发
  4. 未完
    *在安全性,权限校验要求不高时这样配置最为简单,由于DashBoard是luminous版本才开始出现的原生监控组件,目前仍只能查看而无法进行配置,告警等,因此不做精细化的配置(当前Ceph版本为mimic),在后续版本更新或者使用外部工具可能能有更好的集群监控方案

拓展

  1. 动态增加/删除Ceph Monitor
    • 增加mon
      ceph-deploy mon create {ceph-nodes}
      mon个数应始终保持法定个数一般为奇数,查看法定个数情况如下
      ceph quorum_status --format json-pretty
      若始终有monitor out of quorum,则应考虑网络情况和密钥环是否被正确获取
    • 删除mon
      ceph-deploy mon destory {ceph-nodes}
      若删除mon后无法保持法定个数以达成共识,那么应当在删除前先加入一个mon
  2. 动态增加/删除Ceph Object Storage Device
    动态增加OSD的做法与创建无太大区别,查看节点上可用磁盘的命令为
    ceph-deploy disk list {node-name} [{nodename}]
    如前所言,要干净地删除OSD,需要对之前在磁盘上创建的LVM进行清理
    OSD正常状态应为up和in,在删除前应使其为out以重新平衡其存储的数据到其他OSD上
    ceph osd out {osd-num}
    • 停止OSD守护进程(在其所在节点上)
      sudo systemctl stop ceph-osd@{osd-num}
    • 擦除OSD
      ceph osd purge {id} --yes-i-really-mean-it
      在管理节点的ceph.conf中删除可能存在的osd.{num}的入口信息
    • 从crush图中删除osd
      ceph osd crush remove {osd.num}
    • 删除OSD验证密钥
      ceph auth del osd.{num}
    • 删除OSD,osdnum是指osd的序号
      ceph osd rm {osdnum}
      若在ceph osd tree里看到仍旧还有已被删除的osd,且状态显示为down,说明该守护进程目录并没有被删除,则可在osd节点上执行如下操作
      rm -r /var/lib/ceph/osd/ceph-{osdnum}
      至此基本完成删除OSD工作,但若需要重新使用该磁盘,则需要删除磁盘的逻辑卷和物理卷
      lvdisplay 获取LV Path,VG Name
      lvremove {LV Path}
      vgremove {VG Name}
      pvremove /dev/{disk}
      最后lsblk查看是否仍存在逻辑卷,若直接删除逻辑卷而不删除OSD,关闭OSD守护进程,将无法完成操作
  3. 关于FS扩容
    • 查看OSD使用情况
      ceph osd tree
      ceph osd df
      CephFS在集群新增OSD,获得新的磁盘空间时会动态平衡当前集群内的数据,实现扩容,可用空间大体等于总空间/副本数,只需增加OSD便能实现横向扩展(在扩容时不单单只考虑可用空间,由于PG,POOL,OSD间存在严格的计算关系,因此需要在一定时候进行参数调整)

常见问题解决及一些说明

  1. 清理Ceph环境(在管理节点上进行)
    这种方法应当应用于整个集群必须清理,重新部署的情况,若单个节点或守护进程出现异常,在始终无法解决的情况下优先考虑卸载对应的角色或者卸载该节点上的Ceph服务。
    • 清理配置信息
      ceph-deploy purgedata {ceph-node}[{ceph-node}]
    • 卸载节点上的Ceph
      ceph-deploy uninstall {ceph-node}[{ceph-node}]
    • 清理节点上的Ceph (安装包也会删除)
      ceph-deploy purge {ceph-node}[{ceph-node}]
  2. 如何在客户端解除挂载的CephFS
    sudo fusermount -zu {mountdir}
    在一开始使用了unmount命令直接解除挂载,这种方式虽然可以解除重复挂载的同一个FS,但最后会留下一个挂载点无法解除挂载,显示正在占用,因此还是以上述方式解除挂载为优。
  3. 内核方式挂载CephFS
    需要在操作系统内核为4.5以上版本才可实现,否则将无法成功,目前暂且使用FUSE方式挂载
  4. 在解决一些问题时可能需要重启某一守护进程以使配置生效,使用如下命令
    sudo systemctl stop {daemon name}@{num}
  5. 更换主机名时可能会遇到ssh密钥丢失,重新发放提示可能遭受中间人攻击,只需执行
    rm -r ~/.ssh/known_hosts
    在下一次分发时会自动重建
  6. 安装时出现因user ceph被占用而导致的无法安装完成
    ceph已在Infernalis 版本被用作Ceph守护进程的保留字,因此所有用户都不可以ceph为用户名,否则容易导致各种错误,若在安装Ceph之前已有该用户,先移除该用户
    userdel -r {username}