Mysql主從復制與讀寫分離
目錄:
1、mysql主從復制工作原理
2、mysql讀寫分離原理,使用Amoeba中間代理層實現讀寫分離
3、在vmware中實現mysql主從復制+讀寫分離
一、Mysql主從復制的工作原理:
1、mysql支持的復制類型:
1)、基于語句的復制。在服務器上執行sql語句,在從服務器上執行同樣的語句,mysql默認采用基于語句的復制,執行效率高。
2)、 基于行的復制。把改變的內容復制過去,而不是把命令在從服務器上執行一遍。
3)、混合類型的復制。默認采用基于語句的復制,一旦發現基于語句無法精確復制時,就會采用基于行的復制。
2、主從復制的原理
根據上圖說明mysql的主從復制原理:
(1)、在mysql_master上更新數據,寫入二進制日志(Binary log),并通知存儲引擎提交事務
(2)、mysql_slave啟用I/O線程將master的binary log復制到slave的中繼日志(Relay log),
(3)、mysql_slave啟用SQL線程從Relay log中讀取事件,并重放其中的事件從而更新slave數據,使其與master中的數據一致,只要該線程與I/O線程保持一致,中繼日志通常會位于os緩存中,所以中繼日志的開銷很小。
3、mysql讀寫分離原理:
在主從復制的基礎上,master更新數據同步到slave服務器中,master只負責寫入數據,slave只提供讀取數據,從而實現了數據庫性能的優化,以及提升了服務器的安全性。
實現mysql讀寫分離的方法:
1)基于程序代碼內部實現
在代碼中根據select 、insert進行路由分類,這類方法也是目前生產環境下應用最廣泛的。優點是性能較好,因為程序在代碼中實現,不需要增加額外的硬件開支,缺點是需要開發人員來實現,運維人員無從下手。
2)、基于中間代理層實現
代理一般介于應用服務器和數據庫服務器之間,代理數據庫服務器接收到應用服務器的請求后根據判斷后轉發到,后端數據庫,有以下代表性的程序。
(1)mysql_proxy。mysql_proxy是Mysql的一個開源項目,通過其自帶的lua腳本進行sql判斷。
(2)Atlas。是由 Qihoo 360, Web平臺部基礎架構團隊開發維護的一個基于MySQL協議的數據中間層項目。它是在mysql-proxy 0.8.2版本的基礎上,對其進行了優化,增加了一些新的功能特性。360內部使用Atlas運行的mysql業務,每天承載的讀寫請求數達幾十億條。支持事物以及存儲過程。
(3)Amoeba。由阿里巴巴集團在職員工陳思儒使用序java語言進行開發,阿里巴巴集團將其用戶生產環境下,但是他并不支持事物以及存數過程。
不是所有的應用都能夠在基于程序代碼中實現讀寫分離,像一些大型的java應用,如果在程序代碼中實現讀寫分離對代碼的改動就較大,所以,像這種應用一般會考慮使用代理層來實現,那么今天就使用Amoeba為例,完成主從復制和讀寫分離。
二、實驗案例
1、實驗拓撲:
2、實驗環境:
OS:centos7
mysql-5.7.13
ip規劃如拓撲環境
3、實驗步驟:
首先部署主從復制架構,再實現讀寫分離,使用client測試讀寫分離;
3-1:
1)、主從復制:
配置ntp,在master上搭建時間同步服務器,確保主從服務器時間同步
配置本地yum:
安裝ntp:
yum -y install ntp
2)、配置NTP時間服務器:
vim /etc/ntp.conf
添加如下配置:
3)、重啟ntpd服務:
4)、防火墻添加例外:
5)分別slave1和slave2執行時間同步:
分別在slave1 slave2安裝ntp ntpdate
在salve1和slave2執行命令同步時間:
3-2:
1)、分別在master和slave1,slave2安裝Mysql,安裝步驟略:
mysql版本如下:
2)、mysql_master配置:
修改/etc/my.cnf配置文件:
注釋:
server-id=1 ##注意主從server-id不可一樣
log-slave-updates=true:一般用于聯機復制中,
log-bin=master-bin:指定binlog日志名
重啟mysqld服務
在master創建用于復制數據用戶,并授權,查看master的binlog日志信息。
4、配置從服務器(slave1和slave2配置一樣)
1)、修改/etc/my.cnf主配置文件:
注釋:
server-id=2: server-id修改為2
log-bin=mysql-bin: slave的二進制日志
relay-log=relay-log-bin :中繼日志文件名
relay-log-index=slave-relay-bin.index : 中繼日志的索引文件名
重啟mysqld服務
systemctl restart mysqld
注意:
slave2也執行以上操作
3)、在salve1和salve2分別執行change master to操作,用于同步數據:
在master上開啟防火墻的3306端口例外:
注意要記住在master上執行show master status的binlog的二進制名,與位置信息,下面需要指定:
slave2也執行相同操作:
4)、啟動slave(slave1和slave2都執行此操作)
mysql> start slave;
5)、查看slave狀態,確保以下兩個值為YES
當前Slave_IO_Running:值為No,向下查看錯誤信息:
根據上述信息,可以判斷,我的環境為克隆狀態,所以mysql的UUID值一樣,使用以下方法解決:
修改auto.cnf中的UUID值,隨意更改一個值即可。(slave2也一樣)
重啟mysqld服務:
systemctl restart mysqld
再次登錄mysql,查看主從復制的狀態:
根據Slave_SQL_Running 和Slave_IO_Running值是否為Yes狀態
salve1:
slave2:
5、驗證從是否同步數據:
1)、在主服務器上新建數據庫”IT“
創建test表,并插入數據:
在slave1和slave2上查看是否更新數據:
slave1:
slave2:
主從復制配置完畢,接下來配置讀寫分離:
四、讀寫分離:
1、在Amoeba上安裝java環境:
因為Amoeba基于是jdk1.5開發的,所以官方推薦使用jdk1.5或1.6版本,高版本不建議使用
1)、下載jdk的執行程序:
2)、添加x權限,并執行
chmod +x jdk-6u14-linux-x64.bin
cp jdk-6u14-linux-x64.bin /usr/local/
./jdk-6u14-linux-x64.bin ##執行此程序
安裝過程中提示(yes/no),選擇yes安裝即可,
mv jdk1.6.0_14/ /usr/local/jdk1.6
3)、修改/etc/profile配置文件,增加以下配置:
export JAVA_HOME=/usr/local/jdk1.6 //設置jdk的根目錄
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib //將jdk的程序文件賦予CLASSPATH變量
export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin:$PATH:$HOME
/bin //將jdk的程序文件賦予PATH變量
export AMOEBA_HOME=/usr/local/amoeba //定義AMOEBA的根目錄
export PATH=$PATH:$AMOEBA_HOME/bin 將amoeba的程序文件復制給PATH變量
如:
4)、立即生效
2、安裝并配置Amoeba軟件:
#mkdir /usr/local/amoeba //創建amoeba目錄
#tar zxf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
#chmod -R 755 /usr/local/amoeba/
#/usr/local/amoeba/bin/amoeba
顯示以上內容說明amoeba安裝成功。
3、配置amoeba,實現讀寫分離,master負責寫,slave負責讀,負載均衡
1)、在主從三臺服務器上登錄mysql,創建amoeba用戶并授權
用戶amoeba,密碼amoeba(因為之前配置了主從復制,所以在slave1 slave2也會存在授權用戶,可以查看)
2)、修改amoeba.xml文件:
定義兩個配置,第一是應用程序使用什么用戶連接amoeba訪問到后端的mysql數據庫,第二個是定義默認寫池以及讀池。
在Amoeba上操作:
vim /usr/local/conf/amoeba.xml
1)、修改連接amoeba的用戶和密碼
2)、定義讀寫池
3)、編輯dbServers.xml配置文件
1)、修改連接mysql的用戶和密碼:
用戶amoeba 密碼amoeba ###注意刪除注釋 -->
指定master slave1 slave2主機地址:
定義slave的負載均衡:
4)、啟動amoeba:
4、測試讀寫分離:
1)、在client上安裝mysql,用于遠程連接數據庫測試 (安裝過程略,可以使用yum -y install mysql)
2)、在master salve1 slave2分別開啟3306端口,防火墻添加例外
在Amoeba上開啟8066端口:
firewall-cmd --permanent --add-port=8066/tcp;
firewall-cmd --reload
3)、在client上執行mysql命令登錄amoeba
1)、創建數據庫test
2)、創建表student;
查看主從同步情況:
master:
slave1:
slave2:
在client上插入數據到student表中,查看從是否同步:
slave1:
slave2
2)、將slave1 slave2執行 stop slave,停止主從復制
分別在slave1 和salve2 向student表中插入不同的數據,用于在client上測試讀的負載均衡:
slave1:
slave2:
在client上進行查詢:
可以看到,第一次查詢的數據是slave2的數據庫,第二次查詢是slave1的數據庫,實現了輪詢算法的負載均衡
3)、在client上寫入數據,測試寫數據只有在master上會寫入:
從上面可以看出,在client上向student表寫入數據,查詢時,沒有此數據,因為寫操作只在master上生效,讀是在slave上
在master上查看是否有剛寫入的數據:
通過以上測試,mysql的主從復制與讀寫分離部署已完成。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。