1. 程式人生 > >讀寫分離及主從復制

讀寫分離及主從復制

.cn 地址 如果 err 實現 function 同步 結束 查詢

技術分享

一、主從復制要求:

  a) 至少有兩個服務器

  b) 分別設置主服務器和從服務器

  c) 對主服務器有任何操作都會同步到從服務器上

二、實現原理:

  a) MySQL中有一個日誌bin日誌(也叫二進制日誌),此日誌記錄了所有操作數據庫的的sql語句

  b) 主從復制原理實際上是多臺服務器都開啟了bin日誌,然後主服務器會把執行過的sql語句記錄到bin日誌中,之後從服務器讀取此bin日誌,把該日誌內容保存到自己日誌中去,從服務器並將記錄的sql語句執行一遍,這樣主服務器與從服務器的數據就同步了。

  c) 實現的技術:用戶的授權,log_bin日誌的開啟

  d) 問題:如何解決主從同步過程中的延遲問題?

  e) 答:在主從同步過程中添加一個緩存服務器,把剛更新的數據暫時保存在緩存服務器中

技術分享技術分享

技術分享

三、log_bin日誌

  a) 如何開啟log_bin日誌:

  1. 打開my.ini的配置文件
  2. 技術分享
  3. 技術分享
  4. Linuxmy.cnf配置文件進行配置
  5. 技術分享

  b) 如何查看log_bin日誌的內容

  1. 使用一個命令
  2. Mysqlbinlog -no-defaults 日誌文件名和路徑
  3. 技術分享

  a) Log_bin日誌的一些命令操作

  1. 前提:數據MySQL相關命令
  2. Flush logs產生一個新的log_bin日誌
  3. 技術分享
  4. 技術分享
  5. Reset master;清空以前的log_bin日誌,並產生一個新的log_bin日誌
  6. Show master status;查看最新的log_bin日誌,包括最新的POS位置
  7. 技術分享

  b) 使用log_bin日誌完成一個案例,恢復數據的一個案例

  1. 步驟 新建一張表
  2. Create table test(id int);
  3. Flush logs產生一個新的log_bin日誌文件
  4. Insert into test values(100);
  5. Insert into test values(200);
  6. Insert into test values(300);
  7. Flush logs產生一個新的log_bin日誌
  8. Delete from test
  9. 要求恢復數據
  10. 比如一家公司,在上午十點備份了一次數據,到十點半時,由於員工的誤操作,把所有數據都刪除了,要求回復到十點半
  11. 思路:打開log_bin日誌,進行分析,查找insertPOS的位置,根據POS的位置來回復數據
  12. 第一步:查看當前日誌信息
  13. 技術分享
  14. 第二步:查看操作sql位置
  15. 技術分享
  16. 第三步:使用一下命令還原
  17. Mysqlbinlog -no-default 日誌文件 -start-pos=開始pos-stop-pos=結束pos |Mysql -uroot -proot test
  18. 技術分享
  19. 技術分享

三、主從配置

  說明:在同步之前,要同步的數據庫在兩個數據庫服務器中必須都存在,兩個數據庫應該一致。開啟主從同步後,主服務器的寫操作都會同步到從服務器中

技術分享

技術分享

技術分享

  a) 配置主服務器:

  1. 主和從服務器都要開啟log_bin日誌,每臺服務器設置一個唯一的server-id的值。並重啟服務器
  2. 主服務器:47.93.58.95
  3. 技術分享
  4. 要給從服務器授權一個用戶,該用戶授權復制
  5. 技術分享
  6. 要查看主服務器裏面log_bin日誌和pos的位置(停止對主服務器的操作,暫時不往裏面做更新操作)
  7. Show master status
  8. 技術分享

  b) 配置從服務器

  1. 從服務器ip47.93.58.96
  2. 技術分享
  3. 執行stop slave停止從服務器
    1. Stop slave
    2. 技術分享
    3. 具體的配置

  a) Change master to master_host=主服務器的ip,master_user=授權的用戶名,master_password=授權的密碼,master_log_file=log_bin 日誌文件的名稱,master_log_pos=pos位置;

  b) 技術分享

  1. 開啟從服務器start slave

    a) Start salve

    b) 技術分享

    c) 查詢從服務器狀態

  1. show slave status
  2. 技術分享
    1. Slave_IO_Running:Yes
    2. 此進程負責從服務器從主服務器上讀取binlog日誌,並寫入從服務器的中繼日誌
    3. Slave_SQL_Running:Yes
    4. 此進程負責讀取並且執行中繼日誌中的binlog日誌

  a) 註:以上兩個都為yes則表名成功,只要其中一個進程的狀態是no,則表示復制進程停止,錯誤原因可以從“last_error”字段中的值看到

  1. 演示結果:

    a) 主服務器插入數據,可以在從服務器上同步

    b) 主服務器

    c) 技術分享

    d) 從服務器

    e) 技術分享

  c) 如何撤銷從服務器

  1. Stop slave
  2. Reset slave all
    1. 從服務器
    2. 技術分享
    3. 主服務器
    4. 技術分享

四、讀寫分離的實現

  a) 在層次進行設計

  b) Class mysql{

    $dbm = 主服務器

    $dbs1= 從服務器

    $dbs2= 從服務器

    Public function query(){

      在query裏面進行語句判斷,分析鏈接不同的mysql服務器

      如果是查詢則隨機鏈接兩臺從服務器,如果是修改操作,則連接主服務器

    }

  }

  c) 技術分享

  d) 技術分享

  e) 技術分享

  f) Tp框架支持讀寫分離:

  1. DB_DEPLOY_TYPE => 1 //分布式數據庫支持
  2. DB_TYPE => mysqli ,//數據庫類型
  3. DB_HOST => localhost,192.168.3.250,//服務器地址
  4. DB_NAME => php,//數據庫名
  5. DB_USER => root,//用戶名
  6. DB_PWD => root//密碼
  7. DB_PORT => 3306,//端口
  8. DB_PREFIX => ’’,
  9. DB_RW_SEPARATE => true,//支持讀寫分離

  g) 技術分享

五、說明:

  a) 以上配置為讀寫分離操作,如果需要做到讀寫分離、主從復制,還必須手動配置開啟主從復制模式

讀寫分離及主從復制