amoeba搞定mysql主從讀寫分離_第1頁
amoeba搞定mysql主從讀寫分離_第2頁
amoeba搞定mysql主從讀寫分離_第3頁
amoeba搞定mysql主從讀寫分離_第4頁
amoeba搞定mysql主從讀寫分離_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Amoeba搞定mysql主從讀寫別離一、Amoeba 是什么Amoeba(變形蟲)工程,專注 分布式數據庫 proxy 開發(fā)。座落與Client、DB Server(s)之間。對客戶端透明。具有負載均衡、高可用性、sql過濾、讀寫別離、可路由相關的query到目標數據庫、可并發(fā)請求多臺數據庫合并結果。主要解決: 降低 數據切分帶來的復雜多數據庫結構 提供切分規(guī)那么并降低 數據切分規(guī)那么 給應用帶來的影響 降低db 與客戶端的連接數 讀寫別離二、為什么要用Amoeba目前要實現mysql的主從讀寫別離,主要有以下幾種方案:1、 通過程序實現,網上很多現成的代碼,比擬復雜,如果添加從效勞器要更改

2、多臺效勞器的代碼。2、 通過mysql-proxy來實現,由于mysql-proxy的主從讀寫別離是通過lua腳本來實現,目前l(fā)ua的腳本的開發(fā)跟不上節(jié)奏,而寫沒有完美的現成的腳本,因此導致用于生產環(huán)境的話風險比擬大,據網上很多人說mysql-proxy的性能不高。3、 自己開發(fā)接口實現,這種方案門檻高,開發(fā)本錢高,不是一般的小公司能承當得起。4、 利用阿里巴巴的開源工程Amoeba來實現,具有負載均衡、高可用性、sql過濾、讀寫別離、可路由相關的query到目標數據庫,并且安裝配置非常簡單。國產的開源軟件,應該支持,目前正在使用,不發(fā)表太多結論,一切等測試完再發(fā)表結論吧,哈哈!三、快速架設a

3、moeba,實現mysql主從讀寫別離假設amoeba的前提條件:n Java SE 1.5 或以上 Amoeba 框架是基于開發(fā)的,采用了的特性。n 支持Mysql 協(xié)議版本10以后的版本。n 您的網絡環(huán)境至少運行有一個以上的效勞1、首先介紹下我的實驗環(huán)境。System: Master mysql:Slave mysql:Amoeba server架構如如下所示:我這里只用了一個從數據庫!2、安裝配置mysql主從環(huán)境,mysql的安裝省略,請自行編譯或者用rpm安裝#在master mysql創(chuàng)立同步用戶grant replication slave,file on *.* to '

4、;replication''192.168.1.108' identified by '123456'flush privileges;#修改master的my f的配置log-bin=mysql-bin#翻開mysql二進制日志server-id       = 1#設置mysql_id,主從不能相同binlog-do-db=test#設置二進制日志記錄的庫binlog-ignore-db=mysql#設置二進制日志不記錄的庫sync_binlog=1#修改slave的my f的配置log-b

5、in=mysql-binserver-id       = 2replicate-do-db=test#設置同步的庫replicate-ignore-db=mysql#設置不同步的庫log-slave-updates#同步后記錄二進制日志slave-skip-errors=allsync_binlog=1slave-net-timeout=60分別重啟主從mysqld效勞,登錄主mysql,在主上執(zhí)行flush tables with read lock;后將test數據庫的數據copy到從上,并記錄下主上show master st

6、atusG的結果:如:mysql> show master statusG;* 1. row * Position: 1237 Binlog_Do_DB: testBinlog_Ignore_DB: mysql然后執(zhí)行unlock tables登錄從mysql,在從上執(zhí)行:stop slave;change master to master_host='192.168.1.121',master_user='replication',master_password='123456',master_log_file='', m

7、aster_log_pos=1237;start slave;show slave statusG;如果出現下面的情況,說明主從同步已經成功! Slave_IO_Running: Yes Slave_SQL_Running: Yes3、安裝JDK環(huán)境,地址 我用的是:在Amoeba server上執(zhí)行./#然后按n次空格鍵,然后輸入yes就可以了!_ ln -s /usr/java/jdkvi /etc/profile#添加如下兩行內容export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH#執(zhí)行下面的命令使更改的內容生效source /etc/p

8、rofile4、 安裝amoeba-mysql下載amoeba-mysql,目前最新版本為amoeba-mysql-mkdir /usr/local/amoeba/wget unzip amoeba-mysql-配置文件位于conf目錄下,執(zhí)行文件位于bin目錄下,解壓后發(fā)現bin目錄下的啟動文件沒有可執(zhí)行權限,請執(zhí)行:chmod -R +x /usr/local/amoeba/bin/Amoeba For MySQL 的使用非常簡單,所有的配置文件都是標準的XML 文件,總共有四個配置文件。分別為:主配置文件,配置所有數據源以及Amoeba 自身的參數設置;實現主從的話配置這個文件就可以了;

9、:配置所有Query 路由規(guī)那么的信息;:配置用于解析Query 中的函數所對應的Java 實現類;:配置路由規(guī)那么中需要使用到的特定函數的實現類;下面我們就來通過更改配置文件實現mysql主從讀寫別離,我的配置如下:<?xml version="1.0" encoding="gbk"?><!DOCTYPE amoeba:configuration SYSTEM "amoeba.dtd"><amoeba:configuration xmlns:amoeba=" :/amoeba.meidusa

10、/"><server><!- proxy server綁定的端口 -><property name="port">8066</property><!- proxy server綁定的IP -><property name="ipAddress">192.168.1.159</property><!- proxy server net IO Read thread size -><property name="readThread

11、PoolSize">100</property><!- proxy server client process thread size -><property name="clientSideThreadPoolSize">80</property><!- mysql server data packet process thread size -><property name="serverSideThreadPoolSize">100</property&g

12、t;<!- 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><!- 對外驗證的用戶名 -><propert

13、y name="user">root</property><!- 對外驗證的密碼 -><property name="password">password</property><!- query timeout( default: 60 second , TimeUnit:second) -><property name="queryTimeout">60</property></server><!- 每個ConnectionM

14、anager都將作為一個線程啟動。manager負責Connection IO讀寫/死亡檢測-><connectionManagerList><connectionManager name="defaultManager" class=".MultiConnectionManagerWrapper"><property name="subManagerClassName">.AuthingableConnectionManager</property><!- default

15、value is avaliable Processors <property name="processors">5</property> -></connectionManager></connectionManagerList><dbServerList><!- 一臺mysqlServer 需要配置一個pool,如果多臺 平等的mysql需要進行l(wèi)oadBalance, 簡單的配置是屬性加上 virtual="true",該Pool 不允許配置factoryConfig或者自己

16、寫一個ObjectPool。-><dbServer name="server1"><!- PoolableObjectFactory實現類 -><factoryConfig class=".MysqlServerConnectionFactory"><property name="manager">defaultManager</property><!- 真實mysql數據庫端口 -><property name="port">

17、;3306</property><!- 真實mysql數據庫IP -><property name="ipAddress">192.168.1.121</property><property name="schema">test</property><!- 用于登陸mysql的用戶名 -><property name="user">zhang</property><!- 用于登陸mysql的密碼 -><prop

18、erty name="password">zhang123</property></factoryConfig><!- ObjectPool實現類 -><poolConfig class=".poolable.PoolableObjectPool"><property name="maxActive">200</property><property name="maxIdle">200</property><

19、property name="minIdle">10</property><property name="minEvictableIdleTimeMillis">600000</property><property name="timeBetweenEvictionRunsMillis">600000</property><property name="testOnBorrow">true</property><prop

20、erty name="testWhileIdle">true</property></poolConfig></dbServer><dbServer name="server2"><!- PoolableObjectFactory實現類 -><factoryConfig class=".MysqlServerConnectionFactory"><property name="manager">defaultManager&l

21、t;/property><!- 真實mysql數據庫端口 -><property name="port">3306</property><!- 真實mysql數據庫IP -><property name="ipAddress">192.168.1.108</property><property name="schema">test</property><!- 用于登陸mysql的用戶名 -><property nam

22、e="user">zhang</property><!- 用于登陸mysql的密碼 -><property name="password">zhang123</property></factoryConfig><!- ObjectPool實現類 -><poolConfig class=".poolable.PoolableObjectPool"><property name="maxActive">200</

23、property><property name="maxIdle">200</property><property name="minIdle">10</property><property name="minEvictableIdleTimeMillis">600000</property><property name="timeBetweenEvictionRunsMillis">600000</property&g

24、t;<property name="testOnBorrow">true</property><property name="testWhileIdle">true</property></poolConfig></dbServer><dbServer name="master" virtual="true"><poolConfig class="com.meidusa.amoeba.server.MultipleS

25、erverPool"><!- 負載均衡參數 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-><property name="loadbalance">1</property><!- 參與該pool負載均衡的poolName列表以逗號分割 -><property name="poolNames">server1</property></poolConfig></dbServer> <dbServer name=&q

26、uot;slave" virtual="true"> <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool"> <!- 負載均衡參數 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-> <property name="loadbalance">1</property> <!- 參與該pool負載均衡的poolName列表以逗號分割 -> <property

27、name="poolNames">server1,server2</property> </poolConfig> </dbServer></dbServerList><queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter"><property name="ruleConfig">$amoeba.home/conf/rule.xml</property><pr

28、operty name="functionConfig">$amoeba.home/conf/functionMap.xml</property><property name="ruleFunctionConfig">$amoeba.home/conf/ruleFunctionMap.xml</property><property name="LRUMapSize">1500</property><property name="defaultPool&q

29、uot;>master</property><property name="writePool">master</property><property name="readPool">slave</property><property name="needParse">true</property></queryRouter></amoeba:configuration>啟動amoeba/usr/local/amoeba/

30、bin/amoeba &檢驗啟動是否成功使用的是默認的8066端口:rootCentos2 amoeba# ps aux | grep amoebaroot 24580 0.2 19.2 408912 49264 pts256m -Xmx256mrootCentos2 amoeba# netstat -lnp | grep javatcp 0 0 :ffff:192.168.1.159:8066 :* LISTEN 24580/java5、 測試測試之前先要保證amoeba-server有訪問兩個主從效勞器test庫的權限,在主從mysql上都執(zhí)行:grant all on test.

31、* to zhang'192.168.1.%' identified by 'zhang123'#用戶名密碼要和前面配置的意志flush privileges;測試的時候和我們平時使用一樣,amoeba-mysql對我們應用透明,就是個mysql的代理了!登錄mysql使用如下命令用戶名密碼和上面配置的要一致:mysql -uroot -ppassword -h192.168.1.159 -P8066登錄上去后,為了測試讀和寫必須,先把mysql的主從復制停掉,才能更清楚地看出讀寫的效勞器是哪臺,在從上使用stop slave;登錄到amoeba-mysql上,

32、使用命令mysql -uroot -ppassword -h192.168.1.159 -P8066,然后執(zhí)行寫和讀操作,查看寫的是哪臺效勞器,讀的是哪臺效勞器,實驗結果顯示:寫只在主上進行,讀在主和從都進行,比率是1:1測試步驟:還沒有停掉從同步之前,創(chuàng)立一個表:create table zhang (id int(10) ,name varchar(10),address varchar(20);在從上執(zhí)行stop slave;然后在主從上各插入一條不同數據供測試讀的時候用,在主上插入:insert into zhang values('1','zhang'

33、,'this_is_master');在從上插入:insert into zhang values('2','zhang','this_is_slave');接下來通過登錄amoeba-mysql上來測試讀寫:rootCentos2 # mysql -uroot -ppassword -h192.168.1.159 -P8066Welcome to the MySQL monitor. Commands end with ; or g.Your MySQL connection id is 14556042Server versi

34、on: -mysql-amoeba-proxy-1.3.1-BETA Source distributionType 'help;' or 'h' for help. Type 'c' to clear the buffer.mysql> use test;Database changedmysql> select * from zhang; #第一次執(zhí)行顯示在主上讀取的數據!+-+-+-+| id | name | address |+-+-+-+| 1 | zhang | this_is_master |+-+-+-+1 row in set (0.02 sec)mysql> select * from zhang;#第二次執(zhí)行select語句顯示是在從上讀取的數據+-+-+-+| id | name | address |+-+-+-+| 2 | zhang | this_is_slave |+-+-+-+1 row in set (0.02 sec)mysql> insert into zhang values('3','hhh','test_write'); #插入一條數據,然后查詢Query OK, 1 row affe

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論