一、Ceph分布式存儲
1.1、Ceph文件系統簡述
Ceph是一個統一的分布式存儲系統,設計初衷是提供較好的性能、可靠性和可擴展性。
Ceph項目最早起源於Sage就讀博士期間的工作(最早的成果於2004年發表),並隨后貢獻給開源社區。在經過了數年的發展之后,目前已得到眾多雲計算廠商的支持並被廣泛應用。RedHat及OpenStack都可與Ceph整合以支持虛擬機鏡像的后端存儲。
1.2、Ceph的優點
高性能
a. 摒棄了傳統的集中式存儲元數據尋址的方案,采用CRUSH算法,數據分布均衡,並行度高。
b.考慮了容災域的隔離,能夠實現各類負載的副本放置規則,例如跨機房、機架感知等。
c. 能夠支持上千個存儲節點的規模,支持TB到PB級的數據。
高可用性
a. 副本數可以靈活控制。
b. 支持故障域分隔,數據強一致性。
c. 多種故障場景自動進行修復自愈。
d. 沒有單點故障,自動管理。
高可擴展性
a. 去中心化。
b. 擴展靈活。
c. 隨着節點增加而線性增長。
特性豐富
a. 支持三種存儲接口:塊存儲、文件存儲、對象存儲。
b. 支持自定義接口,支持多種語言驅動
二、Ceph架構和名稱解釋
2.1、Ceph架構

2.2、Ceph核心組件及概念介紹
- Monitor
一個Ceph集群需要多個Monitor組成的小集群,它們通過Paxos同步數據,用來保存OSD的元數據。
- OSD
OSD全稱Object Storage Device,也就是負責響應客戶端請求返回具體數據的進程。一個Ceph集群一般都有很多個OSD。
- MDS
MDS全稱Ceph Metadata Server,是CephFS服務依賴的元數據服務。
- Object
Ceph最底層的存儲單元是Object對象,每個Object包含元數據和原始數據。
- PG
PG全稱Placement Grouops,是一個邏輯的概念,一個PG包含多個OSD。引入PG這一層其實是為了更好的分配數據和定位數據。
- RADOS
RADOS全稱Reliable Autonomic Distributed Object Store,是Ceph集群的精華,用戶實現數據分配、Failover等集群操作。
- Libradio
Librados是Rados提供庫,因為RADOS是協議很難直接訪問,因此上層的RBD、RGW和CephFS都是通過librados訪問的,目前提供PHP、Ruby、Java、Python、C和C++支持。
- CRUSH
CRUSH是Ceph使用的數據分布算法,類似一致性哈希,讓數據分配到預期的地方。
- RBD
RBD全稱RADOS block device,是Ceph對外提供的塊設備服務。
- RGW
RGW全稱RADOS gateway,是Ceph對外提供的對象存儲服務,接口與S3和Swift兼容。
- CephFS
CephFS全稱Ceph File System,是Ceph對外提供的文件系統服務。
三、Ceph的存儲過程
CEPH集群在存儲數據時,都是進行扁平化處理,Object作為集群最小的存儲單位。

ceph在對象存儲的基礎上提供了更加高級的思想。當對象數量達到了百萬級以上,原生的對象存儲在索引對象時消耗的性能非常大。ceph因此引入了placement group (pg) 的概念。一個PG就是一組對象的集合。

3.1、Ceph IO流程及數據分布

3.2、正常IO流程圖

步驟:
client 創建cluster handler。
client 讀取配置文件。
client 連接上monitor,獲取集群map信息。
client 讀寫io 根據crushmap 算法請求對應的主osd數據節點。
主osd數據節點同時寫入另外兩個副本節點數據。
等待主節點以及另外兩個副本節點寫完數據狀態。
主節點及副本節點寫入狀態都成功后,返回給client,io寫入完成。
四、Ceph搭建過程
我准備了三台centos7虛擬機,ip如下

4.1、准備工作
1、機器名稱的修改(三台服務器上都執行),給192.168.32.140取別名ghy1,給192.168.32.141取別名ghy2,給192.168.32.142取別名ghy3
命令如果下:
hostnamectl set-hostname ghy1



2、修改三台服務器的配置名字解析IP,命令如下(分別在三台服務器上執行)
vi /etc/hosts
執行上面命令后添加如下映射:
192.168.32.140 ghy1 192.168.32.141 ghy2 192.168.32.142 ghy3

三個服務器配置完成后保存文件並執行reboot命令重啟三台服務器,重啟完成后可以發現機器名稱已經換成我們自己定義的了

3、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=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
4、ceph與ceph-deploy安裝(因為我把140做主服務器,所以這命令在140服務器上執行就行)
更新yum源,並安裝 ceph 和 ceph-deploy ,這個過程非常耗時間,執行如下命令:
yum update && yum -y install ceph ceph-deploy
注意: yum update 和 yum -y install python2-pip 最好在每台機器都更新下yum。
安裝過程中, 如果執行ceph-deploy出現 ImportError: No module named pkg_resources ,則需要安裝python2-pip,執行 yum -y install python2-pip 安裝即可。我在第一次嘗試安裝時就是因為沒有安裝python2搞的我搞了好久。
如果遇到如下錯誤,安裝下epel即可。

操作命令:(最好先執行該命令)
yum install epel-release -y
yum install lttng-ust -y
安裝完了epel記得再次執行yum update && yum -y install ceph ceph-deploy命令
5、NTP時間同步工具(140執行)為了保證時間同步,我們需要安裝NTP時間同步工具:
yum install ntp ntpdate ntp-doc -y

設為開機啟動:
systemctl enable ntpd

設置每隔1小時自動校准同步。編輯 vi /etc/rc.d/rc.local 追加:執行命令
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
如果出現紅框內容表示成功

6、免密配置(在三台服務器上都執行),因為命令都一樣,我以一台服務器為例
官方建議不用系統內置用戶, 創建名為cuser用戶, 密碼也設為cuser:
命令如下
useradd -d /home/cuser -m cuser
passwd cuser

設置sudo權限:(免密+只讀權限)
echo "cuser ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/cuser
再執行如下命令查看是否添加成功
cat /etc/sudoers.d/cuser

執行如下命令添加只讀權限
sudo chmod 0440 /etc/sudoers.d/cuser
添加完成后用如下命令查看是否添加成功,rr表示只讀
ll /etc/sudoers.d/cuser

7、生成秘鑰(在140服務器上執行)
執行如下命令切換到cuser用戶上
su cuser
執行如下命令生成RSA密鑰,一直按默認就可以了
ssh-keygen

分發密鑰至各機器節點
ssh-copy-id cuser@ghy1 ssh-copy-id cuser@ghy2 ssh-copy-id cuser@ghy3

接下來修改管理節點上的 ~/.ssh/config (當前用戶目錄下的.ssh/config)文件, 簡化SSH遠程連接時的輸入信息:管理節點是會有root和cuser多個用戶, ssh遠程連接默認會以當前用戶身份進行登陸, 如果我們是root 身份進行遠程連接, 還是需要輸入密碼,我們可以修改配置 使用root遠程連接時也不用輸入密碼。執行下面切換root身份
su root
但我多次嘗試都無法通過上面命令切回root帳戶,沒辦法,我是重新再啟動一個連接進入root帳戶的,如果有朋友碰到和我一樣情況解決了可以留言跟我說下怎么解決的。進入root帳戶后用如下命令編輯config
vi ~/.ssh/config
添加如下內容
Host ghy1
Hostname ghy1
User cuser
Host ghy2
Hostname ghy2
User cuser
Host ghy3
Hostname ghy3
User cuser
如果保存中報".ssh/config" E212: Can't open file for writing;那么進入他的根目錄,用命令
cd ~
然后用如下命令創建創建目錄
mkdir .ssh
接着用如下命令進入目錄
cd .ssh
再入如下命令編輯文件
vi config

文件編輯完成后記得保存。接着修改文件權限
chmod 600 ~/.ssh/config
用如下命令查看有什么權限rw表示只有讀寫權限
ll ~/.ssh/config

到了這一步后,接下來就是要禁用SELINUX了,執行下面命令進行禁用
vi /etc/selinux/config
打開文件后在最后一行添加
SELINUX=disabled

4.2、集群搭建(全部在140服務器上執行)
安裝集群,用root安裝,可以避免很多權限問題。先mkdir ljx創建一個目錄,然后cd ljx進入這個目錄

1.創建集群管理目錄,作為ceph配置信息存儲目錄。-p是表示創建多級目錄命令如果下
mkdir -p /usr/local/ljx/cephcluster
然后進入目錄
cd /usr/local/ljx/cephcluster

2.創建集群
ceph-deploy new ghy1 ghy2 ghy3

創建成功后, 會生配置文件和秘鑰信息。用ls命令查看

3.修改配置文件
編輯ceph.conf文件 ,用如下命令進行編輯
vi ceph.conf
打開文件后配置如下內容,網段根據自身情況配置
#對外開放網段 public network = 192.168.32.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

注意:Pool是存儲對象的邏輯分區,它規定了數據冗余的類型和對應的副本分布策略。
文件修改后執行安裝,在140上進行安裝,執行如下命令后三台服務器都會執行安裝程序,命令如下
ceph-deploy install ghy1 ghy2 ghy3

安裝完成后頁面如下:

4.初始化Monitor信息,命令如下
ceph-deploy mon create-initial

執行成功后頁面如下,下面頁面生成了很多秘鑰文件

5、同步管理信息
ceph-deploy admin ghy1 ghy2 ghy3
6、安裝mgr(管理守護進程)
ceph-deploy mgr create ghy1 ghy2 ghy3
7、安裝rgw
ceph-deploy rgw create ghy1 ghy2 ghy3
接着執行下面命令安裝mds服務
ceph-deploy mds create ghy1 ghy2 ghy3
如果到現在都沒報錯說明你快成功了,我反正在這些坑中呆了快一個星期了,能記住的錯也都在這里面寫下來了,如果在配置過程任意一個環節安裝失敗了,需要卸載重裝:
ceph-deploy purge ghy1 ghy2 ghy3 ceph-deploy purgedata ghy1 ghy2 ghy3 ceph-deploy forgetkeys
同時將三台節點的mon信息也刪除:
rm -rf /var/run/ceph/
如果出現錯誤:
ceph_deploy][ERROR ] RuntimeError: Failed to execute command: ceph --version
可以在各節點上單獨進行安裝:
yum -y install ceph
8、OSD安裝
OSD服務是對象存儲守護進程, 負責把對象存儲到本地文件系統, 必須要有一塊獨立的磁盤作為存儲。如果沒有獨立磁盤,怎么辦? 可以在Linux下面創建一個虛擬磁盤進行掛載。
添加磁盤:
執行 fdisk -l 查看磁盤信息如下,我們需要添加一個磁盤

因為我用的是virtualBox,所以我下面截圖就是在virtualBox上怎么添加硬盤,這個操作要在三台服務上都執行。
a.虛擬機關機,打開設置>存儲





這樣就創建完成了。記得保存並且三台服務器上都執行。說多了都是淚。一直點擊下一步,設置磁盤空間大小為10G即可。操作完后重啟虛擬機,並輸入 fdisk -l 查看磁盤信息
如下,明顯多了 /dev/sdb 10G大小。

執行創建OSD命令:(注意,每條命令都是在140中執行,不要在每台機器中單獨執行)要在cephcluster文件夾中執行
ceph-deploy osd create --data /dev/sdb ghy1 ceph-deploy osd create --data /dev/sdb ghy2 ceph-deploy osd create --data /dev/sdb ghy3

Monitor查看在 /usr/bin 下執行 ./ceph -s 可以查看集群狀態。 也可以在cephcluster中執行ceph -s查看

執行如下命令同步各個節點的時間(下面這個命令要在三個節點都執行)
ntpdate ntp1.aliyun.com
如果報以下錯執行命令yum -y install ntpdate就可以解決了


4.3、dashboard安裝 (可視化管理頁面)
Ceph 提供了原生的Dashboard功能,通過Dashboard可以獲取Ceph集群的各種基本狀態信息。接下來安裝一下Dashboard,並使用它的功能。
1.開啟dashboard模塊,在140服務器上執行
ceph mgr module enable dashboard
2、生成簽名,在140服務器上執行
ceph dashboard create-self-signed-cert
3、創建目錄,在140服務器上執行
mkdir -p /usr/local/ljx/cephcluster/mgr-dashboard
4、生成密鑰對,在140服務器上執行
openssl req -new -nodes -x509 -subj "/O=IT/CN=ceph-mgr-dashboard" -days 3650 -keyout dashboard.key -out dashboard.crt -extensions v3_ca

5、啟動dashboard ,在140服務器上執行
ceph mgr module disable dashboard
ceph mgr module enable dashboard
6、設置IP與PORT,在140服務器上執行
ceph config set mgr mgr/dashboard/server_addr 192.168.32.140 ceph config set mgr mgr/dashboard/server_port 8843
7、關閉HTTPS ,在140服務器上執行
ceph config set mgr mgr/dashboard/ssl false
8、查看服務信息,在140服務器上執行
ceph mgr services
9、設置管理員賬號密碼,在140服務器上執行
ceph dashboard set-login-credentials admin admin

10、訪問 <https://192.168.32.140:8443/#/dashboard>

11、RGW訪問
訪問 http://192.168.32.140:7480/ 效果如下:

4.3 Cephfs管理
集群創建完后, 默認沒有文件系統, 我們創建一個Cephfs可以支持對外訪問的文件系統。搭建完成后就能進行文件管理和文件下載操作了
1、創建兩個存儲池, 執行兩條命令: (在140上)
ceph osd pool create cephfs_data 128 ceph osd pool create cephfs_metadata 64
少於5個OSD可把pg_num設置為128
OSD數量在5到10,可以設置pg_num為512
OSD數量在10到50,可以設置pg_num為4096
OSD數量大於50,需要計算pg_num的值
通過下面命令可以列出當前創建的存儲池:
ceph osd lspools

2、創建fs, 名稱為fs_test:(在140上,名稱可以隨便取)
ceph fs new fs_test cephfs_metadata cephfs_data
3、狀態查看, 以下信息代表正常(在140上)
ceph fs ls

ceph mds stat

4、fuse掛載(在140上)
先確定ceph-fuse命令能執行, 如果沒有, 則安裝:
yum -y install ceph-fuse
創建掛載目錄
mkdir -p /usr/local/ljx/cephfs_directory
掛載cephfs
ceph-fuse -k /etc/ceph/ceph.client.admin.keyring -m 192.168.32.140:6789 /usr/local/ljx/cephfs_directory

5、掛載信息查看

