上面左边是我的个人微信,如需进一步沟通,请加微信。  右边是我的公众号“Openstack私有云”,如有兴趣,请关注。


引言

    Ceph提供非凡的数据存储可扩展性 - 数以千计的客户端主机或KVM访问PB级到数据级的数据。它为应用程序提供对象存储、块存储、文件系统,存储在一个统一的存储集群中 。Ceph是开源产品可以免费使用,可以部署在经济实惠的商用服务器上。


环境:

系统centos7.4

ceph版本 ceph version 10.2.10

测试服务器为kvm虚拟机(openstack虚拟机)


本篇文章是记录下自己的部署过程,服务器使用kvm虚拟机,只测试功能,服务器分配如下


节点 服务 cluster network
ceph-1(admin-node) osd.{1,2,},mon.ceph-1 eth0:192.168.1.161/24
ceph-2 osd.{3,4},mon.ceph-2 eth0:192.168.1.162/24
ceph-3 osd.{5,6},mon.ceph-3 eth0:192.168.1.163/24

每个节点在原来系统盘的基础上增加2块osd盘/dev/vdb 、/dev/vdc,集群共有6个osd进程,3个monitor进程。管理节点用作执行ceph-deploy命令,使用ceph-1节点充当。

环境预检

部署集群之前,需要进行环境准备,这些步骤应当设置于集群所有节点

配置免登陆访问

生成ssh-key

# ssh-keygen

对需要访问的机器进行认证

# ssh-copy-id root@ceph-2   //拷贝到所有节点

关闭防火墙

# systemctl stop firewalld

关闭防火墙自启动

# systemctl disable firewalld

关闭selinux

# setenforce 0

关闭selinux的自启动

# vim /etc/selinux/config

SELINUX=disabled

ntp同步

各osd节点间需要设置时间同步,节点时钟偏差过大会引起pg异常

yum install -y ntp

设置时区为上海:

timedatectl set-timezone Asia/Shanghai

在ntpserver的机器上写入配置文件

# vim /etc/ntp.conf

restrict default nomodify

server  127.127.1.0    

fudge   127.127.1.0 stratum 8

# systemctl start ntpd


在需要同步时间的客户端机器上修改配置文件

# vim /etc/ntp.conf

driftfile /var/lib/ntp/drift

server ceph-1

includefile /etc/ntp/crypto/pw

keys /etc/ntp/keys


ntp客户端同样要启动这个服务

# systemctl start ntpd


检查机器的ntp服务

# ntpq -p

注意:如果使用ntpdate 手动同步,需要先将ntpd服务停止。

hostname设置

Cluster Map中会使用主机hostname作为名称表示,因此hostname需要提前规划

hosts添加

每个节点都添加集群所有节点的hosts,ceph.conf配置文件中会使用到,如下是3个节点的hosts

# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.161 ceph-1
192.168.1.162 ceph-2
192.168.1.163 ceph-3

配置ceph源

base和epel源使用阿里源

# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 

#wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

或者163的源: 

# wget -O  /etc/yum.repos.d/CentOS-Base-163.repo http://mirrors

不要指望使用ceph官方源,这里需要使用国内第三方源,比如163的ceph源

#cat /etc/yum.repos.d/ceph.repo
[ceph]
name=Ceph packages
baseurl=http://mirrors.163.com/ceph/rpm-jewel/el7/x86_64/
enabled=1
gpgcheck=1
priority=2
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-jewel/el7/noarch/
enabled=1
gpgcheck=1
priority=2
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-jewel/el7/SRPMS/
enabled=0
gpgcheck=1
priority=2
type=rpm-md
gpgkey=http://mirrors.163.com/ceph/keys/release.asc

注意这里priority可以设置yum源的优先级,如果你其它源中也有ceph软件包,需要保证这里的ceph.repo的优先级priority比其它的高(值越小越高),为此需要安装下面这个软件包,用以支持yum源的优先级

yum -y install yum-plugin-priorities

下面这些依赖包也需要在每个节点都安装

yum install -y yum-utils snappy leveldb gdiskpython-argparse gperftools-libs ntpdate

内核调整

osd进程可以产生大量线程,如有需要,可以调整下内核最大允许线程数

vi /etc/sysctl.conf 
kernel.pid_max = 4194303

# echo 'kernel.pid_max = 4194303' >>/etc/sysctl.conf

安装ceph-deploy工具

ceph-deploy是ceph官方提供的部署工具,它通过ssh远程登录其它各个节点上执行命令完成部署过程,我们可以随意选择一台服务器安装此工具,为方便,这里我们选择ceph-1节点安装ceph-deploy

我们把ceph-1节点上的/data/ceph/deploy目录作为ceph-deploy部署目录,其部署过程中生成的配置文件,key密钥,日志等都位于此目录下,因此下面部署应当始终在此目录下进行

yum install ceph-deploy -y

mkdir -p /data/ceph/deploy

ceph-deploy工具默认使用root用户SSH到各Ceph节点执行命令。为了方便,已经配置ceph-deploy免密码登陆各个节点。如果ceph-deploy以某个普通用户登陆,那么这个用户必须有无密码使用sudo的权限。

安装ceph集群

ceph软件包安装

首先安装ceph软件包到三个节点上。上面我们已经配置好ceph源,因此这里使用--no-adjust-repos参数忽略设置ceph源

# ceph-deploy install --no-adjust-repos ceph-1 ceph-2 ceph-3

创建ceph集群

# ceph-deploy new ceph-1 ceph-2 ceph-3
#上步会创建一个ceph.conf配置文件和一个监视器密钥环到各个节点的/etc/ceph/目录,ceph.conf中会有`fsid`,`mon_initial_members`,`mon_host`三个参数 
#默认ceph使用集群名ceph

Ceph Monitors之间默认使用6789端口通信, OSD之间默认用6800:7300 范围内的端口通信,多个集群应当保证端口不冲突

配置文件

修改ceph-deploy目录/data/ceph/deploy下的ceph.conf

#/data/ceph/deploy/ceph.conf添加如下参数  
osd_journal_size = 5120 
osd_pool_default_size = 2
osd_pool_default_min_size=1

journal默认5G建议1TB数据5G,4T盘设置20G,这个影响性能的

添加mons

我们这里创建三个Monitor

cd /data/ceph/deploy
ceph-deploy mon create ceph-1 ceph-2 ceph-3
#上面命令效果如下
#1.write cluster configuration to /etc/ceph/{cluster}.conf
#2.生成/var/lib/ceph/mon/ceph-ceph-1/keyring
#3.systemctl enable ceph-mon@ceph-1
#4.systemctl start ceph-mon@ceph-1

在一主机上新增监视器时,如果它不是由ceph-deploy new命令所定义的,那就必须把public network加入 ceph.conf配置文件

key管理

为节点准备认证key

ceph-deploy gatherkeys ceph-1 ceph-2 ceph-3
#若有需要,可以删除管理主机上、本地目录中的密钥。可用下列命令:#ceph-deploy forgetkeys

osd创建

创建集群,安装ceph包,收集密钥之后,就可以创建osd了

ceph-deploy osd create ceph-1:vdb ceph-1:vdc ceph-2:vdb ceph-2:vdc ceph-3:vdb ceph-3:vdc  
#可以create多个osd
#如果使用单独的journal盘,可以用这种格式:ceph-1:vdb:/dev/vdf ,意思是在ceph-1上创建一个osd,使用磁盘vdb作为数据盘,osd journal分区从vdf磁盘上划分

每个节点上2个osd磁盘vd{b,c}。如果使用单独的日志盘,一般使用同一个日志盘比如/dev/vdf,使用prepare过程中ceph会自动在/dev/vdf上创建相应的日志分区供osd使用,日志分区的大小由上步骤osd_journal_size 指定
prepare 命令只准备 OSD。在大多数操作系统中,硬盘分区创建后,不用 activate 命令也会自动执行 activate 阶段(通过 Ceph 的 udev 规则)

activate 命令会让 OSD 进入 up 且 in 状态,此命令所用路径和 prepare 相同。在一个节点运行多个OSD 守护进程、且多个 OSD 守护进程共享一个日志分区时,你应该考虑整个节点的最小 CRUSH 故障域,因为如果这个 SSD 坏了,所有用其做日志的 OSD 守护进程也会失效

我们这里直接使用create命令,相当于是prepare + activate

允许3台主机以管理员权限执行 Ceph 命令

ceph-deploy admin ceph-1 ceph-2 ceph-3

需要注意,以上的ceph-deploy命令始终在同一个目录/data/ceph/deploy 下执行,否则会出现配置文件不一致的问题。

最后查看集群状态:

[root@ceph-1 deploy]# ceph -w
    cluster 87fd3c2d-7d79-4857-bebe-bc584dcf7dd6
     health HEALTH_WARN
            too few PGs per OSD (21 < min 30)
     monmap e2: 3 mons at {ceph-1=192.168.1.161:6789/0,ceph-2=192.168.1.162:6789/0,ceph-3=192.168.1.163:6789/0}
            election epoch 8, quorum 0,1,2 ceph-1,ceph-2,ceph-3
     osdmap e31: 6 osds: 6 up, 6 in
            flags sortbitwise,require_jewel_osds
      pgmap v61: 64 pgs, 1 pools, 0 bytes data, 0 objects
            201 MB used, 209 GB / 209 GB avail
                  64 active+clean
2018-05-24 14:48:31.947364 mon.0 [INF] pgmap v61: 64 pgs: 64 active+clean; 0 bytes data, 201 MB used, 209 GB / 209 GB avail

ceph-deploy常用命令

  • 允许一主机以管理员权限执行 Ceph 命令

ceph-deploy admin {host-name [host-name]...}
#拷贝ceph.conf和client.admin.keyring到远程主机上
  • 把改过的配置文件分发给集群内各主机

ceph-deploy --overwrite-conf config push node{1..3}
  • ceph-deploy执行后的清除

#卸载指定节点上的ceph软件包  
ceph-deploy uninstall {hostname [hostname] ...}
#清除数据   
#如果只想清除 /var/lib/ceph下的数据、并保留Ceph安装包
ceph-deploy purgedata {hostname} [{hostname} ...]
#要清理掉 /var/lib/ceph 下的所有数据、并卸载 Ceph 软件包
ceph-deploy purge {hostname} [{hostname} ...]
  • 清除磁盘操作

#查看某节点上所有磁盘
ceph-deploy disk list {node-name [node-name]...}
#清除指定磁盘上的分区,用于重装ceph集群
#ceph-deploy disk zap {osd-server-name}:{disk-name}
例如: ceph-deploy disk zap ceph-1:/dev/vdb
  • monitor操作

#从某个节点上移除Ceph MON进程
ceph-deploy mon destroy {host-name [host-name]...}
#ceph集群至少需要一个mon进程,但一个mon进程无法保证高可靠性。确保你删除一个监视器后,集群仍能正常工作。

总结

    通过ceph-deploy命令基本上可以很方便快捷的搭建一套ceph集群,在使用之前主要是需要规划好主机名和网络,实际生产环境中应该要考虑ceph的cluster网络和业务网络分离,需要有2个网口。在安装之前有一些预配置比较繁琐,主要是主机间的ssh互信、时间同步、防火墙、yum源更改到国内等。

    ceph-deploy 部署过程主要是:

  •     安装ceph 软件包:

ceph-deploy install ceph-1 ceph-2 ceph-3
  •     创建集群:

ceph-deploy new ceph-1 ceph-2 ceph-3
  •     安装mon:

ceph-deploy mon create  ceph-1 ceph-2 ceph-3
  •     准备认证key:

ceph-deploy gatherkeys  ceph-1 ceph-2 ceph-3
  •     创建osd:

ceph-deploy create osd  ceph-1 ceph-2 ceph-3
  •     赋予主机管理权限:

ceph-deploy admin  ceph-1 ceph-2 ceph-3


    如果忘了子命令,可以通过加-h 查看。