热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

项目背景企业应用中越来越多的会使用容器技术来是实现解决方案1、单节点的docker和dockercompose2、多节点的dockerswarm集群3、多节点的k8s集群以上都是可

项目背景

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

1、单节点的docker和docker-compose

2、多节点的docker swarm集群

3、多节点的k8s集群

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

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

项目架构图

技术图片

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 

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

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

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

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

技术图片

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.cli][INFO ]  cluster                       : ceph
[ceph_deploy.cli][INFO ]  host                          : ceph3
[ceph_deploy.cli][INFO ]  func                          : 
[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: 

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的存储类型

三种存储类型介绍
技术图片

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

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

优点:利于数据共享

缺点:速度较慢

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

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

缺点:数据不同享

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

优点:速度快,数据共享

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

技术图片

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。

技术图片

如果客户端对一个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集群,并创建了三中类型存储,那么如何使用这些存储呢?

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

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

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


推荐阅读
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文介绍了一种图片处理应用,通过固定容器来实现缩略图的功能。该方法可以实现等比例缩略、扩容填充和裁剪等操作。详细的实现步骤和代码示例在正文中给出。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • 像跟踪分布式服务调用那样跟踪Go函数调用链 | Gopher Daily (2020.12.07) ʕ◔ϖ◔ʔ
    每日一谚:“Acacheisjustamemoryleakyouhaven’tmetyet.”—Mr.RogersGo技术专栏“改善Go语⾔编程质量的50个有效实践” ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 处理docker容器时间和宿主机时间不一致问题的方法
    本文介绍了处理docker容器时间和宿主机时间不一致问题的方法,包括复制主机的localtime到容器、处理报错情况以及重启容器的步骤。通过这些方法,可以解决docker容器时间和宿主机时间不一致的问题。 ... [详细]
  • 本文介绍了Java的集合及其实现类,包括数据结构、抽象类和具体实现类的关系,详细介绍了List接口及其实现类ArrayList的基本操作和特点。文章通过提供相关参考文档和链接,帮助读者更好地理解和使用Java的集合类。 ... [详细]
  • 微信答题小程序的设计与实现详解
    本文详细介绍了如何设计和实现一个微信答题小程序,包括题库的设计和题目的呈现。通过抽取题目编号和使用全局变量记录当前题目的信息,实现了题目的刷新和显示。同时,还介绍了题目的展示方式和容器的创建。本文适合零基础的小白学习微信答题小程序的开发。 ... [详细]
author-avatar
漆黑中的萤火虫
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有