1. 程式人生 > >超詳細搭建Mysql5.5讀寫分離

超詳細搭建Mysql5.5讀寫分離

系統 cts http 剪切 修改 names 部署 authent 一次

Amoeba簡介

Amoeba(變形蟲)項目,該開源框架於2008年 開始發布一款 Amoeba for Mysql軟件。這個軟件致力於MySQL的分布式數據庫前端代理層,它主要在應用層訪問MySQL的 時候充當SQL路由功能,專註於分布式數據庫代理層(Database Proxy)開發。座落與 Client、DB Server(s)之間,對客戶端透明。具有負載均衡、高可用性、SQL 過濾、讀寫分離、可路由相關的到目標數據庫、可並發請求多臺數據庫合並結果。 通過Amoeba你能夠完成多數據源的高可用、負載均衡、數據切片的功能,目前Amoeba已在很多 企業的生產線上面使用。

Amoeba優勢

Amoeba主要解決以下問題:

數據切分後復雜數據源整合
提供數據切分規則並降低數據切分規則給數據庫帶來的影響
降低數據庫與客戶端連接
讀寫分離路由

Amoeba不足

目前還不支持事務
暫時不支持存儲過程
不適合從amoeba導數據的場景或者對大數據量查詢的query並不合適(比如一次請求返回10w以上甚至更多數據的場合)
暫時不支持分庫分表,amoeba目前只做到分數據庫實例,每個被切分的節點需要保持庫表結構一致:

工作原理

技術分享圖片
服務器端責主從復制,兩臺負責讀、一臺負責寫,寫的操作交給了主服務器,同時同步從服務器。客戶端負責讀寫分離,應用客戶端發送SQL的請求(包含了讀寫)發給代理層Amoeba,Amoeba讀寫分流,分開了,最關鍵的是Amoeba,相當於路由,打開兩道門,一個讀,一個寫。

搭建思路

  • 主從同步驗證
  • 驗證允許Amoeba訪問數據庫
  • 允許客戶端訪問Amoeba

讀寫分離實現方式

基於程序代碼內部實現
在代碼中根據select、insert進行路由分類(select、insert各寫入對應的服務器),這類方法目前生產環境應用最廣泛。優點是性能較好,因為在程序代碼中實現,不需要增加額外的設備作為硬件開支
基於中間代理層實現
代理一般位於客戶端和服務器端之間,代理服務器接到客戶端請求後通過判斷後轉發到後端數據庫
MySQL-Proxy
Amoeba

實驗環境

主機名稱 IP地址 操作系統 主要軟件 網絡連接模式
master 192.168.100.71 CentOS 7.4 x86_64 mysql-5.5.24.tar.gz NAT
slave01 T192.168.100.72 CentOS 7.4 x86_64 mysql-5.5.24.tar.gz NAT
slave02 192.168.100.73 CentOS 7.4 x86_64 mysql-5.5.24.tar.gz NAT
amoeba 192.168.100.74 CentOS 7.4 x86_64 jdk-6u14-linux-x64.bin、amoeba-mysql-binary-2.2.0.tar.gz NAT
client 192.168.100.75 CentOS 7.4 x86_64 mysql-5.5.24.tar.gz NAT

搭建步驟

一、安裝部署Amoeba

1、安裝Java環境

[root@amoeba ~]# chmod +x jdk-6u14-linux-x64.bin #賦予執行權限

[root@amoeba ~]# ./jdk-6u14-linux-x64.bin #執行jdk,一路回車,輸入yes

[root@amoeba ~]# mv jdk1.6.0_14/ /usr/local/jdk #將解壓縮包剪切到其他位置

[root@amoeba ~]# vim /etc/profile #配置系統環境變量

末行添加:
export JAVA_HOME=/usr/local/jdk
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

[root@amoeba ~]# source /etc/profile #重新讀取系統環境變量配置文件

[root@amoeba ~]# java -version
技術分享圖片

2、安裝並配置Amoeba軟件

[root@amoeba ~]# mkdir /usr/local/amoeba #創建amoeba安裝目錄

[root@amoeba ~]# tar -zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/ #解壓amoeba軟件

[root@amoeba ~]# chmod 755 /usr/local/amoeba/ -R #遞歸修改權限

[root@amoeba ~]# /usr/local/amoeba/bin/amoeba #查看amoeba安裝狀態
技術分享圖片

二、部署讀寫分離

1、主、從三臺服務器授權Amoeba訪問權限

mysql> grant all on *.* to ‘admin‘@‘192.168.100.%‘ identified by ‘123‘;
mysql> flush privileges;

2、編輯Amoeba主配置文件

[root@amoeba ~]# cd /usr/local/amoeba/conf/
[root@amoeba conf]# vim amoeba.xml


認證器元素標簽,客戶端通過認證器設置的賬號密碼,進行認證,連接amoeba
 <property name="authenticator"> #約27行左右
 <property name="user">amoeba</property>  #約30行左右,設置客戶端連接amoeba的賬戶
 <property name="password">123</property> #32行左右,設置客戶端連接amoeba的密碼

設置mysql群集
 <property name="defaultPool">master</property> #約115行,編輯,設置默認地址池
 <property name="writePool">master</property>   #約118行,關閉註釋,寫池子
 <property name="readPool">slaves</property>    #約119行,關閉註釋,讀池子
 註意這裏定義的池子還要在dbServer.xml數據庫配置文件中再次引用定義

3、編輯Amoeba數據庫配置文件

[root@amoeba conf]# vim dbServers.xml

添加連接數據庫配置
<dbServer name="abstractServer" abstractive="true"> #約13行,找到此標簽
<property name="user">admin</property> #約26行,編輯連接數據庫賬戶
<property name="password">123</property> #約29行左右,打開註釋,編輯連接數據庫賬戶密碼

 添加三臺數據庫服務器
<dbServer name="master"  parent="abstractServer"> #45行左右,指定master服務器        
          <factoryConfig>
             <property name="ipAddress">192.168.100.71</property> #指定主服務器IP地址
        </factoryConfig>
 </dbServer>

 <dbServer name="slave1"  parent="abstractServer"> #45行左右,編輯指定slave01服務器
        <factoryConfig>
             <property name="ipAddress">192.168.100.72</property> #指定01從服務器IP地址
        </factoryConfig>
 </dbServer>

 <dbServer name="slave2"  parent="abstractServer"> #添加slave02服務器
        <factoryConfig>
             <property name="ipAddress">192.168.100.73</property> #指定從02服務器IP地址
        </factoryConfig>
 </dbServer>

設置mysql群集
 <dbServer name="slaves" virtual="true"> #約65行,找到群集標簽,設置群集名稱slaves
    <property name="loadbalance">1</property> #負載均衡策略。"1"代表輪詢;"2"代表加權輪詢;"3"代表高可用
    <property name="poolNames">slave1,slave2</property> #定義集群池成員
 ……

4、啟動Amoeba

[root@amoeba ~]# /usr/local/amoeba/bin/amoeba start &
技術分享圖片

三、測試讀寫分離

1、Client端連接Amoeba

[root@client ~]# mysql -uamoeba -p123 -h192.168.100.74 -P 8066
技術分享圖片

2、在Master上創建一個表,同步到各從服務器上以及關閉各從服務器的Slave功能

[root@master ~]# mysql -uroot -p123 #登陸master服務器
mysql> use db_test;
mysql> create table student(id int(10),name varchar(10),address varchar(20))ENGINE=InnoDB DEFAULT CHARSET=utf8;

[root@slave01 ~]# mysql -uroot -p #登陸slave01服務器
mysql> use db_test;
mysql> show tables;
技術分享圖片
mysql> stop slave;#清除slave,停止主從同步
mysql> show slave status\G;
技術分享圖片

[root@slave02 ~]# mysql -uroot -p #登陸slave02服務器
mysql> use db_test;
mysql> show tables;
技術分享圖片

mysql> stop slave;#清除slave,停止主從同步
mysql> show slave status\G;
技術分享圖片

3、三臺服務器分別插入測試數據

mysql> use db_test;
mysql> insert into student values(‘1‘,‘userAAAAA‘,‘this is master‘);#master服務器添加數據

mysql> use db_test;
mysql> insert into student values(‘2‘,‘userBBBBB‘,‘this is slave_1‘);#slave01服務器添加數據

mysql> use db_test;
mysql> insert into student values(‘3‘,‘userCCCCC‘,‘this is slave_2‘);#slave02服務器添加數據

4、Client查詢相應數據

[root@client ~]# mysql -uamoeba -p123 -h192.168.100.74 -P 8066 #連接Amoeba
技術分享圖片

5、Client執行插入操作

mysql> insert into db_test.student values(‘4‘,‘userDDDDD‘,‘write test‘);

[root@master ~]# mysql -uroot -p -e ‘select from db_test.student‘
技術分享圖片
[root@slave01 ~]# mysql -uroot -p -e ‘select
from db_test.student‘
技術分享圖片
[root@slave02 ~]# mysql -uroot -p -e ‘select * from db_test.student‘
技術分享圖片

超詳細搭建Mysql5.5讀寫分離