MySQL主從複製與讀寫分離

前言:咱們前面搭建過LAMPLNMP,作過了web服務器羣集和熱備,web服務器壞了咱們是不怕了,可是咱們要知道,網站的數據有不少是存儲在數據庫裏面的,例如註冊的會員,發的文章,購物的訂單等信息。固然咱們能夠給數據庫作備份,可是若是天天00:00作一次備份,那麼若是在23:59數據丟失了,那麼就會丟失一天的數據,有沒有一種方法能實現實時備份,就是說有數據產生就當即備份,答案固然是有,也就是今天咱們要學習的mysql主從複製。有點相似於前面咱們學習過的rsync,可是不一樣的是rsync是對磁盤文件作備份,而mysql主從複製是對數據庫中的數據,語句作備份。另外讀寫分離主要是爲了優化數據庫。下面把實驗給你們作一遍。java

 

1、mysql主從複製的工做原理mysql

一、mysq支持的複製類型web

1)基於語句的複製。在服務器上執行sql語句,在從服務器上執行一樣的語句,mysql默認採用基於語句的複製,執行效率高。sql

2)基於行的複製。把改變的內容複製過去,而不是把命令在從服務器上執行一遍。數據庫

3)混合類型的複製。默認採用基於語句的複製,一旦發現基於語句沒法精確複製時,就會採用基於行的複製。vim

 

二、複製的工做過程後端

blob.png

1)在每一個事務更新數據完成以前,master在二進制日誌記錄這些改變。寫入二進制日誌完成後,master通知存儲引擎提交事務。centos

2)Slavemasterbinary log複製到其中繼日誌。首先slave開始一個工做線程(I/O),I/O線程在master上打開一個普通的鏈接,而後開始binlog  dump  processbinlog  dump  processmaster的二進制日誌中讀取事件,若是已經跟上master,它會睡眠並等待master產生新的事件,I/O線程將這些事件寫入中繼日誌。緩存

3)Sql  slave  threadsql從線程)處理該過程的最後一步,sql線程從中繼日誌讀取事件,並重放其中的事件而更新slave數據,使其與master中的數據一致,只要該線程與I/O線程保持一致,中繼日誌一般會位於os緩存中,因此中繼日誌的開銷很小。安全

 

三、mysql讀寫分離原理

讀寫分離就是在主服務器上修改,數據會同步到從服務器,從服務器只能提供讀取數據,不能寫入,實現備份的同時也實現了數據庫性能的優化,以及提高了服務器安全。

blob.png

目前較爲常見的Mysql讀寫分離分爲兩種

 

1)基於程序代碼內部實現

在代碼中根據select insert進行路由分類,這類方法也是目前生產環境下應用最普遍的。優勢是性能較好,由於程序在代碼中實現,不須要增長額外的硬件開支,缺點是須要開發人員來實現,運維人員無從下手。

 

2)基於中間代理層實現

代理通常介於應用服務器和數據庫服務器之間,代理數據庫服務器接收到應用服務器的請求後根據判斷後轉發到,後端數據庫,有如下表明性的程序。

1mysql_proxymysql_proxyMysql的一個開源項目,經過其自帶的lua腳本進行sql判斷。

2Atlas。是由 Qihoo 360, Web平臺部基礎架構團隊開發維護的一個基於MySQL協議的數據中間層項目。它是在mysql-proxy 0.8.2版本的基礎上,對其進行了優化,增長了一些新的功能特性。360內部使用Atlas運行的mysql業務,天天承載的讀寫請求數達幾十億條。支持事物以及存儲過程。

3Amoeba。由阿里巴巴集團在職員工陳思儒使用序java語言進行開發,阿里巴巴集團將其用戶生產環境下,可是他並不支持事物以及存數過程。

 

不是全部的應用都可以在基於程序代碼中實現讀寫分離,像一些大型的java應用,若是在程序代碼中實現讀寫分離對代碼的改動就較大,因此,像這種應用通常會考慮使用代理層來實現,那麼今天就使用Amoeba爲例,完成主從複製和讀寫分離。

 

2、實驗案例:mysql主從複製和讀寫分離

一、實驗拓撲

blob.png

二、實驗環境

blob.png

amoeba上安裝amoebajdk,在其它的機器上安裝mysqlip地址如上圖所示

 

3、主從複製的實驗步驟

1、搭建時間NTP服務器,同步時間

1)創建時間同步環境,在主節點上搭建時間同步服務器

blob.png

2)配置NTP時間服務器

Vim  /etc/ntp.conf

blob.png

3)重啓ntpd服務

blob.png

4)在防火牆上開啓例外

blob.png

5)在從節點上進行時間同步

blob.png

blob.png

在另外一臺從服務器上執行相同操做

blob.png

二、mysql主和兩臺從服務器上安裝mysql,這三臺的安裝方法徹底同樣,我就以一臺爲例。

(1)安裝mysql並建立程序用戶

[root@centos4 ~]# tar  zxf cmake-2.8.6.tar.gz

[root@centos4 ~]# cd cmake-2.8.6

[root@centos4 cmake-2.8.12]# ./configure  &&gmake  &&gmake install

[root@centos4 ~]# tar zxf mysql-5.5.38.tar.gz

[root@centos4 ~]# cd mysql-5.5.38

[root@centos4 mysql-5.5.38]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DSYSCONFDIR=/etc/ -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all&& make &&make install

[root@centos4 mysql-5.5.38]# useradd  -M -s /sbin/nologin  mysql  -g  mysql

 

2)優化程序執行路徑

[root@centos4 mysql-5.5.38]# echo "PATH=$PATH:/usr/local/mysql/bin">> /etc/profile

3)建立主配置文件

[root@centos4 mysql-5.5.38]# cp support-files/my-medium.cnf.sh  /etc/my.cnf

cp:是否覆蓋"/etc/my.cnf"y

[root@centos4 mysql-5.5.38]#

 

4)建立服務腳本並添加爲系統服務

[root@centos4 mysql-5.5.38]# cp support-files/mysql.server /etc/init.d/mysqld

[root@centos4 mysql-5.5.38]# chkconfig  --add mysqld

[root@centos4 mysql-5.5.38]# chkconfig  mysqld on

[root@centos4 mysql-5.5.38]# chmod  +x  /etc/init.d/mysqld

 

5)初始化數據庫

[root@centos4 mysql-5.5.38]# /usr/local/mysql/scripts/mysql_install_db  --user=mysql  --basedir=/usr/local/mysql/  --datadir=/usr/local/mysql/data

[root@centos4 mysql-5.5.38]#

 

6)修改安裝目錄權限

[root@centos4 mysql-5.5.38]# chown -R mysql:mysql  /usr/local/mysql/

 

7)啓動服務

[root@centos4 mysql-5.5.38]# service mysqld start

 

8)爲用戶root設置密碼

[root@centos4 mysql-5.5.38]# mysqladmin  -u root -p password  '123-abc

默認沒有密碼,直接在確認舊密碼處回車便可。

 

9)登陸mysql數據庫

[root@centos4 mysql-5.5.38]# mysql -u root -p

 

三、配置mysql主服務器(MASTER

1)修改/etc/my.cnf配置文件

server-id       = 11   //mysql數據的惟一標示(不能重複)

log-slave-updates=true   //容許連級複製   (增長)

log-bin=master-bin     //二進制文件名(修改)

 

blob.png

2)重啓MySQL服務

blob.png

3)登陸mysql程序,給從服務器受權

Mysql  -u  root  -p

blob.png

四、配置從服務器

1)/etc/my.cnf中修改如下內容

[root@centos3 ~]# vim /etc/my.cnf

server-id       = 22      //不能與其餘實例重複

log-bin=mysql-bin       //二進制日誌文件名 修改

relay-log=relay-log-bin     //複製過來的二進制文件名,增長

relay-log-index=slave-relay-bin.index  //中繼日誌存放的文件名稱,增長

blob.png

注意server-id不能與主服務器相同,可是從服務器要相同。


 

2)重啓mysql服務

blob.png

3)登陸mysql,配置同步

blob.png

blob.png

IP地址、用戶、密碼都master的數據庫信息

4)啓動同步

blob.png

5)查看slave狀態,確保如下兩個值爲YES

blob.png

五、驗證主從複製效果

1)在主服務器上新建數據庫IT

blob.png

2)在從服務器上查看數據庫,若是和主服務器相同,說明成功。

blob.png

blob.png

注意從服務器的配置和主服務器徹底同樣,注意Id也要徹底同樣

 

4、讀寫分離的實驗步驟

一、安裝java環境(amoeba軟件基於java平臺運行)

1)運行jdk

blob.png

 

安裝過程當中提示(yes/no),咱們要選擇yes安裝

 

2)修改/etc/profile配置文件,增長如下配置

blob.png

export JAVA_HOME=/usr/local/jdk1.6  //設置jdk的根目錄

export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jir

e/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變量

blob.png

3)執行腳本

blob.png

二、安裝並配置Amoeba軟件

1)安裝

blob.png

2)出現如下內容說明安裝成功了

blob.png

三、配置amoeba讀寫分離,兩個slave讀負載均衡

1)在主從服務器上開放權限給amoeba(三臺服務器上都作相同設置,這裏我就以其中一臺爲例)

blob.png

2)修改amoeba.xml文件

注意:全部配置文件註釋都是以 <!-- 內容 -->,再刪除註釋時請將內容也一併刪除,最好是刪除正行,可是有些時候只須要刪除頭和尾便可,裏面的配置項是能夠直接使用的。這個配置文件須要定義兩個配置,第一是應用程序使用什麼用戶鏈接amoeba訪問到後端的mysql數據庫,第二個是定義默認寫池以及讀池。

 

Vi  /usr/local/conf/amoeba.xml

blob.png

接下來修改

<propertyname="sqlFunctionFile">${amoeba.home}/conf/functionMap.xml

</property>

<property name="LRUMapSize">1500</property>

<property name="defaultPool">master</property> //定義默認的寫池

<property name="writePool">master</property>  //定義寫池

<property name="readPool">slaves</property> //定義讀池,以上名字隨便 <property name="needParse">true</property>

</queryRouter>

以下圖所示:

接下來修改

<propertyname="sqlFunctionFile">${amoeba.home}/conf/functionMap.xml

</property>

<property name="LRUMapSize">1500</property>

<property name="defaultPool">master</property> //定義默認的寫池

<property name="writePool">master</property>  //定義寫池

<property name="readPool">slaves</property> //定義讀池,以上名字隨便 <property name="needParse">true</property>

</queryRouter>

以下圖所示:blob.png

3)編輯dbServers.xml文件

blob.png

blob.png

blob.png

1)啓動amoeba軟件

blob.png

blob.png

四、測試讀寫分離

1)打開一臺客戶端192.168.1.10,也須要安裝mysql,做爲測試機,可使用yum -y install mysql安裝。

 

2)創建防火牆規則

[root@centos1 ~]# iptables -I INPUT -p tcp --dport 8066 -j ACCEPT

masterslave1slave2都須要開放3306端口入站

[root@centos2 ~]# iptables -I INPUT -p tcp --dport 3306 -j ACCEPT

[root@centos2 ~]# service iptables save

iptables:將防火牆規則保存到 /etc/sysconfig/iptables:     [肯定]

[root@centos2 ~]#

另外兩臺從服務器也是同樣的配置,或者直接將iptables stop

 

3)修改amoebaamoeba.xml配置文件的第一個8066改成3306以後創建一條防火牆規則爲容許3306端口入站而且從新啓動amoeba服務

<property name="port">3306</property> //11

blob.png

[root@centos1 ~]# amoeba stop

[root@centos1 ~]# amoeba start&

[root@centos1 ~]# iptables -I INPUT -p tcp --dport 3306 -j ACCEPT

在進行登陸amoeba

[root@web ~]# mysql -u amoeba -p123.abc -h 192.168.1.1

blob.png

4)在主服務器master上建立一個數據庫WLZS,同步到各從服務器上,而後關掉從服務器的slave功能,再插入數據。

blob.png

5)查看在從服務器已經同步

blob.png

 

6)而後在主服務器上寫入數據

blob.png

 

7)從服務器上也同步了表

blob.png

8)在兩臺從服務器上執行stop slave

 

9)分別在從服務器上寫入不一樣的數據

blob.png

blob.png

10)在客戶端上查詢

blob.png

11)在客戶機上寫入一條語句

blob.png


12)在客戶端上查不到剛寫入的數據,最終只有在master主服務器上才能看到,由於寫操做只有master有,另外兩臺負責讀取數據。

blob.png

blob.png

總結:到此爲止主從複製和讀寫分離都已完成,寫操做都在主服務器上,實現數據的統一更新,從服務器只負責讀取,負載均衡分擔了數據庫壓力。其實在咱們生活中有不少主從複製的應用,例若有不少連鎖超市,總部負責產品的名稱和價格等信息的錄入,而全部的超市都會同步更新,作到了統一價格。而像淘寶的服務器,主要是爲了分擔負載,提高查詢的性能,又快到雙11了,當天那麼多人同時購物,若是隻有一臺mysql定是不夠的,剛好今天使用的軟件amoeba也是阿里巴巴本身員工開發出來的,通過淘寶這麼多用戶的驗證,效果不用懷疑。最後補充一句,Mysql主從複製與咱們之前學習的sqlserver複製是同樣的做用。

相關文章
相關標籤/搜索