mysql 主從配置和集羣負載均衡

  • 閱讀目錄php

    一、簡介
    二、基本環境
    三、配置MySQL主主複製
    四、中間件簡述
      4.一、Haproxy介紹
      4.二、keepalived介紹
    五、中間件的安裝與配置(haproxy、keepalived)
      5.一、安裝haproxy
      1)、編譯安裝haproxy
      2)、提供啓動腳本
      3)、提供配置文件
      4)、啓動日誌
      5)、啓動haproxy
      6)、測試haproxy
      5.二、安裝keepalived
      1)、解決缺乏的軟件庫文件
      2)、編譯安裝keepalived軟件
      3)、建立配置文件
      4)、建立腳本文件
    六、功能測試
      6.一、流程簡述
      6.二、測試haproxy監聽前端端口3306
      6.三、測試高可用+keepalived不搶佔vip
      6.四、測試負載均衡
    七、總結與建議html

 

一、簡介

  使用MySQL時隨着時間的增加,用戶量以及數據量的逐漸增長,訪問量更是劇增,最終將會使MySQL達到某個瓶頸,那麼MySQL的性能將會大大下降。這一結果也不利於軟件的推廣。前端

  那麼如何跨過這個瓶頸,提升MySQL的併發量呢?方法有不少,分佈式數據庫、讀寫分離、高可用負載均衡、增長緩存服務器等等。以前的文章裏已經介紹了讀寫分離的方案了,接下來我將講解MySQL高可用負載均衡這一方法。mysql

  其中實現高可用負載均衡的方法有不少,例如LVS+keepalived組合實現、haproxy+keepalived組合實現等等,這裏咱們採用haproxy+keepalived組合實現MySQL高可用負載均衡這一技術。linux

 

二、基本環境

四臺linux虛擬主機web

Linux版本CentOS6.6redis

MySQL 5.5(已安裝好)sql

haproxy-1.5.14數據庫

keepalived-1.2.19apache

IP:192.168.95.11(mysql1)、192.168.95.12(mysql2)、192.168.95.13(haproxy+keepalived)、192.168.95.14(haproxy+keepalived)、192.168.95.55(vip)

 

三、配置MySQL主主複製

詳細配置步驟能夠參考這篇文章:

http://www.cnblogs.com/phpstudy2015-6/p/6485819.html#_label7

如下簡要介紹一下mysql的主主複製:

何爲主主複製?就是兩個mysql都能讀能寫,數據記錄經過二進制傳達給對方從而保持數據的一致性。

(192.168.95.11主從複製+192.168.95.12主從複製==192.168.95.11、192.168.95.12主主複製)

  所以主主複製中必需要解決的事情就是自增主鍵的問題。若是mysql1主鍵id增長到12了,此時二進制數據還沒到達mysql2,那麼mysql2剛好要插入數據,那麼新數據主鍵id也是12,那不就是亂套了麼!解決這一問題咱們能夠直接更改MySQL中的配置文件便可。

1)、更改配置文件

複製代碼
--192.168.95.11:MySQL
server-id=11   #任意天然數n,只要保證兩臺MySQL主機不重複就能夠了。
log-bin=mysql-bin   #開啓二進制日誌
auto_increment_increment=2   #步進值auto_imcrement。通常有n臺主MySQL就填n
auto_increment_offset=1   #起始值。通常填第n臺主MySQL。此時爲第一臺主MySQL
binlog-ignore=mysql   #忽略mysql庫【我通常都不寫】
binlog-ignore=information_schema   #忽略information_schema庫【我通常都不寫】
replicate-do-db=aa   #要同步的數據庫,默認全部庫
--192.168.95.12:MySQL
server-id=12
log-bin=mysql-bin
auto_increment_increment=2
auto_increment_offset=2
replicate-do-db=aa
複製代碼

配置好後重啓MySQL

2)、配置192.168.95.11主從複製

  一、在192.168.95.12中建立一個192.168.95.11主機中能夠登陸的MySQL用戶

      用戶:mysql11

      密碼:mysql11

mysql>GRANT REPLICATION SLAVE ON *.* TO ‘mysql11’@’192.168.95.11’ IDENTIFIED BY ’mysql11’;
mysql>FLUSH PRIVILEGES;

  二、查看192.168.95.12二進制日誌

mysql> show master status;

 

  三、告知二進制文件名與位置

複製代碼
mysql> change master to
    -> master_host='192.168.95.11',
    -> master_user='mysql11',
    ->master_password='mysql11',
    ->master_log_file='mysql-bin.000097',
    -> master_log_pos=107;
複製代碼

  四、查看結果

mysql> slave start;
mysql> show slave status\G

 

配置主從複製成功

3)、配置192.168.95.12主從複製

同上

配置主從複製成功。

 

四、中間件簡述

  4.1、Haproxy介紹

Haproxy是一個開源的高性能的反向代理或者說是負載均衡服務軟件之一,它支持雙機熱備、虛擬主機、基於TCP和HTTP應用代理等功能。其配置簡單,並且擁有很好的對服務器節點的健康檢查功能(至關於keepalived健康檢查),當其代理的後端服務器出現故障時,Haproxy會自動的將該故障服務器摘除,當服務器的故障恢復後Haproxy還會自動將RS服務器。

HAProxy特別適用於那些負載特大的web站點,這些站點一般又須要會話保持或七層處理。HAProxy運行在當前的硬件上,徹底能夠支持數以萬計的併發鏈接。而且它的運行模式使得它能夠很簡單安全的整合進您當前的架構中, 同時能夠保護你的web服務器不被暴露到網絡上。

Haproxy軟件引入了frontend,backend的功能,frontend(acl規則匹配)能夠根據任意HTTP請求頭作規則匹配,而後把請求定向到相關的backend(server pools等待前端把請求轉過來的服務器組)。經過frontend和backup,咱們能夠很容易的實現haproxy的7層代理功能,haproxy是一款不可多得的優秀代理服務軟件。

  4.2、keepalived介紹

keepalived是以VRRP協議爲實現基礎的,VRRP全稱Virtual Router Redundancy Protocol,即虛擬路由冗餘協議。

虛擬路由冗餘協議,能夠認爲是實現路由器高可用的協議,即將N臺提供相同功能的路由器組成一個路由器組,這個組裏面有一個master和多個backup,master上面有一個對外提供服務的vip(該路由器所在局域網內其餘機器的默認路由爲該vip),master會發組播,當backup收不到vrrp包時就認爲master宕掉了,這時就須要根據VRRP的優先級來選舉一個backup當master。這樣的話就能夠保證路由器的高可用了。

keepalived主要有三個模塊,分別是core、check和vrrp。core模塊爲keepalived的核心,負責主進程的啓動、維護以及全局配置文件的加載和解析。check負責健康檢查,包括常見的各類檢查方式。vrrp模塊是來實現VRRP協議的。

 

五、中間件的安裝與配置(haproxy、keepalived)

百度雲下載:http://pan.baidu.com/s/1qYoCjDE  密碼:7cef

  5.一、安裝haproxy

在192.168.95.1三、192.168.95.14安裝haproxy(如出一轍安裝)

  1)、編譯安裝haproxy

# tar -zxvf haproxy-1.5.14.tar.gz
# cd haproxy-1.5.14
# make TARGET=linux26 ARCH=x86_64 
# make install SBINDIR=/usr/sbin/ MANDIR=/usr/share/man/ DOCDIR=/usr/share/doc/

 

注意:

一、爲何不用configure,請看下圖。haproxy-1.5.14已經存在Makefile文件了。

二、make的時候,target以及arch須要根據本身的linux主機設置

三、make install的時候我增長了一些額外選項。這可加可不加由本身配置,不加的話將會按默認路徑安裝,請看下圖。

  2)、提供啓動腳本

將haproxy這個啓動腳本放在/etc/init.d/文件夾下,以便咱們能夠直接service啓動它

【注意】:此啓動腳本僅僅適合我以上的安裝路徑。倘若安裝路徑不一樣,則須要進行相應的修改方可以使用。

  View Code

 

#給執行權力
#chmod +x /etc/init.d/haproxy 

  3)、提供配置文件

根據上面的啓動腳本創建相應的目錄以及配置文件

# mkdir /etc/haproxy
# mkdir /var/lib/haproxy
# useradd -r haproxy       #創建腳本啓動用戶
# vi /etc/haproxy/haproxy.cfg

 

【配置文件】

#這裏的配置文件僅僅只是貼出來進行解析說明。

#若是須要這個配置文件最好將註釋解析所有刪除掉,由於我在使用的過程當中,正是由於存在註釋解析而致使出錯,刪除後就能正常運行。

#能夠下載這個配置文件進行使用,與下面貼出來的配置文件一致,只是不存在註釋解析

#百度雲下載該配置文件(不含註釋):連接:http://pan.baidu.com/s/1gfOMtKB  密碼:zl9o

 

複製代碼
global

    log         127.0.0.1 local2         //日誌定義級別
    chroot      /var/lib/haproxy         //當前工做目錄
    pidfile     /var/run/haproxy.pid     //進程id
    maxconn     4000                     //最大鏈接數
    user        haproxy                  //運行改程序的用戶
    group       haproxy
    daemon                               //後臺形式運行
    stats socket /var/lib/haproxy/stats

defaults
    mode                    tcp            //haproxy運行模式(http | tcp | health)
    log                     global
    option                  dontlognull
    option                  redispatch     //serverId對應的服務器掛掉後,強制定向到其餘健康的服務器
    retries                 3              //三次鏈接失敗則服務器不用
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s            //鏈接超時
    timeout client          1m             //客戶端超時
    timeout server          1m             //服務器超時
    timeout http-keep-alive 10s
    timeout check           10s            //心跳檢測
    maxconn                 600            //最大鏈接數

listen stats                               //配置haproxy狀態頁(用來查看的頁面)
    mode http
    bind :8888
    stats enable
    stats hide-version                    //隱藏haproxy版本號
stats uri     /haproxyadmin?stats     //一會用於打開狀態頁的uri
    stats realm   Haproxy\ Statistics     //輸入帳戶密碼時的提示文字
    stats auth    admin:admin             //用戶名:密碼

frontend  main 
bind 0.0.0.0:3306                     //使用3306端口。監聽前端端口【表示任何ip訪問3306端口都會將數據輪番轉發到mysql服務器羣組中】
    default_backend             mysql     //後端服務器組名

backend mysql
    balance     leastconn                 //使用最少鏈接方式調度
    server mysql1 192.168.95.11:3306 check port 3306 maxconn 300
    server mysql2 192.168.95.12:3306 check port 3306 maxconn 300
複製代碼

 

  4)、啓動日誌

# vi /etc/rsyslog.conf 

#service rsyslog restart

  5)、啓動haproxy

# service haproxy start

  6)、測試haproxy

安照配置文件進行相應的測試

打開瀏覽器輸入192.168.95.13:8888/haproxyadmin?stats

登錄後以下如所示,代表安裝haproxy成功。

  5.二、安裝keepalived

官網下載:http://www.keepalived.org/download.html

在192.168.95.1三、192.168.95.14安裝keepalived

  1)、解決缺乏的軟件庫文件

【這一步驟視具體的linux版本而定,有些已經安裝openssl了。具體狀況能夠執行./configure就可以肯定缺不缺乏軟件庫文件了】

首先咱們先將keepalived-1.2.19.tar.gz解壓,而後進入目錄./configure查看

# tar -zxvf keepalived-1.2.19.tar.gz
# ./configure --prefix=/usr/local/keepalived  --sbindir=/usr/sbin/ --sysconfdir=/etc/ --mandir=/usr/local/share/man/ --with-kernel-dir=/usr/src/kernels/2.6.32-504.el6.x86_64/

 由上圖可見keepalived的安裝須要先安裝軟件OpenSSL

缺乏頭文件,只須要安裝openssl和openssl-devel便可

最簡單的方法是:yum -y install openssl openssl-devel

沒網的朋友也不用怕,接下來將介紹的是rpm方法安裝:

#掛載光盤,在光盤中查找軟件。若光盤找不到就直接下載,再傳入linux進行安裝

# mount /dev/cdrom  /home/suifeng2/rom/
# cd rom/
# cd Packages/
# ls |grep openssl

安裝keepalived軟件時存在各類依賴,下圖是我安裝軟件後整理的依賴關係圖:

既然已經知道各軟件依賴,則可按最後面的軟件開始安裝:

(你也能夠從前面開始進行安裝,一步一步的查看各個依賴關係)

1、安裝openssl

# rpm -ivh openssl-1.0.1e-30.el6.x86_64.rpm

安裝openssl成功

2、安裝openssl-devel

安裝libsepol-devel:

# rpm -ivh libsepol-devel-2.0.41-4.el6.x86_64.rpm

安裝pkgconfig(libsepol):

# rpm -ivh pkgconfig-0.23-9.1.el6.x86_64.rpm

安裝libselinux-devel:

# rpm -ivh libselinux-devel-2.0.94-5.8.el6.x86_64.rpm

安裝keyutils-libs-devel:

# rpm -ivh keyutils-libs-devel-1.4-5.el6.x86_64.rpm

安裝libcom_err-devel:

# rpm -ivh libcom_err-devel-141.12-21.el6.x86_64.rpm

 

安裝krb5-devel:

# rpm -ivh krb5-devel-1.10.3-33.el6.x86_64.rpm

安裝zlib-devel:

# rpm -ivh zlib-devel-1.2.3-29.el6.x86_64.rpm

安裝openssl-devel

# rpm -ivh openssl-devel-1.0.1e-30.el6.x86_64.rpm

  2)、編譯安裝keepalived軟件

複製代碼
# cd keepalived-1.2.19
# ./configure --prefix=/usr/local/keepalived  --sbindir=/usr/sbin/ --sysconfdir=/etc/ --mandir=/usr/local/share/man/ --with-kernel-dir=/usr/src/kernels/2.6.32-504.el6.x86_64/
# make && make install
# chkconfig --add keepalived #添加開機自啓(我暫時沒添加) # chkconfig keepalived on
複製代碼

 

【注意】:

一、安裝時./configure中的—prefix後的幾個選擇可選可不選,選了就能夠採用service直接啓動了。建議最好都加上吧

二、--with-kernel-dir這個選項根據本身的linux版本進行填寫(在linux中使用命令uname –a能夠查到)

  3)、建立配置文件

/etc/keepalived/文件夾已存在keepalived.conf文件,咱們將它更名爲keepalived.conf.back,再創建一個咱們本身keepalived.conf配置文件。

vi /etc/keepalived/keepalived.conf(13與14配置文件路徑一致)

【如下是簡單的配置文件,使用時最好去掉註釋】

配置文件下載(不含註釋):

192.168.95.13配置文件:

複製代碼
! Configuration File for keepalived
#簡單的頭部,這裏主要能夠作郵件通知報警等的設置,此處就暫不配置了;
global_defs {
        notificationd LVS_DEVEL
}
#預先定義一個腳本,方便後面調用,也能夠定義多個,方便選擇;
vrrp_script chk_haproxy {
    script "/etc/keepalived/chk.sh"  #具體腳本路徑
    interval 2  #腳本循環運行間隔
}
#VRRP虛擬路由冗餘協議配置
vrrp_instance VI_1 {   #VI_1 是自定義的名稱;
    state BACKUP    #MASTER表示是一臺主設備,BACKUP表示爲備用設備【咱們這裏由於設置爲開啓不搶佔,因此都設置爲備用】
    nopreempt      #開啓不搶佔
    interface eth0   #指定VIP須要綁定的物理網卡
    virtual_router_id 11   #VRID虛擬路由標識,也叫作分組名稱,該組內的設備須要相同
    priority 130   #定義這臺設備的優先級 1-254;開啓了不搶佔,因此此處優先級必須高於另外一臺

    advert_int 1   #生存檢測時的組播信息發送間隔,組內一致
    authentication {    #設置驗證信息,組內一致
        auth_type PASS   #有PASS 和 AH 兩種,經常使用 PASS
        auth_pass asd    #密碼
    }
    virtual_ipaddress {
        192.168.95.55    #指定VIP地址,組內一致,能夠設置多個IP
    }
    track_script {    #使用在這個域中使用預先定義的腳本,上面定義的
        chk_haproxy   
    }

    notify_backup "/etc/init.d/haproxy restart"   #表示當切換到backup狀態時,要執行的腳本
    notify_fault "/etc/init.d/haproxy stop"     #故障時執行的腳本
}
複製代碼

192.168.95.14配置文件:

配置文件與上面的幾乎同樣,僅僅改變priority 120【只須要比上面的小便可】

  4)、建立腳本文件

建立上面配置文件所需的腳本文件(1三、14同樣)

(檢測haproxy有沒有發生故障,發生故障則將keepalived停掉,讓出vip)

# vi /etc/keepalived/chk.sh#!/bin/bash
#
if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
       /etc/init.d/keepalived stop
fi
給執行權限
# chmod +x /etc/keepalived/chk.sh

啓動keepalived:
# service keepalived start

安裝keepalived成功!

 

六、功能測試

測試以前先在mysql1和mysql2中創建一個mysql用戶,此用戶能夠容許1三、14linux主機登錄:

用戶:jack

密碼:321

host:192.168.95.%

mysql> GRANT ALL ON *.* TO 'jack'@'192.168.95.%' IDENTIFIED BY '321';
mysql> FLUSH PRIVILEGES;

  6.一、流程簡述

大概講述一下總體的運做流程:

首先兩個11,12的mysql以及1三、14的haproxy、keepalived都啓動;

keepalived在keepalived羣組中獲取虛擬IP,以及檢測haproxy是否被kill;

haproxy負責將進來的數據轉發到11或者12的mysql中。

下圖是我畫的簡單理解圖:(相對來講比較簡潔哈,湊合湊合哈)

接下來咱們將一個個功能的進行測試驗證。

  6.二、測試haproxy監聽前端端口3306

一、frontend監聽端口3306時,將mysql、haproxy、keepalived所有開啓

二、使用任意一個mysql客戶端登錄用戶jack

登錄成功(windowns上登錄mysql)

三、更改frontend監聽端口爲3307,繼續操做登錄測試

登錄失敗

結果:說明了frontend監聽端口的用處,有助於咱們理解haproxy用法。

  6.三、測試高可用+keepalived不搶佔vip

能夠經過haproxy監控頁面獲知誰獲取了vip

一、依次啓動1三、14的keepalived、haproxy(啓動keepalived後將會自動開啓haproxy)

二、訪問http://192.168.95.55:8888/haproxyadmin?stats

13獲取了vip

三、# kill -9 8923

刷新http://192.168.95.55:8888/haproxyadmin?stats

14獲取了vip,機器正常工做

結果:證實了高可用,掛了一臺另外一臺繼續工做

四、從新啓動13的haproxy以及keepalived

並刷新http://192.168.95.55:8888/haproxyadmin?stats

結果:此時vip仍在14手中,證實了keepalived配置了不搶佔vip,沒必要浪費資源去獲取vip。

  6.四、測試負載均衡

一、所有正常啓動,此時vip在14手中

二、分別在十一、12中開啓抓包

# tcpdump -n -i eth0 host 192.168.95.11 and 192.168.95.14
# tcpdump -n -i eth0 host 192.168.95.12 and 192.168.95.14

三、使用不一樣客戶端登錄jack用戶,不斷向數據庫添加數據

結果:此時14向十一、12都有發送數據,此時證實負載均衡

【咱們設置的haproxy中balance方式是最少鏈接方式,倘若採用roundrobin方式測試結果將會更加明顯】

注意:

當某一臺mysql掛了之後,haproxy會將其踢出mysql服務器羣組。

當有命令傳來時會將其轉發到正常的服務器上。

當出問題的mysql恢復後,haproxy又會自動地將它放回mysql服務器羣組中,而且自動同步沒有同步的數據

測試:

一、所有正常啓動

mysql一、mysql2都正常

 二、將mysql2關掉

mysql2出問題,將其踢出mysql羣組

三、啓動mysql2

mysql2恢復後又將其放回mysql羣組裏

【當mysql2掛掉時,如有數據插入,將會轉發給mysql1,當mysql恢復後,又會將這些數據同步到mysql2中】

 

七、總結與建議

  在這篇博文中咱們不只僅只關注這一整個mysql高可用負載均衡的實現方式,咱們還應該理解haproxy以及keepalived的工做方式。Haproxy和keepalived這兩個工具很強大,瞭解他們的實現方式,那麼就能夠以此類推與其餘服務器組合構建強大健壯的服務集羣。例如它能夠與apache組合,構成高可用負載均衡的web集羣。

  這篇文章中只是簡簡單單的搭建了一個mysql高可用負載均衡的環境,真正應用到生產環境中,還須要根據具體項目進行相應的修改。

  最後個人小建議就是看完這篇博客能夠去了解了解更多的haproxy和keepalived的相應配置,以及學習與haproxy功能差很少的LVS。

 

(以上是本身的一些看法與總結,如有不足或者錯誤的地方請各位指出)

相關文章
相關標籤/搜索