概述
ceph是一个Linux PB级别的分布式存储系统,ceph的目标简单地定义为:
可轻松扩展到PB容量
对多种工作负载的高性能(每秒输入/输出操作[IOPS]和带宽)
高可靠性
与常见的集中式存储不同,分布式存储技术并不是将数据存储在某个或多个特定的节点上,而是通过网络使用多台机器上的磁盘空间,并将这些分散的存储资源构成一个虚拟的存储设备,数据分散地存储在这些机器的各个磁盘上
ceph架构
ceph架构大概可以划分为四部分:客户端(数据用户)、元数据服务器(缓存和同步分布式元数据)、一个对象存储集群(将数据和元数据作为对象存储)、集群监视器(执行监视功能)
ceph组件
ceph客户端
Linux显示文件系统的一个公共界面(通过虚拟文件系统VFS),ceph的用户视图就是透明的。管理员的视图肯定是不同的,考虑到很多服务器会包含存储系统这一潜在因素。从用户的角度看,他们访问大容量的存储系统,却不知道下面聚合成一个大容量的存储池的元数据服务器,监视器还有独立的对象存储设备。用户只是简单地看到一个安装点,在这个点上可以执行标准文件I/O
ceph元数据服务器
元数据服务器(cmds)的工作就是管理文件系统的名称空间(pools)。虽然元数据和数据两者都存储在对象存储集群,但两者分别管理,支持可扩展性。事实上,元数据在一个元数据服务器集群上被进一步拆分,元数据服务器能够自适应地复制和分配名称空间,避免出现热点。元数据服务器管理名称空间部分,可以(为冗余和性能)进行重叠。元数据服务器到名称空间的映射在 Ceph 中使用动态子树逻辑分区执行,它允许 Ceph 对变化的工作负载进行调整(在元数据服务器之间迁移名称空间)同时保留性能的位置
元数据服务器管理 inode 空间,将文件名转变为元数据。元数据服务器将文件名转变为索引节点,文件大小,和 Ceph 客户端用于文件 I/O 的分段数据(布局)
ceph监视器
ceph包含实施集群映射管理的监视器,但是故障管理的一些要素是在对象存储本身中执行的。当对象存储设备发生故障或者新设备添加时,监视器就检测和维护一个有效的集群映射。这个功能按一种分布的方式执行,这种方式中映射升级可以和当前的流量通信。Ceph 使用 Paxos,它是一系列分布式共识算法
ceph对象存储集群
和传统的对象存储类似,Ceph 存储节点不仅包括存储,还包括智能。传统的驱动是只响应来自启动者的命令的简单目标。但是对象存储设备是智能设备,它能作为目标和启动者,支持与其他对象存储设备的通信和合作
从存储角度来看,Ceph 对象存储设备执行从对象到块的映射(在客户端的文件系统层中常常执行的任务)。这个动作允许本地实体以最佳方式决定怎样存储一个对象。Ceph 的早期版本在一个名为 EBOFS 的本地存储器上实现一个自定义低级文件系统。这个系统实现一个到底层存储的非标准接口,这个底层存储已针对对象语义和其他特性(例如对磁盘提交的异步通知)调优。今天,B-tree 文件系统(BTRFS)可以被用于存储节点,它已经实了部分必要功能(例如嵌入式完整性)
因为 Ceph 客户实现 CRUSH,而且对磁盘上的文件映射块一无所知,下面的存储设备就能安全地管理对象到块的映射。这允许存储节点复制数据(当发现一个设备出现故障时)。分配故障恢复也允许存储系统扩展,因为故障检测和恢复跨生态系统分配。Ceph 称其为 RADOS
ceph安装
安装环境
Ceph-0.80.6
Ubuntu-14.04 LTS
节点信息
mon:192.168.234.131
osd0:192.168.234.132
osd1:192.168.234.133
ceph的一个好处就是没有中心节点,这样以来任何两个节点在存储系统中都是对等的。官方文档的介绍是使用一个admin节点来部署monitor和osds,如下图
这里我们使用一个简化的方式,admin节点用monitor节点来代替。刚才说过,ceph是没有中心节点的,所以ceph完全是可以自己来部署自己
安装前的准备
为每个节点添加磁盘用于对象存储集群
$ parted /dev/sdb (parted) mklable gpt #使用gpt分区表 (parted) mkpart primary xfs 0 100% (parted) quit $ mkfs.xfs /dev/sdb1 #使用xfs文件系统,单个文件大小没有上限
添加软件源
$ wget -q -O- ‘https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc‘ | sudo apt-key add - $ echo deb http://ceph.com/debian-{ceph-stable-release}/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list $ sudo apt-get update && sudo apt-get install ceph-deploy
添加hosts信息
在所有节点hosts文件中添加如下信息 192.168.234.131 mon 192.168.234.132 osd0 192.168.234.133 osd1
同步时间
在mon节点上安装ntp服务器 $ sudo apt-get install ntp 设定其他节点与mon节点进行时间同步 $ sudo ntpdate 192.168.234.131
在所有节点添加ceph专用用户
$ sudo useradd –d /home/ceph –m ceph –s /bin/bash $ sudo passwd ceph
添加sudo权限
$ echo "ceph ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/ceph $ sudo chmod 0440 /etc/sudoers.d/ceph
设置admin(mon)节点与osds节点ss互通
$ su – ceph $ ssh-keygen Generating public/private key pair. Enter file in which to save the key (/home/ceph/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/ceph/.ssh/id_rsa. Your public key has been saved in /home/ceph/.ssh/id_rsa.pub. $ ssh-copy-id [email protected] $ ssh-copy-id [email protected]
配置config文件
编辑mon节点 /home/ceph/.ssh/config文件添加如下信息 Host mon Hostname mon User ceph Host osd0 Hostname osd0 User ceph Host osd1 Hostname osd1 User ceph 如果不添加此文件,每次在执行ceph-deploye命令的时候需要指定 –username选项
部署对象存储集群
在这个过程中,我们创建一个对象存储集群,包括一个ceph monitor和三个ceph osd daemon。当这个集群达到 active+clean 的状态时,再扩展这个集群,添加一个元数据服务器(metadate server)和更多的ceph monitor
ceph-deploy命令会输出文件到当前目录下,并且会利用输出的文件。在整个执行的过程中,我们都是用ceph用户
切换到ceph
用户
# su – ceph
创建命令执行目录并授权给ceph
$ sudo mkdir /my-cluster $ sudo chown ceph:ceph /my-cluster $ cd /my-cluster
创建集群
$ ceph-deploy new mon
为所有节点安装部署ceph
$ ceph-deploy install mon osd0 osd1
添加ceph monitor
$ ceph-deploy mon create-initial
添加osds
$ ceph-deploy osd prepare mon:/dev/sdb1 osd0:/dev/sdb1 osd1:/dev/sdb1 $ ceph-deploy osd activate mon:/dev/sdb1 osd0:/dev/sdb1 osd1:/dev/sdb1
拷贝配置文件和admin key到admin节点和其他节点
$ ceph-deploy admin mon osd0 osd1 $ sudo chmod +r /etc/ceph/ceph.client.admin.keyring 拷贝之后可以使用ceph命令行而不用指定monitor地址和ceph.client.admin.keyring
查看ceph状态
$ ceph health $ ceph status
添加元数据服务器(mds)
$ ceph-deploy mds create mon
接下来就可以使用ceph了
添加存储
ceph可以用作文件存储、块存储、对象存储。这里以块存储来演示ceph的使用
创建存储池(pools)
$ ceph osd pool create ceph-pool 256 256
创建块存储设备
$ rbd create ceph-block –size 20480 –pool ceph-pool size是以MB为单位
将块存储设备映射到本地并挂载使用
$ sudo modprobe rbd $ sudo rbd map ceph-block –pool ceph-pool $ rbd showmapped
$ sudo mkfs.ext4 /dev/rbd1 $ mount /dev/rbd1 /mnt $ cd /mnt $ ls lost+found
inkscope安装
inkscope是一个ceph的监控和管理接口,使用nosql解决方案,使用mongodb存储实时热数据和历史数据,两种数据来源于不同的收集器
inkscope:https://github.com/inkscope
准备工作
inkscope
将inkscope下载后解压缩到 /var/www/inkscope目录
安装apche2和mongodb
# apt-get install apache2 mongodb
安装inkscopeViz
修改Apache端口
# vim /etc/apache2/port.conf Listen 8080
创建虚拟主机配置文件
# vim /etc/apache2/site-available/inkScope.con <VirtualHost *:8080> ServerName localhost ServerAdmin [email protected] DocumentRoot /var/www/inkscope/ <Directory "/var/www/inkscope/"> Options All AllowOverride All </Directory> ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ <Directory "/usr/lib/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all </Directory> WSGIScriptAlias /inkscopeCtrl /var/www/inkscope/inkscopeCtrl/inkscopeCtrl.wsgi <Directory "/var/www/inkscope/inkScopeCtrl"> Order allow,deny Allow from all </Directory> ErrorLog /var/log/apache2/error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn ProxyRequests Off # we don‘t want a "forward proxy", but only a "Reverse proxy" ProxyPass /ceph-rest-api/ http://192.168.234.131:5000/api/v0.1/ CustomLog /var/log/apache2/access.log combined </VirtualHost>
启动代理并添加inkScope
# a2enmod proxy_http # service apache2 restart # a2ensite inkScope
安装inkscopeCtrl
添加必要的软件
# apt-get install libapache2-mod-wsgi # apt-get install python-pip
配置inkscopeCtrl
执行inkScopeCtrl目录中的install.sh脚本生成配置文件 /opt/inkscope/etc/inkscopeCtrl.conf编辑配置文件 # vim /opt/inkscope/etc/inkscopeCtrl.conf { "mongodb_host" : "192.168.234.131", "mongodb_port" : "27017", "mongodb_user" :"ceph", "mongodb_passwd":"", "is_mongo_authenticate" : 0, "radosgw_url": "http://192.168.234.131", "radosgw_admin": "admin", "radosgw_key": "11111", "radosgw_secret": "11111", "cluster": "ceph", "is_mongo_replicat" : 0, "mongodb_set" : "host_mongodb1:port,host_mongodb2:port,host_mongodb3:port", "mongodb_replicaSet" : "replicaset_name", "mongodb_read_preference" : "ReadPreference.{your_read_preference_choice}" }
安装inkscopeProbe
准备工作
修改mongodb配置 # vim /etc/mongodb.conf bind_ip = 0.0.0.0 port = 27107
安装必要的软件包
# apt-get install python-dev # easy_install psutil # esay_install pymongo
安装
执行inkscopeProbe目录中的install.sh 脚本生成配置文件和执行文件 sysprobe:收集系统信息,必须被安装在所有ceph节点 cephprobe:收集集群信息,只需要安装在某一个ceph节点
修改sysprobe.conf配置文件
# vim /opt/inkscope/etc/sysprobe.conf { "mongodb_host" : "192.168.234.131", "is_mongo_replicat" : 0, "mongodb_set" : "mongodb0:27017,mongodb1:27017,mongodb2:27017", "mongodb_replicaSet" : "replmongo0", "mongodb_read_preference" : "ReadPreference.SECONDARY_PREFERRED", "mongodb_port" : 27017, "is_mongo_authenticate" : 0, "mongodb_user":"ceph", "mongodb_passwd":"", "cluster": "ceph", "mem_refresh": 60, "swap_refresh": 600, "disk_refresh": 60, "partition_refresh": 60, "cpu_refresh": 30, "net_refresh": 30, "mem_window": 1200, "swap_window": 3600, "disk_window": 1200, "partition_window": 1200, "cpu_window": 1200, "net_window": 1200 }
修改cephprobe.conf配置文件
# vim /opt/inkscope/etc/cephprobe.conf { "mongodb_host" : "192.168.234.131", "is_mongo_replicat" : 0, "mongodb_set" : "mongodb0:27017,mongodb1:27017,mongodb2:27017", "mongodb_replicaSet" : "replmongo0", "mongodb_read_preference" : "ReadPreference.SECONDARY_PREFERRED", "mongodb_port" : 27017, "is_mongo_authenticate" : 0, "mongodb_user":"ceph", "mongodb_passwd":"", "cluster" : "ceph", "ceph_conf": "/etc/ceph/ceph.conf", "ceph_rest_api": "192.168.234.131:5000", "status_refresh": 3, "osd_dump_refresh": 3, "pg_dump_refresh": 60, "crushmap_refresh": 60, "df_refresh": 60, "cluster_window": 1200, "osd_window": 1200, "pool_window": 1200 }
启动服务
在mon节点执行 # ceph-rest-api –n client.admin
[email protected]:/opt/inkscope/bin# python sysprobe.py start [email protected]:/opt/inkscope/bin# python cephprobe.py start [email protected]:/opt/inkscope/bin# python daemon.py
在其他节点上执行 [email protected]:/opt/inkscope/bin# python sysprobe.py start [email protected]:/opt/inkscope/bin# python daemon.py
状态图