MySQL 主從復制與讀寫分離
1、在業務復雜的系統中,有這麽一個情景,有一句sql語句需要鎖表,導致暫時不能使用讀的服務,那麽就很影響運行中的業務,使用主從復制,讓主庫負責寫,從庫負責讀,這樣,即使主庫出現了鎖表的情景,通過讀從庫也可以保證業務的正常運作。
2、做數據的熱備
3、架構的擴展。業務量越來越大,I/O訪問頻率過高,單機無法滿足,此時做多庫的存儲,降低磁盤I/O訪問的頻率,提高單個機器的I/O性能。
mysql主從復制是一個異步的復制過程,主庫發送更新事件到從庫,從庫讀取更新記錄,並執行更新記錄,使得從庫的內容與主庫保持一致。
- Msql讀寫分離
1:簡單來說,讀寫分離就是只在主服務器上寫,只在從服務器上讀。因為Mysql在寫入數據時會鎖定表或者行,所有需要將讀寫分離開,實現寫的同時也能讀取數據。
2: Amoeba是一個以MySQL為底層數據存儲,並對應用提供MySQL協議接口的proxy。它集中地響應應用的請求,依據用戶事先設置的規則,將SQL請求發送到特定的數據庫上執行。基於此可以實現負載均衡、讀寫分離、高可用性等需求。與MySQL官方的MySQL Proxy相比,作者強調的是amoeba配置的方便(基於XML的配置文件,用SQLJEP語法書寫規則,比基於lua腳本的MySQL Proxy簡單)。
3:Amoeba相當於一個SQL請求的路由器,目的是為負載均衡、讀寫分離、高可用性提供機制,而不是完全實現它們。用戶需要結合使用MySQL的 Replication等機制來實現副本同步等功能。
- 實驗環境
主機 | IP | 主要軟件 |
---|---|---|
主服務器 | 192.168.126.129 | mysql-5.7.17、 ntp 、boost_1_59_0.tar |
從服務器1 | 192.168.126.130 | mysql-5.7.17 、 ntp 、boost_1_59_0.tar |
從服務器2 | 192.168.126.131 | mysql-5.7.17 、 ntp 、boost_1_59_0.tar |
Amoeba | 192.168.126.132 | amoeba-mysql-binary-2.2.0.tar、 jdk-6u14-linux-x64 |
客戶端 | 192.168.126.133 | mysql-5.7.17 |
- 搭建MySQL主從復制
Mysql主從復制詳細配置:http://blog.51cto.com/13630803/2136766
在三臺mysql上添加權限開放給amoeba訪問:
mysql> grant all on . to test@‘192.168.126.%‘ identified by ‘123.com‘;
-
搭建MySQL讀寫分離
# systemctl stop firewalld.service //關閉防火墻 # setenforce 0 # cp jdk-6u14-linux-x64.bin /usr/local/ # cd /usr/local # ./jdk-6u14-linux-x64.bin //按 “回車鍵” 輸入“ yes“” 回車 # mv jdk1.6.0_14/ /usr/local/jdk1.6
.
# vi /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 //刷新環境變量
.
# 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
(顯示amoeba start|stop說明安裝成功)
-
配置amoeba服務
# vim /usr/local/amoeba/conf/amoeba.xml --30行-- <property name="user">amoeba</property> --32行-- <property name="password">123456</property> --115行-- <property name="defaultPool">master</property> --117-去掉註釋- <property name="writePool">master</property> <property name="readPool">slaves</property> # vi conf/dbServers.xml -23行註釋掉 作用:默認進入test庫 以防mysql中沒有test庫時,會報錯 <!-- <property name="schema">test</property> --> --26--29--去掉註釋-- <property name="user">test</property> <property name="password">123.com</property> -----42-主服務器地址--- <dbServer name="master" parent="abstractServer"> <property name="ipAddress">192.168.126.129</property> --52-從服務器主機名- <dbServer name="slave1" parent="abstractServer"> --55-從服務器1地址- <property name="ipAddress">192.168.126.130</property> --(這裏上面6行復制)從服務器2地址 <dbServer name="slave2" parent="abstractServer"> <property name="ipAddress">192.168.126.131</property> --64行-- <dbServer name="slaves" virtual="true"> --70行-- <property name="poolNames">slave1,slave2</property>
-
開啟服務
# /usr/local/amoeba/bin/amoeba start& # netstat -anpt | grep java //查看端口
- 測試讀寫分離
-
客戶機
# systemctl stop firewalld.service //關閉防火墻 # setenforce 0 # yum install -y mysql //安裝mysql客戶端 # mysql -u amoeba -p123456 -h 192.168.126.132 -P8066 //遠程登錄mysql
-
主服務器
# mysql -u root -p mysql> create database zhang; mysql> use zhang; mysql> create table zang (id int(10),name varchar(10),address varchar(20));
-
兩臺從服務器
mysql> stop slave; //關閉同步 mysql> use zhang; 從服務器1 mysql> insert into zang values(‘2‘,‘zhang‘,‘this_is_slave1‘); 從服務器2 mysq> insert into zang values(‘3‘,‘zhang‘,‘this_is_slave2‘);
-
主服務器
mysql> insert into zang values(‘1‘,‘zhang‘,‘this_is_master‘);
- 客戶機
-
如圖只能查看到 從服務器的數據
mysql> use zhang; mysql> select * from zang;
-
客戶機
mysql> insert into zang values(‘5‘,‘zhang‘,‘write_test‘);
-
兩臺從服務器
mysql> start slave; //開啟同步
MySQL 主從復制與讀寫分離部署成功
MySQL 主從復制與讀寫分離