Ceph 是一个分布式存储,可以提供对象存储、块存储和文件存储,其中对象存储和块存储可以很好地和各大云平台集成。一个 Ceph 集群中有 Monitor 节点、MDS 节点(可选,用于文件存储)、至少两个 OSD 守护进程。
:OSD 守护进程,用于存储数据、处理数据拷贝、恢复、回滚、均衡,并通过心跳程序向 Monitor 提供部分监控信息。一个 Ceph 集群中至少需要两个 OSD 守护进程。
:维护集群的状态映射信息,包括 monitor、OSD、Placement Group(PG)。还维护了 Monitor、OSD 和 PG 的状态改变历史信息。
:存储 Ceph 文件系统的元数据。
4 台服务器:1 台作为 Monitor,1 台作为 OSD RGW,还有两台作为 OSD。ps:我们不搭建 CephFS。
所有服务器都安装 Ubuntu 16.04。
分别将 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
使用 Monitor 服务器作为 NTP server,另外 3 台作为 NTP client。
需安装 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 来查看服务状态。
需安装 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 服务。
- # apt-get install openssh-server
因为我们搭建的 Ceph 直接使用 root 用户,所以需要修改 ssh 配置文件 / etc/ssh/sshd_config,搜索 PermitRootLogin 选项,将其参数改为 yes。保存退出文件,并重启 SSH 服务,执行命令:service ssh restart。
生成 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=,使得配置立即生效。
注意:一定要在 / etc/environment 中配置,而不能在诸如 / etc/profile、~/.profile 等类似文件配置。因为,安装 ceph 时,会使用 ssh 来连接远程节点并 apt-get 安装程序,但 ssh 只能识别 / etc/environment 中的环境变量,设置在其他文件中会导致网络访问失败。
注意二:所有节点都需要设置。
这里,我们直接在 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。
- apt-get update && sudo apt-get install ceph-deploy
在安装过程中如果遇到了问题,想重新开始安装,执行以下命令来清空配置。
- 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 - deploy new {
- initial - monitor - node(s)
- }
如:
- ceph-deploy new node1
在当前目录下使用 ls 和 cat 命令检查 ceph-deploy 输出结果,可以看到一个 ceph 配置文件,一个密钥环以及为新集群创建的日志文件。
因为我们环境中只有两个 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.conf 的 [global] 部分下增加如下配置。
- public network = {
- ip - address
- }
- /{netmask}/
如果环境中只有一种网络,则不需要此配置。关于网络配置更多信息,可参考:
- ceph - deploy install {
- ceph - node
- } [{
- ceph - node
- }...]
例如:
- ceph-deploy install node1 node2 node3 node4
执行命令后,会在每个节点上都安装 Ceph。注意:如果执行过 ceph-deploy purge 命令,则需要重新安装 Ceph。
安装并初始化 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。
- # 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
- ceph - deploy osd prepare {
- ceph - node
- }: /path/to / directory
如:
- # ceph-deploy osd prepare node2:/var/local/osd0 node3:/var/local/osd1
- ceph - deploy osd prepare {
- ceph - node
- }: /path/to / directory
如:
- # ceph-deploy osd prepare node2:/var/local/osd0 node3:/var/local/osd1
- 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 的状态,这样部署就完全没问题了。
如果要使用 Ceph 的对象存储,就需要部署 rgw 网关。执行以下步骤创建一个新的 rgw 实例:
- ceph - deploy rgw create {
- gateway - node
- }
如:
- # ceph-deploy rgw create node4
当显示状态健康时,可写入数据并查看数据。
创建一个普通文本文件 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
- # rados rm test-object-1 --pool=data
来源: http://www.bubuko.com/infodetail-1953417.html