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

MySQL 主從復制與讀寫分離

mes 讀取數據 int tab pad 環境變量 values zxvf wall

  • Mysql主從復制作用原理
  • 1、在業務復雜的系統中,有這麽一個情景,有一句sql語句需要鎖表,導致暫時不能使用讀的服務,那麽就很影響運行中的業務,使用主從復制,讓主庫負責寫,從庫負責讀,這樣,即使主庫出現了鎖表的情景,通過讀從庫也可以保證業務的正常運作。
    2、做數據的熱備
    3、架構的擴展。業務量越來越大,I/O訪問頻率過高,單機無法滿足,此時做多庫的存儲,降低磁盤I/O訪問的頻率,提高單個機器的I/O性能。
    mysql主從復制是一個異步的復制過程,主庫發送更新事件到從庫,從庫讀取更新記錄,並執行更新記錄,使得從庫的內容與主庫保持一致。

    • Msql讀寫分離

    1:簡單來說,讀寫分離就是只在主服務器上寫,只在從服務器上讀。因為Mysql在寫入數據時會鎖定表或者行,所有需要將讀寫分離開,實現寫的同時也能讀取數據。

    2: Amoeba是一個以MySQL為底層數據存儲,並對應用提供MySQL協議接口的proxy。它集中地響應應用的請求,依據用戶事先設置的規則,將SQL請求發送到特定的數據庫上執行。基於此可以實現負載均衡、讀寫分離、高可用性等需求。與MySQL官方的MySQL Proxy相比,作者強調的是amoeba配置的方便(基於XML的配置文件,用SQLJEP語法書寫規則,比基於lua腳本的MySQL Proxy簡單)。
    3:Amoeba相當於一個SQL請求的路由器,目的是為負載均衡、讀寫分離、高可用性提供機制,而不是完全實現它們。用戶需要結合使用MySQL的 Replication等機制來實現副本同步等功能。

    • 實驗環境
    主機 IP 主要軟件
    主服務器 192.168.126.129 mysql-5.7.17、 ntp 、boost_1_59_0.tar
    從服務器1 192.168.126.130 mysql-5.7.17 、 ntp 、boost_1_59_0.tar
    從服務器2 192.168.126.131 mysql-5.7.17 、 ntp 、boost_1_59_0.tar
    Amoeba 192.168.126.132 amoeba-mysql-binary-2.2.0.tar、 jdk-6u14-linux-x64
    客戶端 192.168.126.133 mysql-5.7.17

    技術分享圖片

    • 搭建MySQL主從復制

    Mysql主從復制詳細配置:http://blog.51cto.com/13630803/2136766
    在三臺mysql上添加權限開放給amoeba訪問:
    mysql> grant all on . to test@‘192.168.126.%‘ identified by ‘123.com‘;

    • 搭建MySQL讀寫分離

      # systemctl stop firewalld.service  //關閉防火墻
      # setenforce 0 
      # cp jdk-6u14-linux-x64.bin /usr/local/
      # cd /usr/local
      # ./jdk-6u14-linux-x64.bin    //按 “回車鍵” 輸入“ yes“” 回車
      # mv jdk1.6.0_14/ /usr/local/jdk1.6

      .

      # vi /etc/profile      //添加環境變量  添加到末行
           export JAVA_HOME=/usr/local/jdk1.6
          export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
          export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin
          export AMOEBA_HOME=/usr/local/amoeba
          export PATH=$PATH:$AMOEBA_HOME/bin
          # source /etc/profile   //刷新環境變量

    .

            # mkdir /usr/local/amoeba
            # tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
            # chmod -R 755 /usr/local/amoeba/
            #  /usr/local/amoeba/bin/amoeba
                (顯示amoeba start|stop說明安裝成功)
    • 配置amoeba服務

      # vim /usr/local/amoeba/conf/amoeba.xml
      --30行--
       <property name="user">amoeba</property>
       --32行-- 
       <property name="password">123456</property>
       --115行--
       <property name="defaultPool">master</property>
       --117-去掉註釋-
       <property name="writePool">master</property>
       <property name="readPool">slaves</property>
      
      # vi conf/dbServers.xml
       -23行註釋掉  作用:默認進入test庫 以防mysql中沒有test庫時,會報錯
       <!-- <property name="schema">test</property> -->
       --26--29--去掉註釋--
       <property name="user">test</property>
       <property name="password">123.com</property>
       -----42-主服務器地址---
      <dbServer name="master"  parent="abstractServer">
      <property name="ipAddress">192.168.126.129</property>
      --52-從服務器主機名-
      <dbServer name="slave1"  parent="abstractServer">
      --55-從服務器1地址-
      <property name="ipAddress">192.168.126.130</property>
      --(這裏上面6行復制)從服務器2地址
      <dbServer name="slave2"  parent="abstractServer">
      <property name="ipAddress">192.168.126.131</property>
      --64行--
      <dbServer name="slaves" virtual="true">
      --70行--
      <property name="poolNames">slave1,slave2</property>

      技術分享圖片技術分享圖片技術分享圖片技術分享圖片技術分享圖片


    • 開啟服務

      # /usr/local/amoeba/bin/amoeba start&
      # netstat -anpt | grep java   //查看端口
    • 測試讀寫分離
    • 客戶機

      # systemctl stop firewalld.service  //關閉防火墻
      # setenforce 0
      # yum install -y mysql   //安裝mysql客戶端
      # mysql -u amoeba -p123456 -h 192.168.126.132 -P8066    //遠程登錄mysql
    • 主服務器

      # mysql -u root -p
      mysql> create database zhang;
      mysql> use zhang;
      mysql> create table zang (id int(10),name varchar(10),address varchar(20));
    • 兩臺從服務器

          mysql> stop slave;     //關閉同步
          mysql> use zhang;
          從服務器1
          mysql> insert into zang values(‘2‘,‘zhang‘,‘this_is_slave1‘);
          從服務器2
          mysq> insert into zang values(‘3‘,‘zhang‘,‘this_is_slave2‘);
    • 主服務器

      mysql> insert into zang values(‘1‘,‘zhang‘,‘this_is_master‘);
    • 客戶機
    • 如圖只能查看到 從服務器的數據

      mysql> use zhang;
      mysql> select * from zang;

    技術分享圖片

    • 客戶機

      mysql> insert into zang values(‘5‘,‘zhang‘,‘write_test‘);

      技術分享圖片
      技術分享圖片

    • 兩臺從服務器

          mysql> start slave;      //開啟同步

      技術分享圖片

    MySQL 主從復制與讀寫分離部署成功

    MySQL 主從復制與讀寫分離