ceph集群搭建与(文件存储块存储对象存储测试)

集群环境准备

准备工作:

准备四台服务器,需要能上外网,IP静态固定 (除client外每台最少加1个磁盘,不用分区);

1, 配置主机名和主机名绑定(所有节点都要绑定)

# hostnamectl set-hostname --static node1

# vim /etc/hosts
10.1.1.11	node1
10.1.1.12	node2
10.1.1.13	node3
10.1.1.14	client

2, 关闭防火墙,selinux(使用iptables -F清一下规则)

# systemctl stop firewalld
# systemctl disable firewalld

# iptables -F

# setenforce 0

3, 时间同步(启动ntpd服务并确认所有节点时间一致)

# systemctl restart ntpd
# systemctl enable ntpd

4, 配置yum源(所有节点都要配置,包括client)

  • 需要centos7默认的公网源+ceph本地源我这里把源放在/root/ceph_soft目录

    vim /etc/yum.repos.d/ceph.repo

    [local_ceph]
    name=local_ceph
    baseurl=file:///root/ceph_soft
    gpgcheck=0
    enabled=1

一,集群部署过程

1, 配置ssh免密

以node1为部署配置节点,在node1上配置ssh等效性(要求ssh node1,node2,node3 ,client都要免密码)

[root@node1 ~]# ssh-keygen 
[root@node1 ~]# ssh-copy-id  node1
[root@node1 ~]# ssh-copy-id  node2
[root@node1 ~]# ssh-copy-id  node3
[root@node1 ~]# ssh-copy-id  client

2, 在node1上安装部署工具

[root@node1 ~]# yum install ceph-deploy -y

3, ceph集群节点安装ceph

前面准备环境时已经准备好了yum源,在这里所有集群节点(不包括client)都安装软件

# yum install ceph ceph-radosgw -y

# ceph -v
ceph version 13.2.6 (02899bfda814146b021136e9d8e80eba494e1126) mimic (stable)

4, 客户端安装ceph-common

[root@client ~]# yum install ceph-common -y

5, 在node1上创建集群

建立一个集群配置目录

注意: 后面的大部分操作都会在此目录,所以需要cd进去操作=

[root@node1 ~]# mkdir /etc/ceph			# 有些版本可能已经创建好了,请直接cd进去操作即可
[root@node1 ~]# cd /etc/ceph

创建一个ceph集群

[root@node1 ceph]# ceph-deploy new node1

[root@node1 ceph]# ls
ceph.conf  ceph-deploy-ceph.log  ceph.mon.keyring

6, 创建mon

增加public网络用于监控,网段为ceph集群的IP段

在[global]配置段里添加下面一句(直接放到最后一行)
[root@node1 ceph]# vim /etc/ceph/ceph.conf 	
public network = 10.1.1.0/24			监控网络

监控节点初始化,并同步配置到所有节点(node1,node2,node3,不包括client)

[root@node1 ceph]# ceph-deploy mon create-initial
[root@node1 ceph]# ceph health			
HEALTH_OK										状态health(健康)

将配置文件信息同步到所有节点

[root@node1 ceph]# ceph-deploy admin node1 node2 node3

查看集群健康状态

因为ceph集群要求较高,请在后续的各种操作前都尽量确认一下集群状态为OK再进行操作*

[root@node1 ceph]# ceph -s
  cluster:
    id:     c05c1f28-ea78-41b7-b674-a069d90553ac
    health: HEALTH_OK							健康状态为OK

  services:
    mon: 1 daemons, quorum node1				1个监控
    mgr: no daemons active
    osd: 0 osds: 0 up, 0 in

  data:
    pools:   0 pools, 0 pgs
    objects: 0  objects, 0 B
    usage:   0 B used, 0 B / 0 B avail
    pgs:

为了防止mon单点故障,你可以加多个mon节点

[root@node1 ceph]# ceph-deploy mon add node2	
[root@node1 ceph]# ceph-deploy mon add node3

[root@node1 ceph]# ceph -s
  cluster:
    id:     c05c1f28-ea78-41b7-b674-a069d90553ac
    health: HEALTH_OK								健康状态为OK
 
  services:
    mon: 3 daemons, quorum node1,node2,node3		3个监控,quorum为仲裁
    mgr: no daemons active							
    osd: 0 osds: 0 up, 0 in
 
  data:
    pools:   0 pools, 0 pgs
    objects: 0  objects, 0 B
    usage:   0 B used, 0 B / 0 B avail
    pgs:     

7, 时间同步问题解决

ceph状态因为时间问题为HEALTH_WARN 解决办法

a, 调大时间警告的阈值

[root@node1 ceph]# vim ceph.conf
[global]								在global参数组里添加以下两行						
......
mon clock drift allowed = 2				# monitor间的时钟滴答数(默认0.5秒)
mon clock drift warn backoff = 30		# 调大时钟允许的偏移量(默认为5)

b, 同步到所有节点

[root@node1 ceph]# ceph-deploy --overwrite-conf admin node1 node2 node3

c, 所有ceph集群节点上重启ceph-mon.target服务

# systemctl restart ceph-mon.target

8, 创建mgr

[root@node1 ceph]# ceph-deploy mgr create node1

[root@node1 ceph]# ceph -s
  cluster:
    id:     c05c1f28-ea78-41b7-b674-a069d90553ac
    health: HEALTH_OK

  services:
    mon: 3 daemons, quorum node1,node2,node3
    mgr: node1(active)							node1为mgr
    osd: 0 osds: 0 up, 0 in

  data:
    pools:   0 pools, 0 pgs
    objects: 0  objects, 0 B
    usage:   0 B used, 0 B / 0 B avail
    pgs:

9, 创建osd

[root@node1 ceph]# ceph-deploy disk --help

[root@node1 ceph]# ceph-deploy osd --help

列表所有节点的磁盘,都有sda和sdb两个盘,sdb为我们要加入分布式存储的盘

列表查看节点上的磁盘
[root@node1 ceph]# ceph-deploy disk list node1
[root@node1 ceph]# ceph-deploy disk list node2
[root@node1 ceph]# ceph-deploy disk list node3


zap表示干掉磁盘上的数据,相当于格式化
[root@node1 ceph]# ceph-deploy disk zap node1 /dev/sdb
[root@node1 ceph]# ceph-deploy disk zap node2 /dev/sdb
[root@node1 ceph]# ceph-deploy disk zap node3 /dev/sdb

将磁盘创建为osd
[root@node1 ceph]# ceph-deploy osd create --data /dev/sdb node1
[root@node1 ceph]# ceph-deploy osd create --data /dev/sdb node2
[root@node1 ceph]# ceph-deploy osd create --data /dev/sdb node3

[root@node1 ceph]# ceph -s
  cluster:
    id:     c05c1f28-ea78-41b7-b674-a069d90553ac
    health: HEALTH_OK

  services:
    mon: 3 daemons, quorum node1,node2,node3
    mgr: node1(active)							
    osd: 0 osds: 0 up, 0 in

  data:
    pools:   0 pools, 0 pgs
    objects: 0  objects, 0 B
    usage:   0 B used, 0 B / 0 B avail
    pgs:

二、创建Ceph文件存储

第1步: 在node1部署节点上同步配置文件,并创建mds服务

[root@node1 ceph]# ceph-deploy mds create node1 node2 node3
我这里做三个mds

第2步: 一个Ceph文件系统需要至少两个RADOS存储池,一个用于数据,一个用于元数据。所以我们创建它们。

[root@node1 ceph]# ceph osd pool create cephfs_pool 128
pool 'cephfs_pool' created
[root@node1 ceph]# ceph osd pool create cephfs_metadata 64
pool 'cephfs_metadata' created

[root@node1 ceph]# ceph osd pool ls |grep cephfs
cephfs_pool
cephfs_metadata

第3步: 创建Ceph文件系统,并确认客户端访问的节点

[root@node1 ceph]# ceph fs new cephfs cephfs_metadata cephfs_pool
[root@node1 ceph]# ceph fs ls
name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_pool ]

[root@node1 ceph]# ceph mds stat
cephfs-1/1/1 up  {0=ceph_node3=up:active}, 2 up:standby		这里看到node3为up状态

第4步: 客户端准备验证key文件

在集群节点(node1,node2,node3)上任意一台查看密钥字符串

[root@node1 ~]# cat /etc/ceph/ceph.client.admin.keyring
[client.admin]
        key = AQDEKlJdiLlKAxAARx/PXR3glQqtvFFMhlhPmw==		后面的字符串就是验证需要的
        caps mds = "allow *"
        caps mgr = "allow *"
        caps mon = "allow *"
        caps osd = "allow *"

在客户端上创建一个文件记录密钥字符串

[root@client ~]# vim admin.key			# 创建一个密钥文件,复制粘贴上面得到的字符串
AQDEKlJdiLlKAxAARx/PXR3glQqtvFFMhlhPmw==

第5步: 客户端挂载(挂载ceph集群中跑了mon监控的节点, mon监控为6789端口)

[root@client ~]# mount -t ceph node1:6789:/ /mnt -o name=admin,secretfile=/root/admin.key

第6步: 验证

[root@client ~]# df -h |tail -1
node1:6789:/  3.8G     0  3.8G   0% /mnt 

三、创建Ceph块存储

第1步: 在node1上同步配置文件到client

[root@node1 ceph]# ceph-deploy admin client

第2步:建立存储池,并初始化

注意:在客户端操作

[root@client ~]# ceph osd pool create rbd_pool 128		
pool 'rbd_pool' created

[root@client ~]# rbd pool init rbd_pool

第3步:创建一个存储卷

[root@client ~]# rbd create volume1 --pool rbd_pool --size 5000

[root@client ~]# rbd ls rbd_pool
volume1

[root@client ~]# rbd info volume1 -p rbd_pool
rbd image 'volume1':						
        size 4.9 GiB in 1250 objects
        order 22 (4 MiB objects)
        id: 149256b8b4567
        block_name_prefix: rbd_data.149256b8b4567
        format: 2							
        features: layering, exclusive-lock, object-map, fast-diff, deep-flatten  
        op_features:
        flags:
        create_timestamp: Sat Aug 17 19:47:51 2019

第4步: 将创建的卷映射成块设备

  • 因为rbd镜像的一些特性,OS kernel并不支持,所以映射报错

    [root@client ~]# rbd map rbd_pool/volume1
    rbd: sysfs write failed
    RBD image feature set mismatch. You can disable features unsupported by the kernel with “rbd feature disable rbd_pool/volume1 object-map fast-diff deep-flatten”.
    In some cases useful info is found in syslog - try “dmesg | tail”.
    rbd: map failed: (6) No such device or address

  • 解决方法: disable掉相关特性

    [root@client ~]# rbd feature disable rbd_pool/volume1 exclusive-lock object-map fast-diff deep-flatten

  • 再次映射

    [root@client ~]# rbd map rbd_pool/volume1
    /dev/rbd0

第5步: 格式化,挂载

[root@client ~]# mkfs.xfs /dev/rbd0

[root@client ~]# mount /dev/rbd0 /mnt/

[root@client ~]# df -h |tail -1
/dev/rbd0        4.9G   33M  4.9G   1%   /mnt

四、Ceph对象存储

对象网关即为对象存储开放的接口。我这里在node1上创建rgw

[root@node1 ceph]# ceph-deploy rgw create node1

验证

[root@node1 ceph]# lsof -i:7480
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
radosgw 6748 ceph   40u  IPv4  49601      0t0  TCP *:7480 (LISTEN)

[root@node1 ceph]# ceph osd pool ls	
.rgw.root
default.rgw.control
default.rgw.meta
default.rgw.log
可以看到创建对象存储网关会自动帮助我们建立了以上4个pool

2, 客户端创建连接用户

创建用户

[root@client ~]# radosgw-admin user create --uid="testuser" --display-name="First User"
{
    "user_id": "testuser",
    "display_name": "First User",
    "email": "",
    ...
    ...

3, 保存客户端连接key

创建用户的一大段信息中,主要有用的为access_key与secret_key(需要保存好),用于客户端连接对象存储

[root@client ~]# radosgw-admin user create --uid='testuser' --display-name='First User' |grep -E 'access_key|secret_key'
            "access_key": "36ROCI84S5NSP4BPYL01",
            "secret_key": "jBOKH0v6J79bn8jaAF2oaWU7JvqTxqb4gjerWOFW"

4, 客户端安装s3

AmazonS3是一种面向Internet的对象存储服务.客户端需要安装s3cmd工具

[root@client ~]# yum install s3cmd

5, 客户端创建连接文件

创建并编写下面的文件

[root@client ~]# vim /root/.s3cfg
[default]
access_key = 36ROCI84S5NSP4BPYL01
secret_key = jBOKH0v6J79bn8jaAF2oaWU7JvqTxqb4gjerWOFW 
host_base = 10.1.1.11:7480
host_bucket = 10.1.1.11:7480/%(bucket)
cloudfront_host = 10.1.1.11:7480
use_https = False

6, 测试

[root@client ~]# s3cmd ls

建一个桶
[root@client ~]# s3cmd mb s3://test_bucket

上传文件到桶
[root@client ~]# s3cmd put /etc/fstab s3://test_bucket
upload: '/etc/fstab' -> 's3://test_bucket/fstab'  [1 of 1]
 501 of 501   100% in    1s   303.34 B/s  done
 
下载到当前目录
[root@client ~]# s3cmd get s3://test_bucket/fstab

你可能感兴趣的:(存储,ceph,分布式存储)