背景
Ceph简单介绍
Ceph是一个分布式存储,能够提供对象存储、块存储和文件存储,当中对象存储和块存储能够非常好地和各大云平台集成。
一个Ceph集群中有Monitor节点、MDS节点(可选,用于文件存储)、至少两个OSD守护进程。
Ceph OSD:OSD守护进程,用于存储数据、处理数据拷贝、恢复、回滚、均衡。并通过心跳程序向Monitor提供部分监控信息。
一个Ceph集群中至少须要两个OSD守护进程。
Monitor:维护集群的状态映射信息,包含monitor、OSD、Placement Group(PG)。
还维护了Monitor、OSD和PG的状态改变历史信息。
MDS:存储Ceph文件系统的元数据。
环境规划
4台服务器:1台作为Monitor。1台作为OSD RGW。还有两台作为OSD。ps:我们不搭建CephFS。
全部服务器都安装Ubuntu 16.04。
环境准备:
编辑hosts文件及hostname
分别将Monitor节点定义为node1。两台OSD节点定义为node2、node3,RGW节点定义为node4。
打开Monitor节点的/etc/hostname文件。内容改动为node1。保存退出。但该文件需OS重新启动后才干生效,因此需再手动运行命令让其立马生效,命令为:
# hostname node1
再分别打开各节点的/etc/hosts文件。加入这四个节点ip与名称的相应关系。相似例如以下:
127.0.0.1 localhost
127.0.1.1 node1
192.168.1.100 node1
192.168.1.101 node2
192.168.1.102 node3
192.168.1.103 node4
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
搭建NTP环境
使用Monitor服务器作为NTP server。另外3台作为NTP client。
NTP server
需安装NTP服务。运行命令:apt-get install ntp。
完毕后。改动配置文件/etc/ntp.conf。
由于环境不通外网,无法訪问Ubuntu时间源。而且,这个环境也没有其它的NTP时间源,因此。在这里,我们使用Monitor服务器作为NTP server的本地时间源。在文件末尾加入例如以下内容:
server 127.127.1.0 # 假设有其它的NTP源,能够更换这里的ip地址。
fudge 127.127.1.0 stratum 10
并注销掉以Ubuntu时间源的部分。
#pool 0.ubuntu.pool.ntp.org iburst
#pool 1.ubuntu.pool.ntp.org iburst
#pool 2.ubuntu.pool.ntp.org iburst
#pool 3.ubuntu.pool.ntp.org iburst
#pool ntp.ubuntu.com
改动完毕后,保存退出。并重新启动ntp服务,运行命令:service ntp restart。
注意:NTP服务刚重新启动时。须要一定的时间来同步时间源。不能立马提供服务。需一定时间后才干正常工作(一般5分钟左右)。可在NTP server端运行明令ntpq -p来查看服务状态。
NTP client
需安装ntpdate,运行命令:apt install ntpdate。
安装后,运行命令ntpdate [-d] {serverIp}来同步时间。
-d表示打开调试信息,可不打开。比如:
# ntpdate 109.105.115.67
成功时会出现相似提示:ntpdate[39600]: step time server 109.105.115.67 offset -46797.696033 sec。假设出现:ntpdate[28489]: no server suitable for synchronization found。可能是由于server还未能正常提供服务,等待一段时间后再次尝试。
同步成功后。还须要将时间写入硬件时钟,防止OS重新启动后时间恢复至原样。
运行命令hwclock –w。
安装SSH SERVER
在全部的节点上都安装SSH server服务。
# apt-get install openssh-server
由于我们搭建的Ceph直接使用root用户,所以须要改动ssh配置文件/etc/ssh/sshd_config。搜索PermitRootLogin选项。将其參数改为yes。保存退出文件,并重新启动SSH服务,运行命令:service ssh restart。
使用SSH免password登录
生成SSH keys。不要设置passphrase,全部的输入选项都直接回车。
# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
拷贝这个key到全部的节点。
# ssh-copy-id node1
# ssh-copy-id node2
# ssh-copy-id node3
# ssh-copy-id node4
设置网络代理(可选)
假设整个内网环境须要设置网络代理才干使用apt-get安装程序,那么须要在配置文件/etc/environment中加入,如:
http_proxy="http://[proxy-ip]:[proxy-port]"
https_proxy=https://[proxy-ip]:[proxy-port]
设置完毕后,运行命令:export http_proxy=”http://[proxy-ip]:[proxy-port]”; export https_proxy=https://[proxy-ip]:[proxy-port],使得配置马上生效。
注意:一定要在/etc/environment中配置,而不能在诸如/etc/profile、~/.profile等相似文件配置。
由于,安装ceph时。会使用ssh来连接远程节点并apt-get安装程序,但ssh仅仅能识别/etc/environment中的环境变量,设置在其它文件里会导致网络訪问失败。
注意二:全部节点都须要设置。
部署Ceph存储
这里。我们直接在Monitor节点node1上安装ceph-deploy。然后通过ceph-deploy在node1上部署Monitor,在node2和node3节点上部署OSD,最后。在node4上部署Ceph网关rgw。
在node1上创建一个文件夹。用来维护ceph-deploy生成的配置信息。ceph-deploy命令会在当前文件夹生成输出文件,确保运行该命令时位于相应的文件夹。
mkdir my-cluster
cd my-cluster
安装ceph-deploy
更新镜像仓库,并安装ceph-deploy。
apt-get update && sudo apt-get install ceph-deploy
又一次開始部署Ceph
在安装过程中假设遇到了问题。想又一次開始安装,运行下面命令来清空配置。
ceph-deploy purgedata {ceph-node} [{ceph-node}]
ceph-deploy forgetkeys
假设还想清空Ceph包,需运行:
ceph-deploy purge {ceph-node} [{ceph-node}]
注意:在实际的操作中。假设直接运行ceph-deploy purgedata。总是会报错,提示Ceph还安装在该节点上,拒绝运行清空操作。
因此我都是先运行ceph-deploy purge,再运行ceph-deploy purgedata和ceph-deploy forgetkeys。
部署Ceph
创建集群
ceph-deploy new {initial-monitor-node(s)}
如:
ceph-deploy new node1
在当前文件夹下使用ls和cat命令检查ceph-deploy输出结果,能够看到一个ceph配置文件,一个密钥环以及为新集群创建的日志文件。
改动osd參数
由于我们环境中仅仅有两个OSD,而Ceph模式的副本个数为3。因此我们须要改动配置文件Ceph.conf,在[global]部分添加例如以下配置:
osd pool default size = 2
假设OSD存储数据分区的文件系统类型不是xfs。则须要设置一些osd变量,否则OSD不能正常启动,报错为“ERROR: osd init failed: (36) File name too long”。相同,在Ceph.conf文件。[global]部分添加例如以下配置:
osd max object name len = 256
osd max object namespace len = 64
配置Ceph网络參数
假设环境中有多种网络,那么须要在Ceph.conf的[global]部分下添加例如以下配置。
public network = {ip-address}/{netmask}
假设环境中仅仅有一种网络,则不须要此配置。关于网络配置很多其它信息,可參考:http://docs.ceph.com/docs/master/rados/configuration/network-config-ref/
安装Ceph
ceph-deploy install {ceph-node}[{ceph-node} ...]
比如:
ceph-deploy install node1 node2 node3 node4
运行命令后。会在每一个节点上都安装Ceph。注意:假设运行过ceph-deploy purge命令,则须要又一次安装Ceph。
安装Monitor
安装并初始化Monitor,收集keys:
# ceph-deploy mon create-initial
运行完命令后。当前文件夹会生成例如以下keyring:
• {cluster-name}.client.admin.keyring
• {cluster-name}.bootstrap-osd.keyring
• {cluster-name}.bootstrap-mds.keyring
• {cluster-name}.bootstrap-rgw.keyring
创建OSD数据文件夹
OSD的数据文件夹能够使用单独的分区,也能够仅仅使用已有分区的文件夹。这里我们是直接使用文件夹的方式。
假设须要使用单独数据分区和日志分区。可參考: http://docs.ceph.com/docs/master/rados/deployment/ceph-deploy-osd/。
加入两个OSD。
# ssh node2
# sudo mkdir /var/local/osd0
# chown ceph:ceph /var/local/osd0
# exit
# ssh node3
# sudo mkdir /var/local/osd1
# chown ceph:ceph /var/local/osd1
# exit
准备OSD
ceph-deploy osd prepare {ceph-node}:/path/to/directory
如:
# ceph-deploy osd prepare node2:/var/local/osd0 node3:/var/local/osd1
激活OSD
ceph-deploy osd prepare {ceph-node}:/path/to/directory
如:
# ceph-deploy osd prepare node2:/var/local/osd0 node3:/var/local/osd1
拷贝配置文件和管理key
ceph-deploy admin {admin-node} {ceph-node}
如:
# ceph-deploy admin node1 node2 node3
确保ceph.client.admin.keyring的权限正确。在每一个节点上运行:
chmod +r /etc/ceph/ceph.client.admin.keyring
检查集群状态
# ceph –s
集群应该返回health HEALTH_OK,而且全部pg都是active+clean的状态,这样部署就全然没问题了。
部署rgw网关
假设要使用Ceph的对象存储。就须要部署rgw网关。
运行下面步骤创建一个新的rgw实例:
ceph-deploy rgw create {gateway-node}
如:
# ceph-deploy rgw create node4
验证Ceph
当显示状态健康时,可写入数据并查看数据。
创建一个普通文本文件testfile.txt,并向其写入数据。
创建一个pool。格式为:rados mkpool {pool-name},运行:
# rados mkpool data
将文件写入pool。格式为:rados put {object-name} {file-path} –pool={pool-name}。运行:
# rados put test-object-1 testfile.txt --pool=data
假设文件不大,应该非常快就写完并成功了。假设卡主较长时间,则可能是出错了,须要排查问题。
查看文件是否存在于pool中,格式为:rados -p {pool-name} ls,运行:
# rados -p data ls
确定文件的位置。格式为:ceph osd map {pool-name} {object-name},运行:
# ceph osd map data test-object-1
从pool中读取文件。
格式为:rados get {object-name} –pool={pool-name} {file-path} ,运行:
# rados get test-object-1 --pool=data myfile
可比对读出的文件myfile和原文件testfile.txt是否相同,运行命令:diff myfile testfile.txt。
从pool中删除文件。格式为:rados rm {object-name} –pool={pool-name},运行:
# rados rm test-object-1 --pool=data