文章目录
第一章节 存储概念与SAN
任务背景
随着某些业务数据的增大, 公司服务器硬盘空闲空间越来越小, 服务器上也无法再拓展硬盘, 所以我们考虑使用网络存储方式远程共享存储给服务器使用。
任务要求
实现存储通过远程共享给应用服务器使用
任务拆解
1, 需要知道存储有哪些方式可以通过网络共享给服务器使用,如何选择合理的方式
2, 需要知道存储共享给服务器后是一种什么形式,是一个目录呢, 还是一个块设备
3, 使用什么样的软件来实现
4, 配置实现
学习目标
- 能够区分DAS,NAS,SAN三种存储分类
- 能够区分文件存储类型与块存储类型
- 能够使用iscsi实现IP-SAN
知识储备
存储介绍
存储(storage)是什么?
简单来说,存储就是存放数据的介质。
我们在这里不是学习这些硬件知识,而是学习Linux平台下的存储技术。
在前面学习的架构基础上再加上远程存储。
Linux存储分层(了解)
问题: linux上如何挂载ntfs格式的移动硬盘?
linux内核支持ntfs,但centos7系统并没有加上此功能,解决方法两种:
- 重新编译内核,在内核加上支持ntfs(此方法不推荐,因为编译内核会造成内核运行不稳定, 没有过硬的实力不要做)
- 安装软件,为内核加上支持ntfs的模块
安装
# yum install epel-release -y
# yum install ntfs-3g
挂载命令
# mount.ntfs-3g /dev/sdb1 /mnt
一个新的硬盘在linux系统里使用一般来说就三步:(分区,格式化)-挂载-使用
Linux存储五层:
上面比较难理解的是虚拟文件系统: 又名VFS (Virtual File System),作用就是采用标准的Unix系统调用读写位于不同物理介质上的不同文件系统,即为各类文件系统提供了一个统一的操作界面和应用编程接口。
简单来说,就是使用上层应用程序不用关注底层是什么文件系统, 统一使用。
存储的分类
存储的分类(重点)
存储分类 | 描述 |
---|---|
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使用 |
对象存储 | 通俗来讲,就是存储是什么形式,怎么做的都不用关注。使用的人只要直接使用程序接口去访问, 进行get下载与put上传就好 |
文件存储: 类似一个大的目录,多个客户端都可以挂载过来使用。
- 优点: 利于数据共享
- 缺点: 速度较慢
块存储: 类似一个block设备,客户端可以格式化,挂载并使用,和用一个硬盘一样。
- 优点: 和本地硬盘一样,直接使用,速度较快
- 缺点: 数据不共享
对象存储: 一个对象我们可以看成一个文件, 综合了文件存储和块存储的优点。
- 优点: 速度快,数据共享
- 缺点: 成本高, 不兼容现有的模式
如果两台nginx服务器想要实现web家目录里的数据一致, 请问怎么做?
小结:
-
存储要通过远程的方法共享
-
有可能要考虑数据共享的问题
-
存储分类:DAS,NAS,SAN
-
存储类型分类: 文件存储,块存储, 对象存储
SAN
SAN的分类
两种SAN:
- FC-SAN: 早期的SAN, 服务器与交换机的数据传输是通过光纤进行的, 服务器把SCSI指令传输到存储设备上,不能走普通LAN网的IP协议。
- IP-SAN: 用IP协议封装的SAN, 可以完全走普通网络,因此叫做IP-SAN, 最典型的就是ISCSI。
FC-SAN优缺点: 速度快(2G,8G,16G), 成本高, 传输距离有一定限制。
IP-SAN优缺点: 速度较慢(已经有W兆以太网标准), 成本低, 传输距离无限制。
IP-SAN之iscsi实现
实验: Linux平台通过iscsi实现IP-SAN
实验准备: 两台虚拟机(centos7平台)同网段(比如vmnet8), 交换机不用模拟,因为同网段的虚拟机就相当于连在同一个交换机上
- 静态IP,(两台IP互通就行,网关和DNS不做要求)
- 都配置主机名及其主机名互相绑定
- 关闭防火墙,selinux
- 时间同步
- 配置好yum(需要加上epel源)
- 在存储导出端模拟存储(模拟存储可以使用多种形式,如硬盘:/dev/sdb,分区:/dev/sdb1,软raid:/dev/md0,逻辑卷:/dev/vg/lv01,dd创建的大文件等等)
下面我为了实验方便,就用dd的大文件来模拟存储
export# mkdir /data/
export# dd if=/dev/zero of=/data/storage1 bs=1M count=500
export# dd if=/dev/zero of=/data/storage2 bs=1M count=1000
export# dd if=/dev/zero of=/data/storage3 bs=1M count=1500
export# dd if=/dev/zero of=/data/storage4 bs=1M count=2000
一个模拟了4个存储文件用来导出(大小不一样,是为了后续讨论)
实验步骤:
- export导出端安装软件, 配置导出的存储,启动服务
- import导入端安装软件, 导入存储,启动服务
实验过程:
第1步: 在导出端上安装iscsi-target-utils软件包
export# yum install epel-release -y 没有安装epel源的,再次确认安装
export# yum install scsi-target-utils -y
第2步: 在导出端配置存储的导出
export# cat /etc/tgt/targets.conf |grep -v "#"
default-driver iscsi
<target iscsi:data1>
backing-store /data/storage1
</target>
<target iscsi:data2>
backing-store /data/storage2
</target>
<target iscsi:data3>
backing-store /data/storage3
</target>
<target iscsi:data4>
backing-store /data/storage4
</target>
第3步: 导出端启动服务并验证
export# systemctl start tgtd
export# systemctl enable tgtd
验证端口和共享资源是否ok
export# lsof -i:3260
export# tgt-admin --show
第4步: 导入端安装iscsi-initiator-utils软件包
import# yum install iscsi-initiator-utils
第5步: 导入端导入存储
在登录前必须要先连接并发现资源(discovery)
import# iscsiadm -m discovery -t sendtargets -p 10.1.1.11
10.1.1.11:3260,1 iscsi:data1
10.1.1.11:3260,1 iscsi:data2
10.1.1.11:3260,1 iscsi:data3
10.1.1.11:3260,1 iscsi:data4
发现资源成功后,就可以进行资源登录了
只登录其中一个存储:
import# iscsiadm -m node -T iscsi:data1 -p 10.1.1.11 -l
直接登录所有发现的存储:
import# iscsiadm -m node -l
登录成功后,直接使用fdisk -l查看
import# fdisk -l |grep sd[b-z]
第6步: import端启动服务
启动服务,并做成开机自启动
import# systemctl start iscsi
import# systemctl enable iscsi
import# systemctl start iscsid
import# systemctl enable iscsid
补充: 关于取消连接的操作
取消登录其中一个特定目录: 把-l改成-u
import# iscsiadm -m node -T iscsi:data1 -p 10.1.1.11 -u
取消登录所有目录:
import# iscsiadm -m node -u
如果要连discovery的信息也删除则使用--op delete命令
import# iscsiadm -m node -T iscsi:data1 -p 10.1.1.11 --op delete
删除所有登录过的目录信息:
import# iscsiadm -m node --op delete
问题一: 重新登录几次,会发现什么?
import# iscsiadm -m node -u &> /dev/null
import# iscsiadm -m node -l &> /dev/null
import# fdisk -l |grep sd[b-z]
答: 会发现名字会混乱. 解决方法有udev和存储多路径。
问题二: 如果再加一个新的导入服务器,两个导入服务器导入同一个存储,然后格式化,挂载。能实现同读同写吗?
答: 不可以。
课外拓展: 可以对导出的存储配置验证功能,导入端配置正确的用户名和密码才能登陆
只有两个地方不一样:
- 在导出端配置时加上用户名和密码验证功能
<target iscsi:data1>
backing-store /data/storage1
incominguser daniel daniel123 验证功能,此用户自定义即可,与系统用户无关
</target>
- 在导入端配置时需要多配置下面一步,对应导出端的用户名与密码
如果export端有源被配置了验证功能,那么import端需要配置正确的用户名和密码才OK
CHAP (Challenge-Handshake Authentication Protocol) 挑战握手验证协议
import# vim /etc/iscsi/iscsid.conf
57 node.session.auth.authmethod = CHAP
61 node.session.auth.username = daniel
62 node.session.auth.password = daniel123
71 discovery.sendtargets.auth.authmethod = CHAP
75 discovery.sendtargets.auth.username = daniel
76 discovery.sendtargets.auth.password = daniel123
做完这一步后, 就可以发现资源并登录了
存储多路径
存储多路径(device-multipath): 相当于存储线路的双线路绑定,做HA或LB。
作用:
- 双存储线路HA
- 双存储线路LB
- 可以自定义绑定后的设备名称,达到固定iscsi设备名称的目的。
实验准备
- 在前面实验的基础上,导出端和导入端各加一个网卡连接到一个新的网络上(注意:新的网段一定要用静态ip)。我这里为10.2.2.0/24网段
vmnet8 10.1.1.0/24
vmnet1 10.2.2.0/24
- 然后在存储导入端登出这四个存储,并删除相关信息
import# iscsiadm -m node -u
import# iscsiadm -m node --op delete
实验过程
第1步: 在存储导入端去发现导出端上的存储。分别使用导出端的两个IP去发现,然后将它们登录
import# iscsiadm -m discovery -t sendtargets -p 10.1.1.11
10.1.1.11:3260,1 iscsi:data1
10.1.1.11:3260,1 iscsi:data2
10.1.1.11:3260,1 iscsi:data3
10.1.1.11:3260,1 iscsi:data4
import# iscsiadm -m discovery -t sendtargets -p 10.2.2.11
10.2.2.11:3260,1 iscsi:data1
10.2.2.11:3260,1 iscsi:data2
10.2.2.11:3260,1 iscsi:data3
10.2.2.11:3260,1 iscsi:data4
把发现的targets全部登录
import# iscsiadm -m node -l
使用fdisk -l |grep sd[b-z]命令能查看到8个存储(但实际是4个存储,分别由两个网络线路去访问的)
第2步, 在存储导入端安装device-mapper-multipath的包
import# yum install device-mapper\*
第3步, 把上面的8个进行多路径绑定,绑成4个(同一个存储两个线路访问的绑定成一个)
先运行此命令,才会产生/etc/multipath.conf的配置文件
import# mpathconf --enable
配置/etc/multipath.conf配置文件
import# cat /etc/multipath.conf |grep -v ^# |grep -v ^$
defaults { 看作为全局配置参数
user_friendly_names yes 使用友好名字(默认名为wwid,名字长且难认,友好名可以自定义)
find_multipaths yes
}
blacklist { 黑名单(表示所有在黑名单里的设备不会被绑定成多路径设备)
}
import# vim /etc/multipath.conf
blacklist {
devnode "^sda" 除了sda开头的设备,我都做多路径(指的就是那8个发现的设备)
}
启动服务
import# systemctl start multipathd.service
import# systemctl enable multipathd.service
第4步: 查看当前绑定状态
使用multipath -ll
命令可以看到四个新绑定的设备了(mpatha,mpathb,mpathc,mpathd)这四个设备就是双线路绑定的设备
/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/sda
命令可用来查看wwid
import# multipath -ll
mpathd (360000000000000000e00000000040001) dm-3 IET ,VIRTUAL-DISK 长数字字符串就是wwid
size=2.0G features='0' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=1 status=active 主线路
| `- 8:0:0:1 sdf 8:80 active ready running
`-+- policy='service-time 0' prio=1 status=enabled 备线路(也就是说默认为主备HA模式)
`- 9:0:0:1 sdh 8:112 active ready running
mpathc (360000000000000000e00000000030001) dm-2 IET ,VIRTUAL-DISK
size=1.5G features='0' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=1 status=active
| `- 6:0:0:1 sde 8:64 active ready running
`-+- policy='service-time 0' prio=1 status=enabled
`- 7:0:0:1 sdg 8:96 active ready running
mpathb (360000000000000000e00000000020001) dm-1 IET ,VIRTUAL-DISK
size=1000M features='0' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=1 status=active
| `- 4:0:0:1 sdc 8:32 active ready running
`-+- policy='service-time 0' prio=1 status=enabled
`- 5:0:0:1 sdd 8:48 active ready running
mpatha (360000000000000000e00000000010001) dm-0 IET ,VIRTUAL-DISK
size=500M features='0' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=1 status=active
| `- 2:0:0:1 sda 8:0 active ready running
`-+- policy='service-time 0' prio=1 status=enabled
`- 3:0:0:1 sdb 8:16 active ready running
第5步: 下面我对这8个存储进行自定义绑定(把名字分别绑成data1,data2,这两个做成ha高可用模式;data3,data4这两个做成lb负载均衡模式)
import# cat /etc/multipath.conf |grep -v ^# |grep -v ^$
defaults {
user_friendly_names yes
find_multipaths yes
}
multipaths {
multipath {
wwid 360000000000000000e00000000010001 wwid值
alias data1 自定义绑定的名字
path_grouping_policy failover HA模式
failback immediate 主线路挂了再启起来后,会马上切换回来
}
multipath {
wwid 360000000000000000e00000000020001
alias data2
path_grouping_policy failover
failback immediate
}
multipath {
wwid 360000000000000000e00000000030001
alias data3
path_grouping_policy multibus LB模式
path_selector "round-robin 0" LB的算法为rr轮循
}
multipath {
wwid 360000000000000000e00000000040001
alias data4
path_grouping_policy multibus
path_selector "round-robin 0"
}
}
blacklist {
}
第6步: 重启服务,使自定义配置生效
import# systemctl restart multipathd.service
查看验证,就绑定成了data1,data2,data3,data4这样的名称
import# multipath -ll
import# ls /dev/mapper/data*
/dev/mapper/data1 /dev/mapper/data2 /dev/mapper/data3 /dev/mapper/data4
第7步: 测试
将failover和multibus两种模式各选一个存储格式化(可以直接格式化,也可以先分区再格式化),并挂载进行测试
/dev/mapper/data4如果分两个区,则名字对应为:/dev/mapper/data4p1,/dev/mapper/data4p2(如果分区后看不到,可以使用partprobe命令刷新一下)
centos7写到/etc/fstab里需要多加一个参数(_netdev)就可以成功自动挂载,写法如下
/dev/mapper/data4p1 /mnt xfs defaults,_netdev 0 0
第二章 分布式存储之glusterfs
任务背景
实现了远程的存储共享(NAS或SAN)后, 公司业务发展迅速, 存储空间还需要增大。使用NAS或SAN都不方便扩容,NAS可以增加新的挂载目录, SAN可以增加新的硬盘,但我们希望直接在原来挂载的业务目录上实现在线扩容,数据体量越来越大, 这个时候我们就可以考虑使用**分布式存储**了。
任务要求
1, 将远程多台服务器的空闲存储空间整合,组合成一个大存储给应用服务器(如apache,nginx,tomcat,mysql等)使用
2, 考虑高可用与负载均衡原则,并能实现在线扩容
任务拆解
1, 了解分布式存储的概念与原理
2, 选择对应的分布式存储软件
3, 准备多台有空闲空间的服务器做存储服务器
4, 搭建集群将多台存储服务器组合
5, 将组合的大存储划分成卷共享给应用服务器使用
6, 实现在线扩容
学习目标
-
能够说出分布式存储的优点
-
能够成功搭建glusterfs集群
-
掌握常见的glusterfs卷模式的创建与使用
-
能够对特定的glusterfs卷实现在线裁减或扩容
分布式存储介绍
我们已经学习了NAS是远程通过网络共享目录, SAN是远程通过网络共享块设备。
那么分布式存储你可以看作**拥有多台存储服务器连接起来的存储导出端**。把这多台存储服务器的存储合起来做成一个整体再通过网络进行远程共享,共享的方式有目录(文件存储),块设备(块存储),对象网关或者说一个程序接口(对象存储)。
常见的分布式存储开源软件有:GlusterFS,Ceph,HDFS,MooseFS,FastDFS等。
分布式存储一般都有以下几个优点:
- 扩容方便,轻松达到PB级别或以上
- 提升读写性能(LB)或数据高可用(HA)
- 避免单个节点故障导致整个架构问题
- 价格相对便宜,大量的廉价设备就可以组成,比光纤SAN这种便宜很多
Glusterfs
glusterfs介绍
glusterfs是一个免费,开源的分布式文件系统(它属于文件存储类型)。
https://www.gluster.org/
raid级别回顾(拓展)
raid级别有很多种,下面主要介绍常用的几种:
raid0 读写性能佳,坏了其中一块,数据挂掉,可靠性低(stripe条带化),磁盘利用率100%
raid1 镜像备份(mirror),同一份数据完整的保存在多个磁盘上,写的性能不佳,可靠性高,读的性能还行,磁盘利用率50%
raid10 先做raid 1 再做raid 0
raid5 由多块磁盘做raid 5,磁盘利用率为n-1/n, 其中一块放校验数据,允许坏一块盘,数据可以利用校验值来恢复
raid6 在raid5的基础上再加一块校验盘,进一步提高数据可靠性
生产环境中最常用的为raid5和raid10
常见卷的模式
卷模式 | 描述 |
---|---|
Replicated | 复制卷,类似raid1 |
Striped(了解,新版本将会放弃此模式及其它相关的组合模式) | 条带卷,类似raid0 |
Distributed | 分布卷 |
Distribute Replicated | 分布与复制组合 |
Dispersed | 纠删卷,类似raid5,raid6 |
glusterfs看作是一个将多台服务器存储空间组合到一起,再划分出不同类型的文件存储卷给导入端使用。
Replicated卷
Striped卷
Distributed卷
Distribute Replicated卷
其它模式请参考官网: https://docs.gluster.org/en/latest/Administrator%20Guide/Setting%20Up%20Volumes/
glusterfs集群
实验准备:
- **所有节点(包括client)**静态IP(NAT网络,能上外网)
- **所有节点(包括client)**都配置主机名及其主机名互相绑定(这次我这里做了别名,方便使用)
10.1.1.11 vm1.cluster.com storage1
10.1.1.12 vm2.cluster.com storage2
10.1.1.13 vm3.cluster.com storage3
10.1.1.14 vm4.cluster.com storage4
10.1.1.15 vm5.cluster.com client
-
**所有节点(包括client)**关闭防火墙,selinux
# systemctl stop firewalld # systemctl disable firewalld # iptables -F
-
**所有节点(包括client)**时间同步
-
**所有节点(包括client)**配置好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源说明:
- 可按照以上yum路径去查找
glusterfs5
或glusterfs6
版本的yum源路径(目前我们使用4.1版) - 如果网速太慢,可下载我共享的软件做本地yum源安装
实验步骤:
- 在所有storage服务器上安装相关软件包,并启动服务
- 所有storage服务器建立连接, 成为一个集群
- 所有storage服务器准备存储目录
- 创建存储卷
- 启动存储卷
- client安装挂载软件
- client挂载使用
实验过程:
第1步, 在所有storage服务器上(不包括client)安装glusterfs-server软件包,并启动服务
下面的命令所有存储服务器都要做
# yum install glusterfs-server
# systemctl start glusterd
# systemctl enable glusterd
# systemctl status glusterd
分布式集群一般有两种架构:
- 有中心节点的 中心节点一般指管理节点,后面大部分分布式集群架构都属于这一种
- 无中心节点的 所有节点又管理又做事,glusterfs属于这一种
第2步, 所有storage服务器建立连接,成为一个集群
4个storage服务器建立连接不用两两连接,只需要找其中1个,连接另外3个各一次就OK了
下面我就在storage1上操作
storage1# gluster peer probe storage2
storage1# gluster peer probe storage3
storage1# gluster peer probe storage4 --这里使用ip,主机名,主机名别名都可以
然后在所有存储上都可以使用下面命令来验证检查
# gluster peer status
注意:
如果这一步建立连接有问题(一般问题会出现在网络连接,防火墙,selinux,主机名绑定等);
如果想重做这一步,可以使用gluster peer detach xxxxx [force] 来断开连接,重新做
第3步, 所有storage服务器准备存储目录(可以用单独的分区,也可以使用根分区)
因为我让大家准备的storage服务器没有准备额外的硬盘,所以这里用根分区来做实验
但生产环境肯定是不建议数据盘和系统盘在一起的
# mkdir -p /data/gv0
第4步, 创建存储卷(在任意一个storage服务器上做)
注意: 改变的操作(create,delete,start,stop)等只需要在任意一个storage服务器上操作,查看的操作(info)等可以在所有storage服务器上操作
下面命令我是在storage1上操作的
因为在根分区创建所以需要force参数强制
replica 4表示是在4台上做复制模式(类似raid1)
storage1# gluster volume create gv0 replica 4 storage1:/data/gv0/ storage2:/data/gv0/ storage3:/data/gv0/ storage4:/data/gv0/ force
volume create: gv0: success: please start the volume to access data
所有storage服务器上都可以查看
# gluster volume info gv0
Volume Name: gv0
Type: Replicate 模式为replicate模式
Volume ID: 328d3d55-4506-4c45-a38f-f8748bdf1da6
Status: Created 这里状态为created,表示刚创建,还未启动,需要启动才能使用
Snapshot Count: 0
Number of Bricks: 1 x 4 = 4
Transport-type: tcp
Bricks:
Brick1: storage1:/data/gv0
Brick2: storage2:/data/gv0
Brick3: storage3:/data/gv0
Brick4: storage4:/data/gv0
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
第5步, 启动存储卷
storage1# gluster volume start gv0
# gluster volume info gv0
Volume Name: gv0
Type: Replicate
Volume ID: 328d3d55-4506-4c45-a38f-f8748bdf1da6
Status: Started 现在看到状态变为started,那么就表示可以被客户端挂载使用了
Snapshot Count: 0
Number of Bricks: 1 x 4 = 4
Transport-type: tcp
Bricks:
Brick1: storage1:/data/gv0
Brick2: storage2:/data/gv0
Brick3: storage3:/data/gv0
Brick4: storage4:/data/gv0
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
第6步, client安装软件
客户端上操作
client# yum install glusterfs glusterfs-fuse -y
说明:
fuse(Filesystem in Userspace): 用户空间文件系统,是一个客户端挂载远程文件存储的模块
第7步, client挂载使用
**注意😗*客户端也需要在/etc/hosts文件里绑定存储节点的主机名,才可以挂载(因为我前面做的步骤是用名字的)
client# mkdir /test0
client# mount -t glusterfs storage1:gv0 /test0
这里client是挂载storage1,也可以挂载storage2,storage3,storage4任意一个。(也就是说这4个storage既是老板,又是员工。这是glusterfs的一个特点,其它的分布式存储软件基本上都会有专门的管理server)
replica卷测试
读写测试方法:
在客户端使用dd命令往挂载目录里写文件,然后查看在storage服务器上的分布情况(具体验证详细过程参考授课视频)
(注意: 读写操作请都在客户端进行,不要在storage服务器上操作)
client# dd if=/dev/zero of=/test0/file1 bs=1M count=100
- 读写测试结果: 结果类似raid1
- 同读同写测试: 有条件的可以再开一台虚拟机做为client2,两个客户端挂载gv0后实现同读同写(文件存储类型的特点)
运维思想:
搭建OK后,你要考虑性能,稳定, 高可用,负载均衡,健康检查, 扩展性等
如果某一个节点挂了,你要考虑是什么挂了(网卡,服务,进程,服务器关闭了),如何解决?
请测试如下几种情况:
- 将其中一个storage节点关机
客户端需要等待10几秒钟才能正常继续使用,再次启动数据就正常同步过去
- 将其中一个storage节点网卡down掉
客户端需要等待10几秒钟才能正常继续使用,再次启动数据就正常同步过去
- 将其中一个storage节点glusterfs相关的进程kill掉
客户端无需等待就能正常继续使用,但写数据不会同步到挂掉的storage节点,等它进程再次启动就可以同步过去了
结论: 作为一名运维工程师,HA场景有不同的挂法:
- 服务器关闭
- 网卡坏了
- 网线断了
- 交换机挂了
- 服务进程被误杀等等
但我们需要去考虑,当软件无法把我们全自动实现时,我们可能需要使用脚本来辅助。有一个简单的方法为: 如果一个节点没死透,我们就干脆将它关机,让它死透😂
请参考拓展: RHCS,pacemaker里的fence,stonish(shoot the other node in the head)等概念。
卷的删除
第1步: 先在客户端umount已经挂载的目录(在umount之前把测试的数据先删除)
client# rm /test0/* -rf
client# umount /test0
第2步: 在任一个storage服务器上使用下面的命令停止gv0并删除,我这里是在storage1上操作
storage1# gluster volume stop gv0
Stopping volume will make its data inaccessible. Do you want to continue? (y/n) y
volume stop: gv0: success
storage1# gluster volume delete gv0
Deleting volume will erase all information about the volume. Do you want to continue? (y/n) y
volume delete: gv0: success
第3步: 在所有storage服务器上都可以查看,没有gv0的信息了,说明这个volumn被删除了
# gluster volume info gv0
Volume gv0 does not exist
问题: 我在不删除gv0的情况下,能否再创建一个叫gv1的卷?
当然可以,换个目录再创建就OK
stripe模式(条带)
第1步: 再重做成stripe模式的卷(重点是命令里的stripe 4参数)(在任一个storage服务器上操作, 我这里是在storage1上操作)
storage1# gluster volume create gv0 stripe 4 storage1:/data/gv0/ storage2:/data/gv0/ storage3:/data/gv0/ storage4:/data/gv0/ force
volume create: gv0: success: please start the volume to access data
第2步: 启动gv0(在任一个storage服务器上操作, 我这里是在storage1上操作)
storage1# gluster volume start gv0
第3步: 客户端挂载
client# mount -t glusterfs storage1:gv0 /test0
第4步:读写测试
读写测试结果: 文件过小,不会平均分配给存储节点。有一定大小的文件会平均分配。类似raid0。
- 磁盘利率率100%(前提是所有节点提供的空间一样大,如果大小不一样,则按小的来进行条带)
- 大文件会平均分配给存储节点(LB)
- 没有HA,挂掉一个存储节点,此stripe存储卷则不可被客户端访问
distributed模式
第1步: 准备新的存储目录(所有存储服务器上都要操作)
# mkdir -p /data/gv1
第2步: 创建distributed卷gv1(不指定replica或stripe就默认是Distributed的模式, 在任一个storage服务器上操作, 我这里是在storage1上操作)
storage1# gluster volume create gv1 storage1:/data/gv1/ storage2:/data/gv1/ storage3:/data/gv1/ storage4:/data/gv1/ force
第3步: 启动gv1(在任一个storage服务器上操作, 我这里是在storage1上操作)
storage1# gluster volume start gv1
第4步: 客户端挂载
client# mkdir /test1
client# mount -t glusterfs storage1:gv1 /test1
第5步:读写测试(测试方法与replica模式一样,具体过程参考授课视频)
读写测试结果: 测试结果为随机写到不同的存储里,直到所有写满为止。
-
利用率100%
-
方便扩容
-
不保障的数据的安全性(挂掉一个节点,等待大概1分钟后,这个节点就剔除了,被剔除的节点上的数据丢失)
-
也不提高IO性能
distributed-replica模式
第1步: 准备新的存储目录(所有存储服务器上都要操作)
# mkdir -p /data/gv2
第2步: 创建distributed-replica卷gv2(在任一个storage服务器上操作, 我这里是在storage1上操作)
storage1# gluster volume create gv2 replica 2 storage1:/data/gv2/ storage2:/data/gv2/ storage3:/data/gv2/ storage4:/data/gv2/ force
第3步: 启动gv2(在任一个storage服务器上操作, 我这里是在storage1上操作)
storage1# gluster volume start gv2
第4步: 客户端挂载
client# mkdir /test2
client# mount -t glusterfs storage1:gv2 /test2
第5步:读写测试
读写测试结果: 4个存储分为两个组,这两个组按照distributed模式随机。但在组内的两个存储会按replica模式镜像复制。
特点:
- 结合了distributed与replica的优点:可以扩容,也有HA特性
dispersed模式
disperse卷是v3.6版本后发布的一种卷模式,类似于raid5/6
第1步: 准备新的存储目录(所有存储服务器上都要操作)
# mkdir -p /data/gv3
第2步: 创建卷gv3(在任一个storage服务器上操作, 我这里是在storage1上操作)
storage1# gluster volume create gv3 disperse 4 storage1:/data/gv3/ storage2:/data/gv3/ storage3:/data/gv3/ storage4:/data/gv3/ force
There is not an optimal redundancy value for this configuration. Do you want to create the volume with redundancy 1 ? (y/n) y
volume create: gv3: success: please start the volume to access data
注意:没有指定冗余值,默认为1,按y确认
第3步: 启动gv3(在任一个storage服务器上操作, 我这里是在storage1上操作)
storage1# gluster volume start gv3
storage1# gluster volume info gv3
Volume Name: gv3
Type: Disperse
Volume ID: 767add4e-48c4-4a2d-a5d1-467076d73afd
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x (3 + 1) = 4 这里看到冗余数为1
Transport-type: tcp
Bricks:
Brick1: storage1:/data/gv3
Brick2: storage2:/data/gv3
Brick3: storage3:/data/gv3
Brick4: storage4:/data/gv3
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
第4步: 客户端挂载
client# mkdir /test3
client# mount -t glusterfs storage1:gv3 /test3
第5步:读写测试(测试方法与replica模式一样,具体过程参考授课视频)
读写测试结果: 写100M,每个存储服务器上占33M左右。因为4个存储1个为冗余(与raid5一样)。
课后测试: 如果想要实现2个冗余,则最少需要5台存储服务器
# gluster volume create gv4 disperse 4 redundancy 2 storage1:/data/gv4/ storage2:/data/gv4/ storage3:/data/gv4/ storage4:/data/gv4/ force
redundancy must be less than 2 for a disperse 4 volume
这里指定disperse 4 redundancy 2参数,但报错为冗余值必须要比disperse值少2以上
在线裁减与在线扩容
在线裁减要看是哪一种模式的卷,比如stripe模式就不允许在线裁减。下面我以distributed卷来做裁减与扩容
在线裁减(注意要remove没有数据的brick)
# gluster volume remove-brick gv1 storage4:/data/gv1 force
Removing brick(s) can result in data loss. Do you want to Continue? (y/n) y
volume remove-brick commit force: success
在线扩容
# gluster volume add-brick gv1 storage4:/data/gv1 force
volume add-brick: success
问题1: 4个存储节点想扩容为5个存储节点怎么做?
答案: 第5个存储服务器安装服务器软件包,启动服务,然后gluster peer probe storage5加入集群
问题2: 一个卷里已经有4个brick,想在线扩容brick,怎么做?
只有distributed模式或带有distributed组合的模式才能在线扩容brick
glusterfs小结:
属于文件存储类型,优点:可以数据共享 缺点: 速度较低
卷类型:
第三章 分布式存储之Ceph
任务背景
虽然使用了分布式的glusterfs存储, 但是对于爆炸式的数据增长仍然感觉力不从心。对于大数据与云计算等技术的成熟, 存储也需要跟上步伐. 所以这次我们选用对象存储.
任务要求
1, 搭建ceph集群
2, 实现对象存储的应用
任务拆解
1, 了解ceph
2, 搭建ceph集群
3, 了解rados原生数据存取
4, 实现ceph文件存储
5, 实现ceph块存储
6, 实现ceph对象存储
学习目标
- 能够成功部署ceph集群
- 能够使用ceph共享文件存储,块存储与对象存储
- 能够说出对象存储的特点
一、认识Ceph
Ceph是一个能提供的文件存储,块存储和对象存储的分布式存储系统。它提供了一个可无限伸缩的Ceph存储集群。
二、ceph架构
参考官档: https://docs.ceph.com/docs/master/
RADOS: Ceph的高可靠,高可拓展,高性能,高自动化都是由这一层来提供的, 用户数据的存储最终也都是通过这一层来进行存储的。
可以说RADOS就是ceph底层原生的数据引擎, 但实际应用时却不直接使用它,而是分为如下4种方式来使用:
-
LIBRADOS是一个库, 它允许应用程序通过访问该库来与RADOS系统进行交互,支持多种编程语言。如Python,C,C++等. 简单来说,就是给开发人员使用的接口。
-
CEPH FS通过Linux内核客户端和FUSE来提供文件系统。(文件存储)
-
RBD通过Linux内核客户端和QEMU/KVM驱动来提供一个分布式的块设备。(块存储)
-
RADOSGW是一套基于当前流行的RESTFUL协议的网关,并且兼容S3和Swift。(对象存储)
拓展名词
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)就相当于目录,对象就相当于文件。
硬盘路径类似/root/file1.txt
S3的URI类似s3://bucket_name/object_name
swift: 最初是由Rackspace公司开发的高可用分布式对象存储服务,并于2010年贡献给OpenStack开源社区作为其最初的核心子项目之一.
三、Ceph集群
集群组件
Ceph集群包括Ceph OSD,Ceph Monitor两种守护进程。
Ceph OSD(Object Storage Device): 功能是存储数据,处理数据的复制、恢复、回填、再均衡,并通过检查其他OSD守护进程的心跳来向Ceph Monitors提供一些监控信息。
Ceph Monitor: 是一个监视器,监视Ceph集群状态和维护集群中的各种关系。
Ceph存储集群至少需要一个Ceph Monitor和两个 OSD 守护进程。
集群环境准备
准备工作:
准备四台服务器,需要能上外网,IP静态固定 (除client外每台最少加1个磁盘,最小1G,不用分区);
1, 配置主机名和主机名绑定(所有节点都要绑定)
(注意:这里都全改成短主机名,方便后面实验。如果你坚持用类似vm1.cluster.com这种主机名,或者加别名的话,ceph会在后面截取你的主机名vm1.cluster.com为vm1,造成不一致导致出错)
# hostnamectl set-hostname --static node1
# vim /etc/hosts
10.1.1.11 node1
10.1.1.12 node2
10.1.1.13 node3
10.1.1.14 client
2, 关闭防火墙,selinux(使用iptables -F清一下规则)
# systemctl stop firewalld
# systemctl disable firewalld
# iptables -F
# setenforce 0
3, 时间同步(启动ntpd服务并确认所有节点时间一致)
# systemctl restart ntpd
# systemctl enable ntpd
4, 配置yum源(所有节点都要配置,包括client)
ceph的yum源方法2种:
- 公网ceph源(centos7默认的公网源+epel源+ceph的aliyun源)
# yum install epel-release -y
# 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
- 本地ceph源(centos7默认的公网源+ceph本地源)
- 公网源下载网络慢,而且公网源可能更新会造成问题。可使用下载好的做本地ceph源
将共享的ceph_soft目录拷贝到所有节点上(比如:/root/目录下)
# vim /etc/yum.repos.d/ceph.repo
[local_ceph]
name=local_ceph
baseurl=file:///root/ceph_soft
gpgcheck=0
enabled=1
集群部署过程
第1步: 配置ssh免密
以node1为部署配置节点,在node1上配置ssh等效性(要求ssh node1,node2,node3 ,client都要免密码)
说明: 此步骤不是必要的,做此步骤的目的:
- 如果使用ceph-deploy来安装集群,密钥会方便安装
- 如果不使用ceph-deploy安装,也可以方便后面操作: 比如同步配置文件
[root@node1 ~]# ssh-keygen
[root@node1 ~]# ssh-copy-id -i node1
[root@node1 ~]# ssh-copy-id -i node2
[root@node1 ~]# ssh-copy-id -i node3
[root@node1 ~]# ssh-copy-id -i client
第2步: 在node1上安装部署工具
(其它节点不用安装)
[root@node1 ~]# yum install ceph-deploy -y
第3步: 在node1上创建集群
建立一个集群配置目录
注意: 后面的大部分操作都会在此目录
[root@node1 ~]# mkdir /etc/ceph
[root@node1 ~]# cd /etc/ceph
创建一个ceph集群
[root@node1 ceph]# ceph-deploy new node1
[root@node1 ceph]# ls
ceph.conf ceph-deploy-ceph.log ceph.mon.keyring
说明:
ceph.conf 集群配置文件
ceph-deploy-ceph.log 使用ceph-deploy部署的日志记录
ceph.mon.keyring mon的验证key文件
第4步: ceph集群节点安装ceph
前面准备环境时已经准备好了yum源,在这里==所有集群节点(不包括client)==都安装以下软件
# yum install ceph ceph-radosgw -y
# ceph -v
ceph version 13.2.6 (02899bfda814146b021136e9d8e80eba494e1126) mimic (stable)
补充说明:
- 如果公网OK,并且网速好的话,可以用
ceph-deploy install node1 node2 node3
命令来安装,但网速不好的话会比较坑 - 所以这里我们选择直接用准备好的本地ceph源,然后
yum install ceph ceph-radosgw -y
安装即可。
第5步: 客户端安装ceph-common
[root@client ~]# yum install ceph-common -y
第6步: 创建mon(监控)
增加public网络用于监控
在[global]配置段里添加下面一句(直接放到最后一行)
[root@node1 ceph]# vim /etc/ceph/ceph.conf
public network = 10.1.1.0/24 监控网络
监控节点初始化,并同步配置到所有节点(node1,node2,node3,不包括client)
[root@node1 ceph]# ceph-deploy mon create-initial
[root@node1 ceph]# ceph health
HEALTH_OK 状态health(健康)
将配置文件信息同步到所有节点
[root@node1 ceph]# ceph-deploy admin node1 node2 node3
[root@node1 ceph]# ceph -s
cluster:
id: c05c1f28-ea78-41b7-b674-a069d90553ac
health: HEALTH_OK 健康状态为OK
services:
mon: 1 daemons, quorum node1 1个监控
mgr: no daemons active
osd: 0 osds: 0 up, 0 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 0 B used, 0 B / 0 B avail
pgs:
为了防止mon单点故障,你可以加多个mon节点(建议奇数个,因为有quorum仲裁投票)
回顾: 什么是quorum(仲裁,法定人数)?
[root@node1 ceph]# ceph-deploy mon add node2
[root@node1 ceph]# ceph-deploy mon add node3
[root@node1 ceph]# ceph -s
cluster:
id: c05c1f28-ea78-41b7-b674-a069d90553ac
health: HEALTH_OK 健康状态为OK
services:
mon: 3 daemons, quorum node1,node2,node3 3个监控
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集群所有节点上(node1
,node2
,node3
)不使用ntpd服务,直接使用crontab同步
# systemctl stop ntpd
# systemctl disable ntpd
# crontab -e
*/10 * * * * ntpdate ntp1.aliyun.com 每5或10分钟同步1次公网的任意时间服务器
2, 调大时间警告的阈值
[root@node1 ceph]# vim ceph.conf
[global] 在global参数组里添加以下两行
......
mon clock drift allowed = 2 # monitor间的时钟滴答数(默认0.5秒)
mon clock drift warn backoff = 30 # 调大时钟允许的偏移量(默认为5)
3, 同步到所有节点
[root@node1 ceph]# ceph-deploy --overwrite-conf admin node1 node2 node3
前面第1次同步不需要加--overwrite-conf参数
这次修改ceph.conf再同步就需要加--overwrite-conf参数覆盖
4, 所有ceph集群节点上重启ceph-mon.target服务
# systemctl restart ceph-mon.target
第7步: 创建mgr(管理)
ceph luminous版本中新增加了一个组件:Ceph Manager Daemon,简称ceph-mgr。
该组件的主要作用是分担和扩展monitor的部分功能,减轻monitor的负担,让更好地管理ceph存储系统。
创建一个mgr
[root@node1 ceph]# ceph-deploy mgr create node1
[root@node1 ceph]# ceph -s
cluster:
id: c05c1f28-ea78-41b7-b674-a069d90553ac
health: HEALTH_OK
services:
mon: 3 daemons, quorum node1,node2,node3
mgr: node1(active) node1为mgr
osd: 0 osds: 0 up, 0 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 0 B used, 0 B / 0 B avail
pgs:
添加多个mgr可以实现HA
[root@node1 ceph]# ceph-deploy mgr create node2
[root@node1 ceph]# ceph-deploy mgr create node3
[root@node1 ceph]# ceph -s
cluster:
id: c05c1f28-ea78-41b7-b674-a069d90553ac
health: HEALTH_OK 健康状态为OK
services:
mon: 3 daemons, quorum node1,node2,node3 3个监控
mgr: node1(active), standbys: node2, node3 看到node1为主,node2,node3为备
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:
第8步: 创建osd(存储盘)
[root@node1 ceph]# ceph-deploy disk --help
[root@node1 ceph]# ceph-deploy osd --help
列表所有节点的磁盘,都有sda和sdb两个盘,sdb为我们要加入分布式存储的盘
列表查看节点上的磁盘
[root@node1 ceph]# ceph-deploy disk list node1
[root@node1 ceph]# ceph-deploy disk list node2
[root@node1 ceph]# ceph-deploy disk list node3
zap表示干掉磁盘上的数据,相当于格式化
[root@node1 ceph]# ceph-deploy disk zap node1 /dev/sdb
[root@node1 ceph]# ceph-deploy disk zap node2 /dev/sdb
[root@node1 ceph]# ceph-deploy disk zap node3 /dev/sdb
将磁盘创建为osd
[root@node1 ceph]# ceph-deploy osd create --data /dev/sdb node1
[root@node1 ceph]# ceph-deploy osd create --data /dev/sdb node2
[root@node1 ceph]# ceph-deploy osd create --data /dev/sdb node3
[root@node1 ceph]# ceph -s
cluster:
id: c05c1f28-ea78-41b7-b674-a069d90553ac
health: HEALTH_OK
services:
mon: 3 daemons, quorum node1,node2,node3
mgr: node1(active), standbys: node2, node3
osd: 3 osds: 3 up, 3 in 看到这里有3个osd
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 41 MiB used, 2.9 GiB / 3.0 GiB avail 大小为3个磁盘的总和
pgs:
osd都创建好了,那么怎么存取数据呢?
集群节点的扩容方法
假设再加一个新的集群节点node4
1, 主机名配置和绑定
2, 在node4上yum install ceph ceph-radosgw -y
安装软件
3, 在部署节点node1上同步配置文件给node4. ceph-deploy admin node4
4, 按需求选择在node4上添加mon或mgr或osd等
四、RADOS原生数据存取演示
上面提到了RADOS也可以进行数据的存取操作, 但我们一般不直接使用它,但我们可以先用RADOS的方式来深入了解下ceph的数据存取原理。
存取原理
要实现数据存取需要创建一个pool,创建pool要先分配PG。
如果客户端对一个pool写了一个文件, 那么这个文件是如何分布到多个节点的磁盘上呢?
答案是通过CRUSH算法。
CRUSH算法
-
CRUSH(Controlled Scalable Decentralized Placement of Replicated Data)算法为可控的,可扩展的,分布式的副本数据放置算法的简称。
-
PG到OSD的映射的过程算法叫做CRUSH 算法。(一个Object需要保存三个副本,也就是需要保存在三个osd上)。
-
CRUSH算法是一个伪随机的过程,他可以从所有的OSD中,随机性选择一个OSD集合,但是同一个PG每次随机选择的结果是不变的,也就是映射的OSD集合是固定的。
小结:
- 客户端直接对pool操作(但文件存储,块存储,对象存储我们不这么做)
- pool里要分配PG
- PG里可以存放多个对象
- 对象就是由客户端写入的数据分离的单位
- CRUSH算法将客户端写入的数据映射分布到OSD,从而最终存放到物理磁盘上(这个具体过程是抽象的,我们运维工程师可不用再深挖,因为分布式存储对于运维工程师来说就一个大硬盘)
创建pool
创建test_pool,指定pg数为128
[root@node1 ceph]# ceph osd pool create test_pool 128
pool 'test_pool' created
查看pg数量,可以使用ceph osd pool set test_pool pg_num 64这样的命令来尝试调整
[root@node1 ceph]# ceph osd pool get test_pool pg_num
pg_num: 128
说明: pg数与ods数量有关系
- pg数为2的倍数,一般5个以下osd,分128个PG或以下即可(分多了PG会报错的,可按报错适当调低)
- 可以使用
ceph osd pool set test_pool pg_num 64
这样的命令来尝试调整
存储测试
1, 我这里把本机的/etc/fstab文件上传到test_pool,并取名为newfstab
[root@node1 ceph]# rados put newfstab /etc/fstab --pool=test_pool
2, 查看
[root@node1 ceph]# rados -p test_pool ls
newfstab
3, 删除
[root@node1 ceph]# rados rm newfstab --pool=test_pool
删除pool
1, 在部署节点node1上增加参数允许ceph删除pool
[root@node1 ceph]# vim /etc/ceph/ceph.conf
mon_allow_pool_delete = true
2, 修改了配置, 要同步到其它集群节点
[root@node1 ceph]# ceph-deploy --overwrite-conf admin node1 node2 node3
3, 重启监控服务
[root@node1 ceph]# systemctl restart ceph-mon.target
4, 删除时pool名输两次,后再接--yes-i-really-really-mean-it
参数就可以删除了
[root@node1 ceph]# ceph osd pool delete test_pool test_pool --yes-i-really-really-mean-it
五、创建Ceph文件存储
要运行Ceph文件系统, 你必须先创建至少带一个mds的Ceph存储集群.
(Ceph块设备和Ceph对象存储不使用MDS)。
Ceph MDS: Ceph文件存储类型存放与管理元数据metadata的服务
创建文件存储并使用
第1步: 在node1部署节点上同步配置文件,并创建mds服务(也可以做多个mds实现HA)
[root@node1 ceph]# ceph-deploy mds create node1 node2 node3
我这里做三个mds
第2步: 一个Ceph文件系统需要至少两个RADOS存储池,一个用于数据,一个用于元数据。所以我们创建它们。
[root@node1 ceph]# ceph osd pool create cephfs_pool 128
pool 'cephfs_pool' created
[root@node1 ceph]# ceph osd pool create cephfs_metadata 64
pool 'cephfs_metadata' created
[root@node1 ceph]# ceph osd pool ls |grep cephfs
cephfs_pool
cephfs_metadata
第3步: 创建Ceph文件系统,并确认客户端访问的节点
[root@node1 ceph]# ceph fs new cephfs cephfs_metadata cephfs_pool
[root@node1 ceph]# ceph fs ls
name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_pool ]
[root@node1 ceph]# ceph mds stat
cephfs-1/1/1 up {0=ceph_node3=up:active}, 2 up:standby 这里看到node3为up状态
第4步: 客户端准备验证key文件
- 说明: ceph默认启用了cephx认证, 所以客户端的挂载必须要验证
在集群节点(node1,node2,node3)上任意一台查看密钥字符串
[root@node1 ~]# cat /etc/ceph/ceph.client.admin.keyring
[client.admin]
key = AQDEKlJdiLlKAxAARx/PXR3glQqtvFFMhlhPmw== 后面的字符串就是验证需要的
caps mds = "allow *"
caps mgr = "allow *"
caps mon = "allow *"
caps osd = "allow *"
在客户端上创建一个文件记录密钥字符串
[root@client ~]# vim admin.key # 创建一个密钥文件,复制粘贴上面得到的字符串
AQDEKlJdiLlKAxAARx/PXR3glQqtvFFMhlhPmw==
第5步: 客户端挂载(挂载ceph集群中跑了mon监控的节点, mon监控为6789端口)
[root@client ~]# mount -t ceph node1:6789:/ /mnt -o name=admin,secretfile=/root/admin.key
第6步: 验证
[root@client ~]# df -h |tail -1
node1:6789:/ 3.8G 0 3.8G 0% /mnt # 大小不用在意,场景不一样,pg数,副本数都会影响
如要验证读写请自行验证
可以使用两个客户端, 同时挂载此文件存储,可实现同读同写
删除文件存储方法
如果需要删除文件存储,请按下面操作过程来操作
第1步: 在客户端上删除数据,并umount所有挂载
[root@client ~]# rm /mnt/* -rf
[root@client ~]# umount /mnt/
第2步: 停掉所有节点的mds(只有停掉mds才能删除文件存储)
[root@node1 ~]# systemctl stop ceph-mds.target
[root@node2 ~]# systemctl stop ceph-mds.target
[root@node3 ~]# systemctl stop ceph-mds.target
第3步: 回到集群任意一个节点上(node1,node2,node3其中之一)删除
如果要客户端删除,需要在node1上ceph-deploy admin client
同步配置才可以
[root@client ~]# ceph fs rm cephfs --yes-i-really-mean-it
[root@client ~]# ceph osd pool delete cephfs_metadata cephfs_metadata --yes-i-really-really-mean-it
pool 'cephfs_metadata' removed
[root@client ~]# ceph osd pool delete cephfs_pool cephfs_pool --yes-i-really-really-mean-it
pool 'cephfs_pool' removed
第4步: 再次mds服务再次启动
[root@node1 ~]# systemctl start ceph-mds.target
[root@node2 ~]# systemctl start ceph-mds.target
[root@node3 ~]# systemctl start ceph-mds.target
六、创建Ceph块存储
创建块存储并使用
第1步: 在node1上同步配置文件到client
[root@node1 ceph]# ceph-deploy admin client
第2步:建立存储池,并初始化
注意:在客户端操作
[root@client ~]# ceph osd pool create rbd_pool 128
pool 'rbd_pool' created
[root@client ~]# rbd pool init rbd_pool
第3步:创建一个存储卷(我这里卷名为volume1,大小为5000M)
注意: volume1的专业术语为image, 我这里叫存储卷方便理解
[root@client ~]# rbd create volume1 --pool rbd_pool --size 5000
[root@client ~]# rbd ls rbd_pool
volume1
[root@client ~]# rbd info volume1 -p rbd_pool
rbd image 'volume1': 可以看到volume1为rbd image
size 4.9 GiB in 1250 objects
order 22 (4 MiB objects)
id: 149256b8b4567
block_name_prefix: rbd_data.149256b8b4567
format: 2 格式有1和2两种,现在是2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten 特性
op_features:
flags:
create_timestamp: Sat Aug 17 19:47:51 2019
第4步: 将创建的卷映射成块设备
- 因为rbd镜像的一些特性,OS kernel并不支持,所以映射报错
[root@client ~]# rbd map rbd_pool/volume1
rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable rbd_pool/volume1 object-map fast-diff deep-flatten".
In some cases useful info is found in syslog - try "dmesg | tail".
rbd: map failed: (6) No such device or address
- 解决方法: disable掉相关特性
[root@client ~]# rbd feature disable rbd_pool/volume1 exclusive-lock object-map fast-diff deep-flatten
- 再次映射
[root@client ~]# rbd map rbd_pool/volume1
/dev/rbd0
第5步: 查看映射(如果要取消映射, 可以使用rbd unmap /dev/rbd0
)
[root@client ~]# rbd showmapped
id pool image snap device
0 rbd_pool volume1 - /dev/rbd0
第6步: 格式化,挂载
[root@client ~]# mkfs.xfs /dev/rbd0
[root@client ~]# mount /dev/rbd0 /mnt/
[root@client ~]# df -h |tail -1
/dev/rbd0 4.9G 33M 4.9G 1% /mnt
可自行验证读写
注意: 块存储是不能实现同读同写的,请不要两个客户端同时挂载进行读写
块存储扩容与裁减
在线扩容
经测试,分区后/dev/rbd0p1
不能在线扩容,直接使用/dev/rbd0
才可以
扩容成8000M
[root@client ~]# rbd resize --size 8000 rbd_pool/volume1
[root@client ~]# rbd info rbd_pool/volume1 |grep size
size 7.8 GiB in 2000 objects
查看大小,并没有变化
[root@client ~]# df -h |tail -1
/dev/rbd0 4.9G 33M 4.9G 1% /mnt
[root@client ~]# xfs_growfs -d /mnt/
再次查看大小,在线扩容成功
[root@client ~]# df -h |tail -1
/dev/rbd0 7.9G 33M 7.9G 1% /mnt
块存储裁减
不能在线裁减.裁减后需重新格式化再挂载,所以请提前备份好数据.
再裁减回5000M
[root@client ~]# rbd resize --size 5000 rbd_pool/volume1 --allow-shrink
重新格式化挂载
[root@client ~]# umount /mnt/
[root@client ~]# mkfs.xfs -f /dev/rbd0
[root@client ~]# mount /dev/rbd0 /mnt/
再次查看,确认裁减成功
[root@client ~]# df -h |tail -1
/dev/rbd0 4.9G 33M 4.9G 1% /mnt
删除块存储方法
[root@client ~]# umount /mnt/
[root@client ~]# rbd unmap /dev/rbd0
[root@client ~]# ceph osd pool delete rbd_pool rbd_pool --yes-i-really-really-mean-it
pool 'rbd_pool' removed
七、Ceph对象存储
测试ceph对象网关的连接
第1步: 在node1上创建rgw
[root@node1 ceph]# ceph-deploy rgw create node1
[root@node1 ceph]# lsof -i:7480
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
radosgw 6748 ceph 40u IPv4 49601 0t0 TCP *:7480 (LISTEN)
第2步: 在客户端测试连接对象网关
创建一个测试用户,需要在部署节点使用ceph-deploy admin client同步配置文件给client
[root@client ~]# 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": "36ROCI84S5NSP4BPYL01",
"secret_key": "jBOKH0v6J79bn8jaAF2oaWU7JvqTxqb4gjerWOFW"
}
],
"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": []
}
上面一大段主要有用的为access_key与secret_key,用于连接对象存储网关
[root@client ~]# radosgw-admin user create --uid='testuser' --display-name='First User' |grep -E 'access_key|secret_key'
"access_key": "36ROCI84S5NSP4BPYL01",
"secret_key": "jBOKH0v6J79bn8jaAF2oaWU7JvqTxqb4gjerWOFW"
S3连接ceph对象网关
AmazonS3是一种面向Internet的对象存储服务.我们这里可以使用s3工具连接ceph的对象存储进行操作
第1步: 客户端安装s3cmd工具,并编写ceph连接配置文件
[root@client ~]# yum install s3cmd
创建并编写下面的文件,key文件对应前面创建测试用户的key
[root@client ~]# vim /root/.s3cfg
[default]
access_key = 36ROCI84S5NSP4BPYL01
secret_key = jBOKH0v6J79bn8jaAF2oaWU7JvqTxqb4gjerWOFW
host_base = 10.1.1.11:7480
host_bucket = 10.1.1.11:7480/%(bucket)
cloudfront_host = 10.1.1.11:7480
use_https = False
第2步: 命令测试
列出bucket,可以查看到先前测试创建的my-new-bucket
[root@client ~]# s3cmd ls
2019-01-05 23:01 s3://my-new-bucket
再建一个桶
[root@client ~]# s3cmd mb s3://test_bucket
上传文件到桶
[root@client ~]# s3cmd put /etc/fstab s3://test_bucket
upload: '/etc/fstab' -> 's3://test_bucket/fstab' [1 of 1]
501 of 501 100% in 1s 303.34 B/s done
下载到当前目录
[root@client ~]# s3cmd get s3://test_bucket/fstab
更多命令请见参考命令帮助
[root@client ~]# s3cmd --help
ceph dashboard(拓展)
通过ceph dashboard完成对ceph存储系统可视化监视。
第1步:查看集群状态确认mgr的active节点
[root@node1 ~]# ceph -s
cluster:
id: 6788206c-c4ea-4465-b5d7-ef7ca3f74552
health: HEALTH_OK
services:
mon: 3 daemons, quorum node1,node2,node3
mgr: node1(active), standbys: node3, node2 确认mgr的active节点为node1
osd: 4 osds: 4 up, 4 in
rgw: 1 daemon active
data:
pools: 6 pools, 48 pgs
objects: 197 objects, 2.9 KiB
usage: 596 MiB used, 3.4 GiB / 4.0 GiB avail
pgs: 48 active+clean
第2步:开启dashboard模块
[root@node1 ~]# ceph mgr module enable dashboard
第3步:创建自签名证书
[root@node1 ~]# ceph dashboard create-self-signed-cert
Self-signed certificate created
第4步: 生成密钥对,并配置给ceph mgr
[root@node1 ~]# mkdir /etc/mgr-dashboard
[root@node1 ~]# cd /etc/mgr-dashboard/
[root@node1 mgr-dashboard]# openssl req -new -nodes -x509 -subj "/O=IT-ceph/CN=cn" -days 365 -keyout dashboard.key -out dashboard.crt -extensions v3_ca
Generating a 2048 bit RSA private key
.+++
.....+++
writing new private key to 'dashboard.key'
-----
[root@node1 mgr-dashboard]# ls
dashboard.crt dashboard.key
第5步: 在ceph集群的active mgr节点上(我这里为node1)配置mgr services
使用dashboard服务,主要配置dashboard使用的IP及Port
[root@node1 mgr-dashboard]# ceph config set mgr mgr/dashboard/server_addr 10.1.1.11
[root@node1 mgr-dashboard]# ceph config set mgr mgr/dashboard/server_port 8080
第6步: 重启dashboard模块,并查看访问地址
[root@node1 mgr-dashboard]# ceph mgr module disable dashboard
[root@node1 mgr-dashboard]# ceph mgr module enable dashboard
[root@node1 mgr-dashboard]# ceph mgr services
{
"dashboard": "https://10.1.1.11:8080/"
}
第7步:设置访问web页面用户名和密码
[root@node1 mgr-dashboard]# ceph dashboard set-login-credentials daniel daniel123
Username and password updated
第8步:通过本机或其它主机访问
ceph对象存储结合owncloud打造云盘(拓展)
1,在ceph的客户端上准备好bucket和相关的连接key
[root@client ~]# s3cmd mb s3://owncloud
Bucket 's3://owncloud/' created
[root@client ~]# cat /root/.s3cfg
[default]
access_key = 36ROCI84S5NSP4BPYL01
secret_key = jBOKH0v6J79bn8jaAF2oaWU7JvqTxqb4gjerWOFW
host_base = 10.1.1.11:7480
host_bucket = 10.1.1.11:7480/%(bucket)
cloudfront_host = 10.1.1.11:7480
use_https = False
2, 在client端安装owncloud云盘运行所需要的web环境
owncloud需要web服务器和php支持. 目前最新版本owncloud需要php7.x版本,在这里我们为了节省时间,使用rpm版安装
[root@client ~]# yum install httpd mod_ssl php-mysql php php-gd php-xml php-mbstring -y
[root@client ~]# systemctl restart httpd
3, 上传owncloud软件包, 并解压到httpd家目录
[root@client ~]# tar xf owncloud-9.0.1.tar.bz2 -C /var/www/html/
[root@client ~]# chown apache.apache -R /var/www/html/
需要修改为运行web服务器的用户owner,group,否则后面写入会出现权限问题
4, 通过浏览器访问http:10.1.1.14/owncloud
,进行配置
5, 文件上传下载测试
[root@client ~]# s3cmd put /etc/fstab s3://owncloud
upload: '/etc/fstab' -> 's3://owncloud/fstab' [1 of 1]
501 of 501 100% in 0s 6.64 kB/s done
因为默认owncloud上传文件有限制,不能超过2M。所以需要修改
[root@client ~]# 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@client ~]# systemctl restart httpd
拓展:osd磁盘的删除**(这里以删除node1上的osd.0磁盘为例)
1, 查看osd磁盘状态
[root@node1 ceph]# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.00298 root default
-3 0.00099 host node1
0 hdd 0.00099 osd.0 up 1.00000 1.00000
-5 0.00099 host node2
1 hdd 0.00099 osd.1 up 1.00000 1.00000
-7 0.00099 host node3
2 hdd 0.00099 osd.2 up 1.00000 1.00000
2, 先标记为out
[root@node1 ceph]# ceph osd out osd.0
marked out osd.0.
[root@node1 ceph]# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.00298 root default
-3 0.00099 host node1
0 hdd 0.00099 osd.0 up 0 1.00000 可以看到权重为0,但状态还是UP
-5 0.00099 host node2
1 hdd 0.00099 osd.1 up 1.00000 1.00000
-7 0.00099 host node3
2 hdd 0.00099 osd.2 up 1.00000 1.00000
3, 再rm删除,但要先去**osd.0对应的节点上**停止ceph-osd服务,否则rm不了
[root@node1 ceph]# systemctl stop ceph-osd@0.service
[root@node1 ceph]# ceph osd rm osd.0
removed osd.0
[root@node1 ceph]# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.00298 root default
-3 0.00099 host node1
0 hdd 0.00099 osd.0 DNE 0 状态不再为UP了
-5 0.00099 host node2
1 hdd 0.00099 osd.1 up 1.00000 1.00000
-7 0.00099 host node3
2 hdd 0.00099 osd.2 up 1.00000 1.00000
4, 查看集群状态
[root@node1 ceph]# ceph -s
cluster:
id: 6788206c-c4ea-4465-b5d7-ef7ca3f74552
health: HEALTH_WARN
1 osds exist in the crush map but not in the osdmap 有警告,没有在crush算法中删除
services:
mon: 3 daemons, quorum node1,node2,node3
mgr: node1(active), standbys: node2, node3
osd: 2 osds: 2 up, 2 in 发现只有两个osd,说明osd.0删除成功
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0 B
usage: 28 MiB used, 2.0 GiB / 2.0 GiB avail 3G变为2G,说明删除成功
pgs:
5, 在crush算法中和auth验证中删除
[root@node1 ceph]# ceph osd crush remove osd.0
removed item id 0 name 'osd.0' from crush map
[root@node1 ceph]# ceph auth del osd.0
updated
6, 还需要在**osd.0对应的节点**上卸载
[root@node1 ceph]# df -h |grep osd
tmpfs 488M 48K 488M 1% /var/lib/ceph/osd/ceph-0
[root@node1 ceph]# umount /var/lib/ceph/osd/ceph-0
7, 在osd.0对应的节点上删除osd磁盘产生的逻辑卷
[root@node1 ceph]# pvs
PV VG Fmt Attr PSize PFree
/dev/sdb ceph-56e0d335-80ba-40d8-b076-fc63a766dcac lvm2 a-- 1020.00m 0
[root@node1 ceph]# vgs
VG #PV #LV #SN Attr VSize VFree
ceph-56e0d335-80ba-40d8-b076-fc63a766dcac 1 1 0 wz--n- 1020.00m 0
[root@node1 ceph]# lvremove ceph-56e0d335-80ba-40d8-b076-fc63a766dcac
Do you really want to remove active logical volume ceph-56e0d335-80ba-40d8-b076-fc63a766dcac/osd-block-ef26149d-5d7d-4cc7-8251-684fbddc2da5? [y/n]:y
Logical volume "osd-block-ef26149d-5d7d-4cc7-8251-684fbddc2da5" successfully removed
至此,就完全删除了
8,如果要再加回来,再次在部署节点使用下面命令即可
[root@node1 ceph]# ceph-deploy disk zap node1 /dev/sdb
[root@node1 ceph]# ceph-deploy osd create --data /dev/sdb node1