您好,登錄后才能下訂單哦!
一.MySQL讀寫分離
主數據庫處理事務性查詢,從數據庫處理select查詢。數據庫復制用來把事務性查詢導致的變更同步到從數據庫中。
二.最為常見的讀寫分離有兩種:
1.基于程序代碼實現
在代碼中根據select,insert進程路由分類;
優點:性能好,因為在代碼中實現,不需要額外的硬件設備;
缺點:需要開發人員來實現,對代碼改動比較大,不適合大型復雜應用;
2.基于代理層實現
MySQL-Proxy:隸屬于MySQL開源項目;
Amoeba:Amoeba是一個以MySQL為底層數據存儲,并對應用提供MySQL協議接口的proxy。它集中地響應應用的請求,依據用戶事先設置的規則,將SQL請求發送到特定的數據庫上執行。基于此可以實現負載均衡、讀寫分離、高可用性等需求;
三.實驗環境
OS:CentOS 6.5 x64
Amoeba:192.168.0.128
master:192.168.0.134
slave:192.168.0.135
client:192.168.0.137
三.配置主從復制
1.MySQL讀寫分離是基于主從復制配置的,先配置好主從復制,再配置讀寫分離。
主從復制博文連接:http://guoxh.blog.51cto.com/10976315/1922643
2.添加授權賬號供Amoeba訪問
master和slave:
mysql> grant all on *.* to 'proxy'@'192.168.0.128' identified by '123456'; Query OK, 0 rows affected (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.00 sec)
四.Amoeba安裝配置
1. Amoeba是基于JDK開發的,所有先安裝JAVA環境
[root@amoeba ~]# chmod +x jdk-6u14-linux-x64.bin [root@amoeba ~]# ./jdk-6u14-linux-x64.bin [root@amoeba ~]# cat /etc/profile.d/java.sh export JAVA_HOME=/usr/local/jdk1.6 export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/lib:$PATH:$HOME/bin [root@amoeba ~]# source /etc/profile.d/java.sh [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) #JAVA環境配置完成
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 ~]# ls /usr/local/amoeba/ benchmark bin changelogs.txt conf lib LICENSE.txt README.html [root@amoeba ~]# cat /etc/profile.d/amoeba.sh export AMOEBA_HOME=/usr/local/amoeba/ export PATH=$PATH:$AMOEBA_HOME/bin [root@amoeba ~]# source /etc/profile.d/amoeba.sh [root@amoeba ~]# /usr/local/amoeba/bin/amoeba amoeba start|stop # Amoeba安裝成功
3.編輯amoeba.xml配置文件
[root@amoeba conf]# cd /usr/local/amoeba/conf/ [root@amoeba conf]# cp amoeba.xml amoeba$(date +"%Y_%m_%d").xml #修改前備份一份 [root@amoeba conf]# vim amoeba.xml 27 <property name="authenticator"> 28 <bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator"> 29 30 <property name="user">amoeba</property> #設置client連接的用戶 31 32 <property name="password">amoeba</property> #設置client連接的密碼 33 34 <property name="filter"> 35 <bean class="com.meidusa.amoeba.server.IPAccessController"> 36 <property name="ipFile">${amoeba.home}/conf/access_list.conf</property> 37 </bean> 38 </property> 39 </bean> 40 </property> 112 </property> 113 <property name="sqlFunctionFile">${amoeba.home}/conf/functionMap.xml</property> 114 <property name="LRUMapSize">1500</property> 115 <property name="defaultPool">master/property> #指定默認為master 116 117 <!-- #刪除注釋 118 <property name="writePool">master</property> #指定寫操作為master 119 <property name="readPool">slaves</property> #指定讀操作為slave 120 --> #刪除注釋 121 <property name="needParse">true</property>
3.編輯dbServers.xml
25 <!-- mysql user --> 26 <property name="user">proxy</property> #填mysql授權的用戶 27 28 <!-- mysql password --> 29 <property name="password">123456</property> #填MySQL授權的用戶密碼 30 45 <dbServer name="master" parent="abstractServer"> 46 <factoryConfig> 47 <!-- mysql ip --> 48 <property name="ipAddress">192.168.0.134</property> #指定master的IP 49 </factoryConfig> 50 </dbServer> 51 52 <dbServer name="slave" parent="abstractServer"> 53 <factoryConfig> 54 <!-- mysql ip --> 55 <property name="ipAddress">192.168.0.135</property> #指定slave的IP 56 </factoryConfig> 57 </dbServer> 58 <dbServer name="slaves" virtual="true"> 59 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool"> 60 <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA--> 61 <property name="loadbalance">1</property> 62 63 <!-- Separated by commas,such as: server1,server2,server1 --> 64 <property name="poolNames">slave</property> 65 </poolConfig> 66 </dbServer>
4.啟動服務
[root@amoeba ~]# amoeba start & [1] 2666 [root@amoeba ~]# log4j:WARN log4j config load completed from file:/usr/local/amoeba/conf/log4j.xml 2017-05-07 00:42:16,692 INFO context.MysqlRuntimeContext - Amoeba for Mysql current versoin=5.1.45-mysql-amoeba-proxy-2.2.0 log4j:WARN ip access config load completed from file:/usr/local/amoeba/conf/access_list.conf 2017-05-07 00:42:17,064 INFO net.ServerableConnectionManager - Amoeba for Mysql listening on 0.0.0.0/0.0.0.0:8066. 2017-05-07 00:42:17,067 INFO net.ServerableConnectionManager - Amoeba Monitor Server listening on /127.0.0.1:56460. [root@amoeba ~]# netstat -anptl | grep java tcp 0 0 ::ffff:127.0.0.1:56460 :::* LISTEN 2666/java tcp 0 0 :::8066 :::* LISTEN 2666/java tcp 0 0 ::ffff:192.168.0.128:37361 ::ffff:192.168.0.135:3306 ESTABLISHED 2666/java tcp 0 0 ::ffff:192.168.0.128:35241 ::ffff:192.168.0.134:3306 ESTABLISHED 2666/java #Amoeba默認端口為8066
五.測試
1.客戶端連接Amoeba
[root@client ~]# mysql -uamoeba -p123456 -h 192.168.0.128 -P8066
2.新建一個數據庫
mysql> create database guoxh; Query OK, 1 row affected (0.01 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | aaa | | guoxh | | mysql | | test | +--------------------+ 5 rows in set (0.01 sec)
3.master和slave查看數據庫
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | aaa | | guoxh | #剛建的數據庫已經同步 | mysql | | test | +--------------------+ 5 rows in set (0.00 sec)
五.測試讀寫分離:
1.在master新建一個表,同步到slave上,然后關掉slave功能,在slave上插入區別語句
master:創建名為student的表
mysql> show tables; Empty set (0.00 sec) mysql> create table student (id int(10),name varchar(10),info varchar(50)); Query OK, 0 rows affected (0.01 sec) mysql> show tables; +-----------------+ | Tables_in_guoxh | +-----------------+ | student | +-----------------+ 1 row in set (0.00 sec)
slave:停止同步
mysql> show tables; +-----------------+ | Tables_in_guoxh | +-----------------+ | student | +-----------------+ 1 row in set (0.00 sec) mysql> stop slave; Query OK, 0 rows affected (0.00 sec)
master:插入區別數據
mysql> insert into student values('1','zhangsan','Mysql_master'); Query OK, 1 row affected (0.01 sec) mysql> select * from student; +------+----------+--------------+ | id | name | info | +------+----------+--------------+ | 1 | zhangsan | Mysql_master | +------+----------+--------------+ 1 row in set (0.00 sec)
slave:插入區別數據
mysql> select * from student; Empty set (0.00 sec) mysql> insert into student values('2','lisi','Mysql_slave'); Query OK, 1 row affected (0.00 sec) mysql> select * from student; +------+------+-------------+ | id | name | info | +------+------+-------------+ | 2 | lisi | Mysql_slave | +------+------+-------------+ 1 row in set (0.00 sec)
3.測試讀操作:
client:
mysql> show tables; +-----------------+ | Tables_in_guoxh | +-----------------+ | student | +-----------------+ 1 row in set (0.00 sec) mysql> select * from student; +------+------+-------------+ | id | name | info | +------+------+-------------+ | 2 | lisi | Mysql_slave | +------+------+-------------+ 1 row in set (0.00 sec) mysql> select * from student; +------+------+-------------+ | id | name | info | +------+------+-------------+ | 2 | lisi | Mysql_slave | +------+------+-------------+ 1 row in set (0.00 sec)
# 此時,讀操作已經已經全部分配到slave上面。
4.測試寫操作
client:插入一條數據,這里是看不到數據的,得到master查看
mysql> insert into student values('3','wangwu','Mysql_client'); Query OK, 1 row affected (0.00 sec) mysql> select * from student; +------+------+-------------+ | id | name | info | +------+------+-------------+ | 2 | lisi | Mysql_slave | +------+------+-------------+ 1 row in set (0.00 sec)
master:
mysql> select * from student; +------+----------+--------------+ | id | name | info | +------+----------+--------------+ | 1 | zhangsan | Mysql_master | | 3 | wangwu | Mysql_client | +------+----------+--------------+ 2 rows in set (0.00 sec)
#此時,寫操作全部分給了master。
到此為止,MySQL已經實現了讀寫分離!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。