Linux MYSQL主從復(fù)制與讀寫(xiě)分離

2018-07-31 14:43 更新

防偽碼:曾總想穿過(guò)那段最無(wú)暇的時(shí)光,去實(shí)現(xiàn)所有繽紛的夢(mèng)想。

                                第八章 MYSQL主從復(fù)制與讀寫(xiě)分離 

前言:又快到雙十一網(wǎng)購(gòu)狂歡節(jié)了,試想,當(dāng)天那么多的朋友上網(wǎng)購(gòu)物,單單一臺(tái)或幾臺(tái)數(shù)據(jù)庫(kù)服務(wù)器肯定是不夠的。恰好今天使用的軟件amoeba也是阿里巴巴自己?jiǎn)T工開(kāi)發(fā)出來(lái)的,經(jīng)過(guò)淘寶這么多用戶的驗(yàn)證,效果不用懷疑。在實(shí)際的生產(chǎn)環(huán)境中,對(duì)數(shù)據(jù)庫(kù)的讀和寫(xiě)都在同一個(gè)數(shù)據(jù)庫(kù)服務(wù)器中,是不能滿足實(shí)際需求的。無(wú)論是在安全性、高可用性還是高并發(fā)等各個(gè)方面都是完全不能滿足實(shí)際需求的。因此,通過(guò)主從復(fù)制的方式來(lái)同步數(shù)據(jù),再通過(guò)讀寫(xiě)分離來(lái)提升數(shù)據(jù)庫(kù)的并發(fā)負(fù)載能力。有點(diǎn)類(lèi)似于前面我們學(xué)習(xí)過(guò)的rsync,但是不同的是rsync是對(duì)磁盤(pán)文件做備份,而mysql主從復(fù)制是對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)、語(yǔ)句做備份。

如圖所示:

一、 案例前置知識(shí)點(diǎn)

1、 mysq支持的復(fù)制類(lèi)型

1) 基于語(yǔ)句的復(fù)制。在服務(wù)器上執(zhí)行sql語(yǔ)句,在從服務(wù)器上執(zhí)行同樣的語(yǔ)句,mysql默認(rèn)采用基于語(yǔ)句的復(fù)制,執(zhí)行效率高。

2) 基于行的復(fù)制。把改變的內(nèi)容復(fù)制過(guò)去,而不是把命令在從服務(wù)器上執(zhí)行一遍。

3) 混合類(lèi)型的復(fù)制。默認(rèn)采用基于語(yǔ)句的復(fù)制,一旦發(fā)現(xiàn)基于語(yǔ)句無(wú)法精確復(fù)制時(shí),就會(huì)采用基于行的復(fù)制。

2、 復(fù)制的工作過(guò)程

1) 在每個(gè)事務(wù)更新數(shù)據(jù)完成之前,master在二進(jìn)制日志記錄這些改變。寫(xiě)入二進(jìn)制日志完成后,master通知存儲(chǔ)引擎提交事務(wù)。

2) Slave將master的binary log復(fù)制到其中繼日志。首先slave開(kāi)始一個(gè)工作線程(I/O),I/O線程在master上打開(kāi)一個(gè)普通的連接,然后開(kāi)始binlog dump  process。binlog  dump  process從master的二進(jìn)制日志中讀取事件,如果已經(jīng)跟上master,它會(huì)睡眠并等待master產(chǎn)生新的事件,I/O線程將這些事件寫(xiě)入中繼日志。

3) Sql  slave  thread(sql從線程)處理該過(guò)程的最后一步,sql線程從中繼日志讀取事件,并重放其中的事件而更新slave數(shù)據(jù),使其與master中的數(shù)據(jù)一致,只要該線程與I/O線程保持一致,中繼日志通常會(huì)位于os緩存中,所以中繼日志的開(kāi)銷(xiāo)很小。

如圖所示:

 

3、 mysql讀寫(xiě)分離原理

讀寫(xiě)分離就是在主服務(wù)器上修改,數(shù)據(jù)會(huì)同步到從服務(wù)器,從服務(wù)器只能提供讀取數(shù)據(jù),不能寫(xiě)入,實(shí)現(xiàn)備份的同時(shí)也實(shí)現(xiàn)了數(shù)據(jù)庫(kù)性能的優(yōu)化,以及提升了服務(wù)器安全。

前較為常見(jiàn)的Mysql讀寫(xiě)分離分為以下兩種:

 1)基于程序代碼內(nèi)部實(shí)現(xiàn)

        在代碼中根據(jù)select 、insert進(jìn)行路由分類(lèi),這類(lèi)方法也是目前生產(chǎn)環(huán)境下應(yīng)用最廣泛的。優(yōu)點(diǎn)是性能較好,因?yàn)槌绦蛟诖a中實(shí)現(xiàn),不需要增加額外的硬件開(kāi)支,缺點(diǎn)是需要開(kāi)發(fā)人員來(lái)實(shí)現(xiàn),運(yùn)維人員無(wú)從下手。

 2) 基于中間代理層實(shí)現(xiàn)

        代理一般介于應(yīng)用服務(wù)器和數(shù)據(jù)庫(kù)服務(wù)器之間,代理數(shù)據(jù)庫(kù)服務(wù)器接收到應(yīng)用服務(wù)器的請(qǐng)求后根據(jù)判斷后轉(zhuǎn)發(fā)到,后端數(shù)據(jù)庫(kù),有以下代表性的程序。

(1)mysql_proxy。mysql_proxy是Mysql的一個(gè)開(kāi)源項(xiàng)目,通過(guò)其自帶的lua腳本進(jìn)行sql判斷。

(2)Atlas。是由 Qihoo 360, Web平臺(tái)部基礎(chǔ)架構(gòu)團(tuán)隊(duì)開(kāi)發(fā)維護(hù)的一個(gè)基于MySQL協(xié)議的數(shù)據(jù)中間層項(xiàng)目。它是在mysql-proxy 0.8.2版本的基礎(chǔ)上,對(duì)其進(jìn)行了優(yōu)化,增加了一些新的功能特性。360內(nèi)部使用Atlas運(yùn)行的mysql業(yè)務(wù),每天承載的讀寫(xiě)請(qǐng)求數(shù)達(dá)幾十億條。支持事物以及存儲(chǔ)過(guò)程。

(3)Amoeba。由阿里巴巴集團(tuán)在職員工陳思儒使用序java語(yǔ)言進(jìn)行開(kāi)發(fā),阿里巴巴集團(tuán)將其用戶生產(chǎn)環(huán)境下,但是他并不支持事物以及存數(shù)過(guò)程。

 經(jīng)過(guò)上述簡(jiǎn)單的比較,不是所有的應(yīng)用都能夠在基于程序代碼中實(shí)現(xiàn)讀寫(xiě)分離,像一些大型的java應(yīng)用,如果在程序代碼中實(shí)現(xiàn)讀寫(xiě)分離對(duì)代碼的改動(dòng)就較大,所以,像這種應(yīng)用一般會(huì)考慮使用代理層來(lái)實(shí)現(xiàn),那么今天就使用Amoeba為例,完成主從復(fù)制和讀寫(xiě)分離。

 二、 實(shí)驗(yàn)案例:mysql主從復(fù)制和讀寫(xiě)分離

1、 實(shí)驗(yàn)拓?fù)?/span>

2、 實(shí)驗(yàn)環(huán)境

在amoeba上安裝amoeba和jdk,在其它的機(jī)器上安裝mysql,ip地址如上圖所示

 三、 主從復(fù)制的實(shí)驗(yàn)步驟

1、搭建時(shí)間NTP服務(wù)器,同步時(shí)間

1) 建立時(shí)間同步環(huán)境,在主節(jié)點(diǎn)上搭建時(shí)間同步服務(wù)器

2) 配置NTP時(shí)間服務(wù)器

Vim  /etc/ntp.conf

3) 重啟ntpd服務(wù)

4) 在防火墻上開(kāi)啟指定端口

5) 在從節(jié)點(diǎn)上進(jìn)行時(shí)間同步

在另一臺(tái)從服務(wù)器上執(zhí)行相同操作

2、 在mysql主和兩臺(tái)從服務(wù)器上安裝mysql,我以其中一臺(tái)為例。

(1) 安裝mysql并創(chuàng)建程序用戶

[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)優(yōu)化程序執(zhí)行路徑

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

(3)創(chuàng)建主配置文件

[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)創(chuàng)建服務(wù)腳本并添加為系統(tǒng)服務(wù)

[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)初始化數(shù)據(jù)庫(kù)

[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)修改安裝目錄權(quán)限

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

 (7)啟動(dòng)服務(wù)

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

 (8)為用戶root設(shè)置密碼

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

默認(rèn)沒(méi)有密碼,直接在確認(rèn)舊密碼處回車(chē)即可。

 (9)登錄mysql數(shù)據(jù)庫(kù)

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

3、 配置mysql主服務(wù)器(MASTER)

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

server-id       = 11                        //mysql數(shù)據(jù)的唯一標(biāo)示(不能重復(fù))

log-slave-updates=true                        //允許連級(jí)復(fù)制  (增加)

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

2) 重啟MySQL服務(wù)

3) 登錄mysql程序,給從服務(wù)器授權(quán)

mysql  -u  root  -p

注:上圖中File列顯示日志名,Position列顯示偏移量,這兩個(gè)值在后面配置從服務(wù)器

的時(shí)候需要。

4、 配置從服務(wù)器

1) 在/etc/my.cnf中修改以下內(nèi)容

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

server-id       = 22                                                //不能與其他實(shí)例重復(fù)

log-bin=mysql-bin                                                        //二進(jìn)制日志文件名 修改

relay-log=relay-log-bin                                        //復(fù)制過(guò)來(lái)的二進(jìn)制文件名,增加

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

注意server-id不能與主服務(wù)器相同,但是從服務(wù)器要相同。

2) 重啟mysql服務(wù)

3) 登錄mysql,配置同步(按照主服務(wù)器結(jié)果更改下面命令中

master_file和master_log_pos參數(shù))

4)啟動(dòng)同步

5) 查看slave狀態(tài),確保以下兩個(gè)值為YES

5、 驗(yàn)證主從復(fù)制效果

1) 在主服務(wù)器上新建數(shù)據(jù)庫(kù)“IT”

2) 在從服務(wù)器上查看數(shù)據(jù)庫(kù),如果和主服務(wù)器相同,說(shuō)明主從復(fù)制成功。

四、 搭建MySQL讀寫(xiě)分離

1、 安裝java環(huán)境(amoeba軟件基于java平臺(tái)運(yùn)行)

1)運(yùn)行jdk

安裝過(guò)程中提示(yes/no),我們要選擇yes安裝

2) 修改/etc/profile配置文件,增加以下配置

export JAVA_HOME=/usr/local/jdk1.6  //設(shè)置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的程序文件復(fù)制給PATH變量

3) 執(zhí)行腳本

2、 安裝并配置Amoeba軟件

官方解釋?zhuān)篈moeba(變形蟲(chóng)),這個(gè)軟件致力于MySQL的分布式數(shù)據(jù)庫(kù)前端代理層,主要為應(yīng)用層訪問(wèn)MySQL的時(shí)候

充當(dāng)SQL路由功能,并具有負(fù)載均衡、高可用性、SQL過(guò)濾、讀寫(xiě)分離、可路由相關(guān)的到目的數(shù)據(jù)庫(kù),可并發(fā)

請(qǐng)求多臺(tái)數(shù)據(jù)庫(kù)。

3、 配置amoeba讀寫(xiě)分離,兩個(gè)slave讀負(fù)載均衡

1) 在主從服務(wù)器上開(kāi)放權(quán)限給amoeba訪問(wèn)(三臺(tái)服務(wù)器上都做相同設(shè)置,這里我就以其中一臺(tái)為例)

2) 修改amoeba.xml文件

注意:所有配置文件注釋都是以 <!-- 內(nèi)容 -->,再刪除注釋時(shí)請(qǐng)將內(nèi)容也一并刪除,最好是刪除正行,

但是有些時(shí)候只需要?jiǎng)h除頭和尾即可,里面的配置項(xiàng)是可以直接使用的。這個(gè)配置文件需要定義兩

個(gè)配置,第一是應(yīng)用程序使用什么用戶連接amoeba訪問(wèn)到后端的mysql數(shù)據(jù)庫(kù),第二個(gè)是定義默認(rèn)寫(xiě)池以及讀池。

vi /usr/local/amoeba/conf/amoeba/amoaba.xml

接下來(lái)修改

3) 編輯dbServers.xml文件

vi /usr/local/amoeba/conf/dbServers.xml

接下圖

4) 啟動(dòng)amoeba軟件(默認(rèn)端口為tcp 8066)

4、 測(cè)試讀寫(xiě)分離

1) 打開(kāi)一臺(tái)客戶端192.168.1.10,也需要安裝mysql,作為測(cè)試機(jī),可以使用yum -y install mysql安裝。

2)建立防火墻規(guī)則

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

master、slave1、slave2都需要開(kāi)放3306端口入站

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

[root@centos2 ~]# service iptables save

另外兩臺(tái)從服務(wù)器也是一樣的配置,或者直接將iptables stop掉

3)在客戶端登錄

4) 在主服務(wù)器master上創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)YZZG(一盞燭光,嘿嘿),同步到各從服務(wù)器上,然后關(guān)掉從服務(wù)器的slave功能,再插入數(shù)據(jù)。

5) 查看在從服務(wù)器已經(jīng)同步

6) 然后在主服務(wù)器上寫(xiě)入數(shù)據(jù)

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

8)在兩臺(tái)從服務(wù)器上執(zhí)行stop slave, 分別在從服務(wù)器上寫(xiě)入不同的數(shù)據(jù)

9) 在客戶端上查詢

10) 在客戶機(jī)上寫(xiě)入一條語(yǔ)句

11) 在客戶端上查不到剛寫(xiě)入的數(shù)據(jù),最終只有在master主服務(wù)器上才能看到,因?yàn)閷?xiě)操作只有master有,另外兩臺(tái)負(fù)責(zé)讀取數(shù)據(jù)。

總結(jié):到此為止主從復(fù)制和讀寫(xiě)分離都已完成,寫(xiě)操作都在主服務(wù)器上,實(shí)現(xiàn)數(shù)據(jù)的統(tǒng)一更新,從服務(wù)器只負(fù)責(zé)讀取,負(fù)載均衡分擔(dān)了數(shù)據(jù)庫(kù)壓力。其實(shí)在我們生活中有很多主從復(fù)制的應(yīng)用,例如有很多連鎖超市,總部負(fù)責(zé)產(chǎn)品的名稱和價(jià)格等信息的錄入,而所有的超市都會(huì)同步更新,做到了統(tǒng)一價(jià)格。而像淘寶的服務(wù)器,主要是為了分擔(dān)負(fù)載,提升查詢的性能,最后補(bǔ)充一句,Mysql主從復(fù)制與我們以前學(xué)習(xí)的sqlserver復(fù)制是一樣的作用。

謝謝觀看,真心的希望能幫到您。

本文出自 “一盞燭光” 博客,謝絕轉(zhuǎn)載!

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)