Amoeba實現mysql主從讀寫分離1

這段在網上看了下關於amoeba的文章,整體感受好像要比mysql-proxy好的多,也參考了很多的資料,此文章可能與其餘文章做者會有雷同的地方,請諒解,可是此過程確實是本人親自試驗得來的.
 

試驗環境

操做系統:  SUSE Linux Enterprise Server 10 (x86_64)
 
服務器IP:  10.10.0.72  10.10.0.77  10.10.0.87
 
服務器角色:  10.10.0.72做爲mysqlmaster服務器, 0.77做爲mysqlslave服務
             ,0.87做爲amoeba服務器
 
軟件列表:    MySQL-client-community-5.1.54-1.sles10.i586.rpm
             MySQL-server-community-5.1.54-1.sles10.i586.rpm
             amoeba-mysql-1.3.1-BETA.zip
             jdk-1_5_0_16-linux-i586-rpm.bin

Amoeba的簡介

Amoeba(變形蟲)項目,專一分佈式數據proxy 開發.座落與ClientDB Server(s)之間.對客戶端透明.具備負載均衡、高可用性、sql過濾、讀寫分離、可路由相關的query到目標數據庫、可併發請求多臺數據庫合併結果.
 
主要解決了哪些問題:

下降數據切分帶來的複雜多數據庫結構

提供切分規則並下降數據切分規則給應用帶來的影響

下降db 與客戶端的鏈接數

讀寫分離
 
這裏關於mysql的安裝就不說了,網上的教程比較多.

實現mysql的主從複製

master服務器上執行以下命令:
#mysql –uroot –ptest
mysql> grant replication slave,file on *.* to 'sxit'@'10.10.0.77' identified by '123456';
mysql> flush privileges;
mysql> exit;
 
// 修改mastermy.cnf的配置
 
log-bin=mysql-bin            // 打開mysql二進制日誌
server-id = 1                // 設置mysql_id,主從不能相同
binlog-do-db=test            // 設置二進制日誌記錄的庫
sync_binlog=1      
 
// 修改slavemy.cnf的配置
 
log-bin=mysql-bin
server-id = 2
replicate-do-db=test          //
設置同步的庫
log-slave-updates            //
同步後記錄二進制日誌    
sync_binlog=1
slave-net-timeout=60
 
分別重啓主從mysqld服務,登陸master服務器.
 
master服務器上執行以下命令
 
# mysql –u root –ptest
mysql>  flush tables with read lock;
mysql>  show master status\G;
 
*************************** 1. row ***************************
 File: mysql-bin.000002
 Position: 106
 Binlog_Do_DB: test
Binlog_Ignore_DB:
 
mysql> unlock tables;
 
登錄到slave服務器,執行以下命令:
 
# mysql –u root –ptest
 
mysql>  stop slave;
 
mysql> change master to master_host='10.10.0.72', master_user='sxit', master_password='123456',
       master_log_file='mysql-bin.000002',master_log_pos=106;
 
mysql>  start slave;
 
mysql>  show slave status\G;
 
若是出現下面的狀況,說明主從同步已經成功!
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

安裝amoeba

因爲amoeba基於JDK1.5開發的,採用了JDK1.5的特性,因此咱們這裏要安裝JDK,10.10.0.87服務器上安裝相關程序
 
# chmod +x jdk-1_5_0_16-linux-i586-rpm.bin
# ./ jdk-1_5_0_16-linux-i586-rpm.bin
#  vi /etc/profile          //在文件裏面添加jdk的環境變量,添加內容以下
 
JAVA_HOME=/usr/java/jdk1.5.0_16
export JAVA_HOME
PATH=$JAVA_HOME/bin:$PATH
export PATH
CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
export CLASSPATH
 
# source  /etc/profile
 
# mkdir amoeba
# cd  /usr/local/amoeba
# unzip amoeba-mysql-1.3.1-BETA.zip
# chmod -R +x /usr/local/amoeba/bin/
 
Amoeba For MySQL 的使用很是簡單,全部的配置文件都是標準的XML 文件,總共有四個配置文件.分別爲:
 
amoeba.xml:主配置文件,配置全部數據源以及Amoeba自身的參數設置,實現主從的話配
   置這個文件就能夠了;
 
rule.xml:配置全部Query 路由規則的信息;
 
functionMap.xml:配置用於解析Query 中的函數所對應的Java 實現類;
 
rullFunctionMap.xml:配置路由規則中須要使用到的特定函數的實現類;
 
經過更改amoeba.xml配置文件實現mysql主從讀寫分離,配置以下:
 
<?xml version="1.0" encoding="gbk"?>
 
<!DOCTYPE amoeba:configuration SYSTEM "amoeba.dtd">
<amoeba:configuration xmlns:amoeba="http://amoeba.meidusa.com/">
 
        <server>
                <!-- proxy server 綁定的端口 -->
                <property name="port">8066</property>
 
                <!-- proxy server 綁定的IP -->
                <property name="ipAddress">10.10.0.87</property>
                <!-- proxy server net IO Read thread size -->
                <property name="readThreadPoolSize">20</property>
 
                <!-- proxy server client process thread size -->
                <property name="clientSideThreadPoolSize">30</property>
 
                <!-- mysql server data packet process thread size -->
                <property name="serverSideThreadPoolSize">30</property>
 
                <!-- socket Send and receive BufferSize(unit:K)  -->
                <property name="netBufferSize">128</property>
 
                <!-- Enable/disable TCP_NODELAY (disable/enable Nagle's algorithm). -->
                <property name="tcpNoDelay">true</property>
 
                <!-- 對外驗證的用戶名 -->
                <property name="user">root</property>
 
                <!-- 對外驗證的密碼 -->
              
                <property name="password">sxit</property>
 
                <!-- query timeout( default: 60 second , TimeUnit:second) -->
                <property name="queryTimeout">60</property>
        </server>
 
        <!--
                每一個ConnectionManager都將做爲一個線程啓動。
                manager 負責Connection IO讀寫/死亡檢測
        -->
        <connectionManagerList>
           <connectionManager name="defaultManager" class="com.meidusa.amoeba.net.MultiConnectionManagerWrapper">
  <property name="subManagerClassName">com.meidusa.amoeba.net.AuthingableConnectionManager
</property>
     <!--
       default value is avaliable Processors
         <property name="processors">5</property>
     -->
</connectionManager>
</connectionManagerList>
 
<dbServerList>
     <!--
        一臺mysqlServer 須要配置一個pool
        若是多臺 平等的mysql須要進行loadBalance
        平臺已經提供一個具備負載均衡能力的objectPoolcom.meidusa.amoeba.mysql.server.MultipleServerPool
         簡單的配置是屬性加上 virtual="true",Pool 不容許配置factoryConfig
         或者本身寫一個ObjectPool
     -->
<dbServer name="server1">
 
     <!-- PoolableObjectFactory 實現類 -->
        <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
             <property name="manager">defaultManager</property>
 
                <!-- 真實mysql數據庫端口 -->
                     <property name="port">3306</property>
 
                <!-- 真實mysql數據庫IP -->
                      <property name="ipAddress">10.10.0.72</property>
                      <property name="schema">test</property>
 
                <!-- 用於登錄mysql的用戶名 -->
                       <property name="user">test</property>
 
                 <!-- 用於登錄mysql的密碼 -->
 
                        <property name="password">123456</property>
 
            </factoryConfig>
 
      <!-- ObjectPool 實現類 -->
         <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
                <property name="maxActive">200</property>
                  <property name="maxIdle">200</property>
                  <property name="minIdle">10</property>
                  <property name="minEvictableIdleTimeMillis">600000
</property>
                   <property name="timeBetweenEvictionRunsMillis">600000</property>
                        <property name="testOnBorrow">true</property>
                         <property name="testWhileIdle">true</property>
                   </poolConfig>
</dbServer>
相關文章
相關標籤/搜索