一、在業務複雜的系統中,有這麼一個情景,有一句sql語句須要鎖表,致使暫時不能使用讀的服務,那麼就很影響運行中的業務,使用主從複製,讓主庫負責寫,從庫負責讀,這樣,即便主庫出現了鎖表的情景,經過讀從庫也能夠保證業務的正常運做。
二、作數據的熱備
三、架構的擴展。業務量愈來愈大,I/O訪問頻率太高,單機沒法知足,此時作多庫的存儲,下降磁盤I/O訪問的頻率,提升單個機器的I/O性能。
mysql主從複製是一個異步的複製過程,主庫發送更新事件到從庫,從庫讀取更新記錄,並執行更新記錄,使得從庫的內容與主庫保持一致。java
1:簡單來講,讀寫分離就是隻在主服務器上寫,只在從服務器上讀。由於Mysql在寫入數據時會鎖定表或者行,因此須要將讀寫分離開,實現寫的同時也能讀取數據。mysql
2: Amoeba是一個以MySQL爲底層數據存儲,並對應用提供MySQL協議接口的proxy。它集中地響應應用的請求,依據用戶事先設置的規則,將SQL請求發送到特定的數據庫上執行。基於此能夠實現負載均衡、讀寫分離、高可用性等需求。與MySQL官方的MySQL Proxy相比,做者強調的是amoeba配置的方便(基於XML的配置文件,用SQLJEP語法書寫規則,比基於lua腳本的MySQL Proxy簡單)。
3:Amoeba至關於一個SQL請求的路由器,目的是爲負載均衡、讀寫分離、高可用性提供機制,而不是徹底實現它們。用戶須要結合使用MySQL的 Replication等機制來實現副本同步等功能。linux
主機 | IP | 主要軟件 |
---|---|---|
主服務器 | 192.168.126.129 | mysql-5.7.1七、 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主從複製詳細配置:http://www.javashuo.com/article/p-qfmlmgtt-vc.html
在三臺mysql上添加權限開放給amoeba訪問:
mysql> grant all on . to test@'192.168.126.%' identified by '123.com';sql
搭建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
.vim
# 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 主從複製與讀寫分離部署成功