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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

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

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

3、moeba,實(shí)現(xiàn)mysql主從讀寫別離假設(shè)amoeba的前提條件:n Java SE 1.5 或以上 Amoeba 框架是基于開發(fā)的,采用了的特性。n 支持Mysql 協(xié)議版本10以后的版本。n 您的網(wǎng)絡(luò)環(huán)境至少運(yùn)行有一個(gè)以上的效勞1、首先介紹下我的實(shí)驗(yàn)環(huán)境。System: Master mysql:Slave mysql:Amoeba server架構(gòu)如如下所示:我這里只用了一個(gè)從數(shù)據(jù)庫(kù)!2、安裝配置mysql主從環(huán)境,mysql的安裝省略,請(qǐng)自行編譯或者用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二進(jìn)制日志server-id       = 1#設(shè)置mysql_id,主從不能相同binlog-do-db=test#設(shè)置二進(jìn)制日志記錄的庫(kù)binlog-ignore-db=mysql#設(shè)置二進(jìn)制日志不記錄的庫(kù)sync_binlog=1#修改slave的my f的配置log-b

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

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

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

9、:配置所有Query 路由規(guī)那么的信息;:配置用于解析Query 中的函數(shù)所對(duì)應(yīng)的Java 實(shí)現(xiàn)類;:配置路由規(guī)那么中需要使用到的特定函數(shù)的實(shí)現(xiàn)類;下面我們就來通過更改配置文件實(shí)現(xiàn)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><!- 對(duì)外驗(yàn)證的用戶名 -><propert

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

14、anager都將作為一個(gè)線程啟動(dòng)。manager負(fù)責(zé)Connection IO讀寫/死亡檢測(cè)-><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><!- 一臺(tái)mysqlServer 需要配置一個(gè)pool,如果多臺(tái) 平等的mysql需要進(jìn)行l(wèi)oadBalance, 簡(jiǎn)單的配置是屬性加上 virtual="true",該P(yáng)ool 不允許配置factoryConfig或者自己

16、寫一個(gè)ObjectPool。-><dbServer name="server1"><!- PoolableObjectFactory實(shí)現(xiàn)類 -><factoryConfig class=".MysqlServerConnectionFactory"><property name="manager">defaultManager</property><!- 真實(shí)mysql數(shù)據(jù)庫(kù)端口 -><property name="port">

17、;3306</property><!- 真實(shí)mysql數(shù)據(jù)庫(kù)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實(shí)現(xiàn)類 -><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實(shí)現(xiàn)類 -><factoryConfig class=".MysqlServerConnectionFactory"><property name="manager">defaultManager&l

21、t;/property><!- 真實(shí)mysql數(shù)據(jù)庫(kù)端口 -><property name="port">3306</property><!- 真實(shí)mysql數(shù)據(jù)庫(kù)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實(shí)現(xiàn)類 -><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"><!- 負(fù)載均衡參數(shù) 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-><property name="loadbalance">1</property><!- 參與該pool負(fù)載均衡的poolName列表以逗號(hào)分割 -><property name="poolNames">server1</property></poolConfig></dbServer> <dbServer name=&q

26、uot;slave" virtual="true"> <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool"> <!- 負(fù)載均衡參數(shù) 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-> <property name="loadbalance">1</property> <!- 參與該pool負(fù)載均衡的poolName列表以逗號(hào)分割 -> <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>啟動(dòng)amoeba/usr/local/amoeba/

30、bin/amoeba &檢驗(yàn)啟動(dòng)是否成功使用的是默認(rèn)的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、 測(cè)試測(cè)試之前先要保證amoeba-server有訪問兩個(gè)主從效勞器test庫(kù)的權(quán)限,在主從mysql上都執(zhí)行:grant all on test.

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

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

33、,'this_is_master');在從上插入:insert into zhang values('2','zhang','this_is_slave');接下來通過登錄amoeba-mysql上來測(cè)試讀寫: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í)行顯示在主上讀取的數(shù)據(jù)!+-+-+-+| id | name | address |+-+-+-+| 1 | zhang | this_is_master |+-+-+-+1 row in set (0.02 sec)mysql> select * from zhang;#第二次執(zhí)行select語(yǔ)句顯示是在從上讀取的數(shù)據(jù)+-+-+-+| id | name | address |+-+-+-+| 2 | zhang | this_is_slave |+-+-+-+1 row in set (0.02 sec)mysql> insert into zhang values('3','hhh','test_write'); #插入一條數(shù)據(jù),然后查詢Query OK, 1 row affe

溫馨提示

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

評(píng)論

0/150

提交評(píng)論