帶著問題學習分布式系統

寫在前面

聽過很多道理,卻依然過不好這一生。

  看過很多關于學習的技巧、方法,卻沒應用到自己的學習中。

  隨著年紀變大,記憶力越來越差,整塊的時間也越來越少,于是,越來越希望能夠更高效的學習。學習是一種習慣也是一種能力,這種能力在上學期間養成是最好的,畢竟那個時候絕大部分時間都在學習。但很遺憾,我沒有養成適合自己的、好的學習習慣。工作之后,除了在日常工作中用到的知識技術,很難通過自學掌握新的知識(偏向于專業知識,即技術)。而互聯網行業的分支、知識點又是如此之多,于是會出現這樣的情況,遇到一個新的知識,覺得很厲害很感興趣,看兩天,但很快就忘記了。另外,對于一些比較龐雜的技術,又無從下手,也很難堅持下去。

  根本的問題在于學習不系統,沒有把一個個的知識點連接起來,本來這些新的知識就很少在工作中實踐,如果又是一個個的信息孤島,很快就會被遺忘。另一個問題,沒有良好的規劃,今天看看這里,明天看看哪里,糾結于細枝末節,忘了從整體上把握。

  幸好,差不多半年前開始意識到了這個問題,開始看書,看別人的博客,開始思考如何充分利用好有限的時間。自己也實踐了一些想法,比如寫博客,堅持寫博客。也有很多沒做好,比如如何學習掌握一門新技術。關于這一點,其實看了許多文章,也有很多印象深刻,覺得很有道理;也有一些好書,比如《study?more,learn?less》。紙上得來終覺淺,絕知此事要躬行,別人的辦法再好也需要親身實踐才知道是否對自己適用。

  需要學習的技術很多,要自學新知識也不是一件容易的事,選擇一個自己比較感興趣的會是一個比較好的開端,于是,打算學一學分布式系統。

  帶著問題,有目的的學習,先了解整體架構,在深入感興趣的細節,這是我的計劃。

  首先得有問題,如果每日重復相同的工作,也不主動去學習,很難發現新的問題。不怕自己無知,就怕不知道自己無知,只有不斷的學習,才會發現更多未知的知識領域!

帶著問題出發

分布式要解決什么問題呢?解決持久化數據太大,單個節點的硬盤無法存儲的問題;解決運算量太大,單個節點的內存、CPU無法處理的問題。解決這些問題,有兩種思路:scale?up,scale?out。前者就是提升單個節點的能力,更大的磁盤,更快的CPU,定制的軟硬件,然而這意味著更高的價格,而且再怎么scaleup 也是有上限的。后者就是把存儲、計算任務分擔到普通的機器上,通過動態增加節點來應對數據量的增長,但缺點是多個節點的管理、任務的調度比較麻煩,這也是分布式系統研究和解決的問題。只有當數據量達到單機無法存儲、處理的情況下才考慮分布式,不然都是自找麻煩。

  狀態的維護比計算要難很多,所謂狀態就是需要持久化的數據。因此主要考慮分布式存儲,況且即使是分布式計算,為了節省帶寬需要盡量保證data?locality,也是需要分布式存儲。

  現在有一堆數據,可能是結構化或者半結構化,需要將數據分片(segment、fragment、shard),形成一個個的數據子集,存儲到一組物理節點上,物理節點之間通過網絡通信。那么需要考慮兩個問題:

  第一:數據如何劃分;?

  第二:數據的可靠性、可用性問題

? 

數據分片

  數據分片是指將數據子集盡可能均衡的劃分到各個物理節點上。那么會有哪些挑戰呢?

  (1)如果某個物理節點宕機,如何將該物理節點負責的數據盡快的轉移到其他物理節點;

  (2)如果新增了物理節點,怎么從其他節點遷移數據到新節點;

  (3)對于可修改的數據(即不是只能追加的數據),比如數據庫數據,如果某節點數據量變大,怎么將部分數據遷移到其他負載較小的節點,及達到動態均衡的效果。

  (4)元數據的管理問題:當數據分布在各個節點,那么當用戶使用的時候需要知道具體的數據在哪一個節點上。因此,系統需要維護數據的元數據:即每一個數據所在的位置、狀態等信息。當用戶需要具體的數據時,先查詢元數據,然后再去具體的節點上查詢。當數據在節點之間遷移的時候,也需要更新元數據。元數據的管理節點這里稱之為meta server。元數據的管理也帶來了新的挑戰:

    (4.1)如何抽取數據的特征(特征是分片的依據,也是用戶查詢數據時的key),或者支持用戶自定義數據特征;

    (4.2)如何保證meta server的高性能和高可用,是單點還是復制集

  (5)分片的粒度,即數據子集的大小,也是數據遷移的基本單位。粒度過粗,不利于數據均衡;粒度過細,管理、遷移成本又會比較大。

數據冗余

  前面提到,分布式系統中的節點都是普通的節點,因此有一定的概率會出現物理故障,比如斷電、網絡不可用,這些故障導致數據的暫時不可用;另外一些故障更嚴重,會導致數據的丟失,比如磁盤損壞。即使單個節點的故障是小概率,當集群中的節點數目很多是,故障就成為了一個大概率事件。因此,保證數據的高可用和可靠性是分布式系統必須解決的問題。

  為了避免單點故障,可行的辦法就是數據冗余(復制集),即將同一份數據放在不同的物理節點,甚至是不同的數據中心。如果數據是一次寫,多次讀那很好辦,隨便從哪個副本讀取都行。但對于很多分布式存儲系統,比如數據庫,數據是持續變化的,有讀有寫。那么復制集會帶來什么樣的挑戰呢,需要如何權衡呢,假設有三個副本:

  (1)三個副本的地位,大家都是平等的還是有主(primary、master)有次(secondary、slave),如果是平等的,那么每個節點都可以接收寫操作;如果不平等,可以一個節點負責所有的寫操作,所有節點都提供讀操作,

  (2)在平等的情況下,怎么保證寫入操作不沖突,保證各個節點的數據是一致的,怎么保證能讀取到最新的數據

  (3)不平等的情況下

    (3.1)寫節點怎么將變更的數據同步到其他節點,同步還是異步;

    (3.2)非寫節點能否提供讀數據,如果能夠允許,會不會讀取到過時的數據。

    (3.3)主節點是怎么產生的,當主節點宕機的時候,怎么選擇出新的主節點。是有統一的復制集管理中心(記錄誰主誰次,各自的狀態),還是復制集自己選舉出一個主節點?

  (4)不管復制集內部的節點是平等的,還是有集中式節點的,只要有多個數據副本,就需要考慮數據的一致性可用性問題。按照CAP理論,只能同時滿足一致性?可用性?分區容錯性之間的二者,不同的分布式系統需要權衡。

其他

  分布式系統有自己的術語或者概念。在當前的這個時間點,我對其中的一些有了解,或者使用過;另外一些只是聽說過,不甚了解;當然,還有更多的是不知道的,是需要在后續的學習中去發現、去掌握的。

  分片 副本 一致性哈希 冪等 CAP paxos raft NWR lease 兩階段提交協議 三階段提交協議 拜占庭問題

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

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

相關文章

香港大學余濤組推出開源XLANG Agent!支持三種Agent模式

作者 |小戲、ZenMoore 一個新的未來又逐漸開始從理論走向現實走到我們身邊了。 語言的意義在于使用,而從 ChatGPT 以來這些大規模語言模型的意義,也必然絕不止于 Chat,在四個月前,我們介紹了清華大學關于工具學習的綜述《清華發布…

Python-OpenCV中的圖像處理-圖像特征

Python-OpenCV中的圖像處理-圖像特征 圖像特征Harris角點檢測亞像素級精度的角點檢測Shi-Tomasi角點檢測SIFT(Scale-Invariant Feature Transfrom)SURF(Speeded-Up Robust Features) 圖像特征 特征理解特征檢測特征描述 Harris角點檢測 cv2.cornerHarris(img, blockSize, ks…

海格里斯HEGERLS四向穿梭車倉儲解決方案在電子商務行業中的應用

隨著現代物流,尤其是智能化物流的飛速發展,河北沃克金屬制品有限公司看到了智能物流領域背后的巨大價值和市場空間,深知物流與供應鏈對企業發展的重要性。于是,引進了先進的高科技智能技術—HEGERLS四向穿梭車技術,并迅…

【日常積累】Linux下文件亂碼解決

linux下刪除亂碼文件、目錄 由于編碼原因,在linux服務器上上傳、創建中文文件或目錄時,會產生亂碼,如果想刪除它,有時候發現用rm命令是刪除不了的 這種情況下,用find命令可以刪除亂碼的文件或目錄。 首先進入亂碼文件…

docker 網絡訪問診斷

本地docker開啟nginx服務等, 發現linux系統重啟之后,無法訪問, 進入容器內部,發現可以訪問 但是容器外部,映射端口無法訪問; 診斷之前,發現docker0沒有IP綁定 rootbook:/etc/docker# ip addr …

自制手寫機器人

寫字機器人模擬在畫圖板上寫字效果 寫了一套寫字機器人代碼,有多種字體可供選擇,需要的朋友私信獲取代碼和軟件

Spring5學習筆記— 工廠高級特性

?作者簡介:大家好,我是Leo,熱愛Java后端開發者,一個想要與大家共同進步的男人😉😉 🍎個人主頁:Leo的博客 💞當前專欄: Spring專欄 ?特色專欄: M…

創建型模式-原型模式

文章目錄 一、原型模式1. 概述2. 結構3. 實現4. 案例1.5 使用場景1.6 擴展(深克隆) 一、原型模式 1. 概述 用一個已經創建的實例作為原型,通過復制該原型對象來創建一個和原型對象相同的新對象。 2. 結構 原型模式包含如下角色: …

微服務架構和分布式架構的區別

微服務架構和分布式架構的區別 有:1、含義不同;2、概念層面不同;3、解決問題不同;4、部署方式不同;5、耦合度不同。其中,含義不同指微服務架構是一種將一個單一應用程序開發為一組小型服務的方法&#xff…

使用windows搭建WebDAV服務,并內網穿透公網訪問【無公網IP】

文章目錄 1. 安裝IIS必要WebDav組件2. 客戶端測試3. 使用cpolar內網穿透,將WebDav服務暴露在公網3.1 打開Web-UI管理界面3.2 創建隧道3.3 查看在線隧道列表3.4 瀏覽器訪問測試 4. 安裝Raidrive客戶端4.1 連接WebDav服務器4.2 連接成功4.2 連接成功 1. Linux(centos8…

【Vue-Router】路由入門

路由(Routing)是指確定網站或應用程序中特定頁面的方式。在Web開發中,路由用于根據URL的不同部分來確定應用程序中應該顯示哪個內容。 構建前端項目 npm init vuelatest //或者 npm init vitelatest安裝依賴和路由 npm install npm instal…

TCP重連 - 筆記

1 C++ TCP/IP 關于tcp斷線重連的問題 C++ TCP/IP 關于tcp斷線重連的問題_c++ 斷線重連_Bug&猿柒。的博客-CSDN博客 2 C++基礎--完善Socket C/S ,實現客戶端,服務器端斷開重連 https://www.cnblogs.com/kingdom_0/articles/2571727.html 3 C++實現Tcp通信(考慮客戶…

ATF BL1 UFS初始化簡單分析

ATF BL1 UFS初始化分析 1 ATF的下載鏈接2 ATF BL1 UFS 初始化簡易流程圖3 ATF BL1 ufs初始化簡單過程分析3.1 調用過程3.2 hikey960_ufs_init3.3 dw_ufs_init3.3 ufs_init 以海思hikey960為例來介紹,簡單介紹在ATF BL1階段的初始化處理。 1 ATF的下載鏈接 https:/…

藍帽杯 取證2022

網站取證 網站取證_1 下載附件 并解壓 得到了一個文件以及一個壓縮包 解壓壓縮包 用火絨查病毒 發現后門 打開文件路徑之后 發現了一句話木馬 解出flag 網站取證_2 讓找數據庫鏈接的明文密碼 打開www文件找找 查看數據庫配置文件/application/database.php(CodeI…

Vue3.2+TS的父傳子,子傳父

這是父組件 <template><div><!-- 這個fn是子組件emit觸發名&#xff0c;兩邊保持一致 --><Child :num"num" fn"numUp"></Child></div> </template><script setup lang"ts"> import { ref } fr…

截止到目前全量主體總數有多少?

企業主體類型 企業主體類型有很多種&#xff0c;一般我們會分為公司&#xff08;有限責任&#xff09;、合伙企業、個人獨資企業、個體經營戶這些類別。 今天我們按照企業&#xff0c;個體&#xff0c;組織的分類方式來看各個主體的總數。 企業&#xff1a;統一社會信用代碼…

基于IP網絡的存儲協議——iSCSI

文章首發地址 iSCSI&#xff08;Internet Small Computer System Interface&#xff09;是一種基于IP網絡的存儲協議&#xff0c;它能夠在TCP/IP網絡上實現SCSI協議&#xff0c;使得不同的主機可以通過網絡共享存儲設備。iSCSI可以將存儲設備映射到本地主機上&#xff0c;使得主…

ARTS 挑戰打卡的第7天 --- Ubuntu中的WindTerm如何設置成中文,并且關閉shell中Tab鍵聲音(Tips)

前言 &#xff08;1&#xff09;Windterm是一個非常優秀的終端神器。關于他的下載我就不多說了&#xff0c;網上很多。今天我就分享一個國內目前沒有找到的這方面的資料——Ubuntu中的WindTerm如何設置成中文&#xff0c;并且關閉shell中Tab鍵聲音。 將WindTerm設置成中文 &…

【Mac】mac 系統下格式化U盤或移動硬盤為ext4格式

1. 打開終端&#xff0c;安裝 homebrew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"2. 安裝之后再次運行此命令 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"…

學習C++資料集合

學習C C 是一個難學易用的語言&#xff01; C 的難學&#xff0c;不僅在其廣博的語法&#xff0c;以及語法背後的語意&#xff0c;以及語意背後的深層思維&#xff0c;以及深層思維背後的物件模型&#xff1b; C 的難學&#xff0c;還在於它提供了四種不同&#xff08;但相輔相…