圖4mysql
那麼如何並行化,並行IO線程,仍是並行SQL線程?其實兩方面均可以並行,可是並行SQL線程的收益更大,由於SQL線程作的事情更多(解析,執行)。並行IO線程,能夠將從Master拉取和寫Relay log分爲兩個線程;並行SQL線程則能夠根據須要作到庫級並行,表級並行,事務級並行。庫級並行在mysql官方版本5.6已經實現。以下圖,並行複製框架實際包含了一個協調線程和若干個工做線程,協調線程負責分發和解決衝突,工做線程只負責執行。web
圖中,DB1,DB2和DB3的事務就能夠併發執行,提升了複製的性能。有時候庫級併發可能不夠,須要作表級併發,或更細粒度的事務級併發。sql
圖 5併發
並行複製如何處理衝突?框架
併發的世界是美好的,但不能亂併發,不然數據就亂了。Master上面經過鎖機制來保證併發的事務有序進行,那麼並行複製呢?Slave必需保證回放的順序與Master上事務執行順序一致,所以只要作到順序讀取binlog,將不衝突的事務併發執行便可。對於庫級併發而言,協調線程要保證執行同一個庫的事務放在一個工做線程串行執行;對於表級併發而言,協調線程要保證同一個表的事務串行執行;對於事務級而言,則是保證操做同一行的事務串行執行。異步
是否粒度越細,性能越好?性能
這個並非必定的。相對於串行復制而言,並行複製多了一個協調線程。協調線程一個重要做用是解決衝突,粒度越細的併發,可能會有更多的衝突,最終可能也是串行執行的,但消耗了大量的衝突檢測代價。spa