歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

Centos 6.0系統lvs+keepalived+mysql實現mysql數據庫熱備主主復制

今天這篇文章接著昨天的相關知識,一樣是為了前天剛做的mysql熱備;

大家知道實現mysql_Ha的方案有很多,常見的heartbeat、keepalived,這裡說的就是keepalived,優點就是簡單,快速,下面就是詳情了;

1、系統:Centos6.0;lamp平台(lamp平台是我一個習慣,非必須)

vip:192.168.135.200

master:192.168.135.134

slave:192.168.135.135

實現134實時復制135,135實時復制134,也就是說修改每一個數據庫都會數據統一,master機器配置好點,我這邊配置preempt(搶占),也就說134掛了以後,135提供服務,134恢復以後,繼續134為master提供服務;

master(192.168.135.134)操作:

yum install http mysql* php* ipvsadm keepalived -y

1>、修改MySQL配置文件

兩台MySQL均要開啟binlog日志功能,在MySQL配置文件[MySQLd]段中加上log-bin=mysql-bin選項

兩台MySQL的server-ID不能一樣,默認情況下兩台MySQL的serverID都是1,、其中一台修改為2;

2>、初始化下服務

service httpd restart

service mysqld restart

關閉服務:service iptables stop

修改selinux

3>、首先先將兩台機器的同步做好;

master:同步slave上的數據庫

授權用戶;grant replication slave on *.* to 'leo'@'%' identified by 'leo123';

查詢主數據庫狀態;並記下FILE及Position的值,這個在後面配置從服務器的時候要用到。

在另一台(slave)機器操作將此台機器設置為主服務器

change master to master_host='192.168.135.134',master_user='leo',master_password='leo123',master_log_file='mysql-bin.000001',master_log_pos=106;

授權用戶;

grant replication slave on *.* to 'leo'@'%' identified by 'leo123';

同樣查詢主數據庫狀態

在另一台(master)機器操作將此台機器設置為主服務器

change master to master_host='192.168.135.135',master_user='leo',master_password='leo123',master_log_file='mysql-bin.000001',master_log_pos=247;

然後兩台機器同時啟動slave

start slave

查看slave狀態

檢查主從同步,如果您看到Slave_IO_Running和Slave_SQL_Running均為Yes,則主從復制連接正常。

show slave status\G

重點查看圈住的地方

在slave機器上同樣查看是否正常

test:現在在兩台服務器上其中一台,修改下數據,看看另一台的狀況是否也修改,比如:

在另一台發現已經同步過去了;

2、接下來配置keepalived

vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived
全局定義(global definition)配置
global_defs {
   notification_email {
   [email protected]   故障聯系人
    }
   notification_email_from [email protected]  故障發送人
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id Mysql_ha
}
global_defs全局配置標識
    notification_email
 
    {
 
    [email protected]
    [email protected]
 
    }
    VRRP實例(instance)
vrrp_instance mysql{
    state MASTER   state 指定instance(Initial)的初始狀態,實質是經過優先級決定
    interface eth0    實例綁定的網卡,因為在配置虛擬IP的時候必須是在已有的網卡上添加的
    virtual_router_id 50  這裡設置VRID,這裡非常重要,相同的VRID為一個組,他將決定多播的MAC地址   
    priority 100   設置本節點的優先級,優先級高的為master
    advert_int 1   檢查間隔,默認為1秒
    preempt  設置搶占,這裡只能設置在state為master的節點上,而且這個節點的優先級必須別另外的高
    authentication {
        auth_type PASS   認證方式,可以是PASS或AH兩種認證方式
        auth_pass 123456   認證密碼
    }
    virtual_ipaddress {
        192.168.152.200   這裡設置的就是VIP,也就是虛擬IP地址,他隨著state的變化而增加刪除,
    }
}
 
virtual_server 192.168.135.200 3306 {            設置一個virtual server: VIP:Vport
    delay_loop 2      service polling的delay時間,即服務輪詢的時間間隔
    lb_algo wrr       LVS調度算法 rr|wrr|lc|wlc|lblc|sh|dh  
    lb_kind DR        LVS集群模式  NAT|DR|TUN  
    persistence_timeout 60  會話保持時間(秒為單位),即以用戶在120秒內被分配到同一個後端realserver
    protocol TCP  健康檢查用的是TCP還是UDP
 
    real_server 192.168.135.134 3306 {  後端真實節點主機的權重等設置,主要,後端有幾台這裡就要設置幾個
        weight 3   給每台的權重,0表示失效(不知給他轉發請求知道他恢復正常),默認是1
#   notify_up <STRING> | <QUOTED-STRING>  #檢查服務器正常(UP)後,要執行的腳本
    notify_down /usr/local/Mysql/bin/mysql.sh   檢查服務器失敗(down)後,要執行的腳本
#下面是常用的健康檢查方式,健康檢查方式一共有HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK這些方式
    TCP_CHECK {
    connect_timeout 10
    nb_get_retry 3
    delay_before_retry 3
    connect_port 3306
}
}
}

編寫檢測服務down後所要執行的腳本

#!/bin/sh pkill keepalived

簡單吧,只要mysqld進程不見了,就殺掉keepalived,讓備機頂替

3、在備機操作keepalived

上master的基本一樣,只是幾個地方修改下而已

global_defs {
   notification_email {
   [email protected]
    }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id Mysql_ha
}
 
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 90
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.135.200
    }
}
 
virtual_server 192.168.135.200 3306 {
    delay_loop 2
    lb_algo wrr
    lb_kind DR
    persistence_timeout 10
    protocol TCP
 
    real_server 192.168.135.135 3306 {
    weight 3
    notify_down /usr/local/Mysql/bin/mysql.sh
    TCP_CHECK {
    connect_timeout 10
    nb_get_retry 3
    delay_before_retry 3
    connect_port 3306
}
}
}

找一台機器進行測試

ping 192.168.135.200(vip)

正常,當把master上mysqld殺掉,發現keepalived進程也不見了,說明我們的腳本觸發了,但是vip還是可以ping通,說明備機起作用了;

大家也可以查看vrrp協議的信息;根據優先級100或90進行判斷

黑線的地方說明備機頂替了;

當把master的mysqld進程和keepalived重啟後發現:

說明master又頂替了slave;進行了搶占

繼續測試

再兩台機器上授權遠程登錄、操作

grant all privileges on *.* to 'root'@'%' identified by '1234567890';  

找一台機器mysql -h 192.168.135.200 -p 1234567890

可以進行查看,當你新增,比如create個數據庫,發現兩台機器也是可以同步的,過程是你先寫入了當前服務的機器,然後另一台進行了同步;

為了方便查看keepalived的日志,我們可以單獨將他的日志寫入個日志文件,請查看前面的博文

http://lansgg.blog.51cto.com/5675165/1178903

當我們將服務器更換IP或是停掉slave,然後開啟後發現其狀態異常,

show slave status\G  可以看到,表現如下

解決方法如下:

分別在兩台機器

stop slave;

flush logs;

show master status;

再次分別執行:

change master to  master_host='192.168.135.XXX',master_user='leo',master_password='leo123',master_log_file='mysql-bin.XXXXXX',master_log_pos=XXX;

提示 不同步Mysql數據庫,當上線後,發現修改一個機器的密碼,兩台機器重啟服務後,另一台機器的密碼也修改了,只要修改my.cnf即可讓其不同步Mysql數據庫

新加:binlog-ignore-db=mysql (不同步mysql庫)

在show master status;是可以看到的

同樣發現,新加binlog_do_db=xxx可以指定同步某庫

這樣即可;

大概先寫到這裡,以後會編寫heartbeat的方法,希望大家可以多多交流,指出問題,共同進步

出處:http://lansgg.blog.51cto.com/5675165/1180305

Copyright © Linux教程網 All Rights Reserved