1. 程式人生 > 實用技巧 >變形蟲實現mysql資料庫讀寫分離詳析

變形蟲實現mysql資料庫讀寫分離詳析

  關於mysql的讀寫分離架構有很多,百度的話幾乎都是用mysql_proxy實現的。由於proxy是基於lua指令碼語言實現的,所以網上不少網友表示proxy效率不高,也不穩定,不建議在生產環境使用;

  amoeba是阿里開發的一款資料庫讀寫分離的專案(讀寫分離只是它的一個小功能),由於是基於java編寫的,所以執行環境需要安裝jdk;

  前期準備工作:

  1.兩個資料庫,一主一從,主從同步;

  master: 172.22.10.237:3306 ;主庫負責寫入操作;

  slave: 10.4.66.58:3306 ; 從庫負責讀取操作;

  amoeba: 172.22.10.237:8066 ; 我把amoeba安裝到了主庫所在的伺服器,當然,你也可以安裝到第三臺伺服器上;

  所有伺服器作業系統均為centos7;

  2.在amoeba所在的伺服器上配置安裝jdk;

  我安裝的是jdk1.8;

  路徑是: JAVA_HOME=/usr/local/java/jdk1.8.0_131

  以上務必自己點搭建、配置好,主從正常工作,新增jdk環境變數: /etc/profile ;

  安裝amoeba的方式有很多,這裡就不在安裝上面費口舌了,我下載了amoeba-mysql-3.0.5-RC-distribution的安裝包,直接解壓即可使用;

  解壓目錄: /usr/local/amoeba/

  很明顯 conf裡是配置檔案,bin裡是啟動程式;

  剛才說到 amoeba的功能可不止讀寫分離,但如果只用讀寫分離功能的話只需要配置這幾個個檔案即可: conf/dbServers.xml conf/amoeba.xml 和 bin/launcher ;

  conf/dbServers.xml :

 `<property name="port">3306</property>  
           #設定Amoeba要連線的mysql資料庫的埠,預設是3306
    <property name="schema">testdb</property>  
          #設定預設的資料庫,當連線amoeba時,操作表必須顯式的指定資料庫名,即採用dbname.tablename的方式,不支援 use dbname指定預設庫,因為操作會排程到各個後端dbserver
    <property 
name="user">test1</property>   #設定amoeba連線後端資料庫伺服器的賬號和密碼,因此需要在所有後端資料庫上建立該使用者,並授權amoeba伺服器可連線 <property name="password">111111</property> <property name="maxActive">500</property>  #最大連線數,預設500 <property name="maxIdle">500</property>    #最大空閒連線數 <property name="minIdle">1</property>    #最新空閒連線數 <dbServer name="writedb" parent="abstractServer">  #設定一個後端可寫的資料庫,這裡定義為writedb,這個名字可以任意命名,後面還會用到 <property name="ipAddress">172.22.10.237</property> #設定後端可寫dbserver的ip <dbServer name="slave01" parent="abstractServer">  #設定後端可讀資料庫 <property name="ipAddress">10.4.66.58</property> <dbServer name="myslave" virtual="true">  #設定定義一個虛擬的dbserver,實際上相當於一個dbserver組,這裡將可讀的資料庫ip統一放到一個組中,將這個組的名字命名為myslave <property name="loadbalance">1</property>  #選擇排程演算法,1表示複製均衡,2表示權重,3表示HA, 這裡選擇1 <property name="poolNames">slave01</property>  #myslave組成員`

conf/amoeba.xml :

<property name="port">8066</property>    
        #設定amoeba監聽的埠,預設是8066
        <property name="ipAddress">127.0.0.1</property> 
                #配置監聽的介面,如果不設定,預設監聽所以的IP
                # 提供客戶端連線amoeba時需要使用這裡設定的賬號 (這裡的賬號密碼和amoeba連線後端資料庫伺服器的密碼無關)
            <property name="user">root</property> 
            <property name="password">123456</property>

        <property name="defaultPool">myslave</property>  
                #設定amoeba預設的池,這裡設定為writedb
        <property name="writePool">master</property>  
                #這兩個選項預設是登出掉的,需要取消註釋,這裡用來指定前面定義好的倆個讀寫池
        <property name="readPool">slave01</property>

bin/launcher :

        #啟動指令碼,需要配置jdk環境變數;
        #在註釋後的第一行新增:
        JAVA_HOME=/usr/local/java/jdk1.8.0_131

  launcher 是啟動指令碼,如果不配置JAVA_HOME的話,即便你在/etc/profile中配置了環境變數也可能會報錯:沒有配置jdk環境變數;

  還有一個配置檔案: jvm.properties

   #佔用記憶體配置檔案
        # -Xss引數有最小值要求,必須大於228才能啟動JVM
        #修改:
            JVM_OPTIONS="-server -Xms1024m -Xmx1024m -Xss256k -XX:PermSize=16m -XX:MaxPermSize=96m"

  有經驗的運維都知道,凡是和jdk沾上邊的,基本都會和記憶體的調優有關係,amoeba也不例外;

  現在可以啟動了:

啟動後就可以看到本機的8066埠:

  這時,你只需要通過本機ip的8066埠和你配置檔案中設定的賬號密碼來連線資料庫就行了,寫入的資料都會到master裡,讀取的資料都會從slave中讀取;

  測試:

  關閉master資料庫,依然可以讀取:執行 select 檢視命令;

  或者

  關閉slave資料庫,依然可以寫入: 執行 update、inster命令;