It 鐵人賽 2019

這漫長辛苦的 30 天總於結束囉 ~ 接下來依慣例第 30 天都是總結篇。 這 30 天的過程咱們都在追求『 一個好的系統 』中的其中一個重點 : 性能 性能越高的系統,可以帶給『 公司 』與『 用戶 』雙方都達到愉悅的情況。 咱們先看看第一階 ...
正文開始 前面幾篇文章中,咱們提到了如何擴展資料庫層級服務,讓它可以接更多的客,但是這些擴展方法中,都有提到一個『 中間件 』來使用,接下後本篇文章中,咱們將介紹其中一種比較常見的中間件 : MyCAT 本篇文章分為以下 ...
正文開始 本篇文章中,咱們要來說說分散式系統中,最麻煩的部份『 分散式事務 』這一塊,接下來咱們來認真的理一下這個鬼。 本篇分為以下幾個章節 : 分散式事務難題 分散式事務的處理方案 : 2 PC 二階段提交( Two-phase Commit ) MySQL XA 事務 ...
正文開始 上一篇文章中,咱們有提到了兩種資料庫層的擴展方式 : 分庫 分表 其中分表是用來解決單表太大的問題,而接下來本章節要來介紹另一種處理單表太的工具 : 分區表 本篇文章分以下幾個章節 : 分區概念 MySQL 分區的切分類型 ...
正文開始 上一篇文章中,咱們介紹了資料庫層的分散的第一個起手式『 讀寫分離 』,這個方案是將寫與讀分散在不同的機器上,正常情況下,大部份的系統使用這種方案就已經可以處理很好了。 但 ! 如果你已經將資料庫層與緩存 ...
正文開始 前面的文章我們說明完應用層的分散式架構以後,接下來我們要來思考如果讓『 資料庫層 』做更多的事情。 在正式開始章節之前,我們先來想想看一件事情。 資料庫層可以向應用層一樣加機器,就可以做更多的事情嗎 ? ...
正文開始 上一篇文章中,咱們理解了一般 web 系統的擴展方法後,接下來我們來一篇外傳,來說說關於 即時通訊服務 ( IM Instant Messaging Service ) 的擴展。 本篇文章共分以下幾個章節 : IM 服務的先行知識 IM 服務的擴展方案 1 - 負載均衡 IM 服務的擴 ...
正文開始 前面幾篇的文章中,我們知道如何儘可能的在單機上,可以以最少的資源做最多的事,但是單機一定有它的限制,因此接下來我們要開始正式進入所謂的『 分散式系統 』。 分散式系統不是簡單的增加機器就可以增加效能 ...
正文開始 本篇文章中,網路世界最重的協議 http,不只如上圖應用所示只有用戶端那有用到,現階段大部份很多 server 都還是會實用 http 去其它 server 取資料,所以一個系統中,最重要的應用層協議,咱們幾乎可能說是『 Http 』。 本篇文 ...
正文開始 前幾篇文章中,咱們討論完資料庫層的資料緩存以後,接下來咱們要來談談另外兩個緩存 : CDN ( Content Delivery Network ) HTTP 緩存 本篇文章分為以下幾個章節 : CDN 與運行流程 HTTP 緩存與運行流程 CDN 與 HTTP 緩存搞在一起用 這裡先說一下,接下來 ...
正文開始 上一篇文章中咱們已經學習了一些緩存基本的策略,那接下來我們要來理解一下一個重要的主題 : 如果緩存失效的情況,與可能會發生什麼事情呢 ? 基本上緩存失效後的結果,會很慘,尤其是你當初建立緩存時,就是已 ...
正文開始 上一篇咱們基本上已經理解緩存服務 redis 的基本概念後,接下來咱們要進入正題 : 緩存策略 相信不少人應該會覺得這很簡單,不就是將熱資料丟到緩存,然後用戶先優先去緩存取得,沒有則去資料庫拿去嗎 ? 用腦袋想很簡 ...
正文開始 前面幾篇文章咱們已經學習完了資料層性能相關的知識,而接下來這篇文章,咱們要來學習,如何進一步的讓系統可以做更多的事情。 資料庫單機性能優化到最後,仍然還是逃不過性能的貧頸,但這並不是說單機優化沒 ...
正文開始 上一章節咱們學習到了,在並行情況下 mysql 可能會發生什麼樣的資料不一致問題,並且也學習到了這些問題它又是如何解決。 雖然 innodb 已經儘可能的解決上述這些問題,但是如果要完全解決,性能代價太大,因此後來有了一 ...
正文開始 本篇文章中,咱們要說說另一種資料不一致性產生的場景,那就是 : 『 並行 』產生的不一致性難題 基本上並行所產生的不一致性難題,可以分為以下幾種類型 : 更新不一致 髒讀 不可重讀 幻讀 本篇將會分為以下幾個章節來 ...
正文開始 前面幾篇文章中,咱們理解完了 mysql 的索引概念與原理,並且理解了在 mysql 中一個查詢的速度與否取決於索引與表的設計。接下來咱們要來理解一些會拖性能後腿的東西。 這個會性能後腿的東西就是 : 一致性難題 在追求高性 ...
正文開始 本篇文章中咱們將要從『 表 』的角度來儘可能的優化性能。 表設計的幾個小建議 正規與非正規的小戰爭 表設計的幾個小建議 這個章節會給一些建立表時的小建議,雖然這裡優化的點不多,但是每一個地方都做到好,才是 ...
正文開始 前面兩篇文章中,咱們已經學習完索引的核心觀念以後,接下來咱們學學在使用時有那些的優質的方法與注意事項。 30-11 之資料庫層的核心 - 索引結構演化論 B+樹 30-12 之資料庫層的核心 - MySQL 的索引實現 本篇文章分為以下幾 ...
正文開始 上一篇文章中,我們理解了 innoDB 索引的基本原理 b+ 樹的,也理解了為什麼 innoDB 要選擇 b+ 樹的原因後,那接下來,我們要來理解,在 innoDB 中『 實際上 』是如何使用 b+ 樹來建立索引機制 ? 本篇文章分為以下幾個章節 : 一張乾淨的表 ...
正文開始 接下來咱們要來理解資料庫系統中最核心的問題 : 要如何儲放資料,才能更快速的找到資料呢 ? 而這個東西的技術就是所謂的 : 索引 而在 mysql 中決定如何儲放的是資料庫儲存引擎來決定,而這裡咱們將要從 mysql 預設引擎 innodb 來 ...
正文開始 前面幾篇文章中,咱們大致上學習完了應用層的一些性能優化的基本知識,接下來咱們要來學學資料庫層的高性能優化方向。 在這裡先說一下一個重點 : 資料庫絕對是一個系統的性能核心,請把優質的 DBA 們當寶來餵食 接 ...
正文開始 接下來咱們要來談談,在應用層中很常提到的兩個池『線程池』與『連線池』,它們兩個在應用層扮演了性能方面什麼樣的角色。 本篇文章分為以下幾個章節 : 什麼是進程池 ? 為什麼需要它呢 ? 進程池的數量設置。 什麼 ...
正文開始 上一篇文章說明完了非阻塞 I/O 模式核心 reactor,並且它可以幫我們建立 : 異步非阻塞的 I/O 操作。 而接下這篇文章我們將要來說說 coroutine 協程這東西,協程這東西在 I/O 優化佔據什麼地位呢 ? 簡單的說它可以讓我們實現 ...
正文開始 接下來本篇文章,咱們要來說明所謂的『 I/O 』模型。 這個東西我當初看到也有點不太能理解,為什麼需要它,但後來理解以後發覺,你只要知道一個 http 請求 web server 是如何處理的,從 0 至 1,那這樣的話當你完全通了,就知 ...
正文開始 Stream 這個東東,基本上在每一個語言你都看的到,而今天我們將要深入的來理解它到底是什麼東西,並且它在一些 I/O 操作上可以幫助我們解決什麼事情。 本篇文章將分為以下幾個章節 Stream 是什麼 ? 可以解決什麼事情 ? Stream 在 IPC ...
正文開始 前二篇文章中,咱們已經學習完運算方面的優化,而接下來幾篇文章,咱們要來說明 I/O 優化這個議題。 I/O 基本上可以分為兩種,『 文件 I/O 』與『 網路 I/O 』,這兩種 I/O 操作原理大同小議,但是優化方式卻有些不同,接下來 ...
正文開始 假設你已經將你的演算法進行了優化,但是這時發現,這一項演算法工作還是需要花到非常多的時間處理,那要怎麼辦呢 ? 假設你所在的機器是多核心 CPU,那這時的確是有解,那就是本篇文章的主題 : 開啟 Process 或 Thread 來 ...
正文開始 本篇文章開始,我們將要深入的探討,每一個服務,要如何儘可能的達到高性能呢 ? 這首先第一部份,我們要探討以下主題 : 在應用層,要如何儘可能的使用越少的資源( CPU、Memory ),來做最多的事情呢 ? ...
接下來咱們會從最基本的開始 : 儘可能的優化單機性能 基本上不少高性能的書籍都是直接跳至分散式架構,但是如果一個開發者連單機都處理不好,我不太相信他開發出來的分散式架構是高性能的。 單機處理的好,才是高性能的 ...
何謂一個好的系統呢 ? 為什麼會問這個問題呢 ? 因為事實上這個是我原本想要撰寫的主題。咱們工程師在開發系統,所學習的大部份的技術,基本上都是為了追求『建立一個好的系統』,然後我本來想將建立一個好的系統的知識 ...