一、MySQL讀寫分離
1.1 原理
- 讀寫分離就是只在主服務器上寫,只在從服務器上讀
- 主數據庫處理事務性査詢,而從數據庫處理 select査詢
- 數據庫復制被用來把事務性査詢導致的變更同步到集群中的從數據庫
1.2 為什么要讀寫分離
- 因為數據庫的“寫”(寫10000條數據到oracle可能要3分鍾)操作是比較耗時的。
- 但是數據庫的“讀”(從oracle讀10000條數據可能只要5秒鍾)。
- 所以讀寫分離,解決的是,數據庫的寫入,影響了查詢的效率。
二、讀寫分離的基礎:主從復制
- 可以說沒有主從復制的技術就沒有讀寫分離策略
- 主從復制的搭建詳情可以看我的博客:https://www.cnblogs.com/bushilengmo/p/13668756.html
三、讀寫分離實驗
3.1 環境
-
VMware軟件
-
環境依賴上一篇博客做的主從復制的結果
-
一台centos7服務器當做client
-
一台centos7服務器作為Amoeba服務器
-
三台centos7服務器作為mysql數據庫服務器,一主二從
3.2 實驗過程
3.2.1 關閉防火牆 關閉核心防護
3.2.2 搭建mysql主從復制環境(上篇you詳細過程)
3.2.3 Amoeba服務器環境安裝
amoeba是給予jdk1.5開發的,建議使用1.5或者1.6的環境,不要太高
上傳JDK到opt目錄
[root@localhost ~]# cd /opt
[root@localhost opt]# tar xzvf jdk-8u144-linux-x64.tar.gz
[root@localhost opt]# cp -rv jdk1.8.0_144/ /usr/local/java
[root@localhost opt]# vi /etc/profile ##在末尾添加
export JAVA_HOME=/usr/local/java
export JRE_HOME=/usr/local/java/jre
export PATH=$PATH:/usr/local/java/bin
export CLASSPATH=./:/usr/local/java/lib:/usr/local/java/jre/lib
3.2.4 配置Amoeba讀寫分離,slave1和slave2讀負載均衡
- 三台mysql服務器添加權限和用戶開放給amoeba訪問
mysql> GRANT ALL ON *.* TO test@'192.168.79.%' IDENTIFIED BY 'abc123';
- 配置amoeba服務器
1 [root@amoeba mnt]# cd /usr/local/amoeba/conf/ 2 [root@amoeba conf]# vim amoeba.xml '//編輯amoeba主配置文件' 3 '//此段設置的是客戶端通過amoeba用戶和123456密碼訪問amoeba服務器' 4 <property name="user">amoeba</property> '//第30行開始修改用戶名' 5 6 <property name="password">123456</property> '//使用123456密碼訪問amoeba服務器' 7 8 '//移動到117行,開啟讀寫功能池設定' 9 <property name="defaultPool">master</property> '//115行修改' 10 <!-- --> '//117行取消注釋' 11 <property name="writePool">master</property> '//118行修改' 12 <property name="readPool">slaves</property> '//119行修改' 13 '//120行刪除-->注釋符號' 14 15 [root@amoeba conf]# vim dbServers.xml '//編輯數據庫配置文件' 16 <property name="schema">mysql</property> '//23行test修改為mysql' 17 18 '//設置amoeba訪問mysql數據庫的用戶和密碼' 19 <property name="user">test</property> '//26行修改用戶名' 20 21 <!-- mysql password--> '//28行-30行取消注釋' 22 <property name="password">123.com</property> '//29行修改密碼' 23 24 <dbServer name="master" parent="abstractServer"> '//45行主mysql服務器名稱修改為master' 25 <property name="ipAddress">192.168.79.135</property> '48行//修改主服務器IP' 26 27 <dbServer name="slave1" parent="abstractServer"> '//52行修改從服務器名稱' 28 <property name="ipAddress">192.168.79.135</property> '//55行修改從服務器IP' 29 '//第一個從服務器段后插入第二個從服務器配置' 30 <dbServer name="slave2" parent="abstractServer"> 31 <factoryConfig> 32 <!-- mysql ip --> 33 <propertyname="ipAddress">192.168.79.136</property> 34 </factoryConfig> 35 </dbServer> 36 '//修改數據庫從服務器池' 37 <dbServer name="slaves" virtual="true"> '//66行修改服務器吃名稱為slaves' 38 <property name="poolNames">slave1,slave2</property> '//72行添加兩個從服務器名稱slave1,slave2'
3.2.5 啟動Amoeba軟件
- 開啟amoeba軟件,放到后台運行
1 [root@amoeba conf]# /usr/local/amoeba/bin/amoeba start & 2 [1] 63847 3 [root@amoeba conf]# log4j:WARN log4j config load completed from file:/usr/local/amoeba/conf/log4j.xml 4 2020-01-08 23:38:40,817 INFO context.MysqlRuntimeContext - Amoeba for Mysql current versoin=5.1.45-mysql-amoeba-proxy-2.2.0 5 log4j:WARN ip access config load completed from file:/usr/local/amoeba/conf/access_list.conf 6 2020-01-08 23:38:41,113 INFO net.ServerableConnectionManager - Amoeba for Mysql listening on 0.0.0.0/0.0.0.0:8066. 7 2020-01-08 23:38:41,122 INFO net.ServerableConnectionManager - Amoeba Monitor Server listening on /127.0.0.1:23097. 8 '//此時處於持續監控狀態,無法輸入命令'
3.3 驗證實驗
- 測試讀寫分離,關閉主從復制功能
mysql> stop slave; Query OK, 0 rows affected (0.00 sec) mysql> show slave status\G; ...省略內容 Slave_IO_Running: No '//發現功能已被關閉' Slave_SQL_Running: No ...省略內容
- 從服務器配置數據,驗證讀寫分離
1 MySQL [(none)]> create database siku; '//客戶端創建庫' 2 '//會發現主服務器有,但是從服務器沒有,說明主從復制功能已經關閉' 3 '//slave1從服務器設置:都有erku的庫,所以各自在erku創建yibiao並插入不同數據' 4 mysql> use erku; 5 Database changed 6 mysql> create table yibiao (id int not null,name char(10)); 7 Query OK, 0 rows affected (0.01 sec) 8 9 mysql> insert into yibiao values(1,'zhangsan'); '//添加zhangsan記錄' 10 Query OK, 1 row affected (0.02 sec) 11 12 mysql> select * from yibiao; 13 +----+----------+ 14 | id | name | 15 +----+----------+ 16 | 1 | zhangsan | 17 +----+----------+ 18 1 row in set (0.00 sec) 19 20 '//slave1從服務器設置:' 21 mysql> use erku; 22 Database changed 23 mysql> create table yibiao(id int not null,name char(10)); 24 Query OK, 0 rows affected (0.01 sec) 25 26 mysql> insert into yibiao values(2,'lisi'); '//添加lisi記錄' 27 Query OK, 1 row affected (0.02 sec) 28 29 mysql> select * from yibiao; 30 +----+------+ 31 | id | name | 32 +----+------+ 33 | 2 | lisi | 34 +----+------+ 35 1 row in set (0.00 sec)
- 進入客戶端驗證
1 MySQL [(none)]> use erku; '//進入庫' 2 Database changed 3 MySQL [erku]> select * from yibiao; 4 +----+------+ 5 | id | name | 6 +----+------+ 7 | 2 | lisi | 8 +----+------+ 9 1 row in set (0.01 sec) 10 11 MySQL [erku]> select * from yibiao; 12 +----+----------+ 13 | id | name | 14 +----+----------+ 15 | 1 | zhangsan | 16 +----+----------+ 17 1 row in set (0.01 sec) 18 '//發現每一次查詢都會輪詢在slave1和slave2上查詢數據,如果開啟主從復制,則數據都會相同' 19 '//讀寫分離試驗成功'