Mysql——讀寫分離

內容要點:

一、Mysql 讀寫分離原理

二、關於 Amoeba

三、配置實例

第一步:配置 Amoeba 服務器

第二步:在三臺 mysql 服務器上添加權限,開放給 amoeba 訪問(即三臺mysql允許amoeba對它們進行訪問)

第三步:在 amoeba 服務器上配置讀寫分離功能

第四步:客戶端測試

四、總結

一、Mysql 讀寫分離原理

  • 讀寫分離就是隻在主服務器上寫,只在從服務上讀;

  • 主數據庫處理事務性查詢,從數據庫處理 select 查詢;

  • 數據庫複製被用來把事務性查詢導致的變更同步到集羣中的從數據庫

二、關於 Amoeba

  • (1)Amoeba是一個以MySQL爲底層數據存儲,並對應用提供MySQL協議接口的proxy。它集中地響應應用的請求,依據用戶事先設置的規則,將SQL請求發送到特定的數據庫上執行。基於此可以實現負載均衡、讀寫分離、高可用性等需求。

  • (2)Amoeba相當於一個SQL請求的路由器,目的是爲負載均衡、讀寫分離、高可用性提供機制,而不是完全實現它們。需要結合使用MySQL的 Replication等機制來實現副本同步等功能。


三、配置實例

環境說明:


  • 準備三臺 Mysql服務器(一臺爲主服務器,其餘兩臺爲從服務器);

  • 一臺 Amoeba,用來實現讀寫分離,寫的操作交給主服務器,讀的操作發給兩臺從服務器;

  • 實驗驗證:在客戶機上執行寫的操作,在主、從服務器上驗證。

image.png

說明:Mysql 主從複製與讀寫功能是密切相關的,通過主從複製來實現數據同步,再通過讀寫分離來提升數據庫的併發負載能力。


應用客戶端192.168.220.131
Amoeba192.168.220.129
主服務器192.168.220.141
從服務器 1192.168.220.140
從服務器 2192.168.220.136


第一步:配置 Amoeba 服務器

(1)關閉防火牆:

 systemctl stop firewalld.service
 setenforce 0

(2)安裝管理 jdk:

1、安裝 jdk

 cp jdk-6u14-linux-x64.bin  /usr/local/     //複製
./jdk-6u14-linux-x64.bin                    
//安裝jdk ,注意這一步,一路按回車到最後,提示輸入yes,等待安裝

2、方便管理,將jdk包重新命名:


 mv jdk1.6.0_14/ /usr/local/jdk1.6


3、修改 profile 文件


export JAVA_HOME=/usr/local/jdk1.6
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$AMOEBA_HOME/bin

使環境變量生效:

source /etc/profile


(3)解壓 amoeba包:


1、先創建一個文件

mkdir /usr/local/amoeba

2、解壓

tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/


3、賦權,並驗證是否安裝成功

chmod -R 755 /usr/local/amoeba/


輸入:/usr/local/amoeba/bin/amoeba ,按回車檢查是否成功

2019112217202888.png


第二步:在三臺 mysql 服務器上添加權限,開放給 amoeba 訪問(即三臺mysql允許amoeba對它們進行訪問)

進入數據庫,輸入以下命令:


grant all on *.* to test@'192.168.220.%' identified by '123.com';
//允許ip爲192.168.220網段從任意終端通過123.com的密碼進行訪問


第三步:在 amoeba 服務器上配置讀寫分離功能

1、cd /usr/local/amoeba
vim conf/amoeba.xml
第30行:<property name="user">amoeba</property>
第32行:<property name="password">123456</property>
117行去掉註釋:
 <property name="writePool">master</property>
 <property name="readPool">slaves</property>


2、vim conf/dbServers.xml

26-29行:去掉註釋,設置登錄用戶名和密碼
<property name="user">test</property>
<property name="password">123.com</property>
找到主服務器和從服務器模塊,修改好名稱和對應IP地址:
主服務器:
<dbServer name="master" parent="abstractServer">
<property name="ipAddress">192.168.220.141</property>
第一臺從服務器:
<dbServer name="slave1" parent="abstractServer">
<property name="ipAddress">192.168.220.140</property>
第二臺從服務器:
<dbServer name="slave2" parent="abstractServer">
<property name="ipAddress">192.168.220.136</property>
指定從服務器池:
<dbServer name="slaves" virtual="true">
<property name="poolNames">slave1,slave2</property>

3、啓動 amoeba

/usr/local/amoeba/bin/amoeba start&        //&表示將進程放到後臺,時間較長,稍等待


第四步:客戶端測試

1、客戶端虛擬機,可以直接用yum安裝一個mysql服務

yum install -y mysql


2、連接 amoeba 服務器


(1)指定密碼和端口連接 amoeba

mysql -u amoeba -p 123456 -h 192.168.220.129 -P8066


(2)創建一個 名爲 school 的庫,再創建一個叫 info 的表


MySQL [school]> create table info (
    -> id int(4) not null primary key,      //指定id號,爲primary key,不爲空
    -> name varchar(10) not null,           //名字
    -> score decimal(4,1) not null);        //成績
Query OK, 0 rows affected (0.03 sec)


3、三臺mysql服務器驗證實驗結果


首先驗證寫的操作是否分離:


(1)此時,我們在主服務器上,直接進入數據庫,就會發現也多了一個名爲 info的表

image.png

(2)但是,兩臺從服務器上並沒有:

image.png

所以,我們在客戶端寫入的語句,在主服務器上會查詢到,但是兩臺從服務器上並沒有,此時寫的操作就直接交給了主服務器。


接下來是驗證讀的操作:


(1)在兩臺從服務器上的各自也創建一個 info 表,也都各自寫入兩條信息。

image.png

image.png

(2)客戶端查詢 info 表的內容,因爲做了讀寫分離操作,所以查詢的內容應該是 兩臺從服務器上 info表的內容。

image.png

因此,用戶讀取數據,同時通過從服務器,這樣就減輕了主服務器的併發量。


四、總結

這篇博客,爲了展示讀寫分離的實驗效果,並沒有同時做主從同步,在企業網中,主從同步和讀寫分離是密不可分的。這樣,客戶對數據庫進行寫的操作時,就由主服務器承擔;進行讀取,查詢等操作時,就由從服務器來承擔(由於做了主從同步,每臺從服務器的數據和主服務器是一樣的)

在高併發請求時,實現了負載均衡,保證數據的安全性,服務器的高效運行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章