Mysql——讀寫分離

內容要點:
mysql

1、Mysql 讀寫分離原理linux

2、關於 Amoebasql

3、配置實例數據庫

第一步:配置 Amoeba 服務器vim

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

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

第四步:客戶端測試服務器

4、總結併發

1、Mysql 讀寫分離原理負載均衡

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

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

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

2、關於 Amoeba

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

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


3、配置實例

環境說明:


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

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

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

image.png

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


應用客戶端 192.168.220.131
Amoeba 192.168.220.129
主服務器 192.168.220.141
從服務器 1 192.168.220.140
從服務器 2 192.168.220.136


第一步:配置 Amoeba 服務器

(1)關閉防火牆:

 systemctl stop firewalld.service
 setenforce 0

(2)安裝管理 jdk:

一、安裝 jdk

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

二、方便管理,將jdk包從新命名:


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


三、修改 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包:


一、先建立一個文件

mkdir /usr/local/amoeba

二、解壓

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


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

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 服務器上配置讀寫分離功能

一、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>


二、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>

三、啓動 amoeba

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


第四步:客戶端測試

一、客戶端虛擬機,能夠直接用yum安裝一個mysql服務

yum install -y mysql


二、鏈接 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)


三、三臺mysql服務器驗證明驗結果


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


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

image.png

(2)可是,兩臺從服務器上並無:

image.png

因此,咱們在客戶端寫入的語句,在主服務器上會查詢到,可是兩臺從服務器上並無,此時寫的操做就直接交給了主服務器。


接下來是驗證讀的操做:


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

image.png

image.png

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

image.png

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


4、總結

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

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

相關文章
相關標籤/搜索