超詳細搭建Mysql5.5讀寫分離
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讀寫分離