部署ceph集群

ceph是分布式文件系统

1.安装ceph-deploy

在admin节点添加Ceph的yum源仓库,然后再安装ceph-deploy

1.1启用extras仓库

//如果是别的源就用别的源
sudo subscription-manager repos --enable=rhel-7-server-extras-rpms

1.2安装并使用Extra Packages for Enterprise Linux (EPEL)仓库

sudo yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

1.3 添加ceph仓库

添加ceph仓库到/etc/yum.repos.d/ceph.repo 。把{ceph-stable-release}替换为你想要的ceph版本,如luminous

cat << EOM > /etc/yum.repos.d/ceph.repo
[ceph-noarch]
name=Ceph noarch packages
baseurl=https://download.ceph.com/rpm-luminous/el7/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc

[ceph]
name=Ceph packages for $basearch
baseurl=http://download.ceph.com/rpm-luminous/el7/$basearch
enabled=1
priority=2
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc

[ceph-source]
name=Ceph source packages
baseurl=http://download.ceph.com/rpm-luminous/el7/SRPMS
enabled=0
priority=2
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
EOM

更新仓库(可选)并安装ceph-deploy

sudo yum update
sudo yum install ceph-deploy

2.ceph节点安装

admin节点必须可以免密通过ssh登录ceph节点。当ceph-deploy作为一个用户登录到ceph node的时候,这个用户必须拥有免密的sudo权限。

2.1 安装ntp

ntp是网络时间同步工具,可以同步各个节点的时间。

建议在ceph节点(特别是ceph monitor节点)安装ntp,以防止时间错误。

sudo yum install ntp ntpdate ntp-doc

如果提示有冲突,就先删除已有的相关软件,然后再执行一次。

确保已经开启了ntp服务,并确保每个节点的ntp都使用了一样的server。

//1.配置启动项
chkconfig ntpd on
//2.同步时间
ntpdate -u cn.pool.ntp.org
//3.启动ntpd服务
systemctl start ntpd
//4.验证ntp服务已经运行
pgrep ntpd

2.2 安装ssh server

所有的ceph node都需要执行以下步骤:
1.每个节点都安装ssh server

sudo yum install openssh-server

2.确保ssh server在所有ceph node上都在运行。

2.3创建一个ceph部署用户

ceph-deploy必须要作为一个拥有免密sudo权限的用户登录到ceph node,因为它需要在不提供密码的情况下安装软件与配置文件。

最近版本的ceph-deploy提供了一个–username选项去让你指定任意拥有免密sudo权限的用户(包括root,但是不建议用root)。想要使用ceph-deploy的–username {username},你指定的用户必须拥有免密ssh权限登录ceph node,因为ceph deploy不会问你要密码。

ceph推荐在所有ceph node上为ceph-deploy创建特定用户。但是不要用“ceph”作为用户名。集群内采用统一的用户名可以降低使用难度(不必须),但是你要避免使用太明显的用户名,因为黑客会使用一般的用户名进行攻击(比如root,admin,产品名)。下面解释如何创建免密sudo权限用户:

1.在每个ceph节点创建新用户

注意,在admin节点也是这个用户,用户名最好一致!

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}

2.4 实现免密ssh登录

由于ceph-deploy不会提示输入密码,你必须在admin node生成ssh keys并且分发公钥给每个ceph node。

1.生成ssh keys,但是不要使用sudo或是root用户,把passphrase留空:

ssh-keygen

Generating public/private key pair.
Enter file in which to save the key (/ceph-admin/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /ceph-admin/.ssh/id_rsa.
Your public key has been saved in /ceph-admin/.ssh/id_rsa.pub.

2.复制公钥到ceph node,把{username}替换为你创建的ceph deploy用户,把node替换为ceph node的ip。

ssh-copy-id {username}@node1
ssh-copy-id {username}@node2
ssh-copy-id {username}@node3

3.(建议)在admin node上修改~/.ssh/config文件,这样的话ceph-deploy可以在你每次用ceph-deploy登录到ceph node的ceph-deploy用户,而不需要你指定–username {username}。这有利于简化ssh和scp的使用。

Host node1
   Hostname node1
   User {username}
Host node2
   Hostname node2
   User {username}
Host node3
   Hostname node3
   User {username}

2.5 在启动时启用网络

ceph osds通过网络彼此协作或向ceph monitors报告。如果网络默认关闭,ceph集群就无法在启动过程中联网,直到你连接上网络。

一些lunix发行版(如centos)的网络接口默认关闭。为了确认ceph守护进程可以彼此沟通,需要确认网络接口开启。例如,在rh与centos,查看/etc/sysconfig/network-scripts下的ifcfg-{iface}文件里的ONBOOT设置为yes。

2.6 确保连通性

通过ping hostnames(hostname -s)来确保联通性。

note: hostnames需要解析到ip地址,但不能是127.0.0.1。如果你的admin node也被作为一个ceph node,你同样需要确保它解析hostname到ip地址。

2.7开启需要到端口

如果把防火墙关了就不用看这一步

ceph monitor默认通过6789端口进行沟通。ceph osds默认通过6800:7300之间的端口沟通。Ceph OSDs可以使用多个网络与clients,monitors,其他osds(为了复制),其他osd(为了心跳信号)。

一些发行版(如rh),默认防火墙配置很严格。你也许需要去调整你的防火墙设定去允许访问申请,这样网络内的守护进程可以交流。

rh7的防火墙,在public zone,为ceph monitor节点添加ceph-min service,为OSDs and MDSs添加ceph service,并确保您将设置设置为永久性(permanent)的,以便在重新启动时启用它们。

例如,在monitors:

sudo firewall-cmd --zone=public --add-service=ceph-mon --permanent

在osds 和 mdss:

sudo firewall-cmd --zone=public --add-service=ceph --permanent

一旦你在防火墙配置里加了--permanent,你可以通过重启防火墙来动态更改配置:

sudo firewall-cmd --reload

对于iptables(与firewall一样功能的另一种防火墙管理工具),为ceph monitors添加6789端口,为ceph osds添加6800:7300端口,例如

sudo iptables -A INPUT -i {iface} -p tcp -s {ip-address}/{netmask} --dport 6789 -j ACCEPT

一旦你完成来iptables的配置,确保你当的节点重启时,你的这些变更是持久化的。例如:

/sbin/service iptables save

2.7 tty

On CentOS and RHEL, you may receive an error while trying to execute ceph-deploy commands. If requiretty is set by default on your Ceph nodes, disable it by executing sudo visudo and locate the Defaults requiretty setting. Change it to Defaults:ceph !requiretty or comment it out to ensure that ceph-deploy can connect using the user you created with Create a Ceph Deploy User.

Note If editing, /etc/sudoers, ensure that you use sudo visudo rather than a text editor.

2.8 selinux

在centos和rh,selinux默认是开启的。为了经验你的安装,建议关闭selinux并且确保您的安装和集群在加强配置之前正常工作。用以下代码关闭selunix:

sudo setenforce 0

修改/etc/selinux/config文件来永久关闭selinux:

SELINUX=disabled

2.9首选项

确保你的package manager安装并启用了首选项包。centos,你也许需要安装epel(第一步我们已经安装了)。在rh,你也许需要启用可选仓库。

sudo yum install yum-plugin-priorities

例如,在rh7,执行以下代码去安装yum-plugin-priorities且启用rhel-7-server-optional-rpms仓库:

sudo yum install yum-plugin-priorities --enablerepo=rhel-7-server-optional-rpms

3.快速开始

前2步我们做好了安装ceph的前期准备工作,下面开始正式安装ceph。

在admin node上创建一个目录,用来存放ceph-deploy为集群生成的配置文件和key。

mkdir my-cluster
cd my-cluster

ceph-deploy会输出文件到这个目录,一定要确保在当前目录下执行ceph-deploy。

3.1开始之前的注意事项

如果在任何时候,你遇到了问题并且向重新开始,执行以下命令去删除ceph packages,并且删除所有的与之相关的data和配置:

ceph-deploy purge {ceph-node} [{ceph-node}]
ceph-deploy purgedata {ceph-node} [{ceph-node}]
ceph-deploy forgetkeys
rm ceph.*

如果你执行了删除,以必须重新安装ceph。最后一个命令删除了所有ceph-deploy在安装过程中写入的文件。

3.2创建集群

在admin node的你创建的用来保存配置文件的目录(my-cluster)下,用ceph-deploy执行以下步骤:

1.创建集群:
注意,如果你为ceph-deploy创建的用户,例如:userceph,那么在admin node上执行ceph-deploy 命令的用户也要是ceph-deploy

ceph-deploy new {initial-monitor-node(s)}

指定节点的hostname(所以你要去/etc/hosts里加入集群内的主机信息),fqdn(不知道是啥)或hostname:fqdn,例如:

ceph-deploy new node1

用ls和cat命令去检查当前目录的输出。你会看到一个ceph的配置文件(ceph.conf),一个monitor secret keyring(ceph.mon.keyring),还有一个关于新集群的日志文件。可以通过ceph-deploy new -h查看详细信息

3.3 安装ceph包

在各个ceph节点安装ceph

ceph-deploy install {ceph-node} [...]

例如:

ceph-deploy install node1 node2 node3

ceph-deploy将会在每个节点安装ceph
也可以自己手动安装

sudo yum -y install ceph ceph-osd ceph-mds ceph-mon ceph-radosgw

3.4部署初始monitor并收集keys

初始化monitor

ceph-deploy mon create-initial

一旦你完成了这一步,你的当前目录将会看到如下keyrings:
- ceph.client.admin.keyring
- ceph.bootstrap-mgr.keyring
- ceph.bootstrap-osd.keyring
- ceph.bootstrap-mds.keyring
- ceph.bootstrap-rgw.keyring
- ceph.bootstrap-rbd.keyring

如果进程失败且返回一个类似于“Unable to find /etc/ceph/ceph.client.admin.keyring”的错误信息,请确保ceph.conf中的monitor node的ip是公共ip(也就是可以ping通咯),不是私有ip(如127.0.0.1)

3.5 复制配置文件和key

上一步我们初始化了monitor并生成了keyring,现在我们通过ceph-deploy拷贝配置文件和admin key到admin node和ceph node,这样的话你就可以在使用ceph cli时不用每次都去指定monitor address和ceph.client.admin.keyring。

ceph-deploy admin {ceph-node(s)}

例如

ceph-deploy admin node1 node2 node3

3.6部署manager daemon(只有luminous+ 版本需要)

ceph-deploy mgr create node1  *Required only for luminous+ builds, i.e >= 12.x builds*

3.7添加三个osd

这一步,假设你在每个节点都有一个没有使用的硬盘,名字是/dev/vdb。确认这个硬盘没有在使用且没有含有任何重要数据。

ceph-deploy osd create –data {device} {ceph-node}

例如

ceph-deploy osd create --data /dev/vdb node1
ceph-deploy osd create --data /dev/vdb node2
ceph-deploy osd create --data /dev/vdb node3

==注意:我安装的时候,osd节点的机器硬盘被lvm(逻辑卷,也就是/dev/mapper/下的的东西)占用了。可以用lvs,lvdisplay,pvs,pvdisplay分别查看逻辑卷和物理卷的详细情况。我移除了逻辑卷,释放了物理卷/dev/sdc==

3.8 检查集群健康状况

ssh node1 sudo ceph health

你的集群应该返回HEALTH_OK。你可以通过以下代码查看更详细的集群状态:

ssh node1 sudo ceph -s

4.扩展集群

一旦你有了一个基础集群并正在运行,下一步就是去扩展集群。添加一个Ceph Metadata Server到node1。然后添加一个Ceph Monitor和Ceph Manager到node2和node3去实现可靠性和可用性。

4.1 添加一个metadata server

想要使用CephFS,你需要至少一个metadata server。执行以下命令去创建一个metadata server:

ceph-deploy mds create {ceph-node}

例如

ceph-deploy mds create node1

4.2 添加monitors

一个ceph存储集群需要至少一个monitor和一个manager去运行。为了高可用,ceoh存储集群一般运行多个monitors,这样的话某个monitor失效了不会拖累整个集群。ceph使用Ceph使用Paxos算法,这需要大多数monitor(也就是说,比monitor总数的一半还多)去组成一个quorum。奇数的monitor往往更好,但这不是必需的。
添加两个ceph monitor到集群:

ceph-deploy mon add {ceph-nodes}

例如:

ceph-deploy mon add node2 node3

注意,如果安装过程中报错了。请做如下处理:

#1.编辑admin节点的之前生成的cenf.conf文件,
#把你要添加的节点hostname,ip加进去
#并加入public_network
[global]
fsid = a443f987-c3d2-4e7e-9783-82640b97814d
mon_initial_members = ERP-CEPH-TEST2,ERP-CEPH-TEST3
mon_host = 10.59.1.136,10.59.1.137
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
public_network = 10.59.1.0/24

#3.再执行一次mon add
ceph-deploy --overwrite-conf mon add node2 node3

一旦你添加了新的monitor,ceph将会开始同步这个monitor并且组成quorum。你可以通过以下命令查看quorum状态:

ceph quorum_status --format json-pretty

tip:当你运行多个monitor时,你需要在每个monitor机器上安装配置ntp。确保ntp与monitor一同运行

4.3添加managers

ceph manager守护进程使用activ/stanby模式。部署额外的manager守护进程可以确保当一个守护进程或节点失效时,另外一个可以接管而不影响服务。

用以下代码去部署额外的manager守护进程:

ceph-deploy mgr create node2 node3

你应该可以通过以下命令看到处于standby状态的managers:

ssh node1 sudo ceph -s

4.4添加一个RGW实例

想要使用Ceph Object Gateway组件,你必须部署一个rgw实例。执行以下代码去创建一个rgw实例:

ceph-deploy rgw create {gateway-node}

例如:

ceph-deploy rgw create node1

默认情况下,rgw监听7480端口。这个默认端口可以通过编辑运行rgw的节点上的ceph.conf来实现:

[client]
rgw frontends = civetweb port=80

如果用的是ipv6:

[client]
rgw frontends = civetweb port=[::]:80

5.存储/检索对象数据

想要在ceph存储集群里存储object data,一个ceph客户端必须:
1. 设置一个object name
2. 指定一个pool

Ceph Client检索最新的集群映射,CRUSH算法计算如何将对象映射到placement group,然后计算如何动态地将placement group分配给Ceph OSD守护进程。想要找到object地址,你只需要object名称和pool名称。例如:

ceph osd map {poolname} {object-name}

练习:

1.创建一个文件,指定它的object name,并存入指定pool里

echo {Test-data} > testfile.txt
ceph osd pool create mytest 8
rados put {object-name} {file-path} --pool=mytest
rados put test-object-1 testfile.txt --pool=mytest

2.通过以下命令查看mytest pool里存储的对象

rados -p mytest ls

3.查看object存储位置

ceph osd map {pool-name} {object-name}
ceph osd map mytest test-object-1

4.删除存储的对象

rados rm test-object-1 --pool=mytest

5.删除pool

ceph osd pool rm mytest

注意,因为安全原因,ceph会报错,提示你要把poll名重复两次并加上--yes-i-really-really-mean-it

eph osd pool rm mytest mytest --yes-i-really-really-mean-it

但是即使这样也还会报错,进一步提示你要设置mon节点的ceph.conf的内容,加上:

[mon]
mon_allow_pool_delete = true

这个内容我只在一个mon节点里加上了,然后在另一个节点执行了删除,也生效了。

然后再执行以上删除步骤,就可以删除了。

展开阅读全文

没有更多推荐了,返回首页