mysql读写分离_Mysql数据库09MySQL读写分离
Mysql數(shù)據(jù)庫09-MySQL讀寫分離
一、讀寫分離應(yīng)用案例分析
?????? 在企業(yè)用戶中,在大量的數(shù)據(jù)請求下,單臺數(shù)據(jù)庫將無法承擔(dān)所有讀寫操作。解決方法:配置多臺數(shù)據(jù)庫服務(wù)器以實(shí)現(xiàn)主從復(fù)制+讀寫分離。
二、讀寫分離實(shí)現(xiàn)方法
1、基于程序代碼內(nèi)部實(shí)現(xiàn)
?????? 在代碼中根據(jù)select、insert進(jìn)行路由分類,這種方法目前生產(chǎn)環(huán)境中應(yīng)用最廣泛。優(yōu)點(diǎn)是性能較好,因?yàn)樵诔绦虼a中實(shí)現(xiàn),不需要增加額外的設(shè)備作為硬件開支。缺點(diǎn)是需要開發(fā)人員能來實(shí)現(xiàn),運(yùn)維人員無從下手。
2、基于中間代理層實(shí)現(xiàn)
?????? 代理一般位于客戶端和服務(wù)器之間,代理服務(wù)器接到客戶端請求后通過判斷后轉(zhuǎn)發(fā)到后端數(shù)據(jù)庫。
?????? 常見的代理服務(wù)器:
?????? ·MySQL-Proxy
?????? ·Amoeba
三、Amoeba軟件介紹
1、Amoeba簡介
?????? Amoeba(變形蟲),致力于MySQL的分布式數(shù)據(jù)庫前端代理,主要為應(yīng)用層訪問MySQL的時(shí)充當(dāng)SQL路由功能,能夠?qū)⑾嚓P(guān)的SQL路由到目標(biāo)數(shù)據(jù)庫
2、Amoeba特點(diǎn)
?????? ·負(fù)載均衡
?????? ·高可用性
?????? ·SQL過濾
?????? ·讀寫分離
?????? ·可并發(fā)請求多臺數(shù)據(jù)庫
四、Amoeba實(shí)現(xiàn)MySQL讀寫分離案例
實(shí)驗(yàn)環(huán)境:
amoeba:192.168.2.10/24
mysql-master:192.168.2.11/24
mysql-slave1:192.168.2.12/24
mysql-slave2:192.168.2.13/24
client:192.168.2.100/24
先實(shí)現(xiàn)MySQL數(shù)據(jù)庫的主從復(fù)制,方法詳見上一章,此處略
1、安裝Amoeba上安裝Java環(huán)境(推薦安裝jdk1.5或1.6,不建議安裝1.7版本)
[root@amoeba ~]# ls
amoeba-mysql-binary-2.2.0.tar.gz? install.log???????? jdk-6u14-linux-x64.bin
anaconda-ks.cfg?????????????????? install.log.syslog
[root@amoeba ~]# chmod +x jdk-6u14-linux-x64.bin
[root@amoeba ~]# ./jdk-6u14-linux-x64.bin
一路空格,輸入yes,回車完成
[root@amoeba ~]# ls
amoeba-mysql-binary-2.2.0.tar.gz? install.log??????? jdk1.6.0_14
anaconda-ks.cfg?????????????????? install.log.syslog? jdk-6u14-linux-x64.bin
[root@amoeba ~]# mv jdk1.6.0_14/ /usr/local/jdk1.6
[root@amoeba ~]# vim /etc/profile
在最后添加:
export JAVA_HOME=/usr/local/jdk1.6
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
export AMOEBA_HOME=/usr/local/amoeba/
export PATH=$PATH:$AMOEBA_HOME/bin
[root@amoeba ~]# . /etc/profile
[root@amoeba ~]# java -version
java version "1.6.0_14"
Java(TM) SE Runtime Environment (build 1.6.0_14-b08)
Java HotSpot(TM) 64-Bit Server VM (build 14.0-b16, mixed mode)
2、安裝配置Amoeba
[root@amoeba ~]# mkdir /usr/local/amoeba
[root@amoeba ~]# tar xf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
[root@amoeba ~]# chmod -R 755 /usr/local/amoeba/
[root@amoeba ~]# /usr/local/amoeba/bin/amoeba
amoeba start|stop?????? ?????? //出現(xiàn)此行用法說明,證明配置無誤
如果出現(xiàn)以下信息表示錯誤:
The stack size specified is too small, Specify at least 160k
Could not create the Java virtual machine.
當(dāng)出現(xiàn)以上報(bào)錯信息解決方法是:
[root@amoeba ~]# vi /usr/local/amoeba/bin/amoeba
修改58行的Xss參數(shù):
58 DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss128k"
修改如下:
58 DEFAULT_OPTS="-server -Xms256m -Xmx256m -Xss256k"
3、配置amoeba實(shí)現(xiàn)mysql-slave1、slave2讀負(fù)載均衡
在三臺MySQL服務(wù)器上對amoeba授權(quán)
mysql> grant all on *.* to 'admin'@'192.168.2.%' identified by '123';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
編輯amoeba.xml配置文件,設(shè)置讀寫分離
[root@amoeba ~]# cd /usr/local/amoeba/conf/
[root@amoeba conf]# ls
access_list.conf? dbserver.dtd?? functionMap.xml? rule.dtd
amoeba.dtd??????? dbServers.xml? log4j.dtd??????? ruleFunctionMap.xml
amoeba.xml??????? function.dtd?? log4j.xml??????? rule.xml
[root@amoeba conf]# cp amoeba.xml amoeba.xml.origin
[root@amoeba conf]# vim amoeba.xml
118066?????? //默認(rèn)端口8066,無需修改
30amoeba?????? //設(shè)置一個用戶,后面客戶端訪問時(shí)使用
32123456?????? ?????? //設(shè)置登錄密碼
115 master?????? //默認(rèn)的服務(wù)器池
117master?????? //寫服務(wù)器池
118slaves?????? ?????? //讀服務(wù)器池
把注釋?? -->刪掉,如下圖
編輯dbServer.xml配置文件,設(shè)置登錄MySQL服務(wù)器的用戶及密碼、MySQL服務(wù)器節(jié)點(diǎn)的IP地址、負(fù)載均衡算法
[root@amoeba conf]# cp dbServers.xml dbServers.xml.origin
[root@amoeba conf]# vim dbServers.xml
?20 3306?????? ?????? //設(shè)置MySQL連接端口,默認(rèn)3306
?26admin?????? ?????? //設(shè)置訪問MySQL服務(wù)器所用的用戶名
?27 123?????? //設(shè)置訪問MySQL服務(wù)器所用的密碼
?43master"? parent="abstractServer">?????? //設(shè)置MySQL服務(wù)器及IP地址
?46192.168.2.11
?50slave1"? parent="abstractServer">
?53 192.168.2.12
?56slave2"? parent="abstractServer">
?59192.168.2.13
?63 ?????? ?????? //在amoeba.xml文件中設(shè)置的readPool
?69 slave1,slave2?????? //前面定義的服務(wù)器節(jié)點(diǎn)名
4、啟動amoeba
[root@amoeba ~]# /usr/local/amoeba/bin/amoeba start &
[root@amoeba ~]# jobs
[1]+? Running???????????????? /usr/local/amoeba/bin/amoeba start &
[root@amoeba ~]# netstat -anpt |grep java
tcp??????? 0????? 0 ::ffff:127.0.0.1:54481????? :::*??????????????????????? LISTEN????? 1563/java??????????
tcp??????? 0????? 0 :::8066???????????????????? :::*??????????????????????? LISTEN????? 1563/java??????????
tcp??????? 0????? 0 ::ffff:192.168.2.10:58065?? ::ffff:192.168.2.11:3306??? ESTABLISHED 1563/java??????????
tcp??????? 0????? 0 ::ffff:192.168.2.10:54815?? ::ffff:192.168.2.13:3306??? ESTABLISHED 1563/java??????????
tcp??????? 0????? 0 ::ffff:192.168.2.10:53496?? ::ffff:192.168.2.12:3306??? ESTABLISHED 1563/java??????????
5、測試
此時(shí)的三臺MySQL服務(wù)器是主從備份的:
在mysql-master創(chuàng)建db_test庫及該庫下的test表
mysql> create database db_test;
Query OK, 1 row affected (0.00 sec)
mysql> use db_test;
Database changed
mysql> create table test(id int(10),name varchar(20));
Query OK, 0 rows affected (0.07 sec)
可以在slave1和slave2上查看到該庫
mysql> show databases;
+--------------------+
| Database?????????? |
+--------------------+
| information_schema |
| db_test??????????? |
| mysql????????????? |
| performance_schema |
| test?????????????? |
+--------------------+
5 rows in set (0.01 sec)
在slave1、slave2服務(wù)器上停止主從備份:
mysql> stop slave;
Query OK, 0 rows affected (0.02 sec)
在mater上添加表內(nèi)容
mysql> insert into test values(1,'master');
Query OK, 1 row affected (0.03 sec)
此前在服務(wù)器上同步了表,所以在從服務(wù)器上可以直接手動插入其他內(nèi)容
在slave1上:
mysql> use db_test;
Database changed
mysql> insert into test values(2,'slave1');
Query OK, 1 row affected (0.06 sec)
在slave2上:
mysql> use db_test;
Database changed
mysql> insert into test values(3,'slave2');
Query OK, 1 row affected (0.00 sec)
在客戶機(jī)上進(jìn)行讀測試:
[root@client ~]# yum -y install mysql?????? ?????? //安裝mysql客戶端
[root@client ~]# mysql -uamoeba -p123456 -h192.168.2.10? -P8066
(1)讀測試:
mysql> select * from db_test.test;
+------+--------+
| id?? | name?? |
+------+--------+
|??? 2 | slave1 |
+------+--------+
1 row in set (0.01 sec)
mysql> select * from db_test.test;
+------+--------+
| id?? | name?? |
+------+--------+
|??? 3 | slave2 |
+------+--------+
1 row in set (0.01 sec)
此時(shí)讀取數(shù)據(jù)庫數(shù)據(jù)時(shí),輪詢的方式從slave1、slave2上讀取
(2)寫測試:
在客戶端錄入數(shù)據(jù):
mysql> insert into db_test.test values(4,'client');
Query OK, 1 row affected (0.01 sec)
在master服務(wù)器上查看是否寫入:
mysql> select * from db_test.test;
+------+--------+
| id?? | name?? |
+------+--------+
|??? 1 | master |
|??? 4 | client |
+------+--------+
2 rows in set (0.00 sec)
此時(shí)寫入數(shù)據(jù)到數(shù)據(jù)庫時(shí),會寫入到主服務(wù)器,不會寫到從服務(wù)器上,實(shí)現(xiàn)了讀寫分離。
?????? 至此,可以驗(yàn)證,通過amoeba實(shí)現(xiàn)了MySQL的讀寫分離,寫入數(shù)據(jù)僅會寫入到mysql-master服務(wù)器上,讀取數(shù)據(jù),則以輪詢的方式從slave1、slave2兩臺服務(wù)器上讀取數(shù)據(jù),實(shí)現(xiàn)了負(fù)載均衡。
總結(jié)
以上是生活随笔為你收集整理的mysql读写分离_Mysql数据库09MySQL读写分离的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle语句转成mysql语句_如何
- 下一篇: linux cmake编译源码,linu