1. 程式人生 > 資料庫 >詳解如何利用amoeba(變形蟲)實現mysql資料庫讀寫分離

詳解如何利用amoeba(變形蟲)實現mysql資料庫讀寫分離

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

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

前期準備工作:

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

  1. master: 172.22.10.237:3306 ;主庫負責寫入操作;
  2. slave: 10.4.66.58:3306 ; 從庫負責讀取操作;
  3. 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命令;