成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

驚!使用300行代碼創建一個分布式系統

開發 架構 分布式
構建一個分布式系統是很困難的。它需要可擴展性、容錯性、高可用性、一致性、可伸縮以及高效。為了達到這些目的,分布式系統需要很多復雜的組件以一 種復雜的方式協同工作。例如,Apache Hadoop在大型集群上并行處理TB級別的數據集時,需要依賴有著高容錯的文件系統(HDFS)來達到高吞 吐量。

構建一個分布式系統是很困難的。它需要可擴展性、容錯性、高可用性、一致性、可伸縮以及高效。為了達到這些目的,分布式系統需要很多復雜的組件以一 種復雜的方式協同工作。例如,Apache Hadoop在大型集群上并行處理TB級別的數據集時,需要依賴有著高容錯的文件系統(HDFS)來達到高吞 吐量。

在之前,每一個新的分布式系統,例如Hadoop和Cassandra,都需要構建自己的底層架構,包括消息處理、存儲、網絡、容錯性和可伸縮性。 慶幸的是,像Apache Mesos這樣的系統,通過給分布式系統的關鍵構建模塊提供類似操作系統的管理服務,簡化了構建和管理分布式系統的任務。 Mesos抽離了CPU、存儲和其它計算資源,因此開發者開發分布式應用程序時能夠將整個數據中心集群當做一臺巨型機對待。

[[143382]]

構建在Mesos上的應用程序被稱為框架,它們能解決很多問題:Apache Spark,一種流行的集群式數據分析工具;Chronos,一個類 似cron的具有容錯性的分布式scheduler,這是兩個構建在Mesos上的框架的例子。構建框架可以使用多種語言,包括 C++,Go,Python,Java,Haskell和 Scala。

在分布式系統用例上,比特幣開采就是一個很好的例子。比特幣將為生成 acceptable hash 的挑戰轉為驗證一塊事務的可靠性。可能需要 幾十年,單臺筆記本電腦挖一塊可能需要花費超過150年。結果是,有許多的“采礦池”允許采礦者將他們的計算資源聯合起來以加快挖礦速度。 Mesosphere的一個實習生,Derek,寫了一個比特幣開采框架,利用集群資源的優勢來做同樣的事情。在接下來的內容中,會以他的代碼為例。

1個Mesos框架有1個scheduler 和1個executor組成。scheduler 和Mesos master通信并決定運行什么任 務,而executor 運行在slaves上面,執行實際任務。大多數的框架實現了自己的scheduler,并使用1個由Mesos提供的標準 executors。當然,框架也可以自己定制executor。在這個例子中即會編寫定制的scheduler,并使用標準命令執行器 (executor)運行包含我們比特幣服務的Docker鏡像。

對這里的scheduler來說,需要運行的有兩種任務—— 單礦服務器任務和多礦服務器任務。服務器會和一個比特幣采礦池通信,并給每個“工人”分配塊。“工人”會努力工作,即開采比特幣。

任務實際上被封裝在executor框架中,因此任務運行意味著告訴Mesos master在其中一個slave上面啟動一個executor。 由于這里使用的是標準命令執行器(executor),因此可以指定任務是二進制可執行文件、bash腳本或者其他命令。由于Mesos支持 Docker,因此在本例中將使用可執行的Docker鏡像。Docker是這樣一種技術,它允許你將應用程序和它運行時需要的依賴一起打包。

為了在Mesos中使用Docker鏡像,這里需要在Docker registry中注冊它們的名稱:

  1. const ( 
  2.     MinerServerDockerImage = "derekchiang/p2pool" 
  3.     MinerDaemonDockerImage = "derekchiang/cpuminer" 

然后定義一個常量,指定每個任務所需資源:

  1. const ( 
  2.     MemPerDaemonTask = 128  // mining shouldn't be memory-intensive 
  3.     MemPerServerTask = 256 
  4.     CPUPerServerTask = 1    // a miner server does not use much CPU 

現在定義一個真正的scheduler,對其跟蹤,并確保其正確運行需要的狀態:

  1. type MinerScheduler struct { 
  2.     // bitcoind RPC credentials 
  3.     bitcoindAddr string 
  4.     rpcUser      string 
  5.     rpcPass      string 
  6.     // mutable state 
  7.     minerServerRunning  bool 
  8.     minerServerHostname string 
  9.     minerServerPort     int    // the port that miner daemons 
  10.                                // connect to 
  11.     // unique task ids 
  12.     tasksLaunched        int 
  13.     currentDaemonTaskIDs []*mesos.TaskID 

這個scheduler必須實現下面的接口:

  1. type Scheduler interface { 
  2.     Registered(SchedulerDriver, *mesos.FrameworkID, *mesos.MasterInfo) 
  3.     Reregistered(SchedulerDriver, *mesos.MasterInfo) 
  4.     Disconnected(SchedulerDriver) 
  5.     ResourceOffers(SchedulerDriver, []*mesos.Offer) 
  6.     OfferRescinded(SchedulerDriver, *mesos.OfferID) 
  7.     StatusUpdate(SchedulerDriver, *mesos.TaskStatus) 
  8.     FrameworkMessage(SchedulerDriver, *mesos.ExecutorID, 
  9.                      *mesos.SlaveID, string) 
  10.     SlaveLost(SchedulerDriver, *mesos.SlaveID) 
  11.     ExecutorLost(SchedulerDriver, *mesos.ExecutorID, *mesos.SlaveID, 
  12.                  int
  13.     Error(SchedulerDriver, string) 

現在一起看一個回調函數:

  1. func (s *MinerScheduler) Registered(_ sched.SchedulerDriver, 
  2.       frameworkId *mesos.FrameworkID, masterInfo *mesos.MasterInfo) { 
  3.     log.Infoln("Framework registered with Master ", masterInfo) 
  4. func (s *MinerScheduler) Reregistered(_ sched.SchedulerDriver, 
  5.       masterInfo *mesos.MasterInfo) { 
  6.     log.Infoln("Framework Re-Registered with Master ", masterInfo) 
  7. func (s *MinerScheduler) Disconnected(sched.SchedulerDriver) { 
  8.     log.Infoln("Framework disconnected with Master"

Registered在scheduler 成功向Mesos master注冊之后被調用。

Reregistered在scheduler 與Mesos master斷開連接并且再次注冊時被調用,例如,在master重啟的時候。

Disconnected在scheduler 與Mesos master斷開連接時被調用。這個在master掛了的時候會發生。

目前為止,這里僅僅在回調函數中打印了日志信息,因為對于一個像這樣的簡單框架,大多數回調函數可以空在那里。然而,下一個回調函數就是每一個框架的核心,必須要認真的編寫。

ResourceOffers在scheduler 從master那里得到一個offer的時候被調用。每一個offer包含一個集群上可以給框架使用的資源列表。資源通常包括CPU、內存、端口和磁盤。一個框架可以使用它提供的一些資源、所有資源或者一點資源都不給用。

針對每一個offer,現在期望聚集所有的提供的資源并決定是否需要發布一個新的server任務或者一個新的worker任務。這里可以向每個 offer發送盡可能多的任務以測試***容量,但是由于開采比特幣是依賴CPU的,所以這里每個offer運行一個開采者任務并使用所有可用的CPU資 源。

  1. for i, offer := range offers { 
  2.     // … Gather resource being offered and do setup 
  3.     if !s.minerServerRunning && mems >= MemPerServerTask && 
  4.             cpus >= CPUPerServerTask && ports >= 2 { 
  5.         // … Launch a server task since no server is running and we 
  6.         // have resources to launch it. 
  7.     } else if s.minerServerRunning && mems >= MemPerDaemonTask { 
  8.         // … Launch a miner since a server is running and we have mem 
  9.         // to launch one. 
  10.     } 

針對每個任務都需要創建一個對應的TaskInfo message ,它包含了運行這個任務需要的信息。

 

  1. s.tasksLaunched++ 
  2. taskID = &mesos.TaskID { 
  3.     Value: proto.String("miner-server-" + 
  4.                         strconv.Itoa(s.tasksLaunched)), 
  5.  
  6. Task IDs由框架決定,并且每個框架必須是唯一的。 
  7.  
  8. containerType := mesos.ContainerInfo_DOCKER 
  9. task = &mesos.TaskInfo { 
  10.     Name: proto.String("task-" + taskID.GetValue()), 
  11.     TaskId: taskID, 
  12.     SlaveId: offer.SlaveId, 
  13.     Container: &mesos.ContainerInfo { 
  14.         Type: &containerType, 
  15.         Docker: &mesos.ContainerInfo_DockerInfo { 
  16.             Image: proto.String(MinerServerDockerImage), 
  17.         }, 
  18.     }, 
  19.     Command: &mesos.CommandInfo { 
  20.         Shell: proto.Bool(false), 
  21.         Arguments: []string { 
  22.             // these arguments will be passed to run_p2pool.py 
  23.             "--bitcoind-address", s.bitcoindAddr, 
  24.             "--p2pool-port", strconv.Itoa(int(p2poolPort)), 
  25.             "-w", strconv.Itoa(int(workerPort)), 
  26.             s.rpcUser, s.rpcPass, 
  27.         }, 
  28.     }, 
  29.     Resources: []*mesos.Resource { 
  30.         util.NewScalarResource("cpus", CPUPerServerTask), 
  31.         util.NewScalarResource("mem", MemPerServerTask), 
  32.     }, 

TaskInfo message指定了一些關于任務的重要元數據信息,它允許Mesos節點運行Docker容器,特別會指定name、task ID、container information以及一些需要給容器傳遞的參數。這里也會指定任務需要的資源。

現在TaskInfo已經被構建好,因此任務可以這樣運行:

driver.LaunchTasks([]*mesos.OfferID{offer.Id}, tasks, &mesos.Filters{RefuseSeconds: proto.Float64(1)})

在框架中,需要處理的***一件事情是當開采者server關閉時會發生什么。這里可以利用StatusUpdate 函數來處理。

在一個任務的生命周期中,針對不同的階段有不同類型的狀態更新。對這個框架來說,想要確保的是如果開采者server由于某種原因失敗,系統會Kill所有開采者worker以避免浪費資源。這里是相關的代碼:

  1. if strings.Contains(status.GetTaskId().GetValue(), "server") && 
  2.     (status.GetState() == mesos.TaskState_TASK_LOST || 
  3.         status.GetState() == mesos.TaskState_TASK_KILLED || 
  4.         status.GetState() == mesos.TaskState_TASK_FINISHED || 
  5.         status.GetState() == mesos.TaskState_TASK_ERROR || 
  6.         status.GetState() == mesos.TaskState_TASK_FAILED) { 
  7.     s.minerServerRunning = false 
  8.     // kill all tasks 
  9.     for _, taskID := range s.currentDaemonTaskIDs { 
  10.         _, err := driver.KillTask(taskID) 
  11.         if err != nil { 
  12.             log.Errorf("Failed to kill task %s", taskID) 
  13.         } 
  14.     } 
  15.     s.currentDaemonTaskIDs = make([]*mesos.TaskID, 0

萬事大吉!通過努力,這里在Apache Mesos上建立一個正常工作的分布式比特幣開采框架,它只用了大約300行GO代碼。這證明了使用Mesos 框架的API編寫分布式系統是多么快速和簡單。

責任編輯:王雪燕
相關推薦

2013-09-11 16:02:00

Spark分布式計算系統

2022-06-27 08:36:27

分布式事務XA規范

2020-07-30 09:35:09

Redis分布式鎖數據庫

2011-09-14 10:08:07

Beanstalkd

2016-09-30 10:13:07

分布式爬蟲系統

2024-02-19 00:00:00

Redis分布式

2023-09-04 08:45:07

分布式配置中心Zookeeper

2023-05-29 14:07:00

Zuul網關系統

2020-09-17 11:12:03

分布式系統代碼檢代碼檢視

2023-05-12 08:23:03

分布式系統網絡

2014-04-02 09:39:15

Ceph分布式文件系統

2023-04-05 10:00:00

分布式算法

2024-07-15 08:25:07

2022-04-14 07:56:30

公平鎖Java線程

2023-03-06 08:14:48

MySQLRedis場景

2021-11-01 12:25:56

Redis分布式

2017-10-27 08:40:44

分布式存儲剪枝系統

2023-10-26 18:10:43

分布式并行技術系統

2023-02-11 00:04:17

分布式系統安全

2019-01-28 11:46:53

架構運維技術
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久国产激情视频 | 国产黄色av网站 | 人人干人人看 | 1204国产成人精品视频 | 国产一区二区三区欧美 | 玖玖视频免费 | 九九九视频在线 | 最新av片 | 亚洲一区二区久久 | 久久亚洲一区二区三区四区 | jizz视频| 6080yy精品一区二区三区 | 国产精品视频久久 | 日本a视频 | 中文二区 | 91久久精品国产91久久性色tv | 在线免费观看欧美 | 精品免费国产视频 | 91精品国产欧美一区二区 | 狠狠做深爱婷婷综合一区 | 国产精品日韩欧美一区二区三区 | 精品亚洲一区二区 | 一级毛片免费视频观看 | 国产在线中文字幕 | 婷婷桃色网 | 国产精品一区二区在线 | 天天操天天插天天干 | 伊人久久精品一区二区三区 | 久久免费精品视频 | 黑色丝袜三级在线播放 | 日韩中文字幕在线播放 | 日韩在线第一 | 日韩久久久一区二区 | 成人免费av | 一区| 男女一区二区三区 | 俺去俺来也www色官网cms | 99免费在线视频 | 久久毛片网站 | 亚洲欧洲精品在线 | 国内精品久久久久 |