Linux MYSQL主從復制與讀寫分離

2018-07-31 14:43 更新

防偽碼:曾總想穿過那段最無暇的時光,去實現(xiàn)所有繽紛的夢想。

                                第八章 MYSQL主從復制與讀寫分離 

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

如圖所示:

一、 案例前置知識點

1、 mysq支持的復制類型

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

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

3) 混合類型的復制。默認采用基于語句的復制,一旦發(fā)現(xiàn)基于語句無法精確復制時,就會采用基于行的復制。

2、 復制的工作過程

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

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

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

如圖所示:

 

3、 mysql讀寫分離原理

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

前較為常見的Mysql讀寫分離分為以下兩種:

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

        在代碼中根據select 、insert進行路由分類,這類方法也是目前生產環(huán)境下應用最廣泛的。優(yōu)點是性能較好,因為程序在代碼中實現(xiàn),不需要增加額外的硬件開支,缺點是需要開發(fā)人員來實現(xiàn),運維人員無從下手。

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

        代理一般介于應用服務器和數據庫服務器之間,代理數據庫服務器接收到應用服務器的請求后根據判斷后轉發(fā)到,后端數據庫,有以下代表性的程序。

(1)mysql_proxy。mysql_proxy是Mysql的一個開源項目,通過其自帶的lua腳本進行sql判斷。

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

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

 經過上述簡單的比較,不是所有的應用都能夠在基于程序代碼中實現(xiàn)讀寫分離,像一些大型的java應用,如果在程序代碼中實現(xiàn)讀寫分離對代碼的改動就較大,所以,像這種應用一般會考慮使用代理層來實現(xiàn),那么今天就使用Amoeba為例,完成主從復制和讀寫分離。

 二、 實驗案例:mysql主從復制和讀寫分離

1、 實驗拓撲

2、 實驗環(huán)境

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

 三、 主從復制的實驗步驟

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

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

2) 配置NTP時間服務器

Vim  /etc/ntp.conf

3) 重啟ntpd服務

4) 在防火墻上開啟指定端口

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

在另一臺從服務器上執(zhí)行相同操作

2、 在mysql主和兩臺從服務器上安裝mysql,我以其中一臺為例。

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

[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

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

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

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

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

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

2) 重啟MySQL服務

3) 登錄mysql程序,給從服務器授權

mysql  -u  root  -p

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

的時候需要。

4、 配置從服務器

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                //中繼日志存放的文件名稱,增加

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

2) 重啟mysql服務

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

master_file和master_log_pos參數)

4)啟動同步

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

5、 驗證主從復制效果

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

2) 在從服務器上查看數據庫,如果和主服務器相同,說明主從復制成功。

四、 搭建MySQL讀寫分離

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

1)運行jdk

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

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

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

3) 執(zhí)行腳本

2、 安裝并配置Amoeba軟件

官方解釋:Amoeba(變形蟲),這個軟件致力于MySQL的分布式數據庫前端代理層,主要為應用層訪問MySQL的時候

充當SQL路由功能,并具有負載均衡、高可用性、SQL過濾、讀寫分離、可路由相關的到目的數據庫,可并發(fā)

請求多臺數據庫。

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

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

2) 修改amoeba.xml文件

注意:所有配置文件注釋都是以 <!-- 內容 -->,再刪除注釋時請將內容也一并刪除,最好是刪除正行,

但是有些時候只需要刪除頭和尾即可,里面的配置項是可以直接使用的。這個配置文件需要定義兩

個配置,第一是應用程序使用什么用戶連接amoeba訪問到后端的mysql數據庫,第二個是定義默認寫池以及讀池。

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

接下來修改

3) 編輯dbServers.xml文件

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

接下圖

4) 啟動amoeba軟件(默認端口為tcp 8066)

4、 測試讀寫分離

1) 打開一臺客戶端192.168.1.10,也需要安裝mysql,作為測試機,可以使用yum -y install mysql安裝。

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

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

master、slave1、slave2都需要開放3306端口入站

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

[root@centos2 ~]# service iptables save

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

3)在客戶端登錄

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

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

6) 然后在主服務器上寫入數據

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

8)在兩臺從服務器上執(zhí)行stop slave, 分別在從服務器上寫入不同的數據

9) 在客戶端上查詢

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

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

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

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

本文出自 “一盞燭光” 博客,謝絕轉載!

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號