什么是ceph?
ceph 是一种统一的分布式文件系统,具有优秀的性能、高可用性和可扩展性。ceph 的统一体现在可以提供文件系统、块存储和对象存储,分布式体现在可以动态扩展。在国内一些公司的云环境中,通常会采用 ceph 作为 openstack 的唯一后端存储来提高数据转发效率。
ceph的存储类型有哪些?
①块存储
一对一,只能被一个主机挂载使用,数据以块为单位进行存储,典型代表:硬盘;
②文件存储
一对多,能被多个主机同时挂载使用,数据以文件的形式存储的(元数据和实际数据是分开存储的),并且有目录的层级关系,典型代表:NFS;
③对象存储
一对多,能被多个主机通过API接口访问使用,数据以文件进行存储,一个文件即一个对象,元数据和实际数据是存储在一起的,文件是扁平化的存储,没有目录的层级关系,典型代表:OSS、S3。
Ceph架构:
④ 客户端(APP/VM/HOST)
③ 三个默认接口(块存储RBD,文件存储cephFS,对象存储RGW)
② LibRADOS对象访问接口
① RADOS基础存储系统(统一存储池)
Ceph组件:
OSD 负责存储数据,一般一个磁盘对应一个OSD,响应客户端的读写请求
Monitor(mon) 负责保存OSD的元数据,维护Ceph集群状态的MAP映射视图,管理客户端的认证与授权
Manager(mgr) 负责跟踪集群状态和监控指标,暴露接口给监控软件获取监控指标数据
MDS 负责保存 CephFS 文件系统的元数据,仅在使用 CephFS 接口功能时使用
PG 可以理解成保存OSD位置的索引,一个PG里包含多个数据对象,一个对象只能属于一个PG
Pool 数据池,可以理解成一个命名空间,一个Pool里有多个PG
Ceph的存储过程:
①文件被分成一个或者多个4M大小的数据对象;
②每个数据对象有自己的oid(由ino和ono组成),通过对oid进行hash算法得到一个十六进制的数值,然后除以pool里的pg总数,取余得到pgid(由poolid和pgid组成);
③对pgid进行crush算法得到osdid;
④通过osdid获得数据对象该存储在那个osd里,然后存储进去。
基于 ceph-deploy 部署 Ceph 集群:
Ceph 生产环境推荐:
1、存储集群全采用万兆网络
2、集群网络(cluster-network,用于集群内部通讯)与公共网络(public-network,用于外部访问Ceph集群)分离
3、mon、mds 与 osd 分离部署在不同主机上(测试环境中可以让一台主机节点运行多个组件)
4、OSD 使用 SATA 亦可
5、根据容量规划集群
6、至强E5 2620 V3或以上 CPU,64GB或更高内存
7、集群主机分散部署,避免机柜的电源或者网络故障
①Ceph 环境规划
主机名 | Public网络 | Cluster网络 | 角色 |
admin | 192.168.169.10 | admin(管理节点负责集群整体部署)、client | |
node01 | 192.168.169.20 | 192.168.100.20 | mon、mgr、osd(/dev/sdb、/dev/sdc、/dev/sdd) |
node02 | 192.168.169.40 | 192.168.100.40 | mon、mgr、osd(/dev/sdb、/dev/sdc、/dev/sdd) |
node03 | 192.168.169.50 | 192.168.100.50 | mon、osd(/dev/sdb、/dev/sdc、/dev/sdd) |
admin | 192.168.169.60 | client |
②关闭防火墙
③配置 hosts 解析
cat > /etc/hosts << EOF
192.168.169.10 admin
192.168.169.20 node01
192.168.169.40 node02
192.168.169.50 node03
192.168.169.60 client
EOF
④安装常用软件和依赖包
yum -y install epel-release
yum -y install yum-plugin-priorities yum-utils ntpdate python-setuptools python-pip gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel zip unzip ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5-devel libidn libidn-devel openssl openssh openssl-devel nss_ldap openldap openldap-devel openldap-clients openldap-servers libxslt-devel libevent-devel ntp libtool-ltdl bison libtool vim-enhanced python wget lsof iptraf strace lrzsz kernel-devel kernel-headers pam-devel tcl tk cmake ncurses-devel bison setuptool popt-devel net-snmp screen perl-devel pcre-devel net-snmp screen tcpdump rsync sysstat man iptables sudo libconfig git bind-utils tmux elinks numactl iftop bwm-ng net-tools expect snappy leveldb gdisk python-argparse gperftools-libs conntrack ipset jq libseccomp socat chrony sshpass
⑤在 admin 管理节点配置 ssh 免密登录所有节点
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
sshpass -p '123456' ssh-copy-id -o StrictHostKeyChecking=no root@admin
sshpass -p '123456' ssh-copy-id -o StrictHostKeyChecking=no root@node01
sshpass -p '123456' ssh-copy-id -o StrictHostKeyChecking=no root@node02
sshpass -p '123456' ssh-copy-id -o StrictHostKeyChecking=no root@node03
⑥配置时间同步
systemctl enable --now chronyd
timedatectl set-ntp true #开启 NTP
timedatectl set-timezone Asia/Shanghai #设置时区
chronyc -a makestep #强制同步下系统时钟
timedatectl status #查看时间同步状态
chronyc sources -v #查看 ntp 源服务器信息
timedatectl set-local-rtc 0 #将当前的UTC时间写入硬件时钟
#重启依赖于系统时间的服务
systemctl restart rsyslog
systemctl restart crond
#关闭无关服务
systemctl disable --now postfix
⑦配置 Ceph yum源
wget https://download.ceph.com/rpm-nautilus/el7/noarch/ceph-release-1-1.el7.noarch.rpm --no-check-certificate
rpm -ivh ceph-release-1-1.el7.noarch.rpm --force
⑧执行完上面所有的操作之后重启所有主机
sync
reboot
⑨为所有节点都创建一个 Ceph 工作目录,后续的工作都在该目录下进行
mkdir -p /etc/ceph
安装 ceph-deploy 部署工具
cd /etc/ceph
yum install -y ceph-deploy
ceph-deploy --version
在管理节点为其它节点安装 Ceph 软件包
#ceph-deploy 2.0.1 默认部署的是 mimic 版的 Ceph,若想安装其他版本的 Ceph,可以用 --release 手动指定版本
cd /etc/ceph
ceph-deploy install --release nautilus node0{1..3} admin
#ceph-deploy install 本质就是在执行下面的命令:
yum clean all
yum -y install epel-release
yum -y install yum-plugin-priorities
yum -y install ceph-release ceph ceph-radosgw
⑩安装网卡,配置网卡
在管理节点运行下述命令,告诉 ceph-deploy 哪些是 mon 监控节点:
cd /etc/ceph
ceph-deploy new --public-network 192.168.169.0/24 --cluster-network 192.168.100.0/24 node01 node02 node03
命令执行成功后会在 /etc/ceph 下生成配置文件:
ls /etc/ceph
ceph.conf #ceph的配置文件
ceph-deploy-ceph.log #monitor的日志
ceph.mon.keyring #monitor的密钥环文件
在管理节点初始化 mon 节点:
cd /etc/ceph
ceph-deploy mon create node01 node02 node03 #创建 mon 节点,由于 monitor 使用 Paxos 算法,其高可用集群节点数量要求为大于等于 3 的奇数台
ceph-deploy --overwrite-conf mon create-initial #配置初始化 mon 节点,并向所有节点同步配置
# --overwrite-conf 参数用于表示强制覆盖配置文件
这里有过一次错误:node2和node3没成功一会出现bug?
解决方法:看ceph.conf的配置信息是否正确。
ceph-deploy gatherkeys node01 #可选操作,向 node01 节点收集所有密钥
#命令执行成功后会在 /etc/ceph 下生成配置文件
ls /etc/ceph
ceph.bootstrap-mds.keyring #引导启动 mds 的密钥文件
ceph.bootstrap-mgr.keyring #引导启动 mgr 的密钥文件
ceph.bootstrap-osd.keyring #引导启动 osd 的密钥文件
ceph.bootstrap-rgw.keyring #引导启动 rgw 的密钥文件
ceph.client.admin.keyring #ceph客户端和管理端通信的认证密钥,拥有ceph集群的所有权限
ceph.conf
ceph-deploy-ceph.log
ceph.mon.keyring
在node节点上查看自动开启的 mon 进程
ps aux | grep ceph
在管理节点查看 Ceph 集群状态:
cd /etc/ceph
ceph -s
查看 mon 集群选举的情况:
ceph quorum_status --format json-pretty | grep leader
扩容 mon 节点
ceph-deploy mon add <节点名称>
⑪部署能够管理 Ceph 集群的节点 #可实现在各个节点执行 ceph 命令管理集群
cd /etc/ceph
ceph-deploy --overwrite-conf config push node01 node02 node03
ceph-deploy admin node01 node02 node03 #本质就是把 ceph.client.admin.keyring 集群认证文件拷贝到各个节点
在节点上看:ls /etc/ceph
查看下健康状态:ceph -s
⑫部署 osd 存储节点(三个node节点部署)
#主机添加完硬盘后不要分区,直接使用
如果是利旧的硬盘,则需要先擦净(删除分区表)磁盘(可选,无数据的新硬盘可不做)
cd /etc/ceph
ceph-deploy disk zap node01 /dev/sdb
ceph-deploy disk zap node02 /dev/sdb
ceph-deploy disk zap node03 /dev/sdb
添加 osd 节点:
ceph-deploy --overwrite-conf osd create node01 --data /dev/sdb
ceph-deploy --overwrite-conf osd create node02 --data /dev/sdb
ceph-deploy --overwrite-conf osd create node03 --data /dev/sd