ceph數據分布

ceph的存儲是無主結構,數據分布依賴client來計算,有兩個條主要路徑。

1、數據到PG

2、PG 到OSD

有兩個假設: 第一,pg的數量穩定,可以認為保持不變; 第二, OSD的數量可以增減,OSD的存儲空間權重不等;

由于 PG的數量保持不變,由數據來找PGID的環節可以簡單處理,對數據的key來取hash值再對pg的總數取模即可唯一確認pgid,pgid=hash(data_key)/pg_num。

難點在于從PG到OSD,如果直接用 hash(pgid)/osd_num的模式,則OSD有增減的時候數據就有無規律的遷移,并且也無法體現OSD的不同權重。

Crush算法就是來解決這個問題的,Crush目的是隨機跳出一個OSD,并且要滿足權重越大的OSD,挑中的概率越大。

每個OSD有不同的容量,比如是4T還是12T的容量,可以根據每個OSD的容量定義它的權重,以T為單位, 比如4T權重設為4,12T則設為12。

如何將PG映射到不同權重的OSD上面?這里可以直接采用CRUSH里面的Straw抽簽算法。

核心步驟:

1)計算HASH

draw = CRUSH_HASH( PG_ID, OSD_ID, r ),其中把r當做一個常數,將PG_ID, OSD_ID一起作為輸入,得到一個HASH值。

2)增加OSD權重

osd_straw =( draw &0xffff ) * osd_weight

draw &0xffff 得到一個0-65535的數字,再與OSD的權重相乘,以這個作為每個OSD的簽長, 權重越大的,數值越大。

3)遍歷選取最高的權重

high_draw

Crush所計算出的隨機數,是通過HASH得出來,可以保障相同的輸入會得出同樣的輸出結果。

這里只是計算得出了一個OSD,在Ceph集群中是會存在多個副本,如何解決一個PG映射到多個OSD的問題?

將常量r加1, 再去計算一遍,如果和之前的OSD編號不一樣, 那么就選取它;如果一樣的話,那么再把r+2,再重新計算,直到選出三個不一樣的OSD編號。

如果樣本容量足夠大, 隨機數對選中的結果影響逐漸變小, 起決定性的是OSD的權重,OSD的權重越大, 被挑選的概率也就越大。

樣本容量足夠大,到底是多大? 到底多大才能按照盡可能按照權重來分布,當然是盡量小的樣本才好。

樣本容量主要由PG和OSD的數量多少來決定,其中最關鍵的還是OSD數量,如果OSD很少(比如5塊盤)也能盡量按照權重分布才好。

PG的數量主要是根據數據預估和OSD的數量來定,有個理論參考數,PG數量 =(OSD數量* 100)/副本數,但是PG數量少影響后面的擴容,太多又占用過多資源,需要有一個平衡。

基于上述考慮,寫了一個很簡單的程序來驗證下數據分布平衡性。

假定OSD數量為5并且權重隨機,PG的數量為5000。

結果1:

1.隨機生成5個OSDID和對應權重

OSDID=I0N@6nt5pOhjY$g;權重=32.0

OSDID=.nIjl%3zs3aoE7K;權重=16.0

OSDID=S5O9bSS4NMo%qDN;權重=1.0

OSDID=t$lZF91ofuvOKcn;權重=24.0

OSDID=!E2Ia8XE^Jzb5Dz;權重=12.0

2.在pg數量為5000的時候,PG的分布結果:

OSDID=!E2Ia8XE^Jzb5Dz;權重=12.0;擁有的PG數量=625

OSDID=I0N@6nt5pOhjY$g;權重=32.0;擁有的PG數量=2682

OSDID=t$lZF91ofuvOKcn;權重=24.0;擁有的PG數量=1554

OSDID=.nIjl%3zs3aoE7K;權重=16.0;擁有的PG數量=139

結果2:

1.隨機生成5個OSDID和對應權重

OSDID=C%EN$UM!e8nZy.R;權重=1.0

OSDID=1iTDBnZeeQ6^Uos;權重=32.0

OSDID=%EMc6a4V5cWi%7D;權重=2.0

OSDID=M7WKDUjLrQaV42D;權重=64.0

OSDID=7OVTO@l$XLE$OV$;權重=8.0

2.在pg數量為5000的時候,PG的分布結果:

OSDID=1iTDBnZeeQ6^Uos;權重=32.0;擁有的PG數量=1201

OSDID=7OVTO@l$XLE$OV$;權重=8.0;擁有的PG數量=18

OSDID=M7WKDUjLrQaV42D;權重=64.0;擁有的PG數量=3781

結果3:

1.隨機生成5個OSDID和對應權重

OSDID=TSvabIIG#9IssWW;權重=12.0

OSDID=XglajmN2q3f5qRI;權重=0.8

OSDID=ZEeeX^Wp9tHaxuA;權重=0.5

OSDID=PSiiRAwddyc^ThW;權重=32.0

OSDID=nPI^YbDr0ttVzGa;權重=8.0

2.在pg數量為5000的時候,PG的分布結果:

OSDID=nPI^YbDr0ttVzGa;權重=8.0;擁有的PG數量=319

OSDID=PSiiRAwddyc^ThW;權重=32.0;擁有的PG數量=3816

OSDID=TSvabIIG#9IssWW;權重=12.0;擁有的PG數量=865

package com.test.zhangzk.crush;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Random;public class TestCephCrush {static String str = "abcdefghijklmnopqrstuvwxyzABCDEDFGHIJKLMNOPQRSTUVWXYZ0123456789.@!#$%^&*";static Float[] factories =new Float[] {0.25f,0.5F,0.8f,1f,2f,4f,8f,12f,16f,20f,24f,32f,64f};static int pgidCount = 5000;static int osdCount = 5;public static void main(String[] args) {List<String> pgidList = getRandomPgIdList(pgidCount);List<OSDBean> osdList = getRandomOSDIdList(osdCount);HashMap<String,Integer> keyCount = new HashMap<String,Integer>();for(int i=0;i<pgidCount;i++) {float maxStraw = 0.0f;float osdFactor = 0.0f;String osdId = "";for( int j=0;j<osdCount;j++) {String key = pgidList.get(i) + osdList.get(j);int hashCode = key.hashCode() & 0xffff;float straw = hashCode * osdList.get(j).getFactor();if( maxStraw < straw) {maxStraw = straw;osdFactor = osdList.get(j).getFactor();osdId = osdList.get(j).getId();}}String key =  "OSDID="+osdId  + ";權重=" + osdFactor;Integer v = keyCount.get(key);if( v == null ) {keyCount.put(key, 1);}else {keyCount.put(key, v+1);}	}System.out.println("2.在pg數量為" + pgidCount +"的時候,PG的分布結果:");for(String k:keyCount.keySet()){System.out.println(k + ";擁有的PG數量=" +keyCount.get(k));}}private static List<String> getRandomPgIdList(int pgidCount){// TODO Auto-generated method stubList<String> pgidList = new ArrayList<String>();java.util.Random r = new Random(System.currentTimeMillis());for( int i=0;i<pgidCount;i++) {StringBuilder sb = new StringBuilder();for( int j=0;j<10;j++) {sb.append(str.charAt(r.nextInt(str.length()-1)));}pgidList.add(sb.toString());}return pgidList;}private static List<OSDBean> getRandomOSDIdList(int osdCount){System.out.println("1.隨機生成"+ osdCount + "個OSDID和對應權重");// TODO Auto-generated method stubList<OSDBean> osdList = new ArrayList<OSDBean>();java.util.Random r = new Random(System.currentTimeMillis());for( int i=0;i<osdCount;i++) {StringBuilder sb = new StringBuilder();for( int j=0;j<15;j++) {sb.append(str.charAt(r.nextInt(str.length()-1)));}OSDBean osd = new OSDBean();osd.setId(sb.toString());osd.setFactor(factories[r.nextInt(factories.length)]);System.out.println( "OSDID=" + sb.toString()+ ";權重="+ osd.getFactor() );osdList.add(osd);}return osdList;}
}class OSDBean {private String id;private float factor;public String getId() {return id;}public void setId(String id) {this.id = id;}public float getFactor() {return factor;}public void setFactor(float factor) {this.factor = factor;}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/42250.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42250.shtml
英文地址,請注明出處:http://en.pswp.cn/news/42250.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于Java的深圳坂田附近閑置物品交易群管理系統

開發技術&#xff1a;java 開發框架&#xff1a;springmvc、spring、mybatis 數據庫&#xff1a;mysql 備注&#xff1a;方便大家將手中的二手閑置物品轉讓給需要的人&#xff0c;例如大家搬家的時候&#xff0c;有不要的&#xff08;冰箱、洗衣機、桌子、椅子&#xff09;等物…

RISC-V 整型通用寄存器介紹

簡介 RISC-V64位/32位提供了32個整型通用寄存器&#xff0c;編號是x0~x31&#xff0c;這些整型通用寄存器的寬度與架構位數一致。 浮點數寄存器與整形寄存器一樣也提供了32個&#xff1a;f0~f31&#xff0c;位數與架構位數一致。 通用寄存器介紹 零寄存器 x0/zero x0寄存…

力扣:65. 有效數字(Python3)

題目&#xff1a; 有效數字&#xff08;按順序&#xff09;可以分成以下幾個部分&#xff1a; 一個 小數 或者 整數&#xff08;可選&#xff09;一個 e 或 E &#xff0c;后面跟著一個 整數 小數&#xff08;按順序&#xff09;可以分成以下幾個部分&#xff1a; &#xff08;…

一、進入sql環境,以及sql的查詢、新建、刪除、使用

1、進入sql環境 》》》mysql -u root -p 》》》輸入密碼 2、sql語言的分類 3、注意事項&#xff1a; 4、基礎操作&#xff1a; &#xff08;1&#xff09;查詢所有數據庫&#xff1a; show databases; 運行結果&#xff1a; &#xff08;2&#xff09;創建一個新的數據庫&…

CSS練習

CSS練習 工具代碼運行結果 工具 HBuilder X 代碼 <!DOCTYPE html> <!-- 做一個表格&#xff0c;6行4列實現隔行換色&#xff08;背景色&#xff09;并且第3列文字紅色第一個單元格文字大小30px。最后一個單元格文字加粗--> <html><head><meta ch…

初階C語言-結構體

&#x1f31e; “少年有夢不至于心動&#xff0c;更要付諸行動。” 今天我們一起學習一下結構體的相關內容&#xff01; 結構體 &#x1f388;1.結構體的聲明1.1結構的基礎知識1.2結構的聲明1.3結構成員的類型1.4結構體變量的定義和初始化 &#x1f388;2.結構體成員的訪問2.1結…

自然語言處理從入門到應用——LangChain:記憶(Memory)-[自定義對話記憶與自定義記憶類]

分類目錄&#xff1a;《自然語言處理從入門到應用》總目錄 自定義對話記憶 本節介紹了幾種自定義對話記憶的方法&#xff1a; from langchain.llms import OpenAI from langchain.chains import ConversationChain from langchain.memory import ConversationBufferMemoryllm…

QT 使用第三方庫QtXlsx操作Excel表

1.簡介 一直以來&#xff0c;都想學習一下C/C如何操作excel表&#xff0c;在網上調研了一下&#xff0c;覺得使用C/C去操作很麻煩&#xff0c;遂轉向QT這邊&#xff1b;QT有一個自帶的類QAxObject&#xff0c;可以使用他去操作&#xff0c;但隨著了解的深入&#xff0c;覺得他…

c++游戲制作指南(四):c++實現數據的存儲和讀取(輸入流fstream)

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f35f;歡迎來到靜淵隱者的csdn博文&#xff0c;本文是c游戲制作指南的一部&#x1f35f; &#x1f355;更多文章請點擊下方鏈接&#x1f355; &#x1f368; c游戲制作指南&#x1f3…

最長重復子數組(力扣)動態規劃 JAVA

給兩個整數數組 nums1 和 nums2 &#xff0c;返回 兩個數組中 公共的 、長度最長的子數組的長度 。 示例 1&#xff1a; 輸入&#xff1a;nums1 [1,2,3,2,1], nums2 [3,2,1,4,7] 輸出&#xff1a;3 解釋&#xff1a;長度最長的公共子數組是 [3,2,1] 。 示例 2&#xff1a; 輸…

新寶馬M5諜照曝光,侵略感十足,將與奧迪、梅賽德斯-AMG正面競爭

報道稱&#xff0c;寶馬即將推出全新一代M5&#xff0c;該車的諜照最近再次曝光。早先&#xff0c;寶馬 M5 Touring 旅行汽車的賽道測試圖片已經在網絡上流傳開來&#xff0c;預計該車將與奧迪的RS6 Avant和梅賽德斯-AMG E63 Estate展開正面競爭。 從最新曝光的照片來看&#x…

【操作系統考點匯集】操作系統考點匯集

關于操作系統可能考察的知識點 操作系統基本原理 什么是操作系統&#xff1f; 操作系統是指控制和管理整個計算機系統的硬件和軟件資源&#xff0c;并合理地組織調度計算機的工作和資源的分配&#xff0c;以提供給用戶和它軟件方便的接口和環境&#xff0c;是計算機系統中最基…

Python土力學與基礎工程計算.PDF-鉆探泥漿制備

Python 求解代碼如下&#xff1a; 1. rho1 2.5 # 黏土密度&#xff0c;單位&#xff1a;t/m 2. rho2 1.0 # 泥漿密度&#xff0c;單位&#xff1a;t/m 3. rho3 1.0 # 水的密度&#xff0c;單位&#xff1a;t/m 4. V 1.0 # 泥漿容積&#xff0c;單位&#xff1a;…

神經網絡基礎-神經網絡補充概念-53-將batch norm擬合進神經網絡

代碼實現 import numpy as np import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, BatchNormalization, Activation from tensorflow.keras.optimizers import SGD# 生成隨機數據 np.random.seed(0) X np.…

【0基礎入門Python筆記】一、python 之基礎語法、基礎數據類型、復合數據類型及基本操作

一、python 之基礎語法、基礎數據類型、復合數據類型及基本操作 基礎語法規則基礎數據類型數字類型&#xff08;Numbers&#xff09;字符串類型&#xff08;String&#xff09;布爾類型&#xff08;Boolean&#xff09; 復合數據類型List&#xff08;列表&#xff09;Tuple&…

代碼隨想錄DAY62

這個移動0的問題還是比較重要的 因為涉及到一種思想&#xff1a;快慢指針&#xff01; class Solution { public: void moveZeroes(vector<int>& nums) { int slow0,fast0; for(;fast<nums.size();fast){ if(nums[fast]!0){ swap(nums[slow],nums[fast]); slow;…

Kafka 什么速度那么快

批量發送消息 Kafka 采用了批量發送消息的方式&#xff0c;通過將多條消息按照分區進行分組&#xff0c;然后每次發送一個消息集合&#xff0c;看似很平常的一個手段&#xff0c;其實它大大提升了 Kafka 的吞吐量。 消息壓縮 消息壓縮的目的是為了進一步減少網絡傳輸帶寬。而…

故障012:定時備份作業-6007懸案

故障012&#xff1a;定時備份作業-6007懸案 1. 問題描述2. 解決過程2.1 大膽推想2.2 找規律2.3 嘗試換掉AP2.4 檢查資源限制2.5 資源放寬SYSDBA 3. 精神感悟 DM技術交流QQ群&#xff1a;940124259 1. 問題描述 詭異的現象總是伴隨著隱藏的功能被打開&#xff0c;可能耽誤你很…

比ChatGPT更強的星火大模型V2版本發布!

初體驗 測試PPT生成 結果&#xff1a; 達到了我的預期&#xff0c;只需要微調就可以直接交付&#xff0c;這點比ChatGPT要強很多. 測試文檔問答 結果&#xff1a; 這點很新穎&#xff0c;現在類似這種文檔問答的AI平臺收費都貴的離譜&#xff0c;星火不但免費支持而且效果也…

opencv圖片換背景色

#include <iostream> #include<opencv2/opencv.hpp> //引入頭文件using namespace cv; //命名空間 using namespace std;//opencv這個機器視覺庫&#xff0c;它提供了很多功能&#xff0c;都是以函數的形式提供給我們 //我們只需要會調用函數即可in…