MySQL 數據庫的讀寫分離

  • Mysql主從複製做用原理

一、在業務複雜的系統中,有這麼一個情景,有一句sql語句須要鎖表,致使暫時不能使用讀的服務,那麼就很影響運行中的業務,使用主從複製,讓主庫負責寫,從庫負責讀,這樣,即便主庫出現了鎖表的情景,經過讀從庫也能夠保證業務的正常運做。
二、作數據的熱備
三、架構的擴展。業務量愈來愈大,I/O訪問頻率太高,單機沒法知足,此時作多庫的存儲,下降磁盤I/O訪問的頻率,提升單個機器的I/O性能。
mysql主從複製是一個異步的複製過程,主庫發送更新事件到從庫,從庫讀取更新記錄,並執行更新記錄,使得從庫的內容與主庫保持一致。java

  • Msql讀寫分離

1:簡單來講,讀寫分離就是隻在主服務器上寫,只在從服務器上讀。由於Mysql在寫入數據時會鎖定表或者行,因此須要將讀寫分離開,實現寫的同時也能讀取數據。mysql

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

  • 實驗環境
主機 IP 主要軟件
主服務器 192.168.126.129 mysql-5.7.1七、 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主從複製

Mysql主從複製詳細配置:http://www.javashuo.com/article/p-qfmlmgtt-vc.html
在三臺mysql上添加權限開放給amoeba訪問:
mysql> grant all on . to test@'192.168.126.%' identified by '123.com';sql

  • 搭建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

    .vim

    # 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>

    MySQL 數據庫的讀寫分離MySQL 數據庫的讀寫分離MySQL 數據庫的讀寫分離MySQL 數據庫的讀寫分離MySQL 數據庫的讀寫分離


  • 開啓服務負載均衡

    # /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 數據庫的讀寫分離

  • 客戶機

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

    MySQL 數據庫的讀寫分離
    MySQL 數據庫的讀寫分離

  • 兩臺從服務器

    mysql> start slave;      //開啓同步

    MySQL 數據庫的讀寫分離

MySQL 主從複製與讀寫分離部署成功

相關文章
相關標籤/搜索