背景

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免密码登录

生成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

Ceph部署(一)集群搭建的更多相关文章

  1. kafka系列一、kafka安装及部署、集群搭建

    一.环境准备 操作系统:Cent OS 7 Kafka版本:kafka_2.10 Kafka官网下载:请点击 JDK版本:1.8.0_171 zookeeper-3.4.10 二.kafka安装配置 ...

  2. 初试 Centos7 上 Ceph 存储集群搭建

    转载自:https://cloud.tencent.com/developer/article/1010539 1.Ceph 介绍 Ceph 是一个开源的分布式存储系统,包括对象存储.块设备.文件系统 ...

  3. Ceph 存储集群搭建

    前言 Ceph 分布式存储系统,在企业中应用面较广 初步了解并学会使用很有必要 一.简介 Ceph 是一个开源的分布式存储系统,包括对象存储.块设备.文件系统.它具有高可靠性.安装方便.管理简便.能够 ...

  4. 主从集群搭建及容灾部署redis

    redis主从集群搭建及容灾部署(哨兵sentinel) Redis也用了一段时间了,记录一下相关集群搭建及配置详解,方便后续使用查阅. 提纲 l  Redis安装 l  整体架构 l  Redis主 ...

  5. CDH集群搭建部署

    1. 硬件准备     使用了五台机器,其中两台8c16g,三台4c8g.一台4c8g用于搭建cmServer和NFS服务端,另外4台作为cloudera-manager agent部署CDH集群. ...

  6. apigateway-kong(五)集群搭建部署

    kong 集群将使得系统通过增加更多机器,从而实现水平扩展,承接更多的请求流量.它们将共享同样的配置且使用同一个数据库.kong 集群中的的所有节点都连接同一个数据库. 你需要在 kong 集群的上一 ...

  7. redis主从集群搭建及容灾部署(哨兵sentinel)

    Redis也用了一段时间了,记录一下相关集群搭建及配置详解,方便后续使用查阅. 提纲 Redis安装 整体架构 Redis主从结构搭建 Redis容灾部署(哨兵sentinel) Redis常见问题 ...

  8. 分布式实时日志系统(一)环境搭建之 Jstorm 集群搭建过程/Jstorm集群一键安装部署

    最近公司业务数据量越来越大,以前的基于消息队列的日志系统越来越难以满足目前的业务量,表现为消息积压,日志延迟,日志存储日期过短,所以,我们开始着手要重新设计这块,业界已经有了比较成熟的流程,即基于流式 ...

  9. .Net Core2.1 秒杀项目一步步实现CI/CD(Centos7.2)系列一:k8s高可用集群搭建总结以及部署API到k8s

    前言:本系列博客又更新了,是博主研究很长时间,亲自动手实践过后的心得,k8s集群是购买了5台阿里云服务器部署的,这个集群差不多搞了一周时间,关于k8s的知识点,我也是刚入门,这方面的知识建议参考博客园 ...

  10. 阿里云ECS服务器部署HADOOP集群(一):Hadoop完全分布式集群环境搭建

    准备: 两台配置CentOS 7.3的阿里云ECS服务器: hadoop-2.7.3.tar.gz安装包: jdk-8u77-linux-x64.tar.gz安装包: hostname及IP的配置: ...

随机推荐

  1. shell 踩坑记

    变量赋值时,等号两边不能有空格: 在判断表达式中,不论是 [ -n "$1" ] 还是 [ -f  "$1" ] 都要在变量两侧加上双引号: 在使用与或非判断式 ...

  2. JavaScript的DOM编程--03--读写属性节点

    读写属性节点: 1)可以直接通过 cityNode.id 这样的方式来获取和设置属性节点的值 2)通过元素节点的 getAttributeNode 方法来获取属性节点, 然后在通过 nodeValue ...

  3. Django__Ready

    Python WEB框架 : DJango : 大而全 flask : 小而精 tornado : 下载DJango : PIP3 INSTALL DJANGO 创建DJango项目 : django ...

  4. 如何使用MOQ进行单元测试

    使用MOQ来伪装和隔离被依赖对象,从而提高被测对象的测试效果. 安装 通过http://code.google.com/p/moq可以下载MOQ的最新版本.在SSL项目中,我们使用的是MOQ 3.1. ...

  5. leetcode — linked-list-cycle-ii

    /** * Source : https://oj.leetcode.com/problems/linked-list-cycle-ii/ * * Given a linked list, retur ...

  6. 一步步实现滑动验证码,Java图片处理关键代码

    最近滑动验证码在很多网站逐步流行起来,一方面对用户体验来说,比较新颖,操作简单,另一方面相对图形验证码来说,安全性并没有很大的降低.当然到目前为止,没有绝对的安全验证,只是不断增加攻击者的绕过成本. ...

  7. Vista 及后续版本的新线程池

    在上一篇的博文中,说了下老版本的线程池,在Vista之后,微软重新设计了一套线程池机制,并引入一组新的线程池API,新版线程池相对于老版本的来说,它的可控性更高,它允许程序员自己定义线程池,并规定线程 ...

  8. three.js 相机

    图形学中的相机定义了三维空间到二维屏幕的投影方式,根据投影方式的不同,相机可分为 正交投影相机 与 透视投影相机. 正交投影相机 : 近处.远处的物体大小尺寸保持一致,常适用于工程制图.建模软件,如C ...

  9. 手把手教你构建 Kubernetes 1.8 + Flannel 网络(一)

    一.环境说明 操作系统:CentOS7 Kubernetes版本:v1.8.4 Docker版本:v17.06-ce Flannel 版本: flannel-v0.9.1 二.Ntp 服务器配置   ...

  10. 找出生成json中的error_code,并加以处理

    需求: 前段时间调用了百度AI的分词接口,因为不完全支持并发,一些调用产生了错误,混在json内部. 现在需要将未调用成功的内容重新调用一遍. 思考过程: 方法一: 开始想到的是调用的过程当中,如果报 ...