20191216_LVS+KeepAlived+Dbproxy+Mysql高可用集群方案

LVS+KeepAlived+Dbproxy+Mysql高可用集群方案

參考文檔https://www.php.cn/mysql-tutorials-116060.html

一魏身、安裝mysql5.6

1熙侍、添加MySQL源
rpm -ivh https://repo.mysql.com//mysql57-community-release-el7-9.noarch.rpm
vim /etc/yum.repos.d/mysql-community.repo
    [mysql56-community]
    name=MySQL 5.6 Community Server
    baseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/7/$basearch/
    enabled=1   #這里改成1
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
    
    [mysql57-community]
    name=MySQL 5.7 Community Server
    baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/
    enabled=0  #這里改成0,禁用
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

2甸饱、安裝mysql 5.6
 2.1安裝
    yum install mysql-server
 2.2 初始化        #參考文檔https://www.cnblogs.com/sunny18/p/8684861.html
    mysql_secure_installation

二联四、配置MySQL主從復制

1. 修改master節(jié)點配置文件:

vim /etc/my.cnf
    [mysqld]
    server-id=1 #不得與其他節(jié)點相同
    report-port=3306
    port=3306
    datadir=/data/mysql/
    socket=/tmp/mysql.sock
    binlog-format=ROW
    log-bin=master-bin
    log-bin-index=master-bin.index
    log-slave-updates=true
    gtid-mode=on 
    enforce-gtid-consistency=true
    expire-logs-days=7
    master-info-repository=TABLE
    relay-log-info-repository=TABLE
    sync-master-info=1
    slave-parallel-workers=2
    binlog-checksum=CRC32
    master-verify-checksum=1
    slave-sql-verify-checksum=1
    binlog-rows-query-log_events=1
    auto_increment_increment=2 #該配置只需要在master1撑碴、master2上配置 用來確保自增鍵不沖突 
    auto_increment_offset=1 #該配置只需要在master1、master2上配置 用來確保自增鍵不沖突 
    #binlog-do-db=mydb #需要同步的數(shù)據(jù)庫朝墩,多個數(shù)據(jù)庫添加多行配置項即可,需要重啟mysql實例
    #mysql中有自增長字段醉拓,在做數(shù)據(jù)庫的主主同步時需要設置自增長的兩個相關配置:auto_increment_offset和auto_increment_increment。auto_increment_offset表示自增長字段從那個數(shù)開始收苏,他的取值范圍是1 .. 65535亿卤。auto_increment_increment表示自增長字段每次遞增的量,其默認值是1鹿霸,取值范圍是1 .. 65535
    ##在主主同步配置時排吴,需要將兩臺服務器的auto_increment_increment增長量都配置為2,而要把auto_increment_offset分別配置為1和2.這樣才可以避免兩臺服務器同時做更新時自增長字段的值之間發(fā)生沖突懦鼠。

2.修改slave節(jié)點配置文件

vim /etc/my.cnf
    [mysqld]
    binlog-format=ROW
    log-slave-updates=true
    gtid-mode=on 
    enforce-gtid-consistency=true
    master-info-repository=TABLE
    relay-log-info-repository=TABLE
    sync-master-info=1
    slave-parallel-workers=2
    binlog-checksum=CRC32
    master-verify-checksum=1
    slave-sql-verify-checksum=1
    binlog-rows-query-log_events=1
    server-id=11 #不得與其他節(jié)點相同
    report-port=3306
    port=3306
    log-bin=mysql-bin.log
    datadir=/mydata
    socket=/tmp/mysql.sock
    #auto_increment_increment=2 #該配置只需要在master1钻哩、master2上配置 用來確保自增鍵不沖突 
    #auto_increment_offset=1 #該配置只需要在master1、master2上配置 用來確保自增鍵不沖突 
    #binlog-do-db=mydb #需要同步的數(shù)據(jù)庫肛冶,多個數(shù)據(jù)庫添加多行配置項即可,需要重啟mysql實例

注:四個節(jié)點的配置信息差不多一樣街氢,server-id要確保唯一性。

3淑趾、登錄mysql創(chuàng)建復制用戶

#為了便于管理阳仔,本例中將所有節(jié)點的復制用戶都設置為一樣的。
GRANT REPLICATION SLAVE ON *.* TO repl@'%' IDENTIFIED BY 'passwd';
GRANT REPLICATION SLAVE ON *.* TO root@'%' IDENTIFIED BY '123456';
flush privileges;

4扣泊、為備節(jié)點提供初始數(shù)據(jù)集

注:
    鎖定主表近范,備份主節(jié)點上的數(shù)據(jù),將其還原至從節(jié)點延蟹;
    如果沒有啟用GTID评矩,在備份時需要在master上使用show master status命令查看二進制日志文件名稱及事件位置,以便后面啟動slave節(jié)點時使用阱飘。

5斥杜、啟動從節(jié)點的復制線程

 5.1 master1 執(zhí)行
    CHANGE MASTER TO MASTER_HOST='master2.node.com',MASTER_PORT=3306, MASTER_USER='repl', MASTER_PASSWORD='passwd', MASTER_AUTO_POSITION=1;
 5.2 master2 執(zhí)行
    CHANGE MASTER TO MASTER_HOST='master1.node.com',MASTER_PORT=3306, MASTER_USER='repl', MASTER_PASSWORD='passwd', MASTER_AUTO_POSITION=1;
 5.3 slave1 執(zhí)行
    CHANGE MASTER TO MASTER_HOST='master1.node.com',MASTER_PORT=3306, MASTER_USER='repl', MASTER_PASSWORD='passwd', MASTER_AUTO_POSITION=1;
 5.4 slave2 執(zhí)行
    CHANGE MASTER TO MASTER_HOST='master2.node.com',MASTER_PORT=3306, MASTER_USER='repl', MASTER_PASSWORD='passwd', MASTER_AUTO_POSITION=1;

6虱颗、在各節(jié)點上查看是否成功開啟復制

show slave status\G;
#Slave_IO_Running: Yes\Slave_SQL_Running: Yes 表示主從復制線程成功執(zhí)行。

三蔗喂、配置高可用負載均衡keepalived+lvs

master1忘渔、mastre2搭建寫高可用負載均衡,
VIP:192.168.1.120。
slave1缰儿、slave2搭建讀高可用負載均衡,
VIP:192.168.1.200畦粮。

1、安裝ipvsadm ``

注:linux內(nèi)核2.4版本以上的基本都支持LVS乖阵,要使用lvs宣赔,只需要再安裝一個lvs的管理工具:ipvsadm
yum -y install ipvsadm
    ipvsadm -Ln
    echo "1" > /proc/sys/net/ipv4/ip_forward
    sysctl -p

2、配置lvs,四個節(jié)點上幾乎都一樣lvs腳本,只需要修改相應的VIP即可

vim /etc/rc.d/init.d/realserver.sh
    #!/bin/bash  
     #description: Config realserver lo and apply noarp
    SNS_VIP=192.168.146.220 #修改為對應的VIP即可
    . /etc/rc.d/init.d/functions
    case "$1" in
    # 禁用本地的ARP請求瞪浸、綁定本地回環(huán)地址
    start)
        /sbin/ifconfig lo down
        /sbin/ifconfig lo up
        echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
        echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
        echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
        echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
        /sbin/sysctl -p >/dev/null 2>&1
        /sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 up #在回環(huán)地址上綁定VIP儒将,設定掩碼,與Direct Server(自身)上的IP保持通信
        /sbin/route add -host $VIP dev lo:0
        echo "LVS-DR real server starts successfully.\n"
        ;;
    stop)
        /sbin/ifconfig lo:0 down
        /sbin/route del $VIP >/dev/null 2>&1
        echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
        echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
        echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
        echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
    echo "LVS-DR real server stopped.\n"
        ;;
    status)
        isLoOn=`/sbin/ifconfig lo:0 | grep "$VIP"`
        isRoOn=`/bin/netstat -rn | grep "$VIP"`
        if [ "$isLoON" == "" -a "$isRoOn" == "" ]; then
            echo "LVS-DR real server has run yet."
        else
            echo "LVS-DR real server is running."
        fi
        exit 3
        ;;
    *)
        echo "Usage: $0 {start|stop|status}"
        exit 1
    esac
    exit 0

3对蒲、添加腳本執(zhí)行權限個節(jié)點都執(zhí)行:

chmod u+x /etc/rc.d/init.d/realserver.sh

4钩蚊、啟動lvs

/etc/rc.d/init.d/realserver.sh start                #啟動lvs腳本設置參數(shù),綁定VIP

5蹈矮、4臺服務器安裝keepalived

注:Keepalived是一個專門為lvs提供高可用功能的機制两疚,它可以實現(xiàn)當有兩個主從lvs,而且主lvs損壞的時候含滴,將其IP地址以及l(fā)vs轉(zhuǎn)移至備份lvs上。
yum -y install keepalived

6丐巫、配置文件位置:/etc/keepalived/keepalived.conf

master1谈况、master2上的keeplived為互備模式 
slave1、slave2上的keeplived為互備模式

vim /etc/keepalived/keepalived.conf
    ! Configuration File for keepalived
    global_defs {
       router_id LVS_Master
    }
    vrrp_instance VI_1 {
        state BACKUP            #在備機上修改為BACKUP
        interface eth1          #VIP要綁定到eth1上,是具體情況而定递胧,填寫具體的主機網(wǎng)卡名稱
        virtual_router_id 60
        priority 100            #對應備機的值要小于這個值
        nopreempt               #不搶占資源碑韵,意思就是它活了之后也不會再把主搶回來,備機不需要設置改項
        advert_int 1
        authentication {
            auth_type PASS      #備機上要與之一致
            auth_pass 1111      #備機上要與之一致
        }
        virtual_ipaddress {
            192.168.1.120/32 dev eth1 label eth1:0      #VIP要綁定到eth1上,是具體情況而定,填寫具體的主機網(wǎng)卡名稱,修改為對應的VIP
        }
    }
    
    virtual_server 192.168.1.120 3306 {                 #修改為對應的VIP
            delay_loop 6
            lb_algo wrr #lvs負載均衡算法
            lb_kind DR #lvs的轉(zhuǎn)發(fā)模式
            #nat_mask 255.255.255.0
            persistence_timeout 50
            protocol TCP
            real_server 192.168.1.121 3306 {            #修改為master01對應的ip
                    weight 2
                    TCP_CHECK {
                    connect_timeout 3
                    nb_get_retry 3
                    delay_before_retry 3
                    connect_port 3306
                    }
            }
            real_server 192.168.1.114 3306 {            #修改為master02對應的ip
                        weight 2
                        TCP_CHECK {
                        connect_timeout 3
                        nb_get_retry 3
                        delay_before_retry 3
                        connect_port 3306
                        }
            }
    } 

7缎脾、啟動keepalibed,并查看VIP綁定情況

/etc/init.d/keepalived start
    ip add #查看IP狀態(tài)
    ipvsadm -Ln             # 查看LVS狀態(tài)祝闻,若有沒有該工具yum -y install ipvsadm即可

四、安裝使用dbproxy

1.rpm -vhi Atlas-2.2.1.el6.x86_64.rpm # 將下載的rpm安裝到服務器上
2.cd /usr/local/mysql-proxy/conf/ # 進入到代理目錄
3.cp test.cnf dbproxy.cnf # 將自帶的test配置文件拷貝成新的排位置文件 
2.vim /usr/local/mysql-proxy/conf/dbproxy.cnf # 修改新的配置文件
    [mysql-proxy]
    
    #帶#號的為非必需的配置項目
    
    #管理接口的用戶名
    admin-username = admin
    
    #管理接口的密碼
    admin-password = 123456
    
    #Atlas后端連接的MySQL主庫的IP和端口遗菠,可設置多項联喘,用逗號分隔
    #修改地址為之前配置的虛擬地址
    proxy-backend-addresses = 192.168.1.120:3308
    
    #Atlas后端連接的MySQL從庫的IP和端口,@后面的數(shù)字代表權重辙纬,用來作負載均衡豁遭,若省略則默認為1,可設置多項贺拣,用逗號分隔
    #修改地址為兩個從庫的地址
    proxy-read-only-backend-addresses = 99.1.17.14:3308@1,99.1.17.13:3308@1
    
    #用戶名與其對應的加密過的MySQL密碼蓖谢,密碼使用PREFIX/bin目錄下的加密程序encrypt加密捂蕴,下行的user1和user2為示例,將其替換為你的MySQL的用戶名和加密密碼闪幽!
    #為確保代理正常寫入啥辨。最好新建統(tǒng)一新的賬戶去代理
    pwds = root:/iZxz+0GRoA=
    
    #設置Atlas的運行方式,設為true時為守護進程方式盯腌,設為false時為前臺方式溉知,一般開發(fā)調(diào)試時設為false,線上運行時設為true,true后面不能有空格腊嗡。
    daemon = true
    
    #設置Atlas的運行方式着倾,設為true時Atlas會啟動兩個進程,一個為monitor燕少,一個為worker卡者,monitor在worker意外退出后會自動將其重啟,設為false時只有worker客们,沒有monitor崇决,一般開發(fā)調(diào)試時設為false,線上運行時設為true,true后面不能有空格底挫。
    keepalive = true
    
    #工作線程數(shù)恒傻,對Atlas的性能有很大影響,可根據(jù)情況適當設置
    event-threads = 8
    
    #日志級別建邓,分為message盈厘、warning、critical官边、error沸手、debug五個級別
    log-level = debug
    
    #日志存放的路徑
    log-path = /usr/local/mysql-proxy/log
    
    #SQL日志的開關,可設置為OFF注簿、ON契吉、REALTIME,OFF代表不記錄SQL日志诡渴,ON代表記錄SQL日志捐晶,REALTIME代表記錄SQL日志且實時寫入磁盤,默認為OFF
    sql-log = ON
    
    #慢日志輸出設置妄辩。當設置了該參數(shù)時惑灵,則日志只輸出執(zhí)行時間超過sql-log-slow(單位:ms)的日志記錄。不設置該參數(shù)則輸出全部日志眼耀。
    sql-log-slow = 3000
    
    #實例名稱泣棋,用于同一臺機器上多個Atlas實例間的區(qū)分
    #instance = test
    
    #Atlas監(jiān)聽的工作接口IP和端口
    proxy-address = 0.0.0.0:3306
    
    #Atlas監(jiān)聽的管理接口IP和端口
    admin-address = 0.0.0.0:2345
    
    #分表設置,此例中person為庫名畔塔,mt為表名潭辈,id為分表字段鸯屿,3為子表數(shù)量,可設置多項把敢,以逗號分隔寄摆,若不分表則不需要設置該項
    #tables = person.mt.id.3
    
    #默認字符集,設置該項后客戶端不再需要執(zhí)行SET NAMES語句
    charset = utf8
    
    #允許連接Atlas的客戶端的IP修赞,可以是精確IP婶恼,也可以是IP段,以逗號分隔柏副,若不設置該項則允許所有IP連接勾邦,否則只允許列表中的IP連接
    #client-ips = 127.0.0.1, 192.168.1
    
    #Atlas前面掛接的LVS的物理網(wǎng)卡的IP(注意不是虛IP),若有LVS且設置了client-ips則此項必須設置割择,否則可以不設置
    #lvs-ips = 192.168.1.1

五眷篇、監(jiān)控mysql健康狀態(tài)

對mysql的健康狀態(tài)檢查后執(zhí)行的操作,在real_server區(qū)段添加:
notify_up  $PATH/SCRIPT.sh #檢測到服務開啟后執(zhí)行的腳本 可以是郵件報警,如某某IP荔泳,mysql掛掉蕉饼。。玛歌。昧港。
notify_down $PATH/SCRIPT.sh #檢測到服務停止后執(zhí)行的腳本.

在實際應用中,當master掛掉之后支子,backup會占有資源创肥。
但當master恢復之后會搶占資源,自己繼續(xù)做回主值朋,將VIP綁定至master主機上瓤的。此時正在連接的業(yè)務有可能會中斷。
所以在生產(chǎn)上需要設置為不搶占(nopreempt)資源吞歼,即它活了之后也不會將主搶回來,繼續(xù)作為備機存在塔猾。但nopreempt只能在stat為BACKUP時設置篙骡,所以此時應該將主備機上的stat 都設置為BACKUP,將priority設置為一高一低,以優(yōu)先級高低確定誰是主丈甸。對keeplived做簡單的修改即可:
state BACKUP    #都修改成BACKUP
virtual_router_id 60    #默認51 主從都修改為60
priority 100    #優(yōu)先級(1-254之間)糯俗,另一臺改為90,備用節(jié)點必須比主節(jié)點優(yōu)先級低睦擂。
nopreempt               #不搶占資源得湘,意思就是它活了之后也不會再把主搶回來,備機不需要設置改項

五、附錄

1顿仇、架構圖

WechatIMG117.png

2.遇見的問題

1.dbproxy日志報錯信息如下:
    2019-12-18 06:15:45: (critical) proxy-plugin.c.1450: I have no server backend, closing connection
    2019-12-18 06:15:45: (critical) network-mysqld.c.1387: plugin_call(CON_STATE_READ_QUERY) failed
解決方式:
    由于代理賬號未能在全部數(shù)據(jù)庫上統(tǒng)一造成的淘正。
    新建統(tǒng)一賬號作為代理賬號即可摆马。


最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鸿吆,隨后出現(xiàn)的幾起案子囤采,更是在濱河造成了極大的恐慌,老刑警劉巖惩淳,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蕉毯,死亡現(xiàn)場離奇詭異,居然都是意外死亡思犁,警方通過查閱死者的電腦和手機代虾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來激蹲,“玉大人棉磨,你說我怎么就攤上這事⊥信唬” “怎么了含蓉?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長项郊。 經(jīng)常有香客問我馅扣,道長,這世上最難降的妖魔是什么着降? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任差油,我火速辦了婚禮,結(jié)果婚禮上任洞,老公的妹妹穿的比我還像新娘蓄喇。我一直安慰自己,他們只是感情好交掏,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布妆偏。 她就那樣靜靜地躺著,像睡著了一般盅弛。 火紅的嫁衣襯著肌膚如雪钱骂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天挪鹏,我揣著相機與錄音见秽,去河邊找鬼。 笑死讨盒,一個胖子當著我的面吹牛解取,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播返顺,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼禀苦,長吁一口氣:“原來是場噩夢啊……” “哼蔓肯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起伦忠,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤省核,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后昆码,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體气忠,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年赋咽,在試婚紗的時候發(fā)現(xiàn)自己被綠了旧噪。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡脓匿,死狀恐怖淘钟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情陪毡,我是刑警寧澤米母,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站毡琉,受9級特大地震影響铁瞒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜桅滋,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一慧耍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丐谋,春花似錦芍碧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至吏饿,卻和暖如春踪危,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背找岖。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留敛滋,地道東北人许布。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像绎晃,于是被迫代替她去往敵國和親蜜唾。 傳聞我的和親對象是個殘疾皇子杂曲,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355