分散式檔案儲存系統Ceph1 分散式檔案儲存系統Ceph
Ceph是一個統一的分散式儲存系統,設計初衷是提供較好的效能、可靠性和可擴充套件性。
對比說明TFSFASTDFSMooseFSGlusterFSCEPH開發語言C++CCCC++資料儲存方式塊檔案/Trunk塊檔案/塊物件/檔案/塊線上擴容支援支援支援支援支援冗餘備份支援支援支援支援支援單點故障存在不存在存在不存在不存在易用性安裝複雜,官方文件少安裝簡單,社群相對活躍安裝簡單官方文件專業化安裝有一定複雜度適用場景跨叢集的小檔案單叢集的中小檔案單叢集的大中檔案跨叢集雲端儲存單叢集的大中小檔案
1.1 Ceph介紹Ceph專案最早起源於Sage就讀博士期間的工作(最早的成果於2004年發表),並隨後貢獻給開源社群。在經過了數年的發展之後,目前已得到眾多雲計算廠商的支援並被廣泛應用。RedHat及OpenStack都可與Ceph整合以支援虛擬機器映象的後端儲存。
Ceph特點:
Ceph架構:
元件物件講解:
RADOS:就是這樣一個可用於PB級規模資料儲存叢集的可伸縮的、可靠的物件儲存服務,可以理解成Ceph的整個儲存物件,包括邏輯物件。File:使用者上傳的檔案object:上傳的檔案被切成N個小檔案塊物件,RADOS的基本儲存單元。MDS:元資料的記憶體快取,為了加快元資料的訪問。CRUSH:Ceph定址演算法,用於計算當前檔案儲存到哪個PG對應的OSD中。PG:對object的儲存進行組織和位置對映。具體而言,一個PG負責組織若干個object(可以為數千個甚至更多),但一個object只能被對映到一個PG中,即,PG和object之間是“一對多”對映關係。同時,一個PG會被對映到n個OSD上,而每個OSD上都會承載大量的PG,即,PG和OSD之間是“多對多”對映關係。OSD:RADOS中的儲存節點被稱為OSD
架構圖講解:
1:檔案上傳,先將檔案切片成N個object(如果開啟了cephFS,可以使用MDS快取)2:切片後的檔案object會存入到Ceph中3:檔案儲存前,會經過CRUSH演算法,計算當前檔案儲存歸結於哪個PG4:PG是邏輯概念上對檔案儲存範圍劃分的索引5:根據PG索引將檔案儲存到指定伺服器的OSD中
1.2 Ceph叢集搭建叢集結構如上圖,server1作為主節點(Dashbaord、mon、mds、rgw、mgr、osd),server2和server3作為子節點(mon、mds、rgw、mgr、osd)。
節點中資訊說明:
dashbaord:Ceph視覺化管理介面。rgw:RADOSGW,Ceph物件閘道器,使客戶端能夠利用標準物件儲存API來訪問Ceph叢集。mgr:ceph-mgr,主要目標實現 ceph 叢集的管理,為外界提供統一的入口。節點資訊:server1:192.168.100.131server2:192.168.100.132server3:192.168.100.133
1.2.1 準備工作
1)機器名稱修改(131、132、133都執行)
我們給每臺機器一個別名192.168.100.131->CENTOS1,192.168.100.132->CENTOS2,192.168.100.133->CENTOS3。
修改192.168.100.131/etc/hostname,新增CENTOS1
修改192.168.100.(同上)/etc/hostname,新增CENTOS2(同上)
修改192.168.100.133/etc/hostname,新增CENTOS3(同上)
配置名字解析IP:分別修改131、132、133的/etc/hosts檔案,新增如下對映:
192.168.100.131 CENTOS1192.168.100.132 CENTOS2192.168.100.133 CENTOS3
2)YUM源修改(131、132、133都執行)
這裡採用清華映象源,提升載入速度。
vi /etc/yum.repos.d/ceph.repo,新增如下內容:
[Ceph]name=Ceph packages for $basearchbaseurl=https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-mimic/el7/x86_64/enabled=1gpgcheck=1type=rpm-mdgpgkey=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=1gpgcheck=1type=rpm-mdgpgkey=https://download.ceph.com/keys/release.asc[ceph-source]name=Ceph source packagesbaseurl=https://mirrors.tuna.tsinghua.edu.cn/ceph/rpm-mimic/el7/SRPMS/enabled=1gpgcheck=1type=rpm-mdgpgkey=https://download.ceph.com/keys/release.asc
3)ceph與ceph-deploy安裝(131)
更新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安裝即可。
如果遇到如下錯誤,安裝下epel即可。
操作命令:(最好先執行該命令)
yum install epel-release -y yum install lttng-ust -y
4)NTP時間同步工具(131執行)
為了保證時間同步,我們需要安裝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
5)免密配置(131、132、133都執行)
官方建議不用系統內建使用者, 建立名為cuser使用者, 密碼也設為cuser:
useradd -d /home/cuser -m cuserpasswd cuser
設定sudo許可權:(免密+只讀許可權)
echo "cuser ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/cusersudo chmod 0440 /etc/sudoers.d/cuser
6)生成秘鑰:(131執行)
切換使用者: su cuser
分發金鑰至各機器節點
ssh-copy-id cuser@CENTOS1ssh-copy-id cuser@CENTOS2ssh-copy-id cuser@CENTOS3
修改管理節點上的 ~/.ssh/config (當前使用者目錄下的.ssh/config)檔案, 簡化SSH遠端連線時的輸入資訊:
管理節點是會有root和cuser多個使用者, ssh遠端連線預設會以當前使用者身份進行登陸, 如果我們是root身份進行遠端連線, 還是需要輸入密碼,我們可以修改配置 使用root遠端連線時也不用輸入密碼。
切換root身份,
su root
編輯config
vi ~/.ssh/config
新增如下內容:
Host CENTOS1 Hostname CENTOS1 User cuserHost CENTOS2 Hostname CENTOS2 User cuserHost CENTOS3 Hostname CENTOS3 User cuser
修改檔案許可權:
chmod 600 ~/.ssh/config
禁用SELINUX:
vi /etc/selinux/configSELINUX=disabled
1.2.2 叢集搭建
安裝叢集,用root安裝,可以避免很多許可權問題。
1)建立叢集管理目錄,作為ceph配置資訊儲存目錄。
mkdir -p /usr/local/bobo/cephclustercd /usr/local/bobo/cephcluster
2)建立叢集
ceph-deploy new CENTOS1 CENTOS2 CENTOS3
建立成功後, 會生配置檔案和秘鑰資訊。
3)修改配置檔案
編輯ceph.conf檔案vi /usr/local/bobo/cephcluster/ceph.conf,新增如下配置:
#對外開放網段public network = 192.168.100.0/24# 設定pool池預設分配數量osd pool default size = 2# 容忍更多的時鐘誤差mon clock drift allowed = 2mon clock drift warn backoff = 30# 允許刪除poolmon_allow_pool_delete = true[mgr]# 開啟WEB儀表盤mgr modules = dashboard
注意:Pool是儲存物件的邏輯分割槽,它規定了資料冗餘的型別和對應的副本分佈策略。
完整內容如下:
檔案修改後執行安裝(131執行),此時3臺機器都會執行安裝執行如下安裝命令:
ceph-deploy install CENTOS1 CENTOS2 CENTOS3
如果出現ceph_deploy][ERROR ] RuntimeError: Failed to execute command: ceph --version錯誤,可以直接在每個節點單獨執行yum -y install ceph進行單獨安裝。如果沒有倉庫檔案ceph.repo, 按上面的步驟手工建立。
4)初始化Monitor資訊
ceph-deploy mon create-initial
此時會生成很多秘鑰檔案資訊
5)同步管理資訊
ceph-deploy admin CENTOS1 CENTOS2 CENTOS3
6)安裝mgr(管理守護程序)
ceph-deploy mgr create CENTOS1 CENTOS2 CENTOS3
7)安裝rgw
ceph-deploy rgw create CENTOS1 CENTOS2 CENTOS3
mds服務:
ceph-deploy mds create CENTOS1 CENTOS2 CENTOS3
注意:任意一個環節安裝失敗了,需要解除安裝重灌:
ceph-deploy purge CENTOS1 CENTOS2 CENTOS3ceph-deploy purgedata CENTOS1 CENTOS2 CENTOS3ceph-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檢視磁碟資訊如下,我們需要新增一個磁碟,直接用VMware新增即可。
使用VMware選擇設定->硬碟->新增,如下圖:
一直點選下一步,設定磁碟空間大小為10G即可。操作完後重啟虛擬機器,並輸入fdisk -l檢視磁碟資訊如下,明顯多了/dev/sdb 10G大小。
執行建立OSD命令:(注意,每條命令都是在131中執行,不要在每臺機器中單獨執行)
ceph-deploy osd create --data /dev/sdb CENTOS1ceph-deploy osd create --data /dev/sdb CENTOS2ceph-deploy osd create --data /dev/sdb CENTOS3
Monitor檢視
在/usr/bin下執行./ceph -s可以檢視叢集狀態。
可以執行ntpdate ntp1.aliyun.com同步各個節點的時間。
如果出現如下情況,執行systemctl restart ceph.target重啟每個節點即可(131,132,133都執行)。
1.2.3 dashboard安裝 Ceph 提供了原生的Dashboard功能,透過Dashboard可以獲取Ceph叢集的各種基本狀態資訊。我們接下來安裝一下Dashboard,並使用它的功能。
1)開啟dashboard模組
ceph mgr module enable dashboard
2)生成簽名
ceph dashboard create-self-signed-cert
3)建立目錄
mkdir -p /usr/local/bobo/cephcluster/mgr-dashboard
4)生成金鑰對
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
ceph mgr module disable dashboardceph mgr module enable dashboard
6)設定IP與PORT
ceph config set mgr mgr/dashboard/server_addr 192.168.100.131ceph config set mgr mgr/dashboard/server_port 9001
7)關閉HTTPS
ceph config set mgr mgr/dashboard/ssl false
8)檢視服務資訊
ceph mgr services
9)設定管理員賬號密碼
ceph dashboard set-login-credentials admin admin
10)訪問<https://192.168.100.131:8443/#/dashboard>
11)RGW訪問
訪問 http://192.168.100.131:7480/ 效果如下:
1.3 Cephfs管理叢集建立完後, 預設沒有檔案系統, 我們建立一個Cephfs可以支援對外訪問的檔案系統。
1)建立兩個儲存池, 執行兩條命令:
ceph osd pool create cephfs_data 128ceph 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:
ceph fs new fs_test cephfs_metadata cephfs_data
3)狀態檢視, 以下資訊代表正常
ceph fs ls:
name: fs_test, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
ceph mds stat:
fs_test-0/0/1 up
4)fuse掛載
先確定ceph-fuse命令能執行, 如果沒有, 則安裝:
yum -y install ceph-fuse
建立掛載目錄
mkdir -p /usr/local/gupao/cephfs_directory
掛載cephfs
ceph-fuse -k /etc/ceph/ceph.client.admin.keyring -m 192.168.100.131:6789 /usr/local/gupao/cephfs_directory
出現下面資訊表示掛載成功了:
ceph-fuse[28003]: starting fuse
5)掛載資訊檢視
[root@CENTOS1 cephcluster]# df -hFilesystem Size Used Avail Use% Mounted ondevtmpfs 4.1G 0 4.1G 0% /devtmpfs 4.1G 0 4.1G 0% /dev/shmtmpfs 4.1G 20M 4.1G 1% /runtmpfs 4.1G 0 4.1G 0% /sys/fs/cgroup/dev/mapper/centos-root 17G 2.0G 16G 12% //dev/sda1 1014M 189M 826M 19% /boottmpfs 4.1G 28K 4.1G 1% /var/lib/ceph/osd/ceph-0tmpfs 838M 0 838M 0% /run/user/0ceph-fuse 13G 0 13G 0% /usr/local/gupao/cephfs_directory
1.4 Ceph Swift API介面開發
Swift是由Rackspace開發的用來為雲計算提供可擴充套件儲存的專案。專注於物件儲存, 並提供一套REST風格的Api來訪問, 與Ceph強一致性不同, 它是最終一致性。兩者都是優秀的開源專案, 並無明顯優劣之分,在使用場景上有所不同, 如果是專注於物件儲存, 那麼可以選擇swift即可滿足需要, 如果還有塊儲存要求, 那麼選擇Ceph更為合適。這裡選擇Ceph, 因為透過閘道器可以適配相容swift api, 同時在資料訪問上具有較強的擴充套件性。
1.4.1 準備工作建立Swift使用者, 用於介面請求認證
sudo radosgw-admin user create --subuser="cephtester:subtester" --uid="cephtester" --display-name="cephtester" --key-type=swift --secret="gupao" --access=full
uid 為主使用者, subuser為子使用者資訊, secret指定金鑰, 不指定則隨機生成, access擁有許可權設定,程式碼中需使用返回資訊中的user和secret_key。
swift_keys:
"swift_keys": [ { "user": "cephtester:subtester", "secret_key": "gupao" }],
建立管理員賬號:
radosgw-admin user create --uid=mgruser --display-name=mgruser --system
返回資訊如下:
{ "user_id": "mgruser", "display_name": "mgruser", "email": "", "suspended": 0, "max_buckets": 1000, "auid": 0, "subusers": [], "keys": [ { "user": "mgruser", "access_key": "AZ6L40PH9WB37EKVVMCZ", "secret_key": "rk8PEjtYaMTo7nMDM62hqqN1tOnZPBEe4GA0LQMW" } ], "swift_keys": [], "caps": [], "op_mask": "read, write, delete", "system": "true", "default_placement": "", "placement_tags": [], "bucket_quota": { "enabled": false, "check_on_raw": false, "max_size": -1, "max_size_kb": 0, "max_objects": -1 }, "user_quota": { "enabled": false, "check_on_raw": false, "max_size": -1, "max_size_kb": 0, "max_objects": -1 }, "temp_url_keys": [], "type": "rgw", "mfa_ids": []}
根據生成的access_key與secret_key, 執行:
ceph dashboard set-rgw-api-access-key AZ6L40PH9WB37EKVVMCZceph dashboard set-rgw-api-secret-key rk8PEjtYaMTo7nMDM62hqqN1tOnZPBEe4GA0LQMW
開啟管理介面,http://192.168.100.131:9001/#/rgw/user 可以檢視到我們剛才建立的兩個使用者:
1.4.2 檔案服務搭建我們搭建一個單獨的工程,專門用於實現檔案上傳和檔案下載,工程座標如下:
<groupId>com.bobo.vip.mall</groupId><version>1.0-SNAPSHOT</version><artifactId>mall-file-service</artifactId>
pom.xml:
server: port: 8082spring: application: name: mall-file cloud: nacos: config: file-extension: yaml server-addr: 192.168.100.130:8848 discovery: #Nacos的註冊地址 server-addr: 192.168.100.130:8848ceph: username: cephtester:subtester #Ceph配置 主使用者名稱:子使用者名稱 password: gupao #秘鑰 authUrl: http://192.168.100.131:7480/auth/1.0 #介面訪問路徑 defaultContainerName: user_datainfo #預設容器名字#圖片路徑cephurl: http://localhost:8082/file/download/#日誌配置logging: pattern: console: "%msg%n"
建立com.bobo.vip.mall.file.ceph.ContainerConfig配置類,在類中建立Account和Container物件,程式碼如下:
@Configuration@ConfigurationProperties(prefix = "ceph")@Datapublic class ContainerConfig { private String username; private String password; private String authUrl; private String defaultContainerName; /*** * Ceph的賬戶資訊配置 * @return */ @Bean public Account account(){ // Ceph的賬戶資訊配置 AccountConfig config = new AccountConfig(); config.setUsername(username); config.setPassword(password); config.setAuthUrl(authUrl); config.setAuthenticationMethod(AuthenticationMethod.BASIC); return new AccountFactory(config).createAccount(); } /*** * 容器物件 * @return */ @Bean public Container container(){ // 獲取容器資訊 Container newContainer = account().getContainer(defaultContainerName); if(!newContainer.exists()) { return newContainer.create(); }else { return newContainer; } }}
建立檔案上傳下載工具類com.gupaoedu.vip.mall.file.ceph.FileHandler,程式碼如下:
@Componentpublic class FileHandler { @Autowired private Container container; /**** * 檔案上傳 */ public void upload(String filename,byte[] buffer) { //獲取容器物件 StoredObject object = container.getObject(filename); //檔案上傳 object.uploadObject(buffer); } /*** * 檔案下載 */ public byte[] download(String filename){ //獲取容器中遠端儲存的資訊 StoredObject object = container.getObject(filename); //執行檔案下載 byte[] bytes = object.downloadObject(); return bytes; }}
控制器建立:com.gupaoedu.vip.mall.file.controller.FileController
@RestController@RequestMapping(value = "/file")public class FileController { @Autowired private FileHandler fileHandler; @Value("${cephurl}") private String cephurl; /*** * 檔案上傳 * @param file * @return */ @PostMapping(value = "/upload") public RespResult upload(MultipartFile file) throws IOException { //上傳 fileHandler.upload(file.getOriginalFilename(),file.getBytes()); return RespResult.ok(cephurl+file.getOriginalFilename()); } /*** * 下載 * @return */ @GetMapping(value = "/download/{filename}") public void download(@PathVariable String filename, HttpServletResponse response) throws IOException { //下載 byte[] bytes = fileHandler.download(filename); //輸出檔案 ServletOutputStream os = response.getOutputStream(); os.write(bytes); }}
建立啟動類:com.gupaoedu.vip.mall.file.MallFileApplication
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)public class MallFileApplication { public static void main(String[] args) { SpringApplication.run(MallFileApplication.class,args); }}
檔案上傳測試http://localhost:8082/file/upload
檔案下載測試
搭建成功~!