分布式存储
存储概述
存储介绍
-
存储:就是存放数据的介质
-
如果web服务器家目录空间不够,可以通过添加硬盘使用LVM进行扩容,但硬盘数量存在上限;也可以使用远程存储共享进行扩容
存储分层
- 一个新的硬盘在linux系统里使用一般来说就三步:(分区)-格式化-挂载,才能使用
linux上如何挂载ntfs格式的移动硬盘?
linux内核支持ntfs,但centos7系统没有编译该功能,解决方法:
重新编译内核,在内核中加上ntfs支持。但该方法不推荐,因为编译内核会造成内核运行不稳定,没有过硬的实力不要尝试)
参考内核模块 [root@server1 ~]# lsmod Module Size Used by snd_seq_midi 13565 0 snd_seq_midi_event 14597 1 snd_seq_midi ppdev 17671 0 crc32_pclmul 13133 0 ghash_clmulni_intel 13273 0 vmw_balloon 18094 0 aesni_intel 189456 0 btusb 41520 0 lrw 13286 1 aesni_intel gf128mul 15139 1 lrw btrtl 12945 1 btusb btbcm 14040 1 btusb glue_helper 13990 1 aesni_intel btintel 15709 1 btusb ablk_helper 13597 1 aesni_intel cryptd 21190 3 ghash_clmulni_intel,aesni_intel,ablk_helper bluetooth 548787 5 btbcm,btrtl,btusb,btintel snd_ens1371 25076 0 snd_rawmidi 31553 2 snd_ens1371,snd_seq_midi snd_ac97_codec 130479 1 snd_ens1371 ac97_bus 12730 1 snd_ac97_codec snd_seq 62774 2 snd_seq_midi_event,snd_seq_midi joydev 17389 0 pcspkr 12718 0 snd_seq_device 14356 3 snd_seq,snd_rawmidi,snd_seq_midi rfkill 22391 1 bluetooth snd_pcm 101339 2 snd_ac97_codec,snd_ens1371 sg 40719 0 snd_timer 30014 2 snd_pcm,snd_seq snd 83987 7 snd_ac97_codec,snd_timer,snd_pcm,snd_seq,snd_rawmidi,snd_ens1371,snd_seq_device vmw_vmci 67168 0 soundcore 15047 1 snd i2c_piix4 22401 0 parport_pc 28205 0 parport 46395 2 ppdev,parport_pc ip_tables 27126 0 xfs 997727 2 libcrc32c 12644 1 xfs sd_mod 46281 3 crc_t10dif 12912 1 sd_mod crct10dif_generic 12647 0 sr_mod 22416 0 cdrom 42600 1 sr_mod ata_generic 12923 0 pata_acpi 13053 0 vmwgfx 291993 1 crct10dif_pclmul 14307 1 crct10dif_common 12595 3 crct10dif_pclmul,crct10dif_generic,crc_t10dif crc32c_intel 22094 1 drm_kms_helper 186531 1 vmwgfx serio_raw 13434 0 syscopyarea 12529 1 drm_kms_helper mptspi 22673 2 sysfillrect 12701 1 drm_kms_helper sysimgblt 12640 1 drm_kms_helper fb_sys_fops 12703 1 drm_kms_helper e1000 137624 0 ttm 96673 1 vmwgfx drm 456166 4 ttm,drm_kms_helper,vmwgfx scsi_transport_spi 30732 1 mptspi mptscsih 40150 1 mptspi mptbase 106036 2 mptspi,mptscsih ata_piix 35052 0 drm_panel_orientation_quirks 17180 1 drm libata 243094 3 pata_acpi,ata_generic,ata_piix nfit 55639 0 libnvdimm 159524 1 nfit dm_mirror 22326 0 dm_region_hash 20813 1 dm_mirror dm_log 18411 2 dm_region_hash,dm_mirror dm_mod 124501 8 dm_log,dm_mirror
安装软件,为内核加上支持ntfs的模块
安装 # yum install epel-release -y # yum install ntfs-3g 挂载 # mount.ntfs-3g /dev/sdb1 /mnt
- liunx存储分层
- 物理卷:指的是物理设备,如硬盘(/dev/sda),分区(/dev/sda1),dd命令创建的文件,软raid(/dev/md0),逻辑卷(/dev/vg01/lv01)等
- 模块驱动:安装相应的模块,即可实现相应的功能
- 文件系统:格式化成相应的文件系统:如ext4,xfs
- 虚拟文件系统: 又名VFS (Virtual File System),作用就是采用标准的Unix系统调用读写位于不同物理介质上的不同文件系统,即为各类文件系统提供了一个统一的操作界面和应用编程接口
存储分类
- 三种存储方式:DAS、SAN、NAS
- 三种存储类型:块存储、文件存储、对象存储
按存储方式分:
分类 | 名称 | 描述 |
---|---|---|
DAS | 直连式存储 (direct access/attach storage) | 如:机箱里的disk,或通过接口直连到系统总线上的disk(如U盘,移动硬盘) |
NAS | 网络附加存储 (network attched storage) | 通过交换机,路由器连接起来,共享的是目录如:nfs,samba,ftp |
SAN | 存储区域网络 (storage area network) | 通过交换机,路由器连接起来的高速存储网络,共享的是块设备 |
三者区别与联系
-
DAS: 直接连接系统,不受网速限制,速度快; 扩展容量有上限。
-
NAS与SAN: 通过网络设备连接的远程存储,速度受网络影响; 但扩展方便,几乎无上限。
-
NAS和SAN都是通过网络(通过了网络设备,如路由器,交换机等)的,但NAS共享的是应用层的目录,而SAN共享的是/dev/sdb1或/dev/sdb这种块设备。
按储存类型分:
分类 | 描述 |
---|---|
文件存储 | NAS都属于这一类。 简单来说就是mount后直接使用的 |
块存储 | SAN都属于这一类。 简单来说就是类似/dev/sdb这种,要分区,格式化后才能mount使用 |
对象存储 | 对象存储采用扁平化的形式管理数据,没有目录的层次结构,并且对象的操作主要以put、get、delete为主。 |
三者比较
比较项 | 块存储 | 文件存储 | 对象存储 |
---|---|---|---|
概念 | 用高速网络连接专业主机服务器的一种存储方式 | 使用文件系统,具有目录树 | 将数据和元数据当做一个对象 |
速度 | 低延迟(10ms),热数据 | 不同技术各有不同 | 100ms-1s,冷数据 |
可分布性 | 异地不现实 | 可分布式 | 分布并发能力高 |
文件大小 | 大小都可以 | 适合大文件 | 大小都可以 |
接口 | Driver,kernel module | POSIX | Restful API |
典型技术 | SAN | HDFS、GFS | Swift、Amazon S3 |
适合场景 | 数据中心,虚拟化平台 | 办公网络 | 网络媒体文件存储 |
文件存储: 类似一个大的目录,多个客户端都可以挂载过来使用。
- 优点: 利于数据共享
- 缺点: 速度较慢
块存储: 类似一个block设备,客户端可以格式化,挂载并使用,和用一个硬盘一样。
- 优点: 和本地硬盘一样,直接使用,速度较快
- 缺点: 数据不共享,建议一个块设备仅供一人使用
对象存储: 一个对象我们可以看成一个文件, 综合了文件存储和块存储的优点。
- 优点: 速度快,数据共享
- 缺点: 成本高, 不兼容现有的模式
SAN
分类
- FC-SAN: 早期的SAN, 服务器与交换机的数据传输是通过光纤进行的, 服务器把SCSI指令传输到存储设备上,不能走普通LAN网的IP协议。速度快,成本高
- IP-SAN: 用IP协议封装的SAN, 可以完全走普通网络,因此叫做IP-SAN, 最典型的就是ISCSI。速度较慢(已经有W兆以太网标准), 成本低
IP-SAN之iscsi实现
虚拟机 | IP地址 | 作用 |
---|---|---|
server1 | 192.168.139.10 | 储存服务器(导出) |
server2 | 192.168.139.20 | 业务服务器(导入) |
- 环境准备
systemctl stop NetworkManager
systemctl disable NetworkManager
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
cat >> /etc/hosts <<EOF
192.168.139.10 server10
192.168.139.20 server20
EOF
ntpdate cn.ntp.org.cn
date
- 导出端配置
安装iscsi-target-utils软件包
[root@server1 ~]# yum install -y epel-release.noarch
[root@server1 ~]# yum install -y scsi-target-utils
模拟需要导出的物理卷
[root@server1 ~]# dd if=/dev/zero of=/tmp/big_file bs=1M count=1000
修改配置文件
[root@server1 ~]# cd /etc/tgt/
[root@server1 tgt]# vim targets.conf
[root@server1 tgt]# cat targets.conf |grep -Ev '^#|^$'
default-driver iscsi
#共享名,也就是存储导入端发现后看到的名称
<target iscsi:data>
#backing-store定义实际要共享出去的设备
backing-store /tmp/big_file
</target>
启动服务
[root@server1 tgt]# systemctl start tgtd
[root@server1 tgt]# systemctl enable tgtd
- 导入端配置
安装iscsi-initiator-utils软件包
[root@server2 ~]# yum install -y epel-release.noarch
[root@server2 ~]# yum install -y iscsi-initiator-utils
寻找资源
[root@server2 ~]# iscsiadm -m discovery -t sendtargets -p 192.168.139.10
192.168.139.10:3260,1 iscsi:data
登录
[root@server2 ~]# iscsiadm -m node -l
[root@server2 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─centos-root 253:0 0 17G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 5G 0 disk
sdc 8:32 0 1000M 0 disk
sr0 11:0 1 973M 0 rom
#发现多出来了一块sdc
断开连接:
[root@server2 ~]# iscsiadm -m node -u
[root@server2 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─centos-root 253:0 0 17G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 5G 0 disk
sr0 11:0 1 973M 0 rom
#删除登录过的信息
[root@server2 ~]# iscsiadm -m node --op delete
- 扩展:添加用户名和密码验证功能
导出端配置验证功能
[root@server1 tgt]# vim targets.conf
[root@server1 tgt]# cat targets.conf |grep -Ev '^#|^$'
default-driver iscsi
#共享名,也就是存储导入端发现后看到的名称
<target iscsi:data>
#backing-store定义实际要共享出去的设备
backing-store /tmp/big_file
incominguser tgt-user tgt-pass
</target>
导入端添加用户及密码
[root@server2 ~]# vim /etc/iscsi/iscsid.conf
57 node.session.auth.authmethod = CHAP
68 node.session.auth.username = tgt-user
69 node.session.auth.password = tgt-pass
78 discovery.sendtargets.auth.authmethod = CHAP
82 discovery.sendtargets.auth.username = tgt-user
83 discovery.sendtargets.auth.password = tgt-pass
验证
[root@server2 ~]# iscsiadm -m discovery -t sendtargets -p 192.168.139.10
192.168.139.10:3260,1 iscsi:data
[root@server2 ~]# iscsiadm -m node -l
[root@server2 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─centos-root 253:0 0 17G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 5G 0 disk
sdc 8:32 0 1000M 0 disk
sr0 11:0 1 973M 0 rom
分布式储存
介绍
-
NAS是远程通过网络共享目录, SAN是远程通过网络共享块设备。
-
分布式存储你可以看作**拥有多台存储服务器连接起来的存储导出端**。把这多台存储服务器的存储合起来做成一个整体再通过网络进行远程共享,共享的方式有目录(文件存储),块设备(块存储),对象网关或者说一个程序接口(对象存储)。
-
常见的分布式存储开源软件有:GlusterFS,Ceph,HDFS,MooseFS,FastDFS等
-
分布式存储系统,是将数据分散存储在多台独立的设备上。传统的网络存储系统采用集中的存储服务器存放所有数据,存储服务器成为系统性能的瓶颈,也是可靠性和安全性的焦点,不能满足大规模存储应用的需要。
-
分布式网络存储系统采用可扩展的系统结构,利用多台存储服务器分担存储负荷,利用定位服务器定位存储信息,它不但提高了系统的可靠性、可用性和存取效率,还易于扩展。
-
分布式存储系统需要解决的两个问题:
问题一:我应该把数据写到什么地方?对于一个存储系统而言,当用户提交需要写入的数据时,系统必须迅速决策,为数据分配一个存储空间。这个决策的速度影响到数据如延迟,而更为重要的是,其决策的合理性也影响着数据分布的均匀性。
问题二:我之前把数据写到什么地方?对于一个存储系统而言,高效、准确地处理数据寻址空间也是基本功能之一。
特性
可扩展
- 分布式系统可以扩展到几百台到几千台的集群规模,轻松达到PB级别或以上。而且,随着集群规模的增长,系统整体性能表现为线性增长。 分布式存储的水平扩展有以下几个特性:
- 节点扩展后,旧数据会自动迁移到新节点,实现负载均衡,避免单点过热的情况出现
- 水平扩展只需要将新节点和原有集群连接到同一网络,整个过程不会对业务造成影响
- 当节点被添加到集群,集群系统的整体容量和性能也随之线性扩展,此后新节点的资源就会被管理平台接管,被用于分配或者回收
低成本
- 分布式存储系统的自动容错、自动负载均衡机制使其可以构建在普通PC机之上。另外,线性扩展能力也使得增加、减少机器非常方便,可以使用较低的成本实现自动运维
高性能
- 无论是整个集群还是单机服务,都要求分布式系统具备高性能。提升读写性能(LB)或数据高可用(HA)
易用
- 分布式存储系统需要提供易用的对外接口,另外也要求具备完善的监控、运维工具,并能够方便地与其它系统集成。如 Hadoop云计算系统导入数据。
开源软件比较
存储系统 | Ceph | GlusterFS | HDFS | MooseFS | FastDFS |
---|---|---|---|---|---|
开发语言 | C++ | C | Java | C | C |
开源协议 | LGPL | GPL V3 | Apache | GPL V3 | GPL V3 |
数据存储方式 | 对象/文件/块 | 文件/块 | 文件 | 块 | 文件/块 |
集群节点通信协议 | 私有协议(TCP) | TCP/RDAM | TCP | TCP | TCP |
专用元数据存储点 | 占用MDS | 无 | 占用MDS | 占用MFS | 无 |
在线扩容 | 支持 | 支持 | 支持 | 支持 | 支持 |
冗余备份 | 支持 | 支持 | 支持 | 支持 | 支持 |
单点故障 | 不存在 | 不存在 | 存在 | 存在 | 不存在 |
跨集群同步 | 不支持 | 支持 | 不支持 | 不支持 | 部分支持 |
适用场景 | 单集群的大中小文件 | 跨集群云存储 | Mapreduce使用的文件存储 | 单集群的大中文件 | 单集群的中小文件 |
FUSE挂载 | 支持 | 支持 | 支持 | 支持 | 不支持 |
访问接口 | POSIX | POSIX | 不支持POSIX | POSIX | 不支持POSIX |
Glusterfs
介绍
- glusterfs是一个免费,开源的分布式文件系统(它属于文件存储类型)
- 官网:https://www.gluster.org/
常见raid级别(扩展)
-
raid0 读写性能佳,坏了其中一块,数据挂掉,可靠性低(stripe条带化),磁盘利用率100%
-
raid1 镜像备份(mirror),同一份数据完整的保存在多个磁盘上,写的性能不佳,可靠性高,读的性能还行,磁盘利用率50%
-
raid10 先做raid 1 再做raid 0 (生产环境中常用)
- raid5 由多块磁盘做raid 5,磁盘利用率为n-1/n, 其中一块放校验数据,允许坏一块盘,数据可以利用校验值来恢复 (生产环境中常用)
- raid6 在raid5的基础上再加一块校验盘,进一步提高数据可靠性
常见卷的模式
卷模式 | 描述 |
---|---|
Replicated | 复制卷,类似raid1 |
Striped | 条带卷,类似raid0 |
Distributed | 分布卷 |
Distribute Replicated | 分布与复制组合 |
Dispersed | 纠删卷,类似raid5,raid6 |
复制卷(Replica volume)
- 将文件同步到多个Brick上,使其具备多个文件副本,属于文件级RAID1,具有容错能力。因为数据分散 到多个Brick中,所以读性能得到了很大提升,但写性能下降
条带卷(Stripe volume)
- 类似于RAID0,文件被分为数据块并以轮询的方式分布到多个Brick Server上,文件存储以数据块为单 位,支持大文件存储,文件越大,读取效率越高
分布式卷(Distribute volume)
- 文件通过HASH算法分布到所有Brick Server上,这种卷是Glusterf的基础;以文件为单位根据HASH算法 散列到不同的Brick,其实只是扩大了磁盘空间,如果有一个磁盘损坏,数据也将丢失,属于文件级的 RAID0,不具备容错能力
分布式复制卷(Distribute Replica volume)
- Brick Server数量是镜像数(数据副本数量)的倍数,具有分布式卷和复制卷的特点
其他:详见官网
集群搭建
虚拟机 | 担当 | IP地址 |
---|---|---|
server1 | storage1 | 192.168.139.10 |
server2 | storage2 | 192.168.139.20 |
server3 | storage3 | 192.168.139.30 |
server4 | storage4 | 192.168.139.40 |
server5 | client | 192.168.139.50 |
- 基于server02克隆server03,server04,server05
- 环境准备(所有节点)
修改主机名
hostnamectl set-hostname server3/4/5
su
配置静态IP
vim /etc/sysconfig/network-scripts/ifcfg-ens33
#修改UUID和IPADDR即可
-----------------------------------------------------
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="ens33"
UUID="79065771-0af6-41b9-9112-1dd5b373f8ed"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.139.10
GATEWAY=192.168.139.2
NETMASK=255.255.255.0
DNS1=114.114.114.114
-----------------------------------------------------
systemctl restart network
域名解析
cat >> /etc/hosts <<EOF
192.168.139.10 server1
192.168.139.20 server2
192.168.139.30 server3
192.168.139.40 server4
192.168.139.50 server5
EOF
关闭防火墙,selinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforced/SELINUX=disabled/' /etc/selinux/config
时间同步
ntpdate cn.ntp.org.cn
yum源配置(需要加上glusterfs官方yum源)
vim /etc/yum.repos.d/glusterfs.repo
---------------------------------------------------
[glusterfs]
name=glusterfs
baseurl=https://buildlogs.centos.org/centos/7/storage/x86_64/gluster-4.1/
enabled=1
gpgcheck=0
--------------------------------------------------
yum clean all
yum makecache
- 在所有存储(storage)服务器上安装glusterfs-server软件(1,2,3,4节点)
yum install -y glusterfs-server.x86_64
systemctl start glusterd
systemctl enable glusterd
systemctl status glusterd
分布式集群大多会有一个中心节点去管理其他节点,但是glusterfs无中心节点。
如果想要glusterfs分布式集群中的所有storage建立,只需要选择其中任意一个storage节点,去连接其他节点,即可实现互通
连接命令:gluster peer probe 主机名|IP地址
断开命令:gluster peer detach 主机名|IP地址
- 节点互通(1,2,3,4,任选其中一个节点),现以server4为例
互连
gluster peer probe server1
gluster peer probe server2
gluster peer probe server3
查看连接状态
gluster peer status
replica复制卷
- storage服务器准备存储目录(1,2,3,4节点)
mkdir -p /data/gv0
在生产环境中建议将数据盘和系统盘分开,重新添加磁盘或分区,将磁盘或分区挂载到数据目录下
- 创建存储卷(1,2,3,4,任选其中一个节点)
创建
gluster volume create gv0 replica 4 server1:/data/gv0/ server2:/data/gv0/ server3:/data/gv0/ server4:/data/gv0 force
查看已创建的卷
gluster volume info gv0
----------------------------------------------
Volume Name: gv0
Type: Replicate
Volume ID: 32026a58-93f2-4b13-8e17-704b5d20a6c4
Status: Created
Snapshot Count: 0
Number of Bricks: 1 x 4 = 4
Transport-type: tcp
Bricks:
Brick1: server1:/data/gv0
Brick2: server2:/data/gv0
Brick3: server3:/data/gv0
Brick4: server4:/data/gv0
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off
---------------------------------------------
启动存储卷
gluster volume start gv0
gluster volume info gv0
---------------------------------------------
Volume Name: gv0
Type: Replicate
Volume ID: 32026a58-93f2-4b13-8e17-704b5d20a6c4
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 4 = 4
Transport-type: tcp
Bricks:
Brick1: server1:/data/gv0
Brick2: server2:/data/gv0
Brick3: server3:/data/gv0
Brick4: server4:/data/gv0
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off
---------------------------------------------
- 客户端使用(节点5)
安装相应软件包
yum install -y glusterfs glusterfs-fuse.x86_64
挂载
mkdir /mnt/gv0
mount -t glusterfs server1:gv0 /mnt/gv0
df -h
-------------------------------------------------------
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 899M 0 899M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 9.6M 901M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/mapper/centos-root 17G 2.1G 15G 12% /
/dev/sda1 1014M 194M 821M 20% /boot
tmpfs 182M 0 182M 0% /run/user/0
server1:gv0 17G 3.2G 14G 19% /mnt/gv0
-------------------------------------------------------
- 扩展:验证数据共享(同读同写),基于server5克隆server6
[root@server6 ~]# dd if=/dev/zero of=/mnt/gv0/file1 bs=1M count=100
[root@server6 ~]# ls /mnt/gv0/
file1
[root@server5 ~]# ls /mnt/gv0/
file1
作为运维人员,需要考虑性能稳定, 高可用,负载均衡,健康检查, 扩展性等等内容
如果其中一个storage节点关机|网卡down掉:
- 客户端需要等待10几秒钟才能正常继续使用,再次启动数据就正常同步过去
如果其中一个storage节点glusterfs相关的进程(glusterfsd)被kill掉
- 客户端正常使用,但写数据不会同步到挂掉的storage节点,等进程再次启动即可同步
特点:
- 类似raid1
- 能够实现高可用
- 磁盘利用率为1/n
stripe条带卷
创建
mkdir /data/gv1
[root@server1 ~]# gluster volume create gv1 stripe 4 server1:/data/gv1/ server2:/data/gv1/ server3:/data/gv1/ server4:/data/gv1/ force
开启
[root@server1 ~]# gluster volume start gv1
挂载
[root@server5 ~]# mkdir /mnt/gv1
[root@server5 ~]# mount.glusterfs server1:gv1 /mnt/gv1
测试
特点:
- 文件过小,不会平均分配给存储节点。有一定大小的文件会平均分配。类似raid0
- 磁盘利用率100%(前提是所有节点提供的空间一样大,如果大小不一样,则按小的来进行条带)
- 大文件会平均分配给存储节点(LB)
- 不能实现HA,挂掉一个存储节点,此stripe存储卷则不可被客户端访问
distributed分布卷
创建
mkdir /data/gv2
[root@server1 ~]# gluster volume create gv2 server1:/data/gv2/ server2:/data/gv2/ server3:/data/gv2/ server4:/data/gv2/ force
开启
[root@server1 ~]# gluster volume start gv2
挂载
[root@server5 ~]# mkdir /mnt/gv2
[root@server5 ~]# mount.glusterfs server1:gv2 /mnt/gv2
[root@server5 ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 899M 0 899M 0% /dev
tmpfs tmpfs 910M 0 910M 0% /dev/shm
tmpfs tmpfs 910M 9.6M 901M 2% /run
tmpfs tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 17G 2.1G 15G 12% /
/dev/sda1 xfs 1014M 194M 821M 20% /boot
tmpfs tmpfs 182M 0 182M 0% /run/user/0
server1:gv2 fuse.glusterfs 68G 9.8G 59G 15% /mnt/gv2
测试
[root@server5 ~]# touch /mnt/gv2/{a..h}
[root@server1 ~]# ls /data/gv2/
a
[root@server2 ~]# ls /data/gv2/
b c e
[root@server3 ~]# ls /data/gv2/
f g
[root@server4 ~]# ls /data/gv2/
d h
特点:
- 该模式为随机写到不同的存储里,直到所有写满为止
- 磁盘利用率100%
- 方便扩容
- 不保障的数据的安全性(挂掉一个节点,等待大概1分钟后,这个节点就剔除了,被剔除的节点上的数据丢失)
- 不能提高IO性能
distributed-replica
创建
mkdir /data/gv3
[root@server1 ~]# gluster volume create gv3 replica 2 server1:/data/gv3/ server2:/data/gv3/ server3:/data/gv3/ server4:/data/gv3/ force
开启
[root@server1 ~]# gluster volume start gv3
[root@server1 ~]# gluster volume info gv3
Volume Name: gv3
Type: Distributed-Replicate
Volume ID: 28066226-1da3-4b7c-87f4-0aa0c85c1a08
Status: Started
Snapshot Count: 0
Number of Bricks: 2 x 2 = 4
Transport-type: tcp
Bricks:
Brick1: server1:/data/gv3
Brick2: server2:/data/gv3
Brick3: server3:/data/gv3
Brick4: server4:/data/gv3
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off
挂载
[root@server5 ~]# mkdir /mnt/gv3
[root@server5 ~]# mount.glusterfs server1:gv3 /mnt/gv3
[root@server5 ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 899M 0 899M 0% /dev
tmpfs tmpfs 910M 0 910M 0% /dev/shm
tmpfs tmpfs 910M 9.6M 901M 2% /run
tmpfs tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 17G 2.1G 15G 12% /
/dev/sda1 xfs 1014M 194M 821M 20% /boot
tmpfs tmpfs 182M 0 182M 0% /run/user/0
server1:gv2 fuse.glusterfs 68G 9.8G 59G 15% /mnt/gv2
server1:gv3 fuse.glusterfs 34G 5.4G 29G 16% /mnt/gv3
测试
[root@server5 ~]# touch /mnt/gv3/{a..h}
[root@server1 ~]# ls /data/gv3/
a b c e
[root@server2 ~]# ls /data/gv3/
a b c e
[root@server3 ~]# ls /data/gv3/
d f g h
[root@server4 ~]# ls /data/gv3/
d f g h
特点:
- 4个存储分为两个组,这两个组按照distributed模式随机。但在组内的两个存储会按replica模式镜像复制
- 磁盘利用率50%(分为2组的情况下)
- 方便扩容
- 能够实现HA
dispersed纠删卷
创建
mkdir /data/gv4
[root@server1 ~]# gluster volume create gv4 disperse 4 server1:/data/gv4/ server2:/data/gv4/ server3:/data/gv4/ server4:/data/gv4/ force
There isn't an optimal redundancy value for this configuration. Do you want to create the volume with redundancy 1 ? (y/n) y
开启
[root@server1 ~]# gluster volume start gv4
[root@server1 ~]# gluster volume info gv4
Volume Name: gv4
Type: Disperse
Volume ID: 9ecd5a43-c7b5-485f-b593-0974e54cecf4
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x (3 + 1) = 4
Transport-type: tcp
Bricks:
Brick1: server1:/data/gv4
Brick2: server2:/data/gv4
Brick3: server3:/data/gv4
Brick4: server4:/data/gv4
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
挂载
[root@server5 ~]# mkdir /mnt/gv4
[root@server5 ~]# mount.glusterfs server1:gv4 /mnt/gv4
[root@server5 ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 899M 0 899M 0% /dev
tmpfs tmpfs 910M 0 910M 0% /dev/shm
tmpfs tmpfs 910M 9.6M 901M 2% /run
tmpfs tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 17G 2.1G 15G 12% /
/dev/sda1 xfs 1014M 194M 821M 20% /boot
tmpfs tmpfs 182M 0 182M 0% /run/user/0
server1:gv2 fuse.glusterfs 68G 9.8G 59G 15% /mnt/gv2
server1:gv3 fuse.glusterfs 34G 5.4G 29G 16% /mnt/gv3
server1:gv4 fuse.glusterfs 51G 9.6G 42G 19% /mnt/gv4
测试
[root@server5 ~]# dd if=/dev/zero of=/mnt/gv4/file1 bs=1M count=100
[root@server1 ~]# ll -h /data/gv4/file1
-rw-r--r-- 2 root root 34M 10月 30 21:32 /data/gv4/file1
[root@server2 ~]# ll -h /data/gv4/file1
-rw-r--r-- 2 root root 34M 10月 30 21:32 /data/gv4/file1
[root@server3 ~]# ll -h /data/gv4/file1
-rw-r--r-- 2 root root 34M 10月 30 21:32 /data/gv4/file1
[root@server4 ~]# ll -h /data/gv4/file1
-rw-r--r-- 2 root root 34M 10月 30 21:32 /data/gv4/file1
特点:
- 类似raid5|raid6
- 磁盘利用率75%(视情况而定)
- 能够实现HA
卷的删除
删除客户端挂载的目录及数据
[root@server5 ~]# rm -rf /mnt/gv0/*
解挂
[root@server5 ~]# umount /mnt/gv0
[root@server6 ~]# umount /mnt/gv0
停止存储卷
[root@server4 ~]# gluster volume stop gv0
Stopping volume will make its data inaccessible. Do you want to continue? (y/n) y
删除储存卷
[root@server4 ~]# gluster volume delete gv0
Deleting volume will erase all information about the volume. Do you want to continue? (y/n) y
裁减与扩容
- 以distributed卷为例来做裁减与扩容
裁减
- 在线裁减要看是哪一种模式的卷,比如stripe模式就不允许在线裁减
- 不建议该操作
清空需要裁减的服务器上的数据
[root@server1 ~]# ls /data/gv2
a
[root@server5 ~]# rm -rf /mnt/gv2/a
[root@server1 ~]# ls /data/gv2
裁减
[root@server1 ~]# gluster volume remove-brick gv2 server1:/data/gv2 force
Remove-brick force will not migrate files from the removed bricks, so they will no longer be available on the volume.
Do you want to continue? (y/n) y
[root@server1 ~]# gluster volume info gv2
Volume Name: gv2
Type: Distribute
Volume ID: 7f21d9ec-6367-4eaf-990f-6eb8dd3003ba
Status: Started
Snapshot Count: 0
Number of Bricks: 3
Transport-type: tcp
Bricks:
Brick1: server2:/data/gv2
Brick2: server3:/data/gv2
Brick3: server4:/data/gv2
Options Reconfigured:
performance.client-io-threads: on
transport.address-family: inet
nfs.disable: on
扩容
域名解析(所有storage节点)
cat >> /etc/hosts <<EOF
192.168.139.60 server6
EOF
安装glusterfs-server软件
[root@server6 ~]# yum install -y glusterfs-server.x86_64
错误:软件包:glusterfs-cli-4.1.10-1.el7.x86_64 (glusterfs)
需要:glusterfs-libs = 4.1.10-1.el7
已安装: glusterfs-libs-6.0-49.1.el7.x86_64 (@updates)
glusterfs-libs = 6.0-49.1.el7
可用: glusterfs-libs-4.1.0-0.1.rc0.el7.x86_64 (glusterfs)
glusterfs-libs = 4.1.0-0.1.rc0.el7
可用: glusterfs-libs-4.1.0-1.el7.x86_64 (glusterfs)
glusterfs-libs = 4.1.0-1.el7
原因:版本冲突
解决:yum remove -y glusterf*
[root@server6 ~]# yum remove -y glusterfs*
[root@server6 ~]# yum install -y glusterfs-server.x86_64
启动服务
[root@server6 ~]# systemctl start glusterd
[root@server6 ~]# systemctl enable glusterd
[root@server6 ~]# systemctl status glusterd
通过集群原先成员,将server6加入到集群中
[root@server2 ~]# gluster peer probe server6
peer probe: success.
[root@server2 ~]# gluster peer status
Number of Peers: 4
Hostname: server4
Uuid: 4660760c-793c-4bb1-9f85-2ab0ad7a142c
State: Peer in Cluster (Connected)
Hostname: server3
Uuid: ec3336c8-158a-42bc-a179-b6a6c3f02b2f
State: Peer in Cluster (Connected)
Hostname: server1
Uuid: 6baea8e4-e021-400d-b684-d5a1a17ff427
State: Peer in Cluster (Connected)
Hostname: server6
Uuid: 60ee3b8a-8842-4f97-b1c9-810424551525
State: Peer in Cluster (Connected)
创建数据目录
[root@server6 ~]# mkdir /data/gv2 -p
扩容
[root@server6 ~]# gluster volume add-brick gv2 server6:/data/gv2 force
volume add-brick: success
ceph
介绍
概念
- Ceph是一个能提供的文件存储,块存储和对象存储的分布式存储系统。它提供了一个可无限伸缩的Ceph存储集群
- RedHat及OpenStack 都可与Ceph整合以支持虚拟机镜像的后端存储。
- 官网:https://docs.ceph.com/docs/master/
优势
- 高扩展性,使用普通x86服务器,支持10-1000台服务器,支持TB到EB级的扩展
- 高可靠性,没有单点故障,多数据副本,自动管理,自动修复
- 高性能,数据分布均衡
- 可用于对象存储,块设备存储和文件系统存储
架构
-
RADOS对象存储系统
Ceph基于可靠的、自动化的、分布式的对象存储(Reliable,Autonomous,Distributed Object Storage,RADOS)提供了一个可以无限扩展的存储集群。RADOS,顾名思义这一层本身是一个完整的对象存储系统,所有存储在Ceph系统中的用户数据事实上最终都是由这一层来完成的。而Ceph的高可靠、高可扩展、高性能、高自动化等特性本质上也是由这一层提供的。
物理上,RADOS由大量的存储设备结点组成,每个结点拥有自己的硬件资源(CPU/内存/硬盘/网络), 并运行着操作系统和文件系统。
-
基础库librados
Ceph客户端用一定的协议和存储集群进行交互,Ceph把此功能封装进了librados库。librados库实际上是对RADOS进行抽象和封装,并向上层提供API的,以便可以基于RADOS进行应用开发,支持多种编程语言,如Python,C,C++等.。 简单来说,就是给开发人员使用的接口
-
RADOS GW / RBD / Ceph FS
RADOS GW:是一个构建在librados库之上的对象存储接口,为应用访问Ceph集群提供了一个restful:风格的网关并且兼容S3和Swift。(对象存储)
RBD :则提供了一个标准的块设备接口,常用于在虚拟化的场景下为虚拟机创建存储卷。 (块存储)
Ceph FS:是一个可移植操作系统接口兼容的分布式存储系统,使用Ceph存储集群来存储数据,通过Linux内核客户端和FUSE来提供文件系统。(文件存储)
-
扩展名词
RESTFUL: RESTFUL是一种架构风格,提供了一组设计原则和约束条件,http就属于这种风格的典型应用。REST最大的几个特点为:资源、统一接口、URI和无状态。
- 资源: 网络上一个具体的信息: 一个文件,一张图片,一段视频都算是一种资源。
- 统一接口: 数据的元操作,即CRUD(create, read, update和delete)操作,分别对应于HTTP方法
- GET(SELECT):从服务器取出资源(一项或多项)。
- POST(CREATE):在服务器新建一个资源。
- PUT(UPDATE):在服务器更新资源(客户端提供完整资源数据)。
- PATCH(UPDATE):在服务器更新资源(客户端提供需要修改的资源数据)。
- DELETE(DELETE):从服务器删除资源。
- URI(统一资源定位符): 每个URI都对应一个特定的资源。要获取这个资源,访问它的URI就可以。最典型的URI即URL
- 无状态: 一个资源的定位与其它资源无关,不受其它资源的影响。
S3 (Simple Storage Service 简单存储服务): 可以把S3看作是一个超大的硬盘, 里面存放数据资源(文件,图片,视频等),这些资源统称为对象.这些对象存放在存储段里,在S3叫做bucket.
- 和硬盘做类比, 存储段(bucket)就相当于目录,对象就相当于文件。
swift: 最初是由Rackspace公司开发的高可用分布式对象存储服务,并于2010年贡献给OpenStack开源社区作为其最初的核心子项目之一.
RADOS存取原理
- 要实现数据存取需要创建一个pool,创建pool要先分配PG
- Monitor :一个Ceph集群需要多个Monitor组成的小集群,它们通过Paxos同步数据,用来保存OSD的元数据。
- OSD: OSD全称Object Storage Device,也就是负责响应客户端请求返回具体数据的进程。一个Ceph集群一般都有很多个OSD。
- MDS:MDS全称Ceph· Metadata Server,是CephFS服务依赖的元数据服务。
- Object :Ceph最底层的存储单元是Object对象,每个Object包含元数据和原始数据。
- PG :PG全称Placement Grouops,是一个逻辑的概念,一个PG包含多个OSD。引入PG这一层其实是为了更好的分配数据和定位数据。
- CRUSH:CRUSH是Ceph使用的数据分布算法,类似一致性哈希,让数据分配到预期的地方。
ceph集群搭建
- Ceph存储集群至少需要一个Ceph Monitor和两个 OSD 守护进程
- 环境准备
注意:这里都全改成短主机名,方便后面实验。如果你坚持用类似vm1.cluster.com这种主机名,或者加别名的话,ceph会在后面截取你的主机名vm1.cluster.com为vm1,造成不一致导致出错
虚拟机 | IP地址 | 担当 |
---|---|---|
server1 | 192.168.139.10 | node1 |
server2 | 192.168.139.20 | node2 |
server3 | 192.168.139.30 | node3 |
server4 | 192.168.139.40 | client |
所有node节点添加大小为5G的硬盘
域名解析
cat >> /etc/hosts <<EOF
192.168.139.10 server1
192.168.139.20 server2
192.168.139.30 server3
192.168.139.40 server4
EOF
关闭防火墙,selinux
systemctl stop firewalld
systemctl disable firewalld
iptables -F
setenforce 0
sed -i 's/SELINUX=enforced/SELINUX=disabled/' /etc/selinux/config
时间同步
ntpdate cn.ntp.org.cn
date
yum源配置(centos7默认的公网源+epel源+ceph的aliyun源)
yum install -y epel-release
vim /etc/yum.repos.d/ceph.repo
---------------------------------------------------
[ceph]
name=ceph
baseurl=http://mirrors.aliyun.com/ceph/rpm-mimic/el7/x86_64/
enabled=1
gpgcheck=0
priority=1
[ceph-noarch]
name=cephnoarch
baseurl=http://mirrors.aliyun.com/ceph/rpm-mimic/el7/noarch/
enabled=1
gpgcheck=0
priority=1
[ceph-source]
name=Ceph source packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-mimic/el7/SRPMS
enabled=1
gpgcheck=0
priority=1
--------------------------------------------------
yum clean all
yum makecache
yum repolist
- 配置免密登录(选择server1为部署节点)
[root@server1 ~]# ssh-keygen
[root@server1 ~]# ssh-copy-id server1
[root@server1 ~]# ssh-copy-id server2
[root@server1 ~]# ssh-copy-id server3
[root@server1 ~]# ssh-copy-id server4
- 在选择的部署节点(server1)上安装部署工具并创建集群
安装ceph-deploy
[root@server1 ~]# yum install -y ceph-deploy
创建集群
[root@server1 ~]# mkdir /etc/ceph/
[root@server1 ~]# cd /etc/ceph/
[root@server1 ceph]# ceph-deploy new server1
[root@server1 ceph]# ls
ceph.conf ceph-deploy-ceph.log ceph.mon.keyring
- 安装ceph相关软件
所有node节点(1,2,3)安装ceph和ceph-radosgw
yum install ceph ceph-radosgw.x86_64 -y
客户端(4)安装ceph-common
[root@server4 ~]# yum install -y ceph-common.x86_64
- 创建mon(监控)
在部署节点增加public网络用于监控
[root@server1 ceph]# echo 'public network = 192.168.139.0/24' >> /etc/ceph/ceph.conf
[root@server1 ceph]# cat /etc/ceph/ceph.conf
[global]
fsid = 697c2db7-ffa2-4636-b364-532a89b379fa
mon_initial_members = server1
mon_host = 192.168.139.10
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
public network = 192.168.139.0/24
创建监控
[root@server1 ceph]# ceph-deploy mon create-initial
查看集群
[root@server1 ceph]# ceph health
HEALTH_OK
[root@server1 ceph]# ceph -s
cluster:
id: 697c2db7-ffa2-4636-b364-532a89b379fa
health: HEALTH_OK
services:
mon: 1 daemons, quorum server1
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节点,以防单点故障(建议奇数个,因为有quorum仲裁投票)
[root@server1 ceph]# ceph-deploy mon add server2
[root@server1 ceph]# ceph-deploy mon add server3
[root@server1 ceph]# ceph -s
cluster:
id: 697c2db7-ffa2-4636-b364-532a89b379fa
health: HEALTH_OK
services:
mon: 3 daemons, quorum server1,server2,server3
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:
- 创建mgr(管理)
在部署节点创建一个mgr
[root@server1 ceph]# ceph-deploy mgr create server1
[root@server1 ceph]# ceph -s
cluster:
id: 697c2db7-ffa2-4636-b364-532a89b379fa
health: HEALTH_WARN
OSD count 0 < osd_pool_default_size 3
services:
mon: 3 daemons, quorum server1,server2,server3
mgr: server1(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:
添加多个mgr实现HA
[root@server1 ceph]# ceph-deploy mgr create server2
[root@server1 ceph]# ceph-deploy mgr create server3
[root@server1 ceph]# ceph -s
cluster:
id: 697c2db7-ffa2-4636-b364-532a89b379fa
health: HEALTH_WARN
OSD count 0 < osd_pool_default_size 3
services:
mon: 3 daemons, quorum server1,server2,server3
mgr: server1(active), standbys: server2, server3
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:
- 创建osd(存储盘)
zap表示干掉磁盘上的数据,相当于格式化
[root@server1 ceph]# ceph-deploy disk zap server1 /dev/sdb
[root@server1 ceph]# ceph-deploy disk zap server2 /dev/sdb
[root@server1 ceph]# ceph-deploy disk zap server3 /dev/sdb
将磁盘创建为osd
[root@server1 ceph]# ceph-deploy osd create --data /dev/sdb server1
[root@server1 ceph]# ceph-deploy osd create --data /dev/sdb server2
[root@server1 ceph]# ceph-deploy osd create --data /dev/sdb server3
[root@server1 ceph]# ceph -s
cluster:
id: 697c2db7-ffa2-4636-b364-532a89b379fa
health: HEALTH_OK
services:
mon: 3 daemons, quorum server1,server2,server3
mgr: server1(active), standbys: server2, server3
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
pgs:
在线扩容
以加入node4节点为例
- 主机名配置和绑定
- 在node4上
yum install ceph ceph-radosgw -y
安装软件 - 在部署节点node1上同步配置文件给node4.
ceph-deploy admin node4
- 按需求选择在node4上添加mon或mgr或osd等
pool
- 创建pool
创建test_pool,指定pg数为128
[root@server1 ceph]# ceph osd pool create test_pool 128
pool 'test_pool' created
查看gv数目
[root@server1 ceph]# ceph osd pool get test_pool pg_num
pg_num: 128
- 上传数据
这里把本机的/etc/fstab文件上传到test_pool,并取名为newfstab
[root@server1 ceph]# rados put newfstab /etc/fstab --pool=test_pool
查看
[root@server1 ceph]# rados -p test_pool ls
newfstab
- 删除数据
[root@server1 ceph]# rados rm newfstab -p test_pool
[root@server1 ceph]# rados -p test_pool ls
- 删除pool
在部署节点node1上增加参数允许ceph删除pool
[root@server1 ceph]# echo 'mon_allow_pool_delete = true' >>/etc/ceph/ceph.conf
将配置文件同步到其他集群节点
[root@server1 ceph]# ceph-deploy --overwrite-conf admin server1 server2 server3
重启监控服务
[root@server1 ceph]# systemctl restart ceph-mon.target
删除pool(pool名输入两次,后再接--yes-i-really-really-mean-it参数)
[root@server1 ceph]# ceph osd pool delete test_pool test_pool --yes-i-really-really-mean-it
pool 'test_pool' removed
文件存储
-
要运行Ceph文件系统,需要创建至少带一个mds的Ceph存储集群
-
创建文件系统
创建多个mds,实现HA
[root@server1 ceph]# ceph-deploy --overwrite-conf admin server1 server2 server3
一个Ceph文件系统需要至少两个RADOS存储池,将数据与元数据分开
[root@server1 ceph]# ceph osd pool create cephfs_pool 128
[root@server1 ceph]# ceph osd pool create cephfs_metadata 64
[root@server1 ceph]# ceph osd pool ls
cephfs_pool
cephfs_metadata
将两个pool合并
[root@server1 ceph]# ceph fs new cephfs cephfs_metadata cephfs_pool
new fs with metadata pool 3 and data pool 2
查看状态
[root@server1 ceph]# ceph mds stat
cephfs-1/1/1 up {0=server3=up:active}, 2 up:standby
- 客户端挂载
客户端认证
[root@server1 ceph]# cat /etc/ceph/ceph.client.admin.keyring
[client.admin]
key = AQCTmH9h8BxfMhAA3rbWaEtqLMEVwzuUUll43Q==
caps mds = "allow *"
caps mgr = "allow *"
caps mon = "allow *"
caps osd = "allow *"
#复制key,在客户端上创建一个文件记录密钥字符串
[root@server4 ~]# vim admin.key
[root@server4 ~]# cat admin.key
AQCTmH9h8BxfMhAA3rbWaEtqLMEVwzuUUll43Q==
挂载
[root@server4 ~]# mount.ceph server1:6789:/ /mnt -o name=admin,secretfile=/root/admin.key
[root@server4 ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 899M 0 899M 0% /dev
tmpfs tmpfs 910M 0 910M 0% /dev/shm
tmpfs tmpfs 910M 9.6M 901M 2% /run
tmpfs tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 17G 2.1G 15G 13% /
/dev/sda1 xfs 1014M 194M 821M 20% /boot
tmpfs tmpfs 182M 0 182M 0% /run/user/0
192.168.139.10:6789:/ ceph 3.8G 0 3.8G 0% /mnt
- 删除文件储存系统
客户端删除数据
[root@server4 ~]# rm -rf /mnt/*
解挂
[root@server4 ~]# umount /mnt/
顶掉所有的mds节点
[root@server1 ~]# systemctl stop ceph-mds.target
[root@server2 ~]# systemctl stop ceph-mds.target
[root@server3 ~]# systemctl stop ceph-mds.target
删除文件系统
[root@server1 ~]# ceph fs rm cephfs --yes-i-really-mean-it
删pool
[root@server1 ~]# ceph osd pool delete cephfs_metadata cephfs_metadata --yes-i-really-really-mean-it
[root@server1 ~]# ceph osd pool delete cephfs_pool cephfs_pool --yes-i-really-really-mean-it
启动ceph-mds.target
[root@server1 ~]# systemctl start ceph-mds.target
[root@server2 ~]# systemctl start ceph-mds.target
[root@server3 ~]# systemctl start ceph-mds.target
块存储
- 创建块设备
在server1上同步文件到客户端
[root@server1 ~]# cd /etc/ceph/
[root@server1 ceph]# ceph-deploy admin server4
建立存储池
[root@server4 ~]# ceph osd pool create rbd_pool 128
储存池初始化
[root@server4 ~]# rbd pool init rbd_pool
创建镜像
[root@server4 ~]# rbd create image1 -p rbd_pool --size 5000
查看
[root@server4 ~]# rbd ls rbd_pool
image1
[root@server4 ~]# rbd info image1 -p rbd_pool
rbd image 'image1':
size 4.9 GiB in 1250 objects
order 22 (4 MiB objects)
id: 5eb36b8b4567
block_name_prefix: rbd_data.5eb36b8b4567
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Mon Nov 1 22:59:37 2021
将image1映射为块设备
[root@server4 ~]# rbd feature disable rbd_pool/image1 object-map fast-diff deep-flatten
[root@server4 ~]# rbd map rbd_pool/image1
/dev/rbd0
[root@server4 ~]# rbd map rbd_pool/image1
rbd: warning: image already mapped as /dev/rbd0
/dev/rbd1
[root@server4 ~]# rbd showmapped
id pool image snap device
0 rbd_pool image1 - /dev/rbd0
1 rbd_pool image1 - /dev/rbd1
分区,格式化,挂载
[root@server4 ~]# fdisk /dev/rbd0
[root@server4 ~]# mkfs.xfs /dev/rbd0p1
[root@server4 ~]# mount /dev/rbd0p1 /mnt
[root@server4 ~]# df -Th
文件系统 类型 容量 已用 可用 已用% 挂载点
devtmpfs devtmpfs 899M 0 899M 0% /dev
tmpfs tmpfs 910M 0 910M 0% /dev/shm
tmpfs tmpfs 910M 9.6M 901M 2% /run
tmpfs tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/mapper/centos-root xfs 17G 2.1G 15G 13% /
/dev/sda1 xfs 1014M 194M 821M 20% /boot
tmpfs tmpfs 182M 0 182M 0% /run/user/0
/dev/rbd0p1 xfs 4.9G 33M 4.9G 1% /mnt
测试
[root@server4 ~]# dd if=/dev/zero of=/mnt/file1 bs=1M count=1000
[root@server4 ~]# ceph -s
cluster:
id: 697c2db7-ffa2-4636-b364-532a89b379fa
health: HEALTH_OK
services:
mon: 3 daemons, quorum server1,server2,server3
mgr: server1(active), standbys: server2, server3
osd: 3 osds: 3 up, 3 in
data:
pools: 1 pools, 128 pgs
objects: 239 objects, 900 MiB
usage: 5.6 GiB used, 9.4 GiB / 15 GiB avail
pgs: 128 active+clean
io:
client: 28 MiB/s wr, 0 op/s rd, 22 op/s wr
- 在线扩容
分区后不能在线扩容,选用/dev/rbd1做在线扩容
格式化,挂载
[root@server4 ~]# mkfs.xfs -f /dev/rbd1
[root@server4 ~]# mount /dev/rbd1 /mnt
[root@server4 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─centos-root 253:0 0 17G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 5G 0 disk
sr0 11:0 1 973M 0 rom
rbd0 252:0 0 4.9G 0 disk
└─rbd0p1 252:1 0 4.9G 0 part
rbd1 252:16 0 4.9G 0 disk /mnt
扩容成8.0G
[root@server4 ~]# rbd resize --size 8000 rbd_pool/image1
[root@server4 ~]# rbd info rbd_pool/image1
rbd image 'image1':
size 7.8 GiB in 2000 objects
order 22 (4 MiB objects)
id: 5eb36b8b4567
block_name_prefix: rbd_data.5eb36b8b4567
format: 2
features: layering, exclusive-lock
op_features:
flags:
create_timestamp: Mon Nov 1 22:59:37 2021
[root@server4 ~]# df -h |tail -1
/dev/rbd1 4.9G 33M 4.9G 1% /mnt
[root@server4 ~]# xfs_growfs -d /mnt/
[root@server4 ~]# df -h |tail -1
/dev/rbd1 7.9G 33M 7.8G 1% /mnt
- 裁减
裁减成5G
[root@server4 ~]# rbd resize --size 5000 rbd_pool/image1 --allow-shrink
重新格式化挂载
[root@server4 ~]# umount /mnt
[root@server4 ~]# mkfs.xfs -f /dev/rbd0
[root@server4 ~]# mount /dev/rbd0 /mnt/
[root@server4 ~]# df -Th|tail -1
/dev/rbd0 xfs 4.9G 33M 4.9G 1% /mnt
- 删除块存储
[root@server4 ~]# umount /mnt/
[root@server4 ~]# rbd unmap /dev/rbd0
[root@server4 ~]# ceph osd pool delete rbd_pool rbd_pool --yes-i-really-really-mean-it
pool 'rbd_pool' removed
对象存储
- 创建对象储存
创建对象存储网关
[root@server1 ~]# cd /etc/ceph/
[root@server1 ceph]# ceph-deploy rgw create server1
查看7480端口
[root@server1 ceph]# lsof -i:7480
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
radosgw 7867 ceph 40u IPv4 34871 0t0 TCP *:7480 (LISTEN)
- 客户端连接
创建测试用户,并保留密钥
#--uid和 --display-name的内容都需要用双引号引起来,单引号会报错
[root@server4 ~]# radosgw-admin user create --uid="testuser" --display-name="First User"
{
"user_id": "testuser",
"display_name": "First User",
"email": "",
"suspended": 0,
"max_buckets": 1000,
"auid": 0,
"subusers": [],
"keys": [
{
"user": "testuser",
"access_key": "8YXZDWROO1DZ6DIGGU4W",
"secret_key": "DukiAU8FcRVAHH5leK76l3QH9J4wymxSHcNcJ6kq"
}
],
"swift_keys": [],
"caps": [],
"op_mask": "read, write, delete",
"default_placement": "",
"placement_tags": [],
"bucket_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"user_quota": {
"enabled": false,
"check_on_raw": false,
"max_size": -1,
"max_size_kb": 0,
"max_objects": -1
},
"temp_url_keys": [],
"type": "rgw",
"mfa_ids": []
}
[root@server4 ~]# radosgw-admin user create --uid="testuser" --display-name="First User"|grep -E 'access_key|secret_key'
"access_key": "8YXZDWROO1DZ6DIGGU4W",
"secret_key": "DukiAU8FcRVAHH5leK76l3QH9J4wymxSHcNcJ6kq"
安装s3cmd工具,用于连接
[root@server4 ~]# yum install -y s3cmd
编写连接参数,保存到/root/.s3cfg文件中(s3cmd会默认加载)
[root@server4 ~]# vim /root/.s3cfg
[default]
access_key = 8YXZDWROO1DZ6DIGGU4W
secret_key = DukiAU8FcRVAHH5leK76l3QH9J4wymxSHcNcJ6kq
host_base = 192.168.139.10:7480
host_bucket = 192.168.139.10:7480/%(bucket)
cloudfront_host = 192.168.139.10:7480
use_https = False
- 客户端使用
创建bucket
[root@server4 ~]# s3cmd mb s3://test_bucket
[root@server4 ~]# s3cmd ls
2021-11-01 16:32 s3://test_bucket
上传文件
[root@server4 ~]# s3cmd put /etc/fstab s3://test_bucket
下载文件
[root@server4 ~]# s3cmd get s3://test_bucket/fstab
download: 's3://test_bucket/fstab' -> './fstab' [1 of 1]
[root@server4 ~]# ls ./fstab
./fstab
ceph+owncloud打造云盘
在ceph的客户端上准备好bucket和相关的连接key
[root@server4 ~]# s3cmd mb s3://owncloud
Bucket 's3://owncloud/' created
[root@server4 ~]# cat /root/.s3cfg
[default]
access_key = 8YXZDWROO1DZ6DIGGU4W
secret_key = DukiAU8FcRVAHH5leK76l3QH9J4wymxSHcNcJ6kq
host_base = 192.168.139.10:7480
host_bucket = 192.168.139.10:7480/%(bucket)
cloudfront_host = 192.168.139.10:7480
use_https = False
安装owncloud运行环境
#owncloud需要web服务器和php支持. 目前最新版本owncloud需要php7.x版本
#这里我们使用老版本的owncloud
[root@server4 ~]# yum install httpd mod_ssl php-mysql php php-gd php-xml php-mbstring -y
[root@server4 ~]# systemctl restart httpd
上传owncloud软件包, 并解压到httpd家目录
[root@server4 ~]# yum install -y lrzsz
[root@server4 ~]# rz
[root@server4 ~]# tar -xjf owncloud-9.0.1.tar.bz2
tar (child): bzip2:无法 exec: 没有那个文件或目录
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now
[root@server4 ~]# yum install -y bzip2
[root@server4 ~]# tar -xjf owncloud-9.0.1.tar.bz2
[root@server4 ~]# mv owncloud /var/www/html/
修改/var/www/html的属主,属组
[root@server4 ~]# chown apache.apache -R /var/www/html/
[root@server4 ~]# ll /var/www/html/
drwxr-xr-x 14 apache apache 4096 4月 7 2016 owncloud
- 浏览器访问
- 开启外部存储
- 上传文件
传入Windows中的文件
liunx命令行传入文件
[root@server4 ~]# s3cmd put /etc/fstab s3://owncloud
upload: '/etc/fstab' -> 's3://owncloud/fstab' [1 of 1]
465 of 465 100% in 0s 8.76 KB/s done
- 下载文件
点击文件即可下载
- 修改owncloud上传文件大小限制(默认不能超过2M)
[root@server4 ~]# vim /var/www/html/owncloud/.htaccess
<IfModule mod_php5.c>
php_value upload_max_filesize 2000M 修改调大
php_value post_max_size 2000M 修改调大
[root@client ~]# vim /etc/php.ini
post_max_size = 2000M 修改调大
upload_max_filesize = 2000M 修改调大
[root@server4 ~]# systemctl restart httpd