zoukankan      html  css  js  c++  java
  • docker+ceph实现私网云盘

    ceph+docker方式搭建owncloud实现私网云盘

    项目背景

    企业应用中越来越多的会使用容器技术来是实现解决方案

    1、单节点的docker和docker-compose

    2、多节点的docker swarm集群

    3、多节点的k8s集群

    以上都是可以基于容器技术实现企业应用的编排和快速部署

    在特别大型的业务架构中, 数据达到T级别,P级别,甚至E级别或更高。如此大量 的数据,我们需要保证它的数据读写性能, 数据可靠性, 在线扩容等, 并且希望能 与容器技术整合使用。
    ceph分布式存储是非常不错的开源解决方案
    目前ceph在docker swarm集群与kubernetes集群中已经可以实现对接使用。 虽然3种类型存储并不是在任何场合都支持,但开源社区中也有相应的解决方 案,也会越来越成熟。
    下面我们就使用ceph做底层存储, 分别在docker节点,docker swarm集 群,kubernetes集群中对接应用打造私有云盘与web应用。

    项目架构图

    1587473152092

    PS:在架构图中写的比较全,但是在这个项目中不会全部做完,只是ceph集群加单台docker部署owncloud,实现云盘的功能,并没有docker集群的操作。

    四台主机

    系统版本为7.6 1810

    ceph1 10.0.0.5 作为管理ceph集群的节点,它自身也在集群中

    ceph2 10.0.0.6 组成ceph集群

    ceph3 10.0.0.41 组成ceph集群

    owncloud 10.0.0.63 docker部署owncloud

    部署过程

    准备过程
    1、所有节点配置静态IP地址(要求能上公网)(ceph1举例)
    [root@ceph1 yum.repos.d 04:14:18]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
    TYPE=Ethernet
    PROXY_METHOD=none
    BROWSER_ONLY=no
    BOOTPROTO=static
    DEFROUTE=yes
    IPV4_FAILURE_FATAL=no
    IPV6INIT=yes
    IPV6_AUTOCONF=yes
    IPV6_DEFROUTE=yes
    IPV6_FAILURE_FATAL=no
    IPV6_ADDR_GEN_MODE=stable-privacy
    NAME=eth0
    DEVICE=eth0
    ONBOOT=yes
    IPADDR=10.0.0.5
    NETMASK=255.255.255.0
    GATEWAY=10.0.0.254
    DNS1=223.5.5.5
    
    2、所有节点主机名配置在/etc/hosts文件中

    (ceph1举例)

    [root@ceph1 yum.repos.d 04:14:36]# cat /etc/hosts
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    10.0.0.5 ceph1
    10.0.0.6 ceph2
    10.0.0.41 ceph3
    10.0.0.63 owncloud
    

    说明:还有没有开始部署的节点,也请先把IP地址和主机名进行绑定到/etc/hosts中

    3、所有节点关闭centos7的firewalld房防火墙,iptables规则清空
    # systemctl stop firewalld # systemctl disable firewalld
    
    # yum install iptables-services -y # systemctl restart iptables # systemctl enable iptables
    
    # iptables -F # iptables -F -t nat # iptables -F -t mangle # iptables -F -t raw
    
    # service iptables save iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]
    
    4、所有节点关闭selinux
    [root@ceph1 yum.repos.d 04:16:08]# cat /etc/selinux/config
    
    # This file controls the state of SELinux on the system.
    
    # SELINUX= can take one of these three values:
    
    # enforcing - SELinux security policy is enforced.
    
    # permissive - SELinux prints warnings instead of enforcing.
    
    # disabled - No SELinux policy is loaded.
    
    SELINUX=disabled
    
    # SELINUXTYPE= can take one of three values:
    
    # targeted - Targeted processes are protected,
    
    # minimum - Modification of targeted policy. Only selected processes are protected.
    
    # mls - Multi Level Security protection.
    
    SELINUXTYPE=targeted
    
    [root@ceph1 yum.repos.d 04:18:09]# getenforce
    Disabled
    
    
    
    
    
    5、同步时间
    # systemctl restart ntpd 
    # systemctl enabled ntpd
    

    PS:准备工作是在所有节点都进行操作的

    部署开始
    1、添加ceph的yum源
    [root@ceph1 yum.repos.d 02:40:54]# cat ceph.repo
    [ceph]
    name=ceph
    baseurl=https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-mimic/el7/x86_64/
    enabled=1
    gpgcheck=0
    priority=1
    
    [ceph-noarch]
    name=cephnoarch
    baseurl=https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-mimic/el7/noarch/
    enabled=1
    gpgcheck=0
    priority=1
    
    [ceph-source]
    name=Ceph source packages
    baseurl=https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-mimic/el7/SRPMS/
    enabled=1
    gpgcheck=0
    priority=1
    
    [root@ceph1 yum.repos.d 02:40:57]#
    

    注释:我这里使用的清华源,也可以使用阿里源或者是搭建本地yum源(搭建本地yum源的前提是将所有的rpm下载到本地)

    将此ceph.repo拷贝到其他所有节点

    2、配置ceph集群ssh免密

    以ceph1为部署节点,在ceph1上配置到其他节点的ssh免密

    目的:因为ceph集群会经常同步配置文件到其他节点,免密会方便很多

    [root@ceph1 ~]# ssh-keygen            # 三次回车做成空密码密钥[root@ceph_node1 ~]# ssh-copy-id ceph1 
    [root@ceph_node1 ~]# ssh-copy-id ceph2 
    [root@ceph_node1 ~]# ssh-copy-id ceph3 
    [root@ceph_node1 ~]# ssh-copy-id owncloud 
    
    
    
    
    3、在ceph1上安装部署工具

    其他节点不需要安装

    yum install -y  python-setuptools.noarch  #先安装一个模块
    
     yum install ceph-deploy -y  #安装部署工具
    
    
    4、在ceph1上创建集群

    创建一个集群配置目录

    注意:后面大部分的操作都在这个目录中操作

    mkdir /etc/ceph
     cd /etc/ceph
    
    

    创建一个ceph1集群

    ceph-deploy new  ceph1
    
    
    [root@ceph1 ceph 06:41:01]# ll
    total 16
    -rw-r--r-- 1 root root  191 Apr 21 02:38 ceph.conf
    -rw-r--r-- 1 root root 2917 Apr 21 02:38 ceph-deploy-ceph.log
    -rw------- 1 root root   73 Apr 21 02:38 ceph.mon.keyring
    -rw-r--r-- 1 root root   92 Apr 16 12:47 rbdmap
    [root@ceph1 ceph 06:42:02]#
    
    

    说明:

    ceph.conf 集群配置文件
    
    ceph-deploy-ceph.log  使用ceph-deploy部署的日志记录
    
    ceph.mon.keyring   验证key文件
    
    
    5、安装ceph软件

    在所有ceph集群节点安装ceph与ceph-radosgw软件包

    [root@ceph1 ceph 06:42:32]# ceph -v
    ceph version 13.2.9 (58a2a9b31fd08d8bb3089fce0e312331502ff945) mimic (stable)
    [root@ceph1 ceph 06:42:36]#
    
    

    补充说明:如果网速够好的话,可以使用ceph-deploy install ceph1 ceph2 ceph3 命令来安装。ceph-deploy命令会自动通过公网官方源安装。(网速不给力就不要使用这种方式了)

    在ceph客户端节点(k8s集群节点上)安装ceph-common

    # yum install ceph-common -y
    
    
    创建mon监控组件

    增加监控网络,网段为实验环境的集群物理网络

    [root@ceph1 ceph 06:50:47]# cat /etc/ceph/ceph.conf
    [global]
    fsid = bb1d01eb-0d72-4794-9d7c-cb692d7a8f34
    mon_initial_members = ceph1
    mon_host = 10.0.0.5
    auth_cluster_required = cephx
    auth_service_required = cephx
    auth_client_required = cephx
    
    public network = 10.0.0.0/24  #添加的配置,监控网络
    
    
    1、集群节点初始化
    [root@ceph1 ceph 06:52:13]# ceph-deploy mon create-initial
    [root@ceph1 ceph 06:52:05]# ceph health
    HEALTH_OK
    
    
    
    2、将配置文件信息同步到所有的ceph集群节点
    ceph-deploy admin ceph1 ceph2 ceph3
    
    
    [root@ceph1 ceph 06:57:15]# ceph -s
      cluster:
        id:     bb1d01eb-0d72-4794-9d7c-cb692d7a8f34
        health: HEALTH_OK
    
      services:
        mon: 1 daemons, quorum ceph1
        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:
    
    [root@ceph1 ceph 06:57:19]#
    
    
    

    此时集群已经搭建好了

    3、多个mon节点

    为了防止mon节点单点故障,你可以添加多个mon节点(非必要步骤)

    ceph-deploy mon add ceph2
    ceph-deploy mon add ceph3
    
    
    [root@ceph1 ceph 06:59:11]# ceph -s
      cluster:
        id:     bb1d01eb-0d72-4794-9d7c-cb692d7a8f34
        health: HEALTH_OK
    健康状态为ok
      services:
        mon: 3 daemons, quorum ceph1,ceph2,ceph3  三个监控
        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:
    
    
    监控到时间不同不的解决方法

    ceph集群对时间同步的要求非常高,即使你已经将ntpd服务开启,但仍然有可能会有clock skew deteted相关警告

    可以尝试如下做法:

    1、在ceph集群节点上使用crontab同步
    # systemctl stop ntpd # systemctl disable ntpd
    
    # crontab -e */10 * * * * ntpdate ntp1.aliyun.com                每5或10 分钟同步1次公网的任意时间服务器
    
    
    2、调大时间警告的阈值
    [root@ceph_node1 ceph]# vim ceph.conf 
    [global]                                在global参数组里添加 以下两行                       ...... 
    mon clock drift allowed = 2             # monitor间的时钟滴 答数(默认0.5秒) 
    mon clock drift warn backoff = 30       # 调大时钟允许的偏移量 (默认为5)
    
    
    3、同步到所有节点
    [root@ceph_node1 ceph]# ceph-deploy --overwrite-conf admin ceph_node1 ceph_node2 ceph_node3
    
    前面第1次同步不需要加--overwrite-conf参数 这次修改ceph.conf再同步就需要加--overwrite-conf参数覆盖
    
    
    4、所有ceph集群节点上重启ceph-mon.target服务
    systemctl  restart  ceph-mon.target
    
    
    创建mgr管理组件

    ceph luminous版本之后新增加了一个组件:ceph manager daemon ,简称ceph-mgr

    该组件的主要作用是分担和扩展monitor的部分功能,减轻monitor的负担,让更好的管理ceph存储系统

    ceph dashboard图形化管理就用到了mgr

    1、创建一个mgr
    [root@ceph1 ceph 07:11:17]# ceph-deploy mgr  create ceph1
    
    

    查看一下

    [root@ceph1 ceph 07:11:32]# ceph -s
      cluster:
        id:     bb1d01eb-0d72-4794-9d7c-cb692d7a8f34
        health: HEALTH_OK
    
      services:
        mon: 3 daemons, quorum ceph1,ceph2,ceph3
        mgr: ceph1(active) 这里就是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:
    
    
    2、添加多个mgr可以实现HA
     ceph-deploy mgr  create ceph2
     ceph-deploy mgr  create ceph3
    
    
    [root@ceph1 ceph 07:13:12]# ceph -s
      cluster:
        id:     bb1d01eb-0d72-4794-9d7c-cb692d7a8f34
        health: HEALTH_WARN
                OSD count 0 < osd_pool_default_size 3
    
      services:
        mon: 3 daemons, quorum ceph1,ceph2,ceph3  三个监控
        mgr: ceph1(active), standbys: ceph2, ceph3    ceph1为主mgr
        osd: 0 osds: 0 up, 0 in
    看到0个磁盘
      data:
        pools:   0 pools, 0 pgs
        objects: 0  objects, 0 B
        usage:   0 B used, 0 B / 0 B avail
        pgs:
    
    [root@ceph1 ceph 07:13:19]#
    
    

    至此ceph集群基本已经搭建完成,但是还需要增加OSD磁盘

    ceph集群管理
    1、物理上添加磁盘

    在ceph集群所有节点上增加磁盘

    (我这里只是模拟,就增加一个5G的做测试使用)

    1587468133938

    ceph1 ceph2 ceph3 三个节点上都要进行操作

    不重启让系统识别新增加的磁盘

    操作之前

    [root@ceph1 ceph 07:13:19]# lsblk
    NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda               8:0    0   50G  0 disk
    ├─sda1            8:1    0    1G  0 part /boot
    └─sda2            8:2    0   49G  0 part
      ├─centos-swap 253:0    0    2G  0 lvm  [SWAP]
      └─centos-root 253:1    0   47G  0 lvm  /
    sr0              11:0    1  4.3G  0 rom
    [root@ceph1 ceph 07:24:28]#
    
    

    操作之中

    [root@ceph1 ceph 07:24:28]# echo "- - -" > /sys/class/scsi_host/host0/scan
    [root@ceph1 ceph 07:26:01]# echo "- - -" > /sys/class/scsi_host/host1/scan
    [root@ceph1 ceph 07:26:08]# echo "- - -" > /sys/class/scsi_host/host2/scan
    
    

    操作之后

    [root@ceph1 ceph 07:26:12]# lsblk
    NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda               8:0    0   50G  0 disk
    ├─sda1            8:1    0    1G  0 part /boot
    └─sda2            8:2    0   49G  0 part
      ├─centos-swap 253:0    0    2G  0 lvm  [SWAP]
      └─centos-root 253:1    0   47G  0 lvm  /
    sdb       这里就是我们新加的        8:16   0    5G  0 disk
    sr0              11:0    1  4.3G  0 rom
    [root@ceph1 ceph 07:26:36]#
    
    
    2、创建OSD磁盘

    将磁盘添加到ceph集群中需要osd

    ceph OSD :功能是存储于处理一些数据,并通过检查其他OSD守护进程的心跳来向ceph monitors 提供一些监控信息

    1、列表所有节点的磁盘 并使用zap命令清除磁盘信息准备创建OSD

     ceph-deploy disk zap ceph1 /dev/sdb
    ceph-deploy disk zap ceph2 /dev/sdb
    ceph-deploy disk zap ceph3 /dev/sdb
    
    
    [root@ceph1 ceph 07:32:01]# ceph-deploy disk zap ceph3 /dev/sdb
    [ceph_deploy.conf][DEBUG ] found configuration file at: /root/.cephdeploy.conf
    [ceph_deploy.cli][INFO ] Invoked (2.0.1): /usr/bin/ceph-deploy disk zap ceph3 /dev/sdb
    [ceph_deploy.cli][INFO ] ceph-deploy options:
    [ceph_deploy.cli][INFO ]  username                      : None
    [ceph_deploy.cli][INFO ]  verbose                       : False
    [ceph_deploy.cli][INFO ]  debug                         : False
    [ceph_deploy.cli][INFO ]  overwrite_conf                : False
    [ceph_deploy.cli][INFO ]  subcommand                    : zap
    [ceph_deploy.cli][INFO ]  quiet                         : False
    [ceph_deploy.cli][INFO ]  cd_conf                       : <ceph_deploy.conf.cephdeploy.Conf instance at 0x7feb12eb0368>
    [ceph_deploy.cli][INFO ]  cluster                       : ceph
    [ceph_deploy.cli][INFO ]  host                          : ceph3
    [ceph_deploy.cli][INFO ]  func                          : <function disk at 0x7feb12eec8c0>
    [ceph_deploy.cli][INFO ]  ceph_conf                     : None
    [ceph_deploy.cli][INFO ]  default_release               : False
    [ceph_deploy.cli][INFO ]  disk                          : ['/dev/sdb']
    [ceph_deploy.osd][DEBUG ] zapping /dev/sdb on ceph3
    [ceph3][DEBUG ] connected to host: ceph3
    [ceph3][DEBUG ] detect platform information from remote host
    [ceph3][DEBUG ] detect machine type
    [ceph3][DEBUG ] find the location of an executable
    [ceph_deploy.osd][INFO ] Distro info: CentOS Linux 7.6.1810 Core
    [ceph3][DEBUG ] zeroing last few blocks of device
    [ceph3][DEBUG ] find the location of an executable
    [ceph3][INFO ] Running command: /usr/sbin/ceph-volume lvm zap /dev/sdb
    [ceph3][WARNIN] --> Zapping: /dev/sdb
    [ceph3][WARNIN] --> --destroy was not specified, but zapping a whole device will remove the partition table
    [ceph3][WARNIN] Running command: /bin/dd if=/dev/zero of=/dev/sdb bs=1M count=10 conv=fsync
    [ceph3][WARNIN] --> Zapping successful for: <Raw Device: /dev/sdb>
    
    

    2、创建OSD磁盘

    ceph-deploy osd create --data /dev/sdb ceph1
    ceph-deploy osd create --data /dev/sdb ceph2
    ceph-deploy osd create --data /dev/sdb ceph3
    
    

    3、验证

    [root@ceph1 ceph 07:34:31]# ceph -s
      cluster:
        id:     bb1d01eb-0d72-4794-9d7c-cb692d7a8f34
        health: HEALTH_OK
    
      services:
        mon: 3 daemons, quorum ceph1,ceph2,ceph3
        mgr: ceph1(active), standbys: ceph2, ceph3
        osd: 3 osds: 3 up, 3 in
    三个磁盘
      data:
        pools:   0 pools, 0 pgs
        objects: 0  objects, 0 B
        usage:   3.0 GiB used, 12 GiB / 15 GiB avail  合成一个15G的磁盘,但是使用了3G 是因为合成时会用掉一些空间
        pgs:
    
    
    扩容操作
    节点中增加某个磁盘

    如:在ceph3上再添加一块磁盘/dev/sdc。做如下操作就可以

    ceph-deploy disk zap ceph3 /dev/sdc
    ceph-deploy osd create --data /dev/sdc ceph3
    
    

    验证

    [root@ceph1 ceph 08:10:41]# ceph -s
      cluster:
        id:     bb1d01eb-0d72-4794-9d7c-cb692d7a8f34
        health: HEALTH_OK
    
      services:
        mon: 3 daemons, quorum ceph1,ceph2,ceph3
        mgr: ceph1(active), standbys: ceph2, ceph3
        osd: 4 osds: 4 up, 4 in
    
      data:
        pools:   0 pools, 0 pgs
        objects: 0  objects, 0 B
        usage:   4.0 GiB used, 16 GiB / 20 GiB avail
        pgs:
    
    
    增加某个节点并添加此节点的磁盘

    如果是新增加一个节点(假设是owncloud节点)并添加一块磁盘

    那么做法如下:

    1、准备好owncloud节点的基本环境,安装ceph相关软件

    yum install -y  ceph  ceph-radosgw -y
    
    

    2、在ceph1上同步1配置到owncloud节点

    ceph-deploy admin  owncloud
    
    

    3、将owncloud加入集群

    ceph-deploy disk  zap  owncloud /dev/sdb
    ceph-deploy osd create --data   /dev/sdb  owncloud
    
    

    4、验证

    [root@ceph1 ceph 08:15:44]# ceph -s
      cluster:
        id:     bb1d01eb-0d72-4794-9d7c-cb692d7a8f34
        health: HEALTH_OK
    
      services:
        mon: 3 daemons, quorum ceph1,ceph2,ceph3
        mgr: ceph1(active), standbys: ceph2, ceph3
        osd: 5 osds: 5 up, 5 in
    
      data:
        pools:   0 pools, 0 pgs
        objects: 0  objects, 0 B
        usage:   5.0 GiB used, 20 GiB / 25 GiB avail
        pgs:
    
    [root@ceph1 ceph 08:15:48]#
    
    
    删除磁盘方法

    和很多存储一样,增加磁盘(扩容)都比较方便,但是要删除磁盘会比较麻烦。

    这里以删除owncloud节点的/dev/sdb磁盘为例

    1、查看osd磁盘状态

    [root@ceph1 ceph 08:23:49]# ceph  osd  tree
    ID CLASS WEIGHT  TYPE NAME         STATUS REWEIGHT PRI-AFF
    -1       0.02449 root default
    -3       0.00490     host ceph1
     0   hdd 0.00490         osd.0         up  1.00000 1.00000
    -5       0.00490     host ceph2
     1   hdd 0.00490         osd.1         up  1.00000 1.00000
    -7       0.00980     host ceph3
     2   hdd 0.00490         osd.2         up  1.00000 1.00000
     3   hdd 0.00490         osd.3         up  1.00000 1.00000
    -9       0.00490     host owncloud
     4   hdd 0.00490         osd.4         up  1.00000 1.00000
    
    

    2、先标记为out

    [root@ceph1 ceph 08:23:56]# ceph osd out osd.4
    marked out osd.4.
    [root@ceph1 ceph 08:24:46]# ceph  osd  tree
    ID CLASS WEIGHT  TYPE NAME         STATUS REWEIGHT PRI-AFF
    -1       0.02449 root default
    -3       0.00490     host ceph1
     0   hdd 0.00490         osd.0         up  1.00000 1.00000
    -5       0.00490     host ceph2
     1   hdd 0.00490         osd.1         up  1.00000 1.00000
    -7       0.00980     host ceph3
     2   hdd 0.00490         osd.2         up  1.00000 1.00000
     3   hdd 0.00490         osd.3         up  1.00000 1.00000
    -9       0.00490     host owncloud
     4   hdd 0.00490         osd.4         up        0 1.00000
     可以看到权重为0但是状态还是up
    
    

    3、再rm删除,但是要先去osd.4对应的节点上停止ceph-osd服务,否则删除不了

    [root@owncloud yum.repos.d 08:27:35]# systemctl stop  ceph-osd@4.service
    
    
    [root@ceph1 ceph 08:28:09]# ceph osd rm osd.4
    
    removed osd.4
    
    

    4、查看集群状态

    [root@ceph1 ceph 08:28:18]#
    [root@ceph1 ceph 08:28:18]# ceph -s
      cluster:
        id:     bb1d01eb-0d72-4794-9d7c-cb692d7a8f34
        health: HEALTH_WARN 会有警告,是因为没有在crush算法中删除
                1 osds exist in the crush map but not in the osdmap
    
      services:
        mon: 3 daemons, quorum ceph1,ceph2,ceph3 
        mgr: ceph1(active), standbys: ceph2, ceph3
        osd: 4 osds: 4 up, 4 in
    
      data:
        pools:   0 pools, 0 pgs
        objects: 0  objects, 0 B
        usage:   4.0 GiB used, 16 GiB / 20 GiB avail
        pgs:
    
    
    
    
    
    

    此时再查看,发现osd.4已经没有up了

    [root@ceph1 ceph 08:28:22]# ceph osd  tree
    ID CLASS WEIGHT  TYPE NAME         STATUS REWEIGHT PRI-AFF
    -1       0.02449 root default
    -3       0.00490     host ceph1
     0   hdd 0.00490         osd.0         up  1.00000 1.00000
    -5       0.00490     host ceph2
     1   hdd 0.00490         osd.1         up  1.00000 1.00000
    -7       0.00980     host ceph3
     2   hdd 0.00490         osd.2         up  1.00000 1.00000
     3   hdd 0.00490         osd.3         up  1.00000 1.00000
    -9       0.00490     host owncloud
     4   hdd 0.00490         osd.4        DNE        0
    [root@ceph1 ceph 08:29:23]#
    
    

    5、在crush算法中和auth验证中删除

    [root@owncloud yum.repos.d 08:32:29]# ceph osd crush remove osd.4
    removed item id 4 name 'osd.4' from crush map
    [root@owncloud yum.repos.d 08:32:43]# ceph auth del osd.4
    updated
    
    

    6、还需要在osd.4对应的节点上卸载磁盘

    [root@owncloud yum.repos.d 08:33:04]# df -Th |grep  osd
    tmpfs                   tmpfs     487M   52K  487M   1% /var/lib/ceph/osd/ceph-4
    
    [root@owncloud yum.repos.d 08:33:30]# umount /var/lib/ceph/osd/ceph-4/
    [root@owncloud yum.repos.d 08:33:50]# df -Th
    Filesystem              Type      Size  Used Avail Use% Mounted on
    /dev/mapper/centos-root xfs        47G  1.6G   46G   4% /
    devtmpfs                devtmpfs  475M     0  475M   0% /dev
    tmpfs                   tmpfs     487M     0  487M   0% /dev/shm
    tmpfs                   tmpfs     487M   14M  473M   3% /run
    tmpfs                   tmpfs     487M     0  487M   0% /sys/fs/cgroup
    /dev/sda1               xfs      1014M  133M  882M  14% /boot
    tmpfs                   tmpfs      98M     0   98M   0% /run/user/0
    
    
    

    在ceph1节点查看验证

    [root@ceph1 ceph 08:29:23]# ceph osd  tree
    ID CLASS WEIGHT  TYPE NAME         STATUS REWEIGHT PRI-AFF
    -1       0.01959 root default
    -3       0.00490     host ceph1
     0   hdd 0.00490         osd.0         up  1.00000 1.00000
    -5       0.00490     host ceph2
     1   hdd 0.00490         osd.1         up  1.00000 1.00000
    -7       0.00980     host ceph3
     2   hdd 0.00490         osd.2         up  1.00000 1.00000
     3   hdd 0.00490         osd.3         up  1.00000 1.00000
    -9             0     host owncloud
    
    
    
    

    到这里,就完全删除了。

    如果想要加回来,再次部署在节点上即可

    如下命令

    [root@ceph1 ceph]# ceph-deploy disk zap ceph1 /dev/sdb 
    [root@ceph1 ceph]# ceph-deploy osd create --data /dev/sdb ceph1
    
    
    小结与说明

    ceph集群安装要注意:

    1、ceph-deploy命令默认找官方yum源,国内网速非常慢(而且ceph安装时设置了300秒超时,也就是你安装5分钟内不安装完就会断开)

    2、建议使用国内镜像源(我使用的清华源),如果网速还是慢,就做好本地yum源。

    3、ceph集群节点需要安装ceph与ceph-radosgw软件包,客户端节点只需要安装ceph-common软件包

    4、ceph集群对时间同步很敏感,请一定保证没有时间不同的相关警告

    ceph集群操作注意:

    任何操作一定要保证集群健康的情况下操作,并使用ceph -s命令进行确认

    修改配置文件请在部署节点上修改,然后使用

    ceph-deploy --overwriteconf admin ceph1 ceph2 ceph3命令同步到其它节点

    ceph的存储类型
    三种存储类型介绍

    1587473493263

    无论用那种存储,都可以分为以下三种类型

    文件存储:类似于一个大的目录,多个客户端可以挂载过来

    优点:利于数据共享

    缺点:速度较慢

    块存储:类似于一个block的设备,客户端可以格式化,挂载并使用,和用一个硬盘一样

    优点:和本地硬盘一样直接使用

    缺点:数据不同享

    对象存储:看做一个综合了文件存储和块存储优点的大硬盘,可以挂载也可以通过URL来访问

    优点:速度快,数据共享

    缺点:成本高,不兼容现有的模式

    1587473700624

    RADOS;ceph的高可靠,高可扩展、高性能、高自动化都是由这一层来提供的,用户数据的存储最终也是通过这一层来进行存储的

    可以说RADOS就是ceph底层的原生态的数据引擎,但是实际应用时却不直接使用它,而是分为以下4种方式来使用:

    LIBRADOS是一个库, 它允许应用程序通过访问该库来与RADOS系统进行交 互,支持多种编程语言。如Python,C,C++等. 简单来说,就是给开发人员使 用的接口。

    CEPH FS通过Linux内核客户端和FUSE来提供文件系统。(文件存储)

    RBD通过Linux内核客户端和QEMU/KVM驱动来提供一个分布式的块设 备。(块存储)

    RADOSGW是一套基于当前流行的RESTFUL协议的网关,并且兼容S3和 Swift。(对象存储)

    存储原理

    要实现数据存取需要建一个pool,创建pool要分配PG。

    1587473929074

    如果客户端对一个pool写了一个文件,那么这个文件是如何分布到多个节点的磁盘上呢?

    答案是通过crush算法

    CRUSH算法

    CRUSH(Controlled Scalable Decentralized Placement of Replicated Data)算法为可控的,可扩展的,分布式的副本数据放置算法的简称。 PG到OSD的映射的过程算法叫做CRUSH 算法。(一个Object需要保存三个 副本,也就是需要保存在三个osd上)。

    CRUSH算法是一个伪随机的过程,他可以从所有的OSD中,随机性选择一 个OSD集合,但是同一个PG每次随机选择的结果是不变的,也就是映射的 OSD集合是固定的。

    小结:

    1、客户端直接对pool操作(但文件存储、块存储、对象存储区我们不这么做)

    2、pool里面要分配PG

    3、PG里面可以存放多个对象

    4、对象就是客户端写入的数据分离单位

    5、crush算法将客户端写入的数据映射分布到OSD,从而最终存放到物理磁盘上。

    RADOS原生数据存取
    1、创建pool并测试

    创建test_pool 指定pg数为128

    [root@ceph1 ceph 09:03:17]# ceph osd pool create test_pool 128
    pool 'test_pool' created
    
    

    修改pg数量,可以使用修改调整

    ceph osd pool set test_pool  pg_num 64
    
    

    查看数量

    [root@ceph1 ceph 09:03:32]# ceph osd pool  get test_pool pg_num
    pg_num: 128
    [root@ceph1 ceph 09:03:46]#
    
    

    说明:pg数与osd数量关系

    pg数为2的倍数,一般为5个一下osd,分为128个PG或者一下即可

    可以使用ceph osd pool set test_pool pg_num 64 这样的命令来尝试调整。

    2、存储测试

    1、我这里把本机的/etc/fstab文件上传到test_pool并取名为netfatab

    [root@ceph1 ceph 09:11:12]# rados put newfatab /etc/fstab  --pool=test_pool
    
    

    2、查看

    [root@ceph1 ceph 09:11:19]# rados -p test_pool ls
    newfatab
    [root@ceph1 ceph 09:11:47]#
    
    

    3、删除并查看

    [root@ceph1 ceph 09:12:45]# rados rm newfatab --pool=test_pool
    [root@ceph1 ceph 09:13:16]# rados -p test_pool ls
    
    
    3、删除pool

    1、在部署节点ceph1上增加参数允许ceph删除pool

    [root@ceph1 ceph 09:15:29]# cat ceph.conf
    [global]
    fsid = bb1d01eb-0d72-4794-9d7c-cb692d7a8f34
    mon_initial_members = ceph1
    mon_host = 10.0.0.5
    auth_cluster_required = cephx
    auth_service_required = cephx
    auth_client_required = cephx
    
    public network = 10.0.0.0/24
    mon_allow_pool_delete = true
    增加最后一条信息
    
    
    
    

    2、修改了配置,要同步到其他集群节点

    [root@ceph1 ceph 09:17:19]# ceph-deploy --overwrite-conf admin ceph1 ceph2 ceph3
    
    

    3、重启监控服务

    [root@ceph1 ceph 09:17:42]# systemctl restart  ceph-mon.target
    
    

    4、删除pool名输入两次,后接--yes-i-really-really-mean-it参数就可以删 除了

    [root@ceph1 ceph 09:17:52]# ceph osd pool delete test_pool test_pool --yes-i-really-really-mean-it
    pool 'test_pool' removed
    [root@ceph1 ceph 09:19:23]#
    
    
    创建ceph文件存储

    要运行ceph文件系统,你必须先创建至少一个带mds的ceph存储集群

    (ceph块设备和ceph对象存储都不使用MDS)

    ceph MDS为ceph文件存储类型存放元数据metadata

    1、在ceph1节点部署上同步配置文件,并创建MDS(也可以做多个mds实现HA)

    ceph-deploy mds  create ceph1 ceph2 ceph3
    
    

    2、一个ceph文件系统需要至少两个RADOS存储池,一个用于数据,一个用于元数据。所以我们创建他们

    [root@ceph1 ceph 09:24:47]# ceph osd  pool create cephfs_pool 128
    pool 'cephfs_pool' created
    
    [root@ceph1 ceph 09:25:06]# ceph osd pool create cephfs_metadata 64
    pool 'cephfs_metadata' created
    
    [root@ceph1 ceph 09:25:27]# ceph osd pool ls |grep  cephfs
    cephfs_pool
    cephfs_metadata
    
    

    3、创建ceph文件系统并确认客户端访问的节点

    [root@ceph1 ceph 09:26:38]# ceph fs new cephfs cephfs_metadata cephfs_pool
    new fs with metadata pool 3 and data pool 2
    
    [root@ceph1 ceph 09:26:59]# ceph fs ls
    name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_pool ]
    
    [root@ceph1 ceph 09:27:09]# ceph mds stat
    cephfs-1/1/1 up  {0=ceph3=up:active}, 2 up:standby
    [root@ceph1 ceph 09:27:17]#
    
    

    4、客户端准备key验证文件

    说明:ceph默认启用了cephx认证,所以客户端的挂载必须要认证

    [root@lsy ~ 09:52:52]# mount -t ceph  10.0.0.5:6789:/ /mnt -o name=admin,secret=AQBQ0J5eLDHnLRAAf850/HEvbZd3DAvWE8czrA==
    [root@lsy ~ 09:54:04]# df -Th
    Filesystem              Type      Size  Used Avail Use% Mounted on
    /dev/mapper/centos-root xfs        47G  3.6G   44G   8% /
    devtmpfs                devtmpfs  475M     0  475M   0% /dev
    tmpfs                   tmpfs     487M     0  487M   0% /dev/shm
    tmpfs                   tmpfs     487M   14M  473M   3% /run
    tmpfs                   tmpfs     487M     0  487M   0% /sys/fs/cgroup
    /dev/sda1               xfs      1014M  133M  882M  14% /boot
    tmpfs                   tmpfs      98M     0   98M   0% /run/user/0
    10.0.0.5:6789:/         ceph      5.0G     0  5.0G   0% /mnt
    [root@lsy ~ 09:54:13]#
    
    

    这样的方式可以

    但是使用文件密钥的方式我就实现不出来。

    [root@lsy ~ 10:05:42]# mount -t ceph ceph1:6789:/   /mnt -o name=admin,secretfile=/root/admin.key
    mount: wrong fs type, bad option, bad superblock on ceph1:6789:/,
           missing codepage or helper program, or other error
    
       In some cases useful info is found in syslog - try
       dmesg | tail or so.
    
    

    几种方式的总结:见博客

    https://blog.csdn.net/weixin_42506599/article/details/105669234

    删除文件存储方法

    1、在客户端上删除数据,并umount所有挂载

    [root@lsy ~ 10:24:55]# rm /mnt/* -rf
    [root@lsy ~ 10:25:04]#
    [root@lsy ~ 10:25:05]# umount /mnt/
    [root@lsy ~ 10:25:09]# df -Th
    Filesystem              Type      Size  Used Avail Use% Mounted on
    /dev/mapper/centos-root xfs        47G  3.6G   44G   8% /
    devtmpfs                devtmpfs  475M     0  475M   0% /dev
    tmpfs                   tmpfs     487M     0  487M   0% /dev/shm
    tmpfs                   tmpfs     487M   14M  473M   3% /run
    tmpfs                   tmpfs     487M     0  487M   0% /sys/fs/cgroup
    /dev/sda1               xfs      1014M  133M  882M  14% /boot
    tmpfs                   tmpfs      98M     0   98M   0% /run/user/0
    [root@lsy ~ 10:25:11]#
    
    
    
    

    2、停止所有节点的MDS(只有停掉MDS才可以删除文件系统)

    [root@ceph1 ~]# systemctl stop ceph-mds.target 
    
    [root@ceph2 ~]# systemctl stop ceph-mds.target 
    
    [root@ceph3 ~]# systemctl stop ceph-mds.target
    
    

    3、回到ceph1删除

    [root@ceph1 ceph 10:26:48]# ceph  fs rm cephfs --yes-i-really-mean-it
    [root@ceph1 ceph 10:29:25]# ceph osd pool delete cephfs_metadata cephfs_metadata --yes-i-really-really-mean-it
    pool 'cephfs_metadata' removed
    [root@ceph1 ceph 10:30:04]# ecph osd pool delete cephfs_pool cephfs_pool --yes-i-really-really-mean-it
    bash: ecph: command not found
    [root@ceph1 ceph 10:30:43]# ceph osd pool delete cephfs_pool cephfs_pool --yes-i-really-really-mean-it
    pool 'cephfs_pool' removed
    
    

    此时查看装态为err

    [root@ceph1 ceph 10:26:19]# ceph -s
      cluster:
        id:     bb1d01eb-0d72-4794-9d7c-cb692d7a8f34
        health: HEALTH_ERR
                1 filesystem is degraded
                1 filesystem has a failed mds daemon
                1 filesystem is offline
                insufficient standby MDS daemons available
    
      services:
        mon: 3 daemons, quorum ceph1,ceph2,ceph3
        mgr: ceph1(active), standbys: ceph2, ceph3
        mds: cephfs-0/1/1 up , 1 failed
        osd: 4 osds: 4 up, 4 in
    
      data:
        pools:   2 pools, 192 pgs
        objects: 22  objects, 3.1 KiB
        usage:   4.0 GiB used, 16 GiB / 20 GiB avail
        pgs:     192 active+clean
    
    

    4、再次启动mds服务

    [root@ceph1 ceph 10:32:34]# systemctl start  ceph-mds.target
    
    

    此时查看状态,又回到健康状态

    [root@ceph1 ceph 10:32:44]# ceph -s
      cluster:
        id:     bb1d01eb-0d72-4794-9d7c-cb692d7a8f34
        health: HEALTH_OK
    
      services:
        mon: 3 daemons, quorum ceph1,ceph2,ceph3
        mgr: ceph1(active), standbys: ceph2, ceph3
        osd: 4 osds: 4 up, 4 in
    
      data:
        pools:   0 pools, 0 pgs
        objects: 0  objects, 0 B
        usage:   4.0 GiB used, 16 GiB / 20 GiB avail
        pgs:
    
    
    
    
    创建ceph块存储
    1、创建块存储并使用

    1、建立存储池并初始化

    [root@ceph1 ceph 10:35:32]# ceph osd pool create rbd_pool 8
    pool 'rbd_pool' created
    [root@ceph1 ceph 10:35:47]# rbd pool init rbd_pool
    
    

    2、创建一个存储卷volume1,大小为5000M

    [root@ceph1 ceph 10:37:06]# rbd  create volume1 --pool rbd_pool --size 5000
    [root@ceph1 ceph 10:37:35]# rbd ls rbd_pool
    volume1
    [root@ceph1 ceph 10:37:45]# rbd info volume1 -p rbd_pool
    rbd image 'volume1':
            size 4.9 GiB in 1250 objects
            order 22 (4 MiB objects)
            id: 5ed46b8b4567
            block_name_prefix: rbd_data.5ed46b8b4567
            format: 2
            features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
            op_features:
            flags:
            create_timestamp: Tue Apr 21 10:37:35 2020
    [root@ceph1 ceph 10:38:03]#
    
    
    
    

    4、将创建的卷映射为块设备

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

    [root@ceph1 ceph 10:39:55]# 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
    [root@ceph1 ceph 10:40:10]#
    
    

    解决方法:distable相关特性

    (四者之间有先后顺序问题)

    [root@ceph1 ceph 10:44:36]#  rbd feature disable rbd_pool/volume1  fast-diff
    [root@ceph1 ceph 10:45:42]#  rbd feature disable rbd_pool/volume1  object-map
    [root@ceph1 ceph 10:45:45]#  rbd feature disable rbd_pool/volume1  exclusive-lock
    [root@ceph1 ceph 10:46:02]#
    [root@ceph1 ceph 10:48:17]#  rbd feature disable rbd_pool/volume1  deep-flatten
    
    
    

    再次映射

    [root@ceph1 ceph 10:48:49]# rbd map rbd_pool/volume1
    /dev/rbd0
    
    

    5、查看映射(如果要取消映射,可以使用rbd unmap /dev/rbd0)

    [root@ceph1 ceph 10:50:17]# rbd showmapped
    id pool     image   snap device
    0  rbd_pool volume1 -    /dev/rbd0
    [root@ceph1 ceph 10:50:28]#
    
    

    6、格式化挂载

    [root@ceph1 ceph 10:50:51]# mkfs.xfs /dev/rbd0
    meta-data=/dev/rbd0              isize=512    agcount=8, agsize=160768 blks
             =                       sectsz=512   attr=2, projid32bit=1
             =                       crc=1        finobt=0, sparse=0
    data     =                       bsize=4096   blocks=1280000, imaxpct=25
             =                       sunit=1024   swidth=1024 blks
    naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
    log      =internal log           bsize=4096   blocks=2560, version=2
             =                       sectsz=512   sunit=8 blks, lazy-count=1
    realtime =none                   extsz=4096   blocks=0, rtextents=0
    [root@ceph1 ceph 10:51:03]# mount /dev/rbd0  /mnt/
    df[root@ceph1 ceph 10:51:15]# df -Th |tail -1
    /dev/rbd0               xfs       4.9G   33M  4.9G   1% /mnt
    [root@ceph1 ceph 10:51:24]#
    
    
    
    

    补充:第二个客户端如果也要用此块存储,只需要执行以下几步就可以

    [root@ceph2 yum.repos.d 10:52:45]# rbd  map rbd_pool/volume1
    /dev/rbd0
    [root@ceph2 yum.repos.d 10:53:03]# rbd showmapped
    id pool     image   snap device
    0  rbd_pool volume1 -    /dev/rbd0
    [root@ceph2 yum.repos.d 10:53:10]# mount /dev/rbd0 /mnt/
    [root@ceph2 yum.repos.d 10:53:24]# df -Th |tail -1
    /dev/rbd0               xfs       4.9G   33M  4.9G   1% /mnt
    [root@ceph2 yum.repos.d 10:53:31]#
    
    
    
    

    注意:块存储是不能实现同读和同写的,请不要两个客户端同时挂载进行读写。

    2、删除块存储方法
    [root@ceph2 yum.repos.d 10:53:31]# umount /mnt/
    [root@ceph2 yum.repos.d 10:55:03]# rbd unmap /dev/rbd0
    [root@ceph2 yum.repos.d 10:55:15]# ceph osd pool delete rbd_pool rbd_pool --yes-i-really-really-mean-it
    pool 'rbd_pool' removed
    [root@ceph2 yum.repos.d 10:55:54]#
    
    
    创建对象存储网关

    rgw(对象存储网关):为客户端访问对象存储的接口

    rgw的创建

    1、在ceph集群任意一个节点上创建rgw(我这里为ceph1)

    确保你已经装了这个软件包

    [root@ceph1 ceph 11:11:37]# yum install -y ceph-radosgw
    
    

    创建rgw

    [root@ceph1 ceph 11:11:37]# ceph-deploy rgw create ceph1
    
    

    2、验证7480端口

    [root@ceph1 ceph 11:11:25]# lsof -i:7480
    COMMAND    PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
    radosgw 121388 ceph   41u  IPv4 1625237      0t0  TCP *:7480 (LISTEN)
    
    

    对象网关创建成功,后面的项目中我们会通过ceph1的对象网关来连接就可以使用了。

    连接的地址为10.0.0.5:7480

    小结与说明:

    我们实现了ceph集群,并创建了三中类型存储,那么如何使用这些存储呢?

    在不同的场景与应用中,会需要不同类型的存储类型,并不是说在一个项目里要把三中类型都用到

    在后面的项目中,我们会分别用到这三种不同的类型。

  • 相关阅读:
    【已解决】github中git push origin master出错:error: failed to push some refs to
    好记心不如烂笔头,ssh登录 The authenticity of host 192.168.0.xxx can't be established. 的问题
    THINKPHP 5.0目录结构
    thinkphp5.0入口文件
    thinkphp5.0 生命周期
    thinkphp5.0 架构
    Django template
    Django queryset
    Django model
    Python unittest
  • 原文地址:https://www.cnblogs.com/liushiya/p/13532427.html
Copyright © 2011-2022 走看看