首页 > 代码库 > ceph 存储系统

ceph 存储系统

概述

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节点来部署monitorosds,如下图

这里我们使用一个简化的方式,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

    设置adminmon)节点与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 ceph@osd0
$ ssh-copy-id ceph@osd1

    配置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 keyadmin节点和其他节点

$ 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目录

    安装apche2mongodb

# 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 webmaster@localhost

    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

root@mon:/opt/inkscope/bin# python sysprobe.py start
root@mon:/opt/inkscope/bin# python cephprobe.py start
root@mon:/opt/inkscope/bin# python daemon.py
在其他节点上执行
root@mon:/opt/inkscope/bin# python sysprobe.py start
root@mon:/opt/inkscope/bin# python daemon.py

状态图

ceph 存储系统