Upgrade to Pro — share decks privately, control downloads, hide ads and more …

R/W Splitting in Rails

Kohei Suzuki
September 19, 2014

R/W Splitting in Rails

Kohei Suzuki

September 19, 2014
Tweet

More Decks by Kohei Suzuki

Other Decks in Programming

Transcript

  1. 384QMJUUJOHJO3BJMT
    ,PIFJ4V[VLJ

    View Slide

  2. 4FMGJOUSPEVDUJPO
    ,PIFJ4V[VLJ
    !FBHMFUNU 5XJUUFS (JU)VC ʜ

    !
    $PPLQBE*OD

    View Slide

  3. 3BJMTBOENVMUJQMF%#T
    3BJMTTVQQPSUTUPFTUBCMJTIDPOOFDUJPOTUPEJ⒎FSFOU
    EBUBCBTFTGPSFBDINPEFMT
    class BlogBase < ActiveRecord::Base
    self.abstract_class = true
    establish_connection :production_blog
    end
    !
    class Article < BlogBase; end
    class Category < BlogBase; end
    !
    class Comment < ActiveRecord::Base
    establish_connection :production_comment
    end

    View Slide

  4. 3BJMTBOENVMUJQMF%#T
    38TQMJUUJOHJT/05TVQQPSUFE
    XSJUFUPUIFNBTUFS
    SFBEGSPNUIFTMBWF
    5IFSF`TTFWFSBMHFNTUPEP38TQMJUUJOHJO3BJMT
    PDUPQVT ECDIBSNFS [email protected]
    [email protected]@SFBEPOMZBCMF

    View Slide

  5. PDUPQVT
    IUUQTHJUIVCDPNUDIBOEZPDUPQVT
    4IBSEJOHBOE38TQMJUUJOHBSFTVQQPSUFE
    .JHSBUJPOJTBMTPTVQQPSUFE
    "DUJWFMZNBJOUBJOFE *UXPSLTXJUI3BJMT

    .BOZGFBUVSFT MBSHFDPEFCBTF

    View Slide

  6. [email protected]@SFBEPOMZBCMF
    [email protected]@SFBEPOMZBCMF
    0MEHFN MBTUVQMPBE

    $PPLQBEVTFEJUVOUJMSFDFOUUJNFT
    )FBWJMZNPEJpFEUPTVQQPSU3BJMT
    %P38TQMJUUJOHPOMZ
    +VTU-0$ BTPGPVS3BJMTTVQQPSUFE
    WFSTJPO

    View Slide

  7. 38TQMJUUJOH
    8FOFFE38TQMJUUJOHPOMZ
    [email protected]@SFBEPOMZBCMFJTUPPPMEBOEGSBHJMFUP
    BHHSFTTJWFDIBOHFTPG3BJMT
    *[email protected]@SFBEPOMZBCMF
    [email protected]

    View Slide

  8. [email protected]
    %P38TQMJUUJOHPOMZ
    /PTIBSEJOH
    /PNJHSBUJPOT
    'FXFSNPOLFZQBUDIFT
    JOBXFMMPSEFSFE
    NBOOFS
    IUUQTXXXqJDLSDPNQIPUPTFMMSCSPXO

    View Slide

  9. $POpHVSBUJPO
    EBUBCBTFZNM
    production_blog_master:
    adapter: mysql2
    database: blog
    username: blog_writable
    host: db-blog-master
    !
    production_blog_slave:
    adapter: mysql2
    database: blog
    username: blog_readonly
    host: db-blog-slave

    View Slide

  10. $POpHVSBUJPO
    *OJUJBMJ[FS
    SwitchPoint.configure do |config|
    config.define_switch_point :blog,
    readonly: :"#{Rails.env}_blog_slave",
    writable: :"#{Rails.env}_blog_master"
    end

    View Slide

  11. $POpHVSBUJPO
    .PEFMT
    class Article < ActiveRecord::Base
    use_switch_point :blog
    end
    !
    class Category < ActiveRecord::Base
    use_switch_point :blog
    end
    !
    class Comment < ActiveRecord::Base
    use_switch_point :comment
    end

    View Slide

  12. 1SPYZ
    5IFSF`TBQSPYZCFUXFFONPEFMTBOEEBUBCBTFT
    BOEJUEPFT38TQMJUUJOH
    Article
    Category
    Comment
    blog
    comment
    db-blog-master
    db-blog-slave
    db-comment-master
    db-comment-slave
    .PEFM 1SPYZ TXJUDIQPJOU
    %BUBCBTF

    View Slide

  13. 4XJUDIJOH
    Model.with_readonly {}$POOFDUUPUIFTMBWF
    Model.with_writable {}$POOFDUUPUIFNBTUFS
    with_readonlyBOEwith_writableDBOCFOFTUFE
    "MNPTUUIFTBNFTFNBOUJDTXJUIfrom_slaveBOE
    [email protected]@SFBEPOMZBCMF

    View Slide

  14. 5ZQJDBMVTBHF
    [email protected](&5
    SFRVFTU
    6TFwith_writableGPSXSJUJOHPS4&-&$5GSPN
    UIFNBTUFS
    6TFwith_readonlyGPSTPNFCMPDLTFOEQPJOUT
    UIBUFYFDVUFTIFBWZRVFSZ

    View Slide

  15. *OQSPEVDUJPO
    [email protected]
    BQQMJDBUJPO
    -PUTPG"DUJWF3FDPSENPEFMT JOUPUBM

    .VMUJQMFNBTUFSTMBWFEBUBCBTFT
    5IPVTBOETPGEBUBCBTFDPOOFDUJPOT

    View Slide

  16. 1PMJDZ
    ,FFQGFXFSEFQFOEFODJFTPO3BJMTJNQMFNFOUBUJPO
    /PCSBODIJOHEFQFOEJOHPO
    ActiveRecord::VERSION
    6TFDPNNPOMZVTFEGFBUVSFTBOECFIBWJPST
    %PPOFKPCŠ38TQMJUUJOH
    %PJUBUUIFSJHIUMBZFS

    View Slide

  17. $PODMVTJPO
    *DSFBUFEBTJNQMFHFNUIBUFOBCMFT38TQMJUUJOH
    JO3BJMT
    [email protected]

    View Slide