目前我们的数据存储方式主要有以下几种
SCSI 小型计算机系统接口,主要用于硬盘,光盘,磁带机(目前多数银行应用)
DAS 直连式存储
不能实现数据和其他主机的共享
占用服务器操作系统资源,CPU,IO等
数据量越大,性能越差
NAS网络技术存储
数据存储,以数据为中心
采用标准的nfs,http,cifs,限于文件系统,如NFS samba
SAN存储区域网络
块存储,例如iscsi vda sda sdb等
分布式存储
由于传统的存储例如上面的NAS,SAN不方便扩容,而且存储方式单一
所以分布式存储被越来越多的企业所选择
主要有有以下几类
Lustre,Hadoop,FastDFS,Ceph,GlusterFS(仅支持文件系统)
下面简单的来说一下Ceph,因为这款软件相对来说确实很强大,支持对象存储,块存储,文件系统存储,可以动态迁移
Ceph组件
OSDs 存储设备
Monitors 集群监控组件
MDSs 存放文件系统的元数据
Client ceph客户端ceph-common
工作原理
比如有三台存储设备 node1 node2 node3
监视组件 monitor 配置一个固定IP
现在客户client 发来读写请求a.txt
monitor在接到请求后,经过内部的hash算法,将请求传递给某一个node
比如,文件a.txt取值为0,则对应node1进行存储
实际上我们的ceph需要三个monitor节点(需要过半主机为好,三台,至少有两个是好的…),至少三个存储主机,然后整个数据在分成不同的小单元同时进行存储,这样会降低我们的时间,提高效率,目前的数据一般都是三备份,也可以更多,比如四备份,五备份等,数据取出的时候也是如此,并发取出!
ceph搭建
实验前准备
- 创建1台客户端虚拟机并配置主机名,IP
hostnamectl set-hostname client
nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.4.10/24 connection.autoconnect yes
nmcli connection up eth0
- 创建3台存储集群虚拟机并配置主机名,IP
hostnamectl set-hostname node1
nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.4.11/24 connection.autoconnect yes
nmcli connection up eth0
hostnamectl set-hostname node2
nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.4.12/24 connection.autoconnect yes
nmcli connection up eth0
hostnamectl set-hostname node3
nmcli connection modify eth0 ipv4.method manual ipv4.addresses 192.168.4.13/24 connection.autoconnect yes
nmcli connection up eth0
3.物理机配置YUM源服务器
yum -y install vsftpd
mkdir /var/ftp/ceph
mount /root/rhcs2.0-rhosp9-20161113-x86_64.iso /var/ftp/ceph ##以实际文件路径为准
ls /var/ftp/ceph #查看文件中内容
rhceph-2.0-rhel-7-x86_64/ rhscon-2.0-rhel-7-x86_64/
rhel-7-server-openstack-9-rpms/
cd /var/ftp/ceph/rhceph-2.0-rhel-7-x86_64/
ls
EULA GPL MON OSD README RPM-GPG-KEY-redhat-release Tools TRANS.TBL
# 四台虚拟机需要挂载目录下 MON OSD Tools
- 修改所有主机的yum源节点,以node1为例
[root@node1 ~]# cat /etc/yum.repos.d/ceph.repo
[mon]
name=mon
baseurl=ftp://192.168.4.254/ceph/rhceph-2.0-rhel-7-x86_64/MON
gpgcheck=0
[osd]
name=osd
baseurl=ftp://192.168.4.254/ceph/rhceph-2.0-rhel-7-x86_64/OSD
gpgcheck=0
[tools]
name=tools
baseurl=ftp://192.168.4.254/ceph/rhceph-2.0-rhel-7-x86_64/Tools
gpgcheck=0
- 修改/etc/hosts并同步到所有主机
注:/etc/hosts解析的域名必须与本机主机名一致
这里以node1为例
[root@node1 ~]# cat /etc/hosts
192.168.4.10 client
192.168.4.11 node1
192.168.4.12 node2
192.168.4.13 node3
[root@node1 ~]# for i in 192.168.4.{10,11,12,13}
> do
> scp /etc/hosts $i:/etc/
> done
[root@node1 ~]# for i in 192.168.4.{10,11,12,13}
> do
> scp /etc/yum.repos.d/ceph.repo $i:/etc/yum.repos.d/
> done
- 配置无密码SSH链接
[root@node1 ~]# ssh-keygen -f /root/.ssh/id_rsa -N ''
[root@node1 ~]# for i in 192.168.4.{10 11 12 13}
> do
> ssh-copy-id $i
> done
- 配置NTP时间同步(必须配置,要求时间误差0.05ms内)
真实物理机配置时间服务器
yum -y install chrony
vim /etc/chrony.conf
allow 192.168.4.0/24 # 允许4.0网段所有主机
192.168.4.0/24
systemctl restart chronyd.service # 重启服务
iptables -F # 清空防火墙规则
其他所有节点均要与服务器时间同步(以node1为例)
[root@node1 ~]# cat /etc/chrony.conf
server 192.168.4.254 iburst
[root@node1 ~]# systemctl restart chronyd
8.创建虚拟机磁盘
[root@room9pc01 ~]# virt-manager
为node1/2/3 分别添加三块磁盘
[root@node1]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 3.8G 0 rom /dvd
vda 252:0 0 20G 0 disk
├─vda1 252:1 0 1G 0 part /boot
└─vda2 252:2 0 19G 0 part
├─rhel-root 253:0 0 17G 0 lvm /
└─rhel-swap 253:1 0 2G 0 lvm [SWAP]
vdb 252:16 0 20G 0 disk
vdc 252:32 0 20G 0 disk
vdd 252:48 0 20G 0 disk
部署ceph集群
- 安装部署工具ceph-deploy
这个软件带有一个同步安装的脚本ceph-deploy,我们在前面已经设置了无密码远程其他主机节点和本机,所以在一台设备操作就可以。
之后创建一个新的文件夹,可以随便命名,但之后敲得相关命令必须在次文件夹下面,否则会出错,无法安装。命令如下(这里用node1部署:
[root@node1 ~]# yum -y install ceph-deploy # 部署安装工具
[root@node1 ~]# ceph-deploy --help #可以查看相关帮助
[root@node1 ~]# mkdir ceph-cluster # 创建目录
[root@node1 ~]# cd ceph-cluster/ #进入此目录
- 创建ceph集群
[root@node1 ceph-cluster]# ceph-deploy new node1 node2 node3 # 创建集群配置文件ceph.conf(里面注明集群主机都有那些)
[root@node1 ceph-cluster]# ceph-deploy install node1 node2 node3 # 所有节点安装软件包
[root@node1 ceph-cluster]# ceph-deploy mon create-initial # 初始化mon服务 在相关主机可以查看 这里不用指定主机,前面已经配置过,解析必须对!并启动
[root@node1 ceph-cluster]systemctl status ceph-mon@node1.service # 查看服务已经启动
2.准备日志磁盘分区
[root@node1 ~]# parted /dev/vdb mklabel gpt
[root@node1 ~]# parted /dev/vdb mkpart primary 1M 50%
[root@node1 ~]# parted /dev/vdb mkpart primary 50% 100%
[root@node1 ~]# chown ceph.ceph /dev/vdb1
[root@node1 ~]# chown ceph.ceph /dev/vdb2
#临时赋予权限,重启就会失效 修改udev配置永久权限
[root@node2 ~]# vim /etc/udev/rules.d/70-vdb.rules
ENV{DEVNAME}=="/dev/vdb1",OWNER="ceph",GROUP="ceph"
ENV{DEVNAME}=="/dev/vdb2",OWNER="ceph",GROUP="ceph"
#这两个分区作为存储服务器的日志盘,企业建议用固态盘ssd,其余两个节点也同样操作!
[root@node1 ~]# ceph-deploy disk zap node1:vdc node1:vdd
[root@node1 ~]# ceph-deploy disk zap node2:vdc node2:vdd
[root@node1 ~]# ceph-deploy disk zap node3:vdc node3:vdd
#初始化磁盘设备,仅在node1操作即可
- 创建OSD存储空间
[root@node1 ~]# ceph-deploy osd create node1:vdc:/dev/vdb1 node1:vdd:/dev/vdb2
#创建osd存储设备,vdc为集群提供存储空间,vdb1提供JOURNAL日志...
[root@node1 ~]# ceph-deploy osd create node2:vdc:/dev/vdb1 node2:vdd:/dev/vdb2
[root@node1 ~]# ceph-deploy osd create node3:vdc:/dev/vdb1 node3:vdd:/dev/vdb2
- 查看ceph状态,验证
[root@node1 ~]# ceph -s # 查看集群状态
创建ceph块存储
1.创建块存储镜像
[root@node1 ~]# ceph osd lspools #查看存储池,哪台节点打都可以
0 rbd, # rbd为默认
[root@node1 ~]# rbd create demo-image --image-feature layering --size 10G
[root@node1 ~]# rbd create rbd/image --image-feature layering --size 10G # 创建块存储(镜像) 以及有哪些功能,大小
[root@node1 ~]# rbd list # 查看镜像
[root@node1 ~]# rbd info demo-image
#查看镜像信息
可以进行大小动态调整
[root@node1 ~]# rbd resize --size 7G demo-image --allow-shrink(收缩) # 把demo-image缩小为7G
[root@node1 ~]# rbd resize --size 15G image #把image扩容成15G
- 客户端映射镜像
第一种 集群里有客户端
[root@node1 ~]# rbd map demo-image
/dev/rbd0
[root@node1 ~]# lsblk # 查看会增加一个硬盘 ,磁盘可以格式化可以挂载!
第二种 单独客户端
注意:如果物理机重启过,则需要重新挂载 rhcs2.0-rhosp9-20161113-x86_64.iso文件
[root@node1 ceph-cluster]# ls /etc/ceph/ #在node1 查看 密钥和配置文件
ceph.client.admin.keyring ceph.conf rbdmap tmpvp1YWB
[root@client ~]# yum -y install ceph-common #客户端安装ceph-common软件
[root@client ~]# scp 192.168.4.11:/etc/ceph/ceph.conf /etc/ceph/ # 拷贝配置文件以知道集群在哪
[root@client ~]# scp 192.168.4.11:/etc/ceph/ceph.client.admin.keyring /etc/ceph/ # 拷贝密钥以获得链接权限
[root@client ~]# rbd map image # 类似于mount
[root@client ~]# lsblk
[root@client ~]# rbd showmapped #查看镜像路径
[root@client ~]# rbd unmap image #取消镜像
[root@client ~]# mkfs.xfs /dev/rbd0 #可以格式化
[root@client ~]# mount /dev/rbd0 /mnt/ #可以挂载
[root@client ~]# echo "test" > /mnt/test.txt #可以写数据 不过分散在node1,2,3上! 如果测试的话,umount,否则不能快照
- 创建镜像快照
原理
[快照即COW(copy on write ) 写实复制]
- 比方说:有一块原始盘100G,文件有a.txt (内容比如为123456) 如果内容改变为13579 …
- 如果正常备份,需要100G或者更大,但是我们通过快照,新盘可能仅需1G (相当于快捷方式)就可以,这样可以节省空间,时间
- 快照仅为a.txt 拷贝新的文件a.txt(内容为13579)
- 另一方面,比如我们备份一个10G的数据,大概需要10分钟 ,10.00开始备份,正常10.10备份完成,不过数据需要过程,如果中间有数据变化,最后备份的就是备份过的改变前的和改变之后的内容。
- 改变这种情况,可以先变只读,再快照(很快就可以完成) 然后把快照备份到新的硬盘。这样不影响企业的业务。
[root@node1 ~]# rbd snap ls image # 查看镜像快照,当前没有
[root@node1 ~]# rbd snap create image --snap image-snap1 #给image创建镜像快照为image-snap1
[root@node1 ~]# rbd snap ls image
SNAPID NAME SIZE
4 image-snap1 15360 MB
- 使用快照还原数据
[root@client ~]# rm -rf /mnt/test.txt # 删除文件
[root@node1 ~]# rbd snap rollback image --snap image-snap1 # 还原快照
#客户端重新挂载分区
[root@client ~]# umount /mnt
[root@client ~]# mount /dev/rbd0 /mnt/
[root@client ~]# ls /mnt
- 使用快照克隆镜像
[root@node1 ~]# rbd snap protect image --snap image-snap1 # 快照之前先要保护快照,防止中间快照变化
[root@node1 ~]# rbd snap rm image --snap image-snap1 #因为保护,所以删除会失败
[root@node1 ~]# rbd clone image --snap image-snap1 image-clone --image-feature layering # 使用image的快照image-snap1克隆一个新的镜像image-clone(可以随意命名)
[root@node1 ~]# rbd info image-clone
...
parent: rbd/image@image-snap1 #虽然也属于镜像,但是数据很多都是来源于源快照
[root@node1 ~]# rbd flatten image-clone #拷贝数据
[root@node1 ~]# rbd info image-clone
...
#可以独立工作,不需要父快照信息了
- 删除快照与镜像
[root@client ~]# umount /mnt #卸载
[root@client ~]# rbd showmapped #查看
[root@client ~]# rbd unmap /dev/rbd/{poolname}/{imagename} #删除格式
[root@client ~]# rbd unmap /dev/rbd/rbd/image
[root@node1 ~]# rbd snap rm image --snap image-snap # 删除快照
[root@node1 ~]# rbd list
[root@node1 ~]# rbd rm image #删除镜像