系統架構


Posted by chihyu on 2021-01-25

系統架構

單點故障 Single Point of Failure:一個地方掛了,整個都掛了
備份機制:為了避免這樣的事發生,會有備份資料庫,如果一個資料庫掛了,還有另外一個可以用

虛擬主機(Web hosting)

虛擬主機是由實體主機分割出的一個個虛擬空間,一個虛擬空間就是虛擬主機,功能與實體主機一樣

網域(Domain)

可以進入網站路口的位置,將虛擬主機比喻為房子,網域名稱(網址)就是虛擬主機的地址,透過網址找到虛擬主機,請求該網址內容
網域設定:利用 A 設定,連結網域名稱與 IP 位置

DNS(Domain name system)

網址與 IP 之間的橋樑

  • A:網址與 IP 的雙向對應綁定,綁定 IPv4
  • AAAA:綁定 IPv6
  • C Name:讓更多的網址名稱可以查詢

Saclability

對系統添加資源以應對增加的工作量
添加方式:

  • 橫向擴展(Horizontal Scaling) - 增加機器數量,可以無限擴展,沒有頂配的問題,多個組件取代單一組件,透過冗餘提高可靠性
  • 縱向擴展(Vertical Scalint) - 提升單個機器的配置,但會達到頂配時就不能再進升級了

負載均衡器 Load Balancer

把用戶請求分發到多個伺服器上,利用多台伺服器提供單一服務,處理資源分配的問題
分發方法:

  • 輪循(輪流) Round robin
  • 隨機
  • 依據情況 (基於負載情況分發最理想)

有關聯的請求(ex. 登入、下單)可能分發到不同伺服器,解決方法:

  • 把有關連的請求都發到同一個伺服器
  • 把 session 存放在讓所有伺服器都可以存取的地方

冗餘負載均衡器

負載均衡器也需透過冗餘來避免單點故障(Single Point of Failure)
故障轉移模式:

  • 主動-被動(active-passive):主動的運作,被動的備用,主動壞了,才會還成被動的
  • 被動-被動(passive-active):兩個同時運作,一個壞掉了不會影響

快取 (緩存) cache

對處理過的資料作快取,用來加速 GET

短網址

把一般的網址轉成比較短的網址

點擊短網址,重新導向到原始 URL
原理:輸入短網址時,DNS 先解析 IP 位置,獲取 IP 位置後發送 HTTP GET 請求,查詢短網址,伺服器再透過短網址取得對應的長網址,再用 HTTP 301 發請求到長網址

設計需求:

  • 功能面向

    • 給定原始 URL,產生一個短且唯一的短網址
    • 訪問短網址時,重新導向到原始 URL
    • 可自定義短網址
    • 允許設置時效性
  • 系統面向

    • 需具可靠性,避免當機時 URL 重新導向失敗
    • 盡量減少重新導向的延遲性
    • 不可預測(?)
  • 其他
    • 可以分析(ex. 計算重新導向了幾次)
    • 提供 API 服務

數據庫設計:

  • 儲存原始 URL 對應的資料
  • 儲存短網址用戶資料

Zookeeper

  • 管理增加的數 main increasing counter
  • 輕易新增或移除 application server
  • original_url + incrementing_counter 下去Hash
    • 避免碰種問題(collision)
    • 減少 DB CALL

Key Generating Service

  • offline 生成短碼
  • 從 Key DB 預先取得短碼儲存

算法:

  • 自增序列算法(不重複算法)
    低進位轉成高進位,字符會減少,短網址有 6 個字,每個字都是 62 進位
  • 摘要算法

參考資料:
Scalability_系统设计笔记1
負載均衡

經典系統設計面試題解析:如何設計TinyURL(一)
系統設計 - 設計縮網址服務

Q:Zookeeper 跟 Load Balancer 的關係?


#Web #scalibility #DNS #Domain #Load Balancer #TinyURL







Related Posts

JavaScirpt - async/await

JavaScirpt - async/await

Golang中的字元

Golang中的字元

[學學ReactNative] DAY1 - 前言與動機:為何選擇 React Native?

[學學ReactNative] DAY1 - 前言與動機:為何選擇 React Native?


Comments