[論文中文導讀] Maglev : A Fast and Reliable Software Network Load Balancer (using Consistent Hashing)

前言 (為何想讀這一篇論文) 這一篇論文吸引我注意的原因是, Consistent Hashing 本來的特性就是作為 Distributed Caching 之用. 但是 Google 將他們的 Load Balancer (代號: Maglev ) 公布他的實作方式,裡面並且將 Consistent Hashing 做了一些小改版來符合他們的需求. 由於我之前就有學習過 Consistent Hashing ,所以相當好奇 Google 能夠如何地將它更進一步地做提升. 就想要閱讀這一篇論文. 本篇導讀主要內容如下: 介紹 Maglev 的特性與其改善的部分 回顧 Consistent Hashing 介紹 Maglev Hashing 原始論文 Maglev: A Fast and Reliable Software Network Load Balancer 導讀 什麼是 Maglev? Maglev 是 Google 的軟體 Load Balancer ,不像是一般硬體的 Load Balancer , 他可以運行在一般的 Linux 機器上面. Maglev 在 Google 內部已經運行了超過 六年 ( since 2008 ) .一台 Maglev 可以處理 10Gbps 的小封包連結. Maglev 主要的功能與特色 Maglev 作為 Google 內部的高效能軟體 Load Balancer ,他有以下兩個主要功能: 新的 Consistent Hashing Algorithm 稱為 Maglev Hashing Connection Tracking 回過來講,那什麼是 Consistent Hashing ? 講到 Consistent Hashing 就必須要提到原本 distributed caching 的運作是靠 Hash Table 的方式來達成,比如說: 來源 ip : 1.2.3.4 透過將來源 ip 做 Hashing 過後指向 server1 來源 ip : 1.2.3.5 透過將來源 ip 做 Hashing 過後指向 server2 來源 ip : 1.2.4.6 透過將來源 ip 做 Hashing 過後指向 server3 依照原先的設計如果 server1 發生了故障,那麼不論如何 1.2.3.4 就無法連接到任何一個伺服器. 於是 Consistent Hashing 就是在這裡發揮效果. 根據定義...
繼續閱讀

程式設計週記[2016/05/27]: 史詩級任務: 帶著你第一個未滿周歲的小孩一起出國旅遊

這是什麼? 程式週記主要內容如下: Gihub project 介紹: 主要會貼一些github,但是會盡量寫上一些有用的評語(或是我容易想到的關鍵詞)幫助以後查詢 網路文章心得: 會寫些心得,強迫自己閱讀. “程式週記”並且定期週期性更新. 大部分內容在我的twitter都會有,這邊只是將一些簡單的心得與感想註解一下. 本週摘要 這個禮拜有三天請假,因為帶我的小孩去石垣島的 ClubMed 遊玩.雖然當地每天都是 Buffet 吃到飽,但是我跟老婆還是因為照顧小孩子太辛苦而消瘦. 由於只有兩天,本週專案想了很久不知道要寫什麼.於是先把上週的專案加以應用.但是也重寫了好幾次,並且想不到一個很好的處理方式. Go dgryski: best practices for writing high-performance Go code. 大大 dgryski 教導如何寫出高效能的 Go App. Replication of Etcd - Blog With ReeZhou 有介紹 etcd 裡面使用 raft 的 propose 的流程分析. Suffix arrays in the Go standard library 介紹如何使用 Go 內建的 Suffix Array ,其實 Go 內建也有 container/ring 的套件可以用.這裡有篇介紹文章. To create package alias for your #Go tool by using “go list” Application data caching using SSDs Netflix 最新的部落格提到有一個 ‎golang 寫的 application data cache proxy - Rend 決定資料要存放 memcached 或是 SSDs Abstracting S3 for Fun and Profit in Go 試著做一出一個類似 AWS S3 的服務. Practical Golang: Using Protobuffs | Jacob Martin 一些關於 Protobuf 的實際應用. VoV is a high score game for Android 完全使用 Go 開發的 Android 射擊遊戲. Four and a Half Years of Go in Production at goto Chicago 2016 講解 iron.io 在四年半前如何從 ruby 換到 Go 的故事. 當時 Go...
繼續閱讀

程式設計週記[2016/05/20]: 最簡單的地震探知系統

(pic from twitter: https://twitter.com/toddmotto/status/731435248588890113) 這是什麼? 程式週記主要內容如下: Gihub project 介紹: 主要會貼一些github,但是會盡量寫上一些有用的評語(或是我容易想到的關鍵詞)幫助以後查詢 網路文章心得: 會寫些心得,強迫自己閱讀. “程式週記”並且定期週期性更新. 大部分內容在我的twitter都會有,這邊只是將一些簡單的心得與感想註解一下. 本週摘要 本週都在讀臉書的時間序列資料庫 Gorilla 論文,覺得應該有不少地方可以運用這樣的技術.本週專題是一個幫助你處理 bit/byte 的 bit stream helper. Go Essential knowledge for Go debugging | Stack Traces In Go 很有用的舊文章,透過了解 Golang 處理 stack 的方式可以讓你更了解如何 debugging golang app. distatus/battery: cross-platform, normalized battery information library 跨平台的電池資訊顯示工具,挺有趣的 golang app. Comparing Golang with Java 從 Java 轉到 Go 的工程師寫出他心得感想. pierrre/imageserver: Image server toolkit in Go 將一些影像處理可能經常用到的工具 kits 寫成 web services 並且開源. C++ Bindings For A Go Library 講解如何在 C++ 中去使用 Go library 的方式與該注意的地方. 並且有提到 C++ GC 處理方式的 Golang-Nuts The InfoQ Podcast: Uber’s Chief Systems Architect on their Architecture and Rapid Growth Uber 的開發團隊決定從把開發語言從 node.js 搬到 Go 跟 Java Dev Cheney 出的程式小測驗,你能做對嗎? 主要是講解使用 point 指向 slice 要注意到 slice 會因為 cap 變大而 reallocation 位置,造成你舊的指標指向一個已經過期的資料空間. 更多資訊可以參考這篇 https://blog.golang.org/go-slices-usage-and-internals Python 用Python開發Facebook Bot 流程算清楚,先存檔起來 Android/JAVA/NODE.JS devstdio/podq: The Open-source Online Podcast Player for Developers 前端透過 JS 的 pocast player. Docker Using Caddy with Docker 透過 docker...
繼續閱讀

[中文導讀] Facebook 的時間序列資料庫 - Gorilla (Gorilla: A Fast, Scalable, In-Memory Time Series Database)

(come from Paper) 前言: 本文會介紹最近被討論的 Facebook 時間序列資料庫的論文,並且會介紹資料庫壓縮演算法. 其中不少解讀都是參考 Morning Paper 裡面的論文導讀. 最後會導入 Damian Gryski 根據論文推導出的演算法 dgryski/go-tsz . 原始論文: Gorilla: A Fast, Scalable, In-Memory Time Series Database 導讀: 什麼是 Gorilla ? Gorilla 是 Facebook 開發的時間序列資料庫.其實市場上已經有很多的時間序列資料庫 (HBase on TSDB(time-series database)) ,為什麼還需要自己開發一個呢? 資料的儲存過於龐大 查詢的延遲過長 所以 Gorilla 針對這些有了以下的優化: 針對 timestamp 的壓縮 分析並且針對資料的壓縮 放在記憶體 (in-memory databse) 那麼 Gorilla 比起一般的時間序列資料庫究竟有多強大呢? 透過將時間與數值的壓縮,並且透過儲放在記憶體的操作. Gorilla 可以達到: 73 倍的 Query Latency 減少 14 倍的 Query Throughput 增加 為了要儲存到 26 小時以上的時間序列資料,並切壓縮到 1.3 TB 的記憶體之中(分散在 20 部伺服器中).所以 Gorilla 針對儲存資料有相當程度的壓縮. 透過資料的壓縮最佳狀態可以達到: (come from Paper) 高達 12 倍的壓縮比: 原先 16 bytes 的數值資料(包括 timestamp 與 value )透過壓縮,一般而言平均可以達到 1.37 bytes (通常在經過 240 分鐘後) 12倍的壓縮比? 那麼大的壓縮比是如何做到? 簡單的來說 Gorilla 透過將時間資料( timestamp )與數值資料( value ) 的壓縮. 其壓縮的方式是參考前一次的資料,透過時間序列資料庫的特性: 連續性資料 在比較小的取樣時間中,每筆資料間的變化不大 透過這樣的方式,可以拿目前的資料 \(t_n\) 去與前一筆資料 \(t_(n-1)\) 比對的方式, 來拿到差異值 (delta) .並且將差異值做一定程度的壓縮. 達到整個資料庫數值的壓縮. 壓縮的演算法: 關於時間資料的壓縮 首先針對時間資料的壓縮部分,讓我們先看看以前的時間可能如何紀錄: (舉例) \(t_0\) => 02: 00 : 00 \(t_1\) => 02: 01 : 02 \(t_2\) => 02: 02 : 02 \(t_3\) => 02: 03 : 02 如果要直接紀錄的話,其實資料長度會變得相當大. 讓我們換個角度來看: \(t_0\)...
繼續閱讀

[TIL][Mac] About GOPATH and GOBIN system environment

Major problem: System environment variable GOBIN cause problem “vim-go error: vim-go: goimports does not support srcdir” Situation: Recently I use vs code to write golang more than vim-go,But when you upgrade the Golang version then use vim-go to save file, it will always popup following error message. vim-go: goimports does not support srcdir Problem Environment: Mac Only. Homebrew installed only. Root Cause: normally there are two importnt variable in go env which was $GOPATH and $GOBIN. But most user only set $GOPATH but $GOBIN. It will cause your all golang binary install via go install to the directory $GOPATH/bin. Recently Homebrew formula, it will help us to set $GOBIN but the path will be/usr/local/Cellar/go/GO_VERSION/libexec/bin rather than $GOPATH/bin. What’s the problem with that? If you have any package which force to install in $GOPATH/bin, it might has problem with duplicate or not install latest one with Golang update. dlv has the...
繼續閱讀

程式設計週記[2016/05/13]: 最近地震真不少,國家級警報也不少

這是什麼? 程式週記主要內容如下: Gihub project 介紹: 主要會貼一些github,但是會盡量寫上一些有用的評語(或是我容易想到的關鍵詞)幫助以後查詢 網路文章心得: 會寫些心得,強迫自己閱讀. “程式週記”並且定期週期性更新. 大部分內容在我的twitter都會有,這邊只是將一些簡單的心得與感想註解一下. 本週摘要 本週花太多時間在學習 Amazon Echo 跟一些社群的事務上面.應該花更多時間開始看論文.下週應該又要回到看論文寫每週專題的日子. 本週專題將上週的 Line Bot 套件拆解出來,準備要移植到 Facebook Messenger Platform 之用. Go mkideal/onepw: onepw is a command line tool for managing passwords 使用命令列的密碼管理工具,可以幫你產生你需要的密碼並且儲存起來,幫助你再也不需要記住密碼. emc-advanced-dev/unik: The Unikernel Compilation and Deployment Platform 幫你把 Go App 燒在可開機磁碟上. saiday/JonSnow: Google Play review watcher, deliver new reviews to your slack channel 很威的 Google Play Review Watcher by saiday ,一開源過後馬上就有人幫忙加上 Apple Store Review Watcher 開源真棒啊… How To Use Martini to Serve Go Applications Behind an Nginx Server on Ubuntu 雖然文章是 2013 年的,但是使用 NGINX 搭配 Go 的 Web App - Martini 到目前都還是很多想要使用的架構之一. [Youtube] Golang Google Cloud Storage 在 Google Cloud Storage 上面使用 Golang 的影片教學. 在 Github 專案內搜尋 Golang 函式,Golang 開發者必裝 Chrome Extension 這個 Chrome Extension 不錯使用,一定要裝. liviosoares/go-watson-sdk: Go (golang) SDK for IBM Watson services 最近在大肆宣傳的 IBM 網路服務 Watson ,馬上就有人寫出 Go 的 SDK .幾乎所有的服務都可以使用,相當的棒. manul: The madness vendoring utility for Golang programs 使用 Git submodule 來做...
繼續閱讀