一、 介绍
Ceph 是一个去中心化的分布式存储系统, 拥有较好的性能、可靠性和可扩展性。
与其他主流存储系统对比:
对比说明 | TFS | FASTDFS | MooseFS | GlusterFS | CEPH |
开发语言 | C++ | C | C | C | C++ |
数据存储方式 | 块 | 文件/Trunk | 块 | 文件/块 | 对象/文件/块 |
在线扩容 | 支持 | 支持 | 支持 | 支持 | 支持 |
冗余备份 | 支持 | 支持 | 支持 | 支持 | 支持 |
单点故障 | 存在 | 不存在 | 存在 | 不存在 | 不存在 |
易用性 | 安装复杂,官方文档少 | 安装简单,社区相对活跃 | 安装简单,官方文档多 | 安装简单,官方文档专业化 | 安装简单,官方文档专业化 |
适用场景 | 跨集群的小文件 | 单集群的中小文件 | 单集群的大中文件 | 跨集群云存储 | 单集群的大中小文件 |
二、脉络
- 了解Ceph部署规划
- 操作系统基础配置
- Ceph集群创建配置
- Ceph Dashboard管理后台
- CephFs文件系统创建
- Rados Java Ceph功能验证
三、知行
Ceph集群虽然宣称安装简单,官方文档资料齐全, 但是实际部署当中步骤还挺多, 坑也不少,略显高能, 如果出现失败,请大家严格按照步骤,环境及版本操作。
1. 部署规划结构
创建三台虚拟机, 本教程采用的是CENTOS7.6版本。
主机名称 | 主机IP | 说明 |
CENTOS7-1 | 10.10.10.11 | 管理主节点,安装Dashbaord |
CENTOS7-2 | 10.10.10.12 | 子节点 |
CENTOS7-3 | 10.10.10.13 | 子节点 |
2. 操作系统基础配置
依次在三台节点上执行:
- 修改主机名称
[root@CENTOS7-1 ~]# vi /etc/hostname
CENTOS7-1
重启生效, 临时修改方法(重连会话生效): hostnamectl set-hostname CENTOS7-1
建议采用永久修改方法并进行重启。
- 编辑hosts文件
10.10.10.11 CENTOS7-1
10.10.10.12 CENTOS7-2
10.10.10.13 CENTOS7-3
注意, 主机名称要和部署的Ceph节点名称保持一致, 否则安装时候会出现问题。
- 修改YUM安装源
vi /etc/yum.repos.d/ceph.repo
这里采用清华镜像源, 提升下载速度
[Ceph]
name=Ceph packages for $basearch
baseurl=https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-mimic/el7/x86_64/
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
[Ceph-noarch]
name=Ceph noarch packages
# 官方源
#baseurl=http://download.ceph.com/rpm-mimic/el7/noarch
# 清华源
baseurl=https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-mimic/el7/noarch/
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
[ceph-source]
name=Ceph source packages
baseurl=https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-mimic/el7/SRPMS/
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
- 安装NTP时间同步工具
Ceph集群要求时间保持同步, 通过NTP时间同步可以保障所有节点时间一致。
yum install ntp ntpdate ntp-doc -y
确保时区是正确, 设置开机启动:
systemctl enable ntpd
并将时间每隔1小时自动校准同步。编辑 vi /etc/rc.d/rc.local 追加:
/usr/sbin/ntpdate ntp1.aliyun.com > /dev/null 2>&1; /sbin/hwclock -w
配置定时任务, 执行crontab -e 加入:
0 */1 * * * ntpdate ntp1.aliyun.com > /dev/null 2>&1; /sbin/hwclock -w
- 内核优化
#调整内核参数
[root@CENTOS7-1 ~]# cat >> /etc/sysctl.conf << EOF
> kernel.pid_max=4194303
> vm.swappiness = 0
> EOF
[root@CENTOS7-1 ~]# sysctl -p
# read_ahead, 通过数据预读并且记载到随机访问内存方式提高磁盘读操作,8192是比较理想的值
[root@CENTOS7-1 ~]# echo "8192" > /sys/block/sda/queue/read_ahead_kb
# I/O Scheduler优化,如果SSD要用noop,SATA/SAS设备采用deadline。
[root@CENTOS7-1 ~]#echo "deadline" > /sys/block/sda/queue/scheduler
[root@CENTOS7-1 ~]#echo "noop" > /sys/block/sda/queue/scheduler
- 关闭selinux
vi /etc/selinux/config文件, 将SELINUX设为disabled, 永久生效。
SELINUX=disabled
临时生效:
setenforce 0
3. SSH免密登陆配置
- 官方建议不用系统内置用户, 创建名为ceph_user用户, 密码也设为ceph_user:
useradd -d /home/ceph_user -m ceph_user
passwd ceph_user
- 设置sudo权限
echo "ceph_user ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/ceph_user
sudo chmod 0440 /etc/sudoers.d/ceph_user
1、2两个步骤请依次在三台机器上执行。
接下来的步骤在主节点执行即可:
- 生成密钥:
切换用户: su ceph_user
执行ssh-keygen,一直按默认提示点击生成RSA密钥信息。 - 分发密钥至各机器节点
ssh-copy-id ceph_user@CENTOS7-1
ssh-copy-id ceph_user@CENTOS7-2
ssh-copy-id ceph_user@CENTOS7-3
- 让root管理用户采用ceph_user连接并支持远程免密登陆:
管理节点是会有root和ceph_user多个用户, ssh远程连接默认会以当前用户身份进行登陆,
如果我们是root身份进行远程连接, 还是需要输入密码, 我们想简化, 该怎么处理?
切换root身份,
su root
修改ssh连接配置文件:
vi ~/.ssh/config
Host CENTOS7-1
Hostname CENTOS7-1
User ceph_user
Host CENTOS7-2
Hostname CENTOS7-2
User ceph_user
Host CENTOS7-3
Hostname CENTOS7-3
User ceph_user
注意修改文件权限, 不能采用777最大权限:
chmod 600 ~/.ssh/config
注意: 进行ssh远程连接时, Host的主机名称是区分大小写的。
- 开放端口, 非生产环境, 可以直接禁用防火墙:
systemctl stop firewalld.service
systemctl disable firewalld.service
4. Ceph集群搭建与配置
为避免目录权限等问题,我们采用root身份进行安装。
- 安装Ceph与Ceph-Deploy组件(在三台节点分别执行)
yum update && yum -y install ceph ceph-deploy
安装完成, 如果执行ceph-deploy出现ImportError: No module named pkg_resources
请安装python2-pip: yum -y install python2-pip
- 在主节点创建集群配置目录:
cd /usr/local
mkdir ceph-cluster
cd ceph-cluster
注意: 此目录作为ceph操作命令的基准目录, 会存储集群配置信息。
- 创建集群(主节点操作)
填写三台机器节点名称:
ceph-deploy new CENTOS7-1 CENTOS7-2 CENTOS7-3
创建成功后, 会生一个配置文件。
- 如果接下来集群的安装配置出现问题, 可以执行以下命令清除, 再重新安装:
ceph-deploy purge CENTOS7-1 CENTOS7-2 CENTOS7-3
ceph-deploy purgedata CENTOS7-1 CENTOS7-2 CENTOS7-3
ceph-deploy forgetkeys
将三台节点的mon信息也删除
rm -rf /var/run/ceph/
- 修改配置文件(主节点操作):
有些配置后面需要用到
vi /usr/local/ceph-cluster/ceph.conf
加入:
[global]
public network = 10.10.10.0/24
# 设置pool池默认分配数量
osd pool default size = 2
# 容忍更多的时钟误差
mon clock drift allowed = 2
mon clock drift warn backoff = 30
# 允许删除pool
mon_allow_pool_delete = true
[mgr]
# 开启WEB仪表盘
mgr modules = dashboard
- 执行安装(主节点操作):
ceph-deploy install CENTOS7-1 CENTOS7-2 CENTOS7-3
如果出现错误:
ceph_deploy][ERROR ] RuntimeError: Failed to execute command: ceph --version
请在各节点上单独进行安装:
yum -y install ceph
如果没有仓库文件ceph.repo, 请参考上面的第2章第3节,YUM的源配置文件是否完整, 网路是否通畅, 或采用其他数据源进行安装。
- 初始monitor信息(主节点操作):
ceph-deploy mon create-initial
执行完成后, 会生成以下文件:
ceph.bootstrap-mds.kering
ceph.bootstrap-mgr.kering
ceph.bootstrap-osd.kering
ceph.bootstrap-rgw.kering
ceph.client.admin.keyring
ceph.conf
- 同步管理信息(主节点操作):
从主节点下发配置文件和管理信息至各节点:
ceph-deploy admin CENTOS7-1 CENTOS7-2 CENTOS7-3
- 安装mgr管理守护进程(主节点操作)
大于12.x版本需安装, 我们装的是最新版,需执行:
ceph-deploy mgr create CENTOS7-1 CENTOS7-2 CENTOS7-3
- 安装OSD对象存储设备(三台节点操作)
注意: 新版本的OSD没有prepare与activate命令。
这里需要新的硬盘作为OSD存储设备, 关闭虚拟机, 增加一块硬盘, 不用格式化。
重启, fdisk -l 查看新磁盘名称:
执行创建OSD命令:
ceph-deploy osd create --data /dev/sdb CENTOS7-1
- 验证节点:
输入ceph health 或 ceph -s查看, 出现HEALTH_OK代表正常。
可以看到mon,mgr, mds等三个节点的信息,说明各节点的服务安装成功。
5. 管理后台Dashboard安装
- 开启dashboard模块
ceph mgr module enable dashboard
- 生成签名
ceph dashboard create-self-signed-cert
- 创建目录
在/usr/local/ceph-cluster目录下创建:
mkdir mgr-dashboard
[root@CENTOS7-1 mgr-dashboard]# pwd
/usr/local/ceph-cluster/mgr-dashboard
- 生成密钥对
cd /usr/local/ceph-cluster/mgr-dashboard
openssl req -new -nodes -x509 -subj "/O=IT/CN=ceph-mgr-dashboard" -days 3650 -keyout dashboard.key -out dashboard.crt -extensions v3_ca
[root@CENTOS7-1 mgr-dashboard]# ll
total 8
-rw-rw-r-- 1 ceph_user ceph_user 1155 Dec 14 02:26 dashboard.crt
-rw-rw-r-- 1 ceph_user ceph_user 1704 Dec 14 02:26 dashboard.key
- 启动dashboard
ceph mgr module disable dashboard
ceph mgr module enable dashboard
- 设置IP与PORT
ceph config set mgr mgr/dashboard/server_addr 10.10.10.11
ceph config set mgr mgr/dashboard/server_port 8843
如果需要关闭SSL,执行:
ceph config set mgr mgr/dashboard/ssl false
- 查看服务信息
[root@CENTOS7-1 mgr-dashboard]# ceph mgr services
{
"dashboard": "http://10.10.10.11:8443/"
}
- 设置管理用户与密码
ceph dashboard set-login-credentials admin admin
- 访问
6. CephFs文件系统创建
集群创建完后, 默认没有文件系统, 我们需要创建一个Cephfs可以支持对外访问的文件系统。
- 创建两个存储池, 执行两条命令:
ceph osd pool create cephfs_data 128
ceph osd pool create cephfs_metadata 64
说明:
如果OSD少于5个可把pg_num设置为128
OSD数量在5到10,可以设置pg_num为512
OSD数量在10到50,可以设置pg_num为4096
OSD数量大于50,需要计算pg_num的值
通过下面命令可以列出当前创建的存储池:
ceph osd lspools
- 创建fs, 名称为fs_test:
ceph fs new fs_test cephfs_metadata cephfs_data
- 查看创建信息
以下信息代表正常:
[root@CENTOS7-1 mgr-dashboard]# ceph fs ls
name: fs_test, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
[root@CENTOS7-1 mgr-dashboard]# ceph mds stat
fs_test-1/1/1 up {0=centos7-1=up:active}
附: 如果创建错误, 需要删除的话, 执行:
ceph fs rm fs_test --yes-i-really-mean-it
ceph osd pool delete cephfs_data cephfs_data --yes-i-really-really-mean-it
需要输入两次名称, 并附带–yes-i-really-really-mean-it参数。
同时确保在ceph.conf中开启以下配置, 这个我们在上面集群配置文件中已经开启:
mon allow pool delete = true
- 采用fuse挂载
先确定ceph-fuse命令能执行, 如果没有, 则安装:
yum -y install ceph-fuse
- 创建挂载目录
mkdir -p /usr/local/cephfs_directory
- 挂载cephfs
[root@node3 ~]# ceph-fuse -k /etc/ceph/ceph.client.admin.keyring -m 10.10.10.11:6789 /usr/local/cephfs_directory
ceph-fuse[6687]: starting ceph client
2019-07-14 21:39:09.644181 7fa5be56e040 -1 init, newargv = 0x7fa5c940b500 newargc=9
ceph-fuse[6687]: starting fuse
- 查看磁盘挂载信息
[root@CENTOS7-1 mgr-dashboard]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 38G 3.0G 35G 8% /
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 20M 1.9G 2% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/sda1 197M 167M 31M 85% /boot
tmpfs 378M 0 378M 0% /run/user/0
tmpfs 1.9G 24K 1.9G 1% /var/lib/ceph/osd/ceph-0
ceph-fuse 27G 0 27G 0% /usr/local/cephfs_directory
tmpfs 378M 0 378M 0% /run/user/1000
可以看到, /usr/local/cephfs_directory目录已成功挂载。
7. Rados Java使用与验证
- 安装好JDK、GIT和MAVEN。
- 下载rados java客户端源码
git clone https://github.com/ceph/rados-java.git
下载目录位置:
[root@CENTOS7-1 rados-java]# pwd
/usr/local/sources/rados-java
- 执行MAVEN安装:
跳过测试用例, 节省时间:
[root@CENTOS7-1 rados-java]# mvn install -Dmaven.test.skip=true
生成jar包, rados-0.6.0-SNAPSHOT.jar
[root@CENTOS7-1 target]# ll
total 104
drwxr-xr-x 3 root root 17 Dec 3 19:31 classes
drwxr-xr-x 2 root root 27 Dec 3 19:31 dependencies
drwxr-xr-x 3 root root 25 Dec 3 19:31 generated-sources
drwxr-xr-x 2 root root 28 Dec 3 19:31 maven-archiver
drwxr-xr-x 3 root root 35 Dec 3 19:31 maven-status
-rw-r--r-- 1 root root 105570 Dec 3 19:31 rados-0.6.0-SNAPSHOT.jar
- 创建软链接, 加入CLASSPATH环境变量中:
ln -s /usr/local/sources/rados-java/target/rados-0.6.0-SNAPSHOT.jar /usr/local/jdk1.8.0_181/jre/lib/ext/rados-0.6.0-SNAPSHOT.jar
安装jna
yum -y install jna
创建软链接
ln -s /usr/share/java/jna.jar /usr/local/jdk1.8.0_181/jre/lib/ext/jna.jar
- 创建JAVA测试类
CephClient类,注意, 最新版0.6的异常处理包位置已发生变化。
import com.ceph.rados.Rados;
import com.ceph.rados.exceptions.*;
import java.io.File;
public class CephClient {
public static void main (String args[]){
try {
// 创建名为admin的操作对象
Rados cluster = new Rados("admin");
System.out.println("Created cluster handle.");
// 读取Ceph集群配置
File f = new File("/etc/ceph/ceph.conf");
cluster.confReadFile(f);
System.out.println("Read the configuration file.");
// 客户端与集群建立连接
cluster.connect();
System.out.println("Connected to the cluster.");
} catch (RadosException e) {
System.out.println(e.getMessage() + ": " + e.getReturnValue());
}
}
}
- 运行验证
需要在linux环境下运行,且要在client节点。
编译并运行:
[root@CENTOS7-1 sources]# javac CephClient.java
[root@CENTOS7-1 sources]# java CephClient
Created cluster handle.
Read the configuration file.
Connected to the cluster.
从打印日志, 可以看到客户端成功与Ceph集群建立连接。
四、合一
- Ceph集群搭建与配置并不复杂, 只是操作步骤较多, 这与Ceph的设计也有关系, 将各个模块分离设计, 职能单一, 减少耦合, 提升了服务的稳定性。
- 集群配置过程中, 根据不同的系统环境, Ceph版本(本教程采用的是13.2.6版本), 会存有差异,可能会导致各种问题, 大家可以通过ceph health 命令来查看具体原因, 再做具体分析。填坑是个艰难的过程, 但也能让自己的认知获得提升。
- 后面教程会再讲解Java Swift Api的使用, 以及Ceph Docker方式的部署,Docker方式部署也会存在不少差异与新的问题, 尽量让大家少走弯路。
- 最后, 建议大家还是要在虚拟机上多做实践与探索。