mysql slave,master配置

          Posted on 2011-01-21 11:09 李春生 閱讀(2939) 評論(0)  編輯  收藏 所屬分類: linuxmysql

          一個完整的mysql讀寫分離環(huán)境包括以下幾個部分:

          應(yīng)用程序client
          database proxy
          database集群
          在本次實戰(zhàn)中,應(yīng)用程序client基于c3p0連接后端的database proxy。database proxy負責管理client實際訪問database的路由策略,采用開源框架amoeba。database集群采用mysql的master-slave的replication方案。整個環(huán)境的結(jié)構(gòu)圖如下所示:

           

          實戰(zhàn)步驟與詳解

          一.搭建mysql的master-slave環(huán)境

          1)分別在host1(10.20.147.110)和host2(10.20.147.111)上安裝mysql(5.0.45),具體安裝方法可見官方文檔

          2)配置master

          首先編輯/etc/my.cnf,添加以下配置:

          log-bin=mysql-bin #slave會基于此log-bin來做replication
          server-id=1 #master的標示
          binlog-do-db = amoeba_study #用于master-slave的具體數(shù)據(jù)庫

          然后添加專門用于replication的用戶:

          mysql> GRANT REPLICATION SLAVE ON *.* TO repl@10.20.147.111 IDENTIFIED BY '111111';

          重啟mysql,使得配置生效:

          /etc/init.d/mysqld restart

          最后查看master狀態(tài):

           

          3)配置slave

          首先編輯/etc/my.cnf,添加以下配置:

          server-id=2 #slave的標示

          配置生效后,配置與master的連接:

          mysql> CHANGE MASTER TO
              -> MASTER_HOST='10.20.147.110',
              -> MASTER_USER='repl',
              -> MASTER_PASSWORD='111111',
              -> MASTER_LOG_FILE='mysql-bin.000003',
              -> MASTER_LOG_POS=161261;

          其中MASTER_HOST是master機的ip,MASTER_USER和MASTER_PASSWORD就是我們剛才在master上添加的用戶,MASTER_LOG_FILE和MASTER_LOG_POS對應(yīng)與master status里的信息

          最后啟動slave:

          mysql> start slave;

          4)驗證master-slave搭建生效

          通過查看slave機的log(/var/log/mysqld.log):

          100703 10:51:42 [Note] Slave I/O thread: connected to master 'repl@10.20.147.110:3306',  replication started in log 'mysql-bin.000003' at position 161261

          如看到以上信息則證明搭建成功,如果有問題也可通過此log找原因

          二.搭建database proxy

          此次實戰(zhàn)中database proxy采用amoeba ,它的相關(guān)信息可以查閱官方文檔,不在此詳述

          1)安裝amoeba

          下載amoeba(1.2.0-GA)后解壓到本地(D:\openSource\amoeba-mysql-1.2.0-GA),即完成安裝

          2)配置amoeba

          先配置proxy連接和與各后端mysql服務(wù)器連接信息(D:\openSource\amoeba-mysql-1.2.0-GA\conf\amoeba.xml):

          <server> 
              <!-- proxy server綁定的端口 --> 
              <property name="port">8066</property> 
                
              <!-- proxy server綁定的IP --> 
              <!--  
              <property name="ipAddress">127.0.0.1</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">root</property> 
          </server> 
          <server>
           <!-- proxy server綁定的端口 -->
           <property name="port">8066</property>
           
           <!-- proxy server綁定的IP -->
           <!--
           <property name="ipAddress">127.0.0.1</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">root</property>
          </server>

          以上是proxy提供給client的連接配置

          <dbServerList> 
              <dbServer name="server1">           
                  <!-- PoolableObjectFactory實現(xiàn)類 --> 
                  <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory"> 
                      <property name="manager">defaultManager</property> 
                        
                      <!-- 真實mysql數(shù)據(jù)庫端口 --> 
                      <property name="port">3306</property> 
                        
                      <!-- 真實mysql數(shù)據(jù)庫IP --> 
                      <property name="ipAddress">10.20.147.110</property> 
                      <property name="schema">amoeba_study</property> 
                        
                      <!-- 用于登陸mysql的用戶名 --> 
                      <property name="user">root</property> 
                        
                      <!-- 用于登陸mysql的密碼 --> 
                      <property name="password"></property> 
                        
                  </factoryConfig> 
                    
                  <!-- ObjectPool實現(xiàn)類 --> 
                  <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> 
              <dbServer name="server2"> 
                    
                  <!-- PoolableObjectFactory實現(xiàn)類 --> 
                  <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory"> 
                      <property name="manager">defaultManager</property> 
                        
                      <!-- 真實mysql數(shù)據(jù)庫端口 --> 
                      <property name="port">3306</property> 
                        
                      <!-- 真實mysql數(shù)據(jù)庫IP --> 
                      <property name="ipAddress">10.20.147.111</property> 
                      <property name="schema">amoeba_study</property> 
                        
                      <!-- 用于登陸mysql的用戶名 --> 
                      <property name="user">root</property> 
                        
                      <!-- 用于登陸mysql的密碼 --> 
                      <property name="password"></property> 
                        
                  </factoryConfig> 
                    
                  <!-- ObjectPool實現(xiàn)類 --> 
                  <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>         
          </dbServerList> 
          <dbServerList>
           <dbServer name="server1">   
            <!-- PoolableObjectFactory實現(xiàn)類 -->
            <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
             <property name="manager">defaultManager</property>
             
             <!-- 真實mysql數(shù)據(jù)庫端口 -->
             <property name="port">3306</property>
             
             <!-- 真實mysql數(shù)據(jù)庫IP -->
             <property name="ipAddress">10.20.147.110</property>
             <property name="schema">amoeba_study</property>
             
             <!-- 用于登陸mysql的用戶名 -->
             <property name="user">root</property>
             
             <!-- 用于登陸mysql的密碼 -->
             <property name="password"></property>
             
            </factoryConfig>
            
            <!-- ObjectPool實現(xiàn)類 -->
            <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>
           <dbServer name="server2">
            
            <!-- PoolableObjectFactory實現(xiàn)類 -->
            <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
             <property name="manager">defaultManager</property>
             
             <!-- 真實mysql數(shù)據(jù)庫端口 -->
             <property name="port">3306</property>
             
             <!-- 真實mysql數(shù)據(jù)庫IP -->
             <property name="ipAddress">10.20.147.111</property>
             <property name="schema">amoeba_study</property>
             
             <!-- 用于登陸mysql的用戶名 -->
             <property name="user">root</property>
             
             <!-- 用于登陸mysql的密碼 -->
             <property name="password"></property>
             
            </factoryConfig>
            
            <!-- ObjectPool實現(xiàn)類 -->
            <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>  
          </dbServerList>

          以上是proxy與后端各mysql數(shù)據(jù)庫服務(wù)器配置信息,具體配置見注釋很明白了

          最后配置讀寫分離策略:

          <queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter"> 
              <property name="LRUMapSize">1500</property> 
              <property name="defaultPool">server1</property> 
              <property name="writePool">server1</property> 
              <property name="readPool">server2</property> 
              <property name="needParse">true</property> 
          </queryRouter> 
          <queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
           <property name="LRUMapSize">1500</property>
           <property name="defaultPool">server1</property>
           <property name="writePool">server1</property>
           <property name="readPool">server2</property>
           <property name="needParse">true</property>
          </queryRouter>

          從以上配置不然發(fā)現(xiàn),寫操作路由到server1(master),讀操作路由到server2(slave)

          3)啟動amoeba

          在命令行里運行D:\openSource\amoeba-mysql-1.2.0-GA\amoeba.bat即可:

          log4j:WARN log4j config load completed from file:D:\openSource\amoeba-mysql-1.2.0-GA\conf\log4j.xml
          log4j:WARN ip access config load completed from file:D:\openSource\amoeba-mysql-1.2.0-GA/conf/access_list.conf
          2010-07-03 09:55:33,821 INFO  net.ServerableConnectionManager - Server listening on 0.0.0.0/0.0.0.0:8066.
          三.client端調(diào)用與測試

          1)編寫client調(diào)用程序

          具體程序細節(jié)就不詳述了,只是一個最普通的基于mysql driver的jdbc的數(shù)據(jù)庫操作程序

          2)配置數(shù)據(jù)庫連接

          本client基于c3p0,具體數(shù)據(jù)源配置如下:

          <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" 
              destroy-method="close"> 
              <property name="driverClass" value="com.mysql.jdbc.Driver" /> 
              <property name="jdbcUrl" value="jdbc:mysql://localhost:8066/amoeba_study" /> 
              <property name="user" value="root" /> 
              <property name="password" value="root" /> 
              <property name="minPoolSize" value="1" /> 
              <property name="maxPoolSize" value="1" /> 
              <property name="maxIdleTime" value="1800" /> 
              <property name="acquireIncrement" value="1" /> 
              <property name="maxStatements" value="0" /> 
              <property name="initialPoolSize" value="1" /> 
              <property name="idleConnectionTestPeriod" value="1800" /> 
              <property name="acquireRetryAttempts" value="6" /> 
              <property name="acquireRetryDelay" value="1000" /> 
              <property name="breakAfterAcquireFailure" value="false" /> 
              <property name="testConnectionOnCheckout" value="true" /> 
              <property name="testConnectionOnCheckin" value="false" /> 
          </bean> 
          <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
           destroy-method="close">
           <property name="driverClass" value="com.mysql.jdbc.Driver" />
           <property name="jdbcUrl" value="jdbc:mysql://localhost:8066/amoeba_study" />
           <property name="user" value="root" />
           <property name="password" value="root" />
           <property name="minPoolSize" value="1" />
           <property name="maxPoolSize" value="1" />
           <property name="maxIdleTime" value="1800" />
           <property name="acquireIncrement" value="1" />
           <property name="maxStatements" value="0" />
           <property name="initialPoolSize" value="1" />
           <property name="idleConnectionTestPeriod" value="1800" />
           <property name="acquireRetryAttempts" value="6" />
           <property name="acquireRetryDelay" value="1000" />
           <property name="breakAfterAcquireFailure" value="false" />
           <property name="testConnectionOnCheckout" value="true" />
           <property name="testConnectionOnCheckin" value="false" />
          </bean>

          值得注意是,client端只需連到proxy,與實際的數(shù)據(jù)庫沒有任何關(guān)系,因此jdbcUrl、user、password配置都對應(yīng)于amoeba暴露出來的配置信息

          3)調(diào)用與測試

          首先插入一條數(shù)據(jù):insert into zone_by_id(id,name) values(20003,'name_20003')

          通過查看master機上的日志/var/lib/mysql/mysql_log.log:

          100703 11:58:42       1 Query       set names latin1
                                1 Query       SET NAMES latin1
                                1 Query       SET character_set_results = NULL
                                1 Query       SHOW VARIABLES
                                1 Query       SHOW COLLATION
                                1 Query       SET autocommit=1
                                1 Query       SET sql_mode='STRICT_TRANS_TABLES'
                                1 Query       SHOW VARIABLES LIKE 'tx_isolation'
                                1 Query       SHOW FULL TABLES FROM `amoeba_study` LIKE 'PROBABLYNOT'
                                1 Prepare     [1] insert into zone_by_id(id,name) values(?,?)
                                1 Prepare     [2] insert into zone_by_id(id,name) values(?,?)          
                                1 Execute     [2] insert into zone_by_id(id,name) values(20003,'name_20003')

          得知寫操作發(fā)生在master機上

          通過查看slave機上的日志/var/lib/mysql/mysql_log.log:

          100703 11:58:42       2 Query       insert into zone_by_id(id,name) values(20003,'name_20003')

          得知slave同步執(zhí)行了這條語句

          然后查一條數(shù)據(jù):select t.name from zone_by_id t where t.id = 20003

          通過查看slave機上的日志/var/lib/mysql/mysql_log.log:

          100703 12:02:00      33 Query       set names latin1
                               33 Prepare     [1] select t.name from zone_by_id t where t.id = ?
                               33 Prepare     [2] select t.name from zone_by_id t where t.id = ?   
                               33 Execute     [2] select t.name from zone_by_id t where t.id = 20003 

          得知讀操作發(fā)生在slave機上

          并且通過查看slave機上的日志/var/lib/mysql/mysql_log.log發(fā)現(xiàn)這條語句沒在master上執(zhí)行

          通過以上驗證得知簡單的master-slave搭建和實戰(zhàn)得以生效

           

          本文來自CSDN博客,轉(zhuǎn)載請標明出處:http://blog.csdn.net/cutesource/archive/2010/07/03/5710645.aspx


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           

          posts - 5, comments - 10, trackbacks - 0, articles - 23

          Copyright © 李春生

          主站蜘蛛池模板: 油尖旺区| 安仁县| 洛扎县| 敦煌市| 唐山市| 福鼎市| 大姚县| 申扎县| 元谋县| 遵化市| 峨眉山市| 平阴县| 中宁县| 阿克苏市| 隆安县| 商南县| 滕州市| 广南县| 长丰县| 弥勒县| 阿坝| 鹤峰县| 九龙城区| 侯马市| 凤台县| 龙口市| 广水市| 商南县| 青龙| 广平县| 江城| 革吉县| 南澳县| 通城县| 辽阳市| 手游| 罗平县| 太康县| 汽车| 伊通| 霞浦县|