作者:李毓
ceph是一个分布式的存储系统。
特点一是高性能,他屏蔽了传统的集中式存储元数据寻址,采用了crush算法,数据负载均衡,并行访问。考虑了容灾,实现了副本规则,很好的适应了跨机房跨机架。能够支持成千上万个存储节点的规模,支持到PB级的规模。
特点二是高可用性,副本数可以灵活控制,故障分离数据强一致性。故障场景的自动修复。
特点三是可扩展性,CEPH是去中心化的存储,扩展灵活,随着节点增加而线性增长。
特点四是种类丰富,支持三种风格的存储接口,块存储,文件存储,对象存储,支持api和resutfulapi风格的接口。
下面演示一下搭建过程
约定:
[root@node1 ~]# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)
hostname | ip | 角色 |
---|---|---|
admin-node | 192.168.0.130 | 管理节点 |
node1 | 192.168.0.131 | 监控节点 |
node2 | 192.168.0.132 | OSD节点 |
node3 | 192.168.0.133 | OSD节点 |
所有节点编辑hosts
[root@node1 ~]# cat /etc/hosts
192.168.0.130 admin-node
192.168.0.131 node1
192.168.0.132 node2
192.168.0.133 node3
所有节点安装ntp
yum install ntp ntpdate ntp-doc -y
所有节点安装open-ssh
yum install openssh-server -y
所有节点创建ceph用户
useradd -d /home/liyu -m liyu
passwd liyu
确保新建用户有sudo权限
echo "liyu ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/liyu
chmod 0440 /etc/sudoers.d/liyu
允许管理节点无密码登录,因为 ceph-deploy 不支持输入密码,你必须在管理节点上生成 SSH 密钥并把其公钥分发到各 Ceph 节点。 ceph-deploy 会尝试给初始 monitors 生成 SSH 密钥对。
su - liyu
ssh-keygen
公钥分发到各个节点
ssh-copy-id liyu@node1
ssh-copy-id liyu@node2
ssh-copy-id liyu@node3
新增config文件,这样 ceph-deploy 就能用你所建的用户名登录 Ceph 节点了。
[liyu@admin-node ~]$ cat ~/.ssh/config
Host admin-node
Hostname admin-node
User liyu
Host node1
Hostname node1
User liyu
Host node2
Hostname node2
User liyu
Host node3
Hostname node3
User liyu
赋权
sudo chmod 644 ~/.ssh/config
放行端口,因为我这里是测试,所有节点禁用防火墙,Ceph Monitors 之间默认使用 6789 端口通信, OSD 之间默认用 6800:7300 这个范围内的端口通信。Ceph OSD 能利用多个网络连接进行与客户端、monitors、其他 OSD 间的复制和心跳的通信。
sudo firewall-cmd --zone=public --add-port=6789/tcp --permanent
或者
systemctl stop firewalld
systemctl disable firewalld
所有节点关闭selinux
sudo setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
管理节点配置EPEL源
sudo yum install -y yum-utils && sudo yum-config-manager --add-repo https://dl.fedoraproject.org/pub/epel/7/x86_64/ && sudo yum install --nogpgcheck -y epel-release && sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 && sudo rm /etc/yum.repos.d/dl.fedoraproject.org*
管理节点添加yum源
[liyu@admin-node ~]$ cat /etc/yum.repos.d/ceph.repo
[Ceph]
name=Ceph packages for $basearch
baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/x86_64/
enabled=1
gpgcheck=0
type=rpm-md
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
priority=1
[Ceph-noarch]
name=Ceph noarch packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/noarch/
enabled=1
gpgcheck=0
type=rpm-md
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
priority=1
[ceph-source]
name=Ceph source packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-jewel/el7/SRPMS/
enabled=1
gpgcheck=0
type=rpm-md
gpgkey=https://mirrors.aliyun.com/ceph/keys/release.asc
priority=1
管理节点更新软件库并安装ceph-deploy
sudo yum update && sudo yum install ceph-deploy
sudo yum install yum-plugin-priorities
准备工作做完后就可以搭建集群了,在管理节点上创建一个目录,用于保存 ceph-deploy 生成的配置文件和密钥对。
cd ~
mkdir my-cluster
cd my-cluster
注:若安装ceph后遇到麻烦可以使用以下命令进行清除包和配置:
// 删除安装包
$ ceph-deploy purge admin-node node1 node2 node3
// 清除配置
$ ceph-deploy purgedata admin-node node1 node2 node3
$ ceph-deploy forgetkeys
创建集群并初始化监控节点,这里node1是monitor节点,所以执行:
ceph-deploy new node1
[liyu@admin-node my-cluster]$ ceph-deploy new node1
[ceph_deploy.conf][DEBUG ] found configuration file at: /home/liyu/.cephdeploy.conf
[ceph_deploy.cli][INFO ] Invoked (1.5.39): /bin/ceph-deploy new node1
[ceph_deploy.cli][INFO ] ceph-deploy options:
[ceph_deploy.cli][INFO ] username : None
[ceph_deploy.cli][INFO ] func : <function new at 0x7f06a9468668>
[ceph_deploy.cli][INFO ] verbose : False
[ceph_deploy.cli][INFO ] overwrite_conf : False
[ceph_deploy.cli][INFO ] quiet : False
[ceph_deploy.cli][INFO ] cd_conf : <ceph_deploy.conf.cephdeploy.Conf instance at 0x7f06a8be46c8>
[ceph_deploy.cli][INFO ] cluster : ceph
[ceph_deploy.cli][INFO ] ssh_copykey : True
[ceph_deploy.cli][INFO ] mon : ['node1']
[ceph_deploy.cli][INFO ] public_network : None
[ceph_deploy.cli][INFO ] ceph_conf : None
[ceph_deploy.cli][INFO ] cluster_network : None
[ceph_deploy.cli][INFO ] default_release : False
[ceph_deploy.cli][INFO ] fsid : None
[ceph_deploy.new][DEBUG ] Creating new cluster named ceph
[ceph_deploy.new][INFO ] making sure passwordless SSH succeeds
[node1][DEBUG ] connected to host: admin-node
[node1][INFO ] Running command: ssh -CT -o BatchMode=yes node1
[node1][DEBUG ] connection detected need for sudo
[node1][DEBUG ] connected to host: node1
[node1][DEBUG ] detect platform information from remote host
[node1][DEBUG ] detect machine type
[node1][DEBUG ] find the location of an executable
[node1][INFO ] Running command: sudo /usr/sbin/ip link show
[node1][INFO ] Running command: sudo /usr/sbin/ip addr show
[node1][DEBUG ] IP addresses found: [u'192.168.0.131']
[ceph_deploy.new][DEBUG ] Resolving host node1
[ceph_deploy.new][DEBUG ] Monitor node1 at 192.168.0.131
[ceph_deploy.new][DEBUG ] Monitor initial members are ['node1']
[ceph_deploy.new][DEBUG ] Monitor addrs are ['192.168.0.131']
[ceph_deploy.new][DEBUG ] Creating a random mon key...
[ceph_deploy.new][DEBUG ] Writing monitor keyring to ceph.mon.keyring...
[ceph_deploy.new][DEBUG ] Writing initial config to ceph.conf...
[liyu@admin-node my-cluster]$ ls
ceph.conf ceph-deploy-ceph.log ceph.mon.keyring
修改配置文件,把 Ceph 配置文件里的默认副本数从 3 改成 2 ,这样只有两个 OSD 也可以达到 active + clean 状态。把 osd pool default size = 2 加入 [global] 段:
[liyu@admin-node my-cluster]$ cat ceph.conf
[global]
fsid = 3c6f0d86-a5d1-4c63-ab07-fd8211ce32bb
mon_initial_members = node1
mon_host = 192.168.0.131
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
[liyu@admin-node my-cluster]$ sed -i '$a\osd pool default size = 2' ceph.conf
[liyu@admin-node my-cluster]$ cat ceph.conf
[global]
fsid = 3c6f0d86-a5d1-4c63-ab07-fd8211ce32bb
mon_initial_members = node1
mon_host = 192.168.0.131
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
osd pool default size = 2
然后在所有节点上安装ceph
ceph-deploy install admin-node node1 node2 node3
安装的时候遇到一堆报错的问题,这里插播一下。
1、问题:[ceph_deploy][ERROR ] RuntimeError: Failed to execute command: yum -y install epel-release
解决方法:
sudo yum -y remove epel-release
出现的错误[2]。No data was received after 300 seconds, disconnecting...。原因是网络比较慢,达到5分钟超时。
解决办法是:
分别在每个节点上安装ceph,yum -y install ceph。
2、出现的错误[3]。[ceph_deploy][ERROR ] RuntimeError: Failed to execute command: ceph --version。这个错误和上面【2】的错误的解决办法一样。
3、在执行命令ceph osd tree时,发现节点名字不是node1-4时,判断是不是已经修改主机名成功,修改主机名称命令是: hostnamectl set-hostname name
4、在执行安装或者准备node节点时,出现了Error:[Errno 2] No such file or directory,说明以前卸载过ceph,但是没有清除干净配置文件,所以要删除以前的配置文件。解决办法是:
rm -rf /etc/ceph/*
rm -rf /var/lib/ceph/*/*
rm -rf /var/log/ceph/*
rm -rf /var/run/ceph/*
5、出现Error:/var/run/yum.pid 已被锁定,PID 为 xxxx 的另一个程序正在运行。这个问题解决方案是:
rm -f /var/run/yum.pid
配置初始 monitor(s)、并收集所有密钥(my-cluster目录下执行)
ceph-deploy mon create-initial
执行完毕后目录下会出现这些密钥
[liyu@admin-node my-cluster]$ ls
ceph.bootstrap-mds.keyring ceph.bootstrap-osd.keyring ceph.client.admin.keyring
ceph.bootstrap-mgr.keyring ceph.bootstrap-rgw.keyring ceph.mon.keyring
添加2个OSD
1.登录到 Ceph 节点、并给 OSD 守护进程创建一个目录,并添加权限。
[liyu@admin-node my-cluster]$ ssh node2
Last login: Wed Mar 3 20:56:41 2021 from admin-node
[liyu@node2 ~]$ sudo mkdir /var/local/osd0
[liyu@node2 ~]$ sudo chmod 777 /var/local/osd0/
[liyu@node2 ~]$ exit
logout
Connection to node2 closed.
[liyu@admin-node my-cluster]$ ssh node3
Last login: Wed Mar 3 20:56:44 2021 from admin-node
[liyu@node3 ~]$ sudo mkdir /var/local/osd1
[liyu@node3 ~]$ sudo chmod 777 /var/local/osd1/
[liyu@node3 ~]$ exit
logout
Connection to node3 closed.
2.然后,从管理节点执行 ceph-deploy 来准备 OSD 。
ceph-deploy osd prepare node2:/var/local/osd0 node3:/var/local/osd1
3.最后,激活OSD。
ceph-deploy osd activate node2:/var/local/osd0 node3:/var/local/osd1
把配置文件和 admin 密钥拷贝到管理节点和 Ceph 节点
ceph-deploy admin admin-node node1 node2 node3
确保对 ceph.client.admin.keyring 有正确的操作权限
sudo chmod +r /etc/ceph/ceph.client.admin.keyring
检查集群的健康状况和OSD节点状况
给集群扩容
添加OSD
[liyu@admin-node my-cluster]$ ssh node1
Last login: Wed Mar 3 20:56:37 2021 from admin-node
[liyu@node1 ~]$ sudo mkdir /var/local/osd2
[liyu@node1 ~]$ sudo chmod 777 /var/local/osd2/
[liyu@node1 ~]$ exit
logout
Connection to node1 closed.
准备OSD
ceph-deploy osd prepare node1:/var/local/osd2
激活OSD
ceph-deploy osd activate node1:/var/local/osd2
检查集群状况和OSD节点:
可以看到,多了一个。
添加monitor
在 ndoe2 和 node3 添加监控节点。
修改 mon_initial_members、mon_host 和 public network 配置:
[liyu@admin-node my-cluster]$ cat ceph.conf
[global]
fsid = 3c6f0d86-a5d1-4c63-ab07-fd8211ce32bb
mon_initial_members = node1,node2,node3
mon_host = 192.168.0.131,192.168.0.132,192.168.0.133
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
osd pool default size = 2
public network = 192.168.0.130/24
推送至其他节点:
ceph-deploy --overwrite-conf config push node1 node2 node3
添加监控节点
ceph-deploy mon add node2
ceph-deploy mon add node3
Cephfs使用挂载方式有两种 1.使用linux kernel挂载 mount 2.使用ceph-fuse挂载。
我们这里演示第一种
Ceph文件系统至少需要两个RADOS池,一个用于数据,一个用于元数据
启用mds服务
ceph-deploy mds create node1
创建数据pool
ceph osd pool create cephfs_data 128
创建Metadata池
ceph osd pool create cephfs_metadata 128
启用pool
ceph fs new cephfs cephfs_metadata cephfs_data
查看cephfs
在ceph-client客户端节点上创建挂载点目录
mkdir -pv /mnt/mycephfs/
查看管理员秘钥,因为要挂载启用了 cephx 认证的 Ceph 文件系统,所以必须指定用户名、密钥。
[liyu@admin-node my-cluster]$ cat ceph.client.admin.keyring
[client.admin]
key = AQBzoT9gbAcpExAAqDOEJNqLXbQfmSNhNnDQuA==
caps mds = "allow *"
caps mon = "allow *"
caps osd = "allow *"
用命令挂载
[root@client ~]# mount -t ceph 192.168.0.131:6789:/ /mnt/mycephfs -o name=admin,secret=AQBzoT9gbAcpExAAqDOEJNqLXbQfmSNhNnDQuA==
加入开机启动
192.168.0.131:6789:/ /mnt/mycephfs ceph name=admin,secret=AQBzoT9gbAcpExAAqDOEJNqLXbQfmSNhNnDQuA==,noatime,_netdev 0 2
卸载
[root@client mnt]# umount /mnt/mycephfs