文章目錄
一、讀寫分離的概述
- 讀寫分離是高性能數據庫集羣的一種方式,其本質是將訪問壓力分散到集羣中的多個節點,但是沒有分散存儲壓力。
- 業務服務器將寫操作發給數據庫主機,將讀操作發給數據庫從機通過主從複製的方式來同步數據,再通過讀寫分離來提升數據庫的併發負載能力。
1.1、讀寫分離的基本原理
-
數據庫服務器搭建主從集羣,一主一從、一主多從都可以。
-
數據庫主機負責讀寫操作,從機只負責讀操作。
-
數據庫主機通過複製將數據同步到從機,每臺數據庫服務器都存儲了所有的業務數據。
二、怎麼實現讀寫分離?
2.1、環境準備和安裝包
注意:配置過程需要的安裝包,需要的可以去我的百度雲下載,我的 Mysql手工編譯版本是 5.7。
百度雲鏈接爲:https://pan.baidu.com/s/1DZIVX46wKWoW1ak-IGkzKA
提取碼:fohm
-
讀寫分離是在主從複製的基礎上進行配置的,所以先搭建主從複製再搭建讀寫分離。
-
準備五臺centos7虛擬機,其中三臺搭建 Mysql服務器(一臺爲主服務器,其餘兩臺爲從服務器)
-
Mysql配置可參考我的之前博客,LNMP架構中Mysql的安裝。博客鏈接爲:MySQL版本5.7的安裝
-
一臺虛擬機用來做 Amoeba,實現讀寫分離。
-
一臺做應用客戶端,進行操作驗證。
-
我的服務器IP地址:
主服務器master | 192.168.220.136 |
---|---|
從服務器slave1 | 192.168.220.164 |
從服務器slave2 | 192.168.220.159 |
Amoeba服務器 | 192.168.220.130 |
客戶端 | 192.168.220.171 |
主從複製的具體操作我在這裏就不多介紹,可以看我上篇博客,鏈接爲:Mysql 之主從複製
在上篇博客中我用一臺主服務器和一臺從服務器,這裏再加一臺從服務器,從服務器的配置沒有改變,只有server-id需要改爲23,只要與之前的id不同。
2.2、實驗操作
2.2.1、Amoeba的配置
1、關閉防火牆,掛載本地共享文件夾,把 jdk 安裝包放在 /usr/local目錄下
systemctl stop firewalld
setenforce 0
//用samba共享本地文件夾
mount.cifs //192.168.10.34/share /mnt
cd /mnt/mysql/
cp jdk-6u14-linux-x64.bin /usr/local/
2、安裝 jdk 包
//.bin是二進制文件,可直接執行
cd /usr/local/
./jdk-6u14-linux-x64.bin
一直空格出現圖中問句時,輸入yes 按enter即可
爲了方便管理,重命名 jdk。
cd /usr/local/
mv jdk1.6.0_14/ jdk1.6
3、修改 profile 文件,配置環境變量
vim /etc/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 //加載生效
4、先創建一個文件,存放解壓內容,解壓 amoeba包。
mkdir /usr/local/amoeba
cd /mnt/mysql
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
給Amoeba加755權限,並驗證安裝是否成功。
chmod -R 755 /usr/local/amoeba/
/usr/local/amoeba/bin/amoeba
2.2.2、Mysql服務器
在三臺 mysql 服務器上添加權限,開放給 Amoeba 訪問
登錄數據庫
mysql -uroot -pabc123
grant all on *.* to test@'192.168.220.%' identified by '123.com';
允許test用戶通過ip爲192.168.220網段,從任意終端輸入123.com的密碼進行訪問
2.2.3、讀寫分離實現配置
回到Amoeba服務器,配置讀寫分離功能。
1、修改amoeba.xml文件
cd /usr/local/amoeba/conf
vim amoeba.xml
//1、修改30行和32行
30 <property name="user">amoeba</property>
32 <property name="password">123123</property>
//2、117行--去掉註釋
(<!-- -->爲註釋符號)
<property name="defaultPool">master</ property>
<property name="writePool">master</ property>
<property name="readPool">slaves</ property>
2、修改配置文件夾下的dbServers.xml文件
vim dbServers.xml
//26-29行:去掉註釋,設置登錄用戶名和密碼
<property name="schema">mysql</property>
<property name="user">test</property>
<property name="password">123.com</property>
//45行--主服務器地址
<dbServer name="master" parent="abstractServer">
<property name="ipAddress">192.168.220.136</property>
//從服務器slave1,修改好名稱和對應IP地址
<dbServer name="slave1" parent="abstractServer">
<property name="ipAddress">192.168.220.164</property>
//從服務器slave2,修改好名稱和對應IP地址。
配置文件只有兩個模塊,可以yy複製粘貼修改。
<dbServer name="slave2" parent="abstractServer">
<factoryConfig>
<property name="ipAddress">192.168.220.159</property>
</factoryConfig>
</dbServer>
//指定從服務器池
<dbServer name="slaves" virtual="true">
<property name="poolNames">slave1,slave2</property>
啓動Amoeba監控
/usr/local/amoeba/bin/amoeba start &
2.3、客戶端驗證
1、yum安裝數據庫
yum install -y mysql
2、連接 amoeba 服務器
mysql -u amoeba -p 123123 -h 192.168.220.130 -P8066
創建一個名爲 test02 的庫,再創建一個叫 demo01 的表
MySQL [test02]> create table demo01 (
-> id int(4) not null primary key,
-> name varchar(10) not null,
-> score decimal(4,1) not null);
Query OK, 0 rows affected (0.03 sec)
我們在主服務器上,直接進入數據庫,就會發現也多了一個名爲 stu01 的表
三、總結
- 讀寫分離擴展了讀操作,提高了併發吞吐量和負載能力。
- 對數據庫進行寫的操作時,全部由主服務器承擔,用來避免數據的不同步。
- 進行讀操作時,由從服務器slave來承擔,用來分擔數據庫的壓力。