mysql 읽기와 쓰기 분리된amoeba

하나.amoeba 소개
Amoeba(아메바) 프로젝트, 오픈 소스 프레임워크는 2008년부터 Amoeba for Mysql 소프트웨어를 출시했습니다.이 소프트웨어는 MySQL의 분포식 데이터베이스 전단 프록시층에 주력하는데 주로 응용층이 MySQL에 접근할 때 SQL 루트 기능을 충당하고 분포식 데이터베이스 프록시층(Database Proxy) 개발에 전념한다.클라이언트에 투명한 위치와 Client, DB Server(s) 사이입니다.로드 밸런싱, 고가용성, SQL 필터링, 읽기/쓰기 분리, 라우팅 가능 대상 데이터베이스, 동시 요청 가능한 다중 데이터베이스 병합 결과 등이 있습니다.Amoeba를 통해 다중 데이터 소스의 고가용성, 로드 밸런싱, 데이터 슬라이싱 기능을 완성할 수 있습니다. 현재 Amoeba는 많은 기업의 생산 라인에서 사용되고 있습니다.
MySQL proxy 6.0 버전에서 읽기와 쓰기가 분리되고 읽기와 쓰기가 분리된 경우 mysql proxy를 사용하는 데 상당한 작업량이 필요합니다. 현재 mysql proxy에는 기존의 루아 스크립트가 없습니다.mysqlproxy에는 설정 파일이 전혀 없습니다. 루아 스크립트가 전부입니다. 물론 루아는 상당히 편리합니다.마찬가지로 이런 것들은 대량의 스크립트를 작성해야만 복잡한 설정을 완성할 수 있다.Amoeba for Mysql은 관련 구성만으로도 요구 사항을 충족할 수 있습니다.
현재 부족:
4
  • 현재 트랜잭션이 지원되지 않습니다. 2.당분간 저장 프로세스가 지원되지 않습니다(조만간 지원될 것)3.amoeba에서 데이터를 유도하는 장면이나 빅데이터 양 조회에 적합하지 않은query(예를 들어 한 번에 10w 이상, 심지어 더 많은 데이터를 되돌려 달라고 요청하는 경우) 4.당분간 라이브러리 리스트를 지원하지 않습니다.amoeba는 현재 데이터베이스 실례만 할 수 있고 각각의 분리된 노드는 라이브러리 구조가 일치해야 합니다

  • 4
  • 원리 흐름도 4
  • 설치amoeba
    wget http://sourceforge.net/projects/amoeba/files/Amoeba%20for%20mysql/2.x/amoeba-mysql-binary-2.1.0-RC5.tar.gz
    mkdir -pv /usr/loca/amoeba/
    tar -zxvf amoeba-mysql-binary-2.1.0-RC5.tar.gz -C/usr/loca/amoeba/
    그리고 bin 디렉터리에 들어가서 amoeba start 또는amoeba start & 백엔드 형식으로 실행하지만, 다음은 설정 파일을 먼저 봅시다.‍ 가장 유행하는 자바 백엔드 프레임워크 가져오기 [다운로드 주소]
    3 구성amoeba
    1. Amoeba가 데이터베이스 에이전트로서 많은 데이터베이스와 통신을 유지할 것이라고 생각하면 Amoeba가 에이전트로 하는 데이터베이스가 어떻게 연결되는지 알아야 한다. 예를 들어 가장 기초적인 것은 호스트 IP, 포트, Amoeba가 사용하는 사용자 이름과 비밀번호 등이다.이러한 정보는 $AMOEBA 에 저장됩니다.HOME/conf/dbServers.xml 중입니다.2. Amoeba는 데이터 분할을 완성하기 위해 완벽한 분할 규칙 설정을 제공하고, 데이터 분할, 데이터베이스를 되돌려 주는 데이터 통합을 이해하기 위해서는 분할 규칙을 알아야 한다.분리 규칙에 대한 정보는 $AMOEBA 에 저장됩니다.HOME/conf/rule.xml 중입니다.3. 우리가 SQL을 써서 데이터베이스를 조작할 때 많은 다른 데이터베이스 함수를 사용한다. 예를 들어 UNIXTIMESTAMP(), SYSDATE() 등등.이 함수들은 어떻게 Amoeba에 의해 해석됩니까? $AMOEBA_HOME/conf/functionMap.xml은 함수 이름과 함수 처리의 관계를 설명합니다.4. $AMOEBAHOME/conf/rule.xml을 설정할 때 사용자가 정의한 함수를 사용합니다. 예를 들어 사용자 ID에 대해HASH 값을 구해서 데이터를 나누어야 합니다. 이 함수들은 $AMOEBAHOME/conf/ruleFunctionMap.xml에서 정의합니다.5. Amoeba는 $AMOEBA 에 구성된 액세스 가능한 호스트 IP 주소를 지정하고 액세스를 거부할 수 있습니다.HOME/conf/access_list.conf에서 6.Amoeba는 사용자가 출력 로그 수준과 방식을 설정할 수 있도록 합니다. 설정 방법은 log4j의 파일 형식을 사용합니다. 파일은 $AMOEBA 입니다.HOME/conf/log4j.xml.
    ok
    구성하기 전에 아키텍처에 대해 살펴보겠습니다. 간단합니다. 호스트 세 대
    amoeba 192.168.127.140 한 대가 요청을 전달한다.
    마스터 한 대가 192.168.127.141로 읽기와 쓰기를 할 수 있다.
    slave 192.168.127은 읽기 조작만 할 수 있습니다.
    이 장면은 읽기 데이터량이 비교적 많기 때문에 마스터는 읽기와 쓰기를 할 수 있고 slave는 읽기만 할 수 있으며 최종 효과 읽기 비율은 마스터:slave=1:3이다.
    7 .amoeba 노드 구성
    7.1 빨간색 글꼴은 주 프로필의 주의와 수정이 필요한 부분이다
    <?xml version="1.0" encoding="gbk"?>
    <!DOCTYPE amoeba:configuration SYSTEM "amoeba.dtd">
    <amoeba:configuration xmlns:amoeba="http://amoeba.meidusa.com/">
    <proxy>
     
     <!-- service class must implements com.meidusa.amoeba.service.Service -->
     <service name="Amoeba for Mysql" class="com.meidusa.amoeba.net.ServerableConnectionManager">#1.      MySQL Proxy Service。      MongoDB Proxy Service  Aladdin Proxy Service。
     <!-- port -->
     <property name="port">8066</property> #2.          amoeba   ;
     
     <!-- bind ipAddress -->
     <!-- 
     <property name="ipAddress">192.168.127.140</property> #3.          amoeba IP,  Proxy Service             ,  Amoeba                           IP   Amoeba        。     127.0.0.1           Amoeba   。
     -->
     
     <property name="manager">${clientConnectioneManager}</property>
     
     <property name="connectionFactory">
     <bean class="com.meidusa.amoeba.mysql.net.MysqlClientConnectionFactory">
     <property name="sendBufferSize">128</property>
     <property name="receiveBufferSize">64</property>
     </bean>
     </property>
     
     <property name="authenticator">
     <bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">
     
     <property name="user">root</property> #6.          amoeba    ;
     
     <property name="password">password</property>#7.          amoeba   ;
     
     <property name="filter">
     <bean class="com.meidusa.amoeba.server.IPAccessController"> 
     <property name="ipFile">${amoeba.home}/conf/access_list.conf</property>
     </bean>
     </property>
     </bean>
     </property>
     
     </service>
     
     <!-- server class must implements com.meidusa.amoeba.service.Service -->
     <service name="Amoeba Monitor Server" class="com.meidusa.amoeba.monitor.MonitorServer">
     <!-- port -->
     <!-- default value: random number
     <property name="port">9066</property>
     -->
     <!-- bind ipAddress -->
     <property name="ipAddress">127.0.0.1</property>
     <property name="daemon">true</property>
     <property name="manager">${clientConnectioneManager}</property>
     <property name="connectionFactory">
     <bean class="com.meidusa.amoeba.monitor.net.MonitorClientConnectionFactory"></bean>
     </property>
     
     </service>
     
     <runtime class="com.meidusa.amoeba.mysql.context.MysqlRuntimeContext">#8.runtime       Proxy        ,                  SQL        。
     <!-- 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>
     
     <!-- per connection cache prepared statement size -->
     <property name="statementCacheSize">500</property>
     
     <!-- query timeout( default: 60 second , TimeUnit:second) -->
     <property name="queryTimeout">60</property>
     </runtime>
     
     </proxy>
     
     <!-- 
     Each ConnectionManager will start as thread
     manager responsible for the Connection IO read , Death Detection
     -->
     <connectionManagerList> #9.connectionManagerList           ,                 ,  clientConnectioneManager amoeba.xml      MySQL Proxy Service         ;defaultManager dbServers.xml      dbServer             。                 CPU  ,   processor   Amoeba     CPU  。
     <connectionManager name="clientConnectioneManager" class="com.meidusa.amoeba.net.MultiConnectionManagerWrapper">
     <property name="subManagerClassName">com.meidusa.amoeba.net.ConnectionManager</property>
     <!-- 
     default value is avaliable Processors 
     <property name="processors">5</property>
     -->
     </connectionManager>
     <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>
     
     <!-- default using file loader -->
     <dbServerLoader class="com.meidusa.amoeba.context.DBServerConfigFileLoader">
     <property name="configFile">${amoeba.home}/conf/dbServers.xml</property>
     </dbServerLoader>
     
     <queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
     <property name="ruleLoader">
     <bean class="com.meidusa.amoeba.route.TableRuleFileLoader">
     <property name="ruleFile">${amoeba.home}/conf/rule.xml</property>
     <property name="functionFile">${amoeba.home}/conf/ruleFunctionMap.xml</property>
     </bean>
     </property>
     <property name="sqlFunctionFile">${amoeba.home}/conf/functionMap.xml</property>
     <property name="LRUMapSize">1500</property>
     <property name="defaultPool">master</property>#10.               master    , dbServer.xml   ;
     
     <property name="writePool">master</property>#11.          master       ;
     <property name="readPool">virtualSlave</property>#12.          virtualSlave       ;
     <property name="needParse">true</property>
     </queryRouter>
    </amoeba:configuration>

    ok
    7.2 dbServer를 구성합니다.xml
    <?xml version="1.0" encoding="gbk"?>
    <!DOCTYPE amoeba:dbServers SYSTEM "dbserver.dtd">
    <amoeba:dbServers xmlns:amoeba="http://amoeba.meidusa.com/">
    <!-- 
     Each dbServer needs to be configured into a Pool,
     If you need to configure multiple dbServer with load balancing that can be simplified by the following configuration:
     add attribute with name virtual = "true" in dbServer, but the configuration does not allow the element with name factoryConfig
     such as ‘multiPool‘ dbServer 
     -->
     <dbServer name="abstractServer" abstractive="true"> #1.  dbServers     ,       dbServer  ,     dbServer     。    abstractServer dbServer, abstractive   true,           dbServer  ,     dbServer    。
     <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
     <property name="manager">${defaultManager}</property> #2.manager    dbServer        (ConnectionManager),     amoeba.xml   
     <property name="sendBufferSize">64</property>
     <property name="receiveBufferSize">128</property>
     <!-- mysql port -->
     <property name="port">3306</property>#3.     
     <!-- mysql schema -->
     <property name="schema">dongdong</property>#4.     
     <!-- mysql user -->
     <property name="user">haha</property>#5.            ,                  ;
     <!-- mysql password -->
     <property name="password">haha123</property>#6.haha       
     </factoryConfig>
    <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">#7.dbServer  poolConfig   ,                    ,                 。
     <property name="maxActive">500</property>
     <property name="maxIdle">500</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><dbServer name="master" parent="abstractServer">#8.  master abstractServer   ,parent          dbServer,    abstractServer ipAddress         IP  ,    、     、           abstractServer   。
     <factoryConfig>
     <!-- mysql ip -->
     <property name="ipAddress">192.168.127.141</property>#9.master   ;
     </factoryConfig>
     </dbServer>
     <dbServer name="slave" parent="abstractServer">
     <factoryConfig>
     <!-- mysql ip -->
     <property name="ipAddress">192.168.127.142</property>#9.slave   ;
     </factoryConfig>
     </dbServer>
     <dbServer name="virtualSlave" virtual="true">#10.            ,          。             :multiPool           ,                       。               server1,       ROUNDROBIN(  )。                         。
     <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
     <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
     <property name="loadbalance">1</property>
     <!-- Separated by commas,such as: server1,server2,server1 -->
     <property name="poolNames">master,slave,slave,slave</property>#11.  master slave                   ,   1:3
     </poolConfig>
     </dbServer>
    </amoeba:dbServers>

    abstractServer를 추가로 정의하는 이유: 우리가 데이터베이스 그룹을 관리해야 할 때 이 데이터베이스 그룹의 노드의 대부분 정보는 같을 수 있다. 예를 들어 포트 번호, 사용자 이름, 비밀번호 등이다.따라서 이러한 공통적으로 정의된 abstractServer를 귀납함으로써dbServers 프로필을 크게 간소화시켰다.
    넷.amoeba 실행 및 테스트
    1./usr/loca/amoeba/bin/amoeba start &

    로그 표시
    open socket channel to server[192.168.127.141:3306] success!
    open socket channel to server[192.168.127.142:3306] success!

    만약 표시되지 않으면 백엔드 데이터베이스에 연결되지 않았다는 것을 증명한다. 필자는 이전에 연결되지 않은 것이 하나 있는데 그 결과 프로필 안의 주석이 제거되지 않았기 때문이다. o(□╰)o
    2. 실제 환경은 마스터와 슬레이브가 동기화되어야 하기 때문에 본고의 중점이 아니라 다른 문장을 볼 수 있다.
    이 전제는 slave의 동기화를 닫는 것이다. slave에서 stop slave를 닫는다. 그러나 대량의 테스트 데이터가 있다면 slave가 마스터의 데이터베이스를 동기화해서 닫아도 ok이다.
    마스터와 슬레이브에 각각 데이터베이스 만들기
    grant all privileges on hehe.* to hehe@‘%‘ indefied by ‘hehe123‘;
     flush privileges;
    create database hehe;
     use hehe;
    create tables heheta(id int(10),name varchar(20));
    insert into heheta (id,name,address)value(‘9,‘master‘,‘100‘);  master    
    insert into heheta (id,name,address)value(‘10‘,‘slave‘,‘101‘); slave    
       amoeba           
    mysql -uroot -ppassword -h192.168.127.140 -P8066
    use heheta;
    mysql> select * from heheta;
    +------+-------+---------+
    | id | name | address |
    +------+-------+---------+
    | 10 | slave | 101 |
    +------+-------+---------+
    1 row in set (0.01 sec)
    mysql> select * from heheta;
    +------+-------+---------+
    | id | name | address |
    +------+-------+---------+
    | 10 | slave | 101 |
    +------+-------+---------+
    1 row in set (0.00 sec)
    mysql> select * from heheta;
    +------+-------+---------+
    | id | name | address |
    +------+-------+---------+
    | 10 | slave | 101 |
    +------+-------+---------+
    1 row in set (0.01 sec)
    mysql> select * from heheta;
    +------+--------+---------+
    | id | name | address |
    +------+--------+---------+
    | 9 | master | 100 |
    +------+--------+---------+
    1 row in set (0.01 sec)

    읽기 비율 마스터:slave=1:3
          
    insert into heheta(id,name,address)value(‘11‘,‘adddata‘,‘102‘);
                master      
    mysql> select * from heheta;
    +------+-------+---------+
    | id | name | address |
    +------+-------+---------+
    | 10 | slave | 101 |
    +------+-------+---------+
    1 row in set (0.01 sec)
    mysql> select * from heheta;
    +------+---------+---------+
    | id | name | address |
    +------+---------+---------+
    | 9 | master | 100 |
    | 11 | adddata | 102 |
    +------+---------+---------+
    2 rows in set (0.02 se

    좋은 웹페이지 즐겨찾기