高可用的Mysql雙機熱備(Mysql_HA)

使用KeepAlived實現高可用的MYSQL_HA集羣環境中,MYSQL爲(Master/Master)主/主同步複製關係,保證MYSQL服務器數據的一致性,用KeepAlived提供虛擬IP,經過KeepAlived來進行故障監控,實現Mysql故障時自動切換。

佈署環境拓樸以下:mysql

Mysql VIP :192.168.187.61linux

Master1:192.168.187.129web

Master:192.168.187.132算法

OS 環境:Cent OS 5.9sql

Mysql版本:Mysql5.5.31數據庫

 

 

安裝mysql

 

由於CentOS的Mysql仍是停留在5.0.19,而咱們作Mysql之間的同步複製,Mysql版本至少要在Mysql5.1以上,因此要對其進行升級安裝。centos

>>使用 yum安裝, yum 能夠幫你解決依賴於衝突安全

# rpm –Uvh  http://repo.webtatic.com/yum/centos/5/latest.rpm  //安裝最新的mysql的yum源服務器

# yum –y install Mysql55 MySQL55-* --enablerepo=webtatic  //安裝Mysql,--enablerepo參數是用來指定源網絡

 

>>開啓mysql服務

# service mysqld start  //開啓mysql服務

 

>>剛安裝密碼爲空,設置root密碼

# mysqladmin –u root password ‘1234’  //設置root密碼     

>>更改mysql配置文件

# cp /usr/share/mysql/my-medium.cnf  /etc/my.cnf //在etc目錄下創建mysql的配置文件my.cnf

# service mysqld restart//重啓mysql服務

 

>>登錄Mysql

# mysql –u root –p 1234    //設置root密碼

Mysql>     //登錄進了mysql

2.2.Mysql主/主配置

2.2.1 設置配置文件

Mysql是經過日誌進行同步複製的,先創建日誌文件

#touch /var/log/mysql/mysql-bin.log   //創建日誌文件

#chown mysql.mysql /var/log/mysql/mysql-bin.log  //將日誌文件的所屬用戶和用戶組更改爲mysql

在兩臺要進行備份的mysql服務器上的my.cnf文件進行配置以下(將下面的配置分別加入相關服務器的my.cnf):

Master1(192.168.187.129)

Master(192.168.187.132)

#主標服務標識號,必需惟一

server-id = 1

#由於MYSQL是基於二進制的日誌來作同步的,每一個日誌文件大小爲 1G

log-bin=/var/log/mysql/mysql-bin.log

#要同步的庫名

binlog-do-db = test

#不記錄日誌的庫,即不須要同步的庫

binlog-ignore-db=mysql

#用從屬服務器上的日誌功能

log-slave-updates

#通過1日誌寫操做就把日誌文件寫入硬盤一次(對日誌信息進行一次同步)。n=1是最安全的作法,但效率最低。默認設置是n=0。

sync_binlog=1

# auto_increment,控制自增列AUTO_INCREMENT的行爲

用於MASTER-MASTER之間的複製,防止出現重複值,

auto_increment_increment=n有多少臺服務器,n就設置爲多少,

auto_increment_offset=1設置步長,這裏設置爲1,這樣Master的auto_increment字段產生的數值是:1, 3, 5, 7, …等奇數ID

auto_increment_offset=1

auto_increment_increment=2

#進行鏡像處理的數據庫

replicate-do-db = test

#不進行鏡像處理的數據庫

replicate-ignore-db= mysql

#主標服務標識號,必需惟一

server-id = 2

#由於MYSQL是基於二進制的日誌來作同步的,每一個日誌文件大小爲 1G

log-bin=/var/log/mysql/mysql-bin.log

#要同步的庫名

binlog-do-db = test

#不記錄日誌的庫,即不須要同步的庫

binlog-ignore-db=mysql

#用從屬服務器上的日誌功能

log-slave-updates

#通過1日誌寫操做就把日誌文件寫入硬盤一次(對日誌信息進行一次同步)。n=1是最安全的作法,但效率最低。默認設置是n=0。

sync_binlog=1

# auto_increment,控制自增列AUTO_INCREMENT的行爲

用於MASTER-MASTER之間的複製,防止出現重複值,

auto_increment_increment=n有多少臺服務器,n就設置爲多少,

auto_increment_offset=2設置步長,這裏設置爲2,這樣Master的auto_increment字段產生的數值是:2, 4, 6, 8, …等奇數ID

auto_increment_offset=2

auto_increment_increment=2

#進行鏡像處理的數據庫

replicate-do-db = test

#不進行鏡像處理的數據庫

replicate-ignore-db= mysql

2.2.2查看配置狀況

按上面的配置將兩臺服務器配置好之後,從新啓動mysql服務,用showmaster status查看一下兩臺服務器的Master配置狀況,能夠看出已經配置成功,以下:

NO1:Master1(192.168.187.129)的狀況

# mysql –u root –p 1234

mysql> show master status;

+------------------+----------+--------------+------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000001|      107 | test         | mysql            |

+------------------+----------+--------------+------------------+

NO2:Master(192.168.187.132)的狀況

# mysql –u root –p 1234

mysql> show master status;

+------------------+----------+--------------+------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000001|      107 | test         | mysql            |

+------------------+----------+--------------+------------------+

2.2.3創建權限賬戶,實現同步

a.建立帳戶並授予REPLICATION SLAVE權限

mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '1234';   //創建一個用戶名爲slave的賬戶

mysql> FLUSH PRIVILEGES;   //刷新相關權限表

由於進行雙向複製,兩邊服務器都須要創建一個用於複製的的用戶。兩邊能夠複用上面的語句,用戶名和密碼能夠自行進行修改。

b.同步設置

Master1(192.168.187.129)上操做以下:

mysql> stop slave;  //中止slave

mysql>change master to master_host='192.168.187.132', master_user='slave', master_password='1234', master_log_file='mysql-bin.000001', master_log_pos=107;  //修改當前的Master的值,由於是互爲備份,因此Master1(192.168.187.129)的master爲Master2(192.168.187.132),Master2設置複製的用戶名爲slave,密碼是1234,上面經過 show master status咱們得知,log_file是mysql-bin.000001,postion是107。

mysql>start slave;    //開始salve,開始同步

mysql>show slave status;   //檢測slave狀態,若是Slave_IO_Running: Yes    Slave_SQL_Running: Yes    Seconds_Behind_Master: 0就OK了

 

Master2(192.168.187.132)上面操做以下:

mysql> stop slave;  //中止slave

mysql>change master to master_host='192.168.187.129', master_user='slave', master_password='1234', master_log_file='mysql-bin.000001', master_log_pos=107;  //修改當前的Master的值,由於是互爲備份,因此Master2(192.168.187.132)的master爲Master2(192.168.187.129),Master1設置複製的用戶名爲slave,密碼是1234,上面經過 show master status咱們得知,log_file是mysql-bin.000001,postion是107。

mysql>start slave;    //開始salve,開始同步

mysql>show slave status;  //檢測slave狀態,若是Slave_IO_Running: Yes    Slave_SQL_Running: Yes    Seconds_Behind_Master: 0就OK了

c.測試狀況:

Step1:建一個測試表Test,兩個字段,id與name字段,id字段爲自增,兩個服務器上面都是一樣的結構,以下圖:

 

Step2:我在Master1(192.168.187.129)表上執行一個insert語句,並進行查詢,以下圖:

 

Step3:在Master2(192.168.187.132)中查詢,能夠發現數據已經同步過來了,以下圖:

 

 

3KeepAlived安裝配置

3.1 KeepAlived的安裝方法

 可參照「高可用的負載均衡配置方法(Haproxy+KeepAlived)」5.1 中KeepAlived的安裝方法

3.2將keepalived加入服務

可參照「高可用的負載均衡配置方法(Haproxy+KeepAlived)」5.2  中將keepalived加入服務

3.3 KeepAlived的配置

安裝好之後,對其進行配置以下:

有兩臺機器(MASTER1)所在的192.168.187.129與(Master2)192.168.187.132,用(VIP)192.168.187.61作虛擬IP。

在兩臺服各器中的/etc/keepalived文件夾中的keepalived.conf下進行配置:

Master1的設置 

192.168.187.129

global_defs {

   router_id Mysql_HA  #當前節點名

}

vrrp_instance VI_1{

    state BACKUP       #兩臺配置節點均爲BACKUP

interface eth0       #綁定虛擬IP的網絡接口

virtual_router_id 51 #VRRP組名,兩個節點的設置必須同樣,以指明各個節點屬於同一VRRP組

priority 100        #節點的優先級,另外一臺優先級改低一點

acvert_int 1         #組播信息發送間隔,兩個節點設置必須同樣

nopreempt      #不搶佔,只在優先級高的機器上設置便可,優先級低的機器不設置

authentication{      #設置驗證信息,兩個節點必須一致

    auth_type  PASS

    auth_pass  1111

}

Virtual_ipaddress{   #指定虛擬IP,兩個節點設置必須同樣

192.168.187.61

     }

   }

virtual_server 192.168.187.61 3306 {   #linux虛擬服務器(LVS)配置

delay_loop 2     #每一個2秒檢查一次real_server狀態

lb_algo wrr      #LVS調度算法,rr|wrr|lc|wlc|lblc|sh|dh

lb_kind DR      #LVS集羣模式 ,NAT|DR|TUN

persistence_timeout 60    #會話保持時間

protocol TCP    #使用的協議是TCP仍是UDP

real_server 192.168.187.129 3306 {

weight 3   #權重

notify_down  /usr/local/bin/mysql.sh    #檢測到服務down後執行的腳本

TCP_CHECK {

connect_timeout 10   #鏈接超時時間

nb_get_retry 3      #重連次數

delay_before_retry 3 #重連間隔時間

connect_port 3306    #健康檢查端口

}

}

 

Master2的設置 

192.168.187.132

global_defs {

   router_id Mysql_HA  #當前節點名

}

vrrp_instance VI_1{

    state BACKUP       #兩臺配置節點均爲BACKUP

interface eth0       #綁定虛擬IP的網絡接口

virtual_router_id 51 #VRRP組名,兩個節點的設置必須同樣,以指明各個節點屬於同一VRRP組

priority 90        #節點的優先級,另外一臺優先級改低一點

acvert_int 1         #組播信息發送間隔,兩個節點設置必須同樣

authentication{      #設置驗證信息,兩個節點必須一致

    auth_type  PASS

    auth_pass  1111

}

Virtual_ipaddress{   #指定虛擬IP,兩個節點設置必須同樣

192.168.187.61

     }

   }

virtual_server 192.168.187.61 3306 {   #linux虛擬服務器(LVS)配置

delay_loop 2     #每一個2秒檢查一次real_server狀態

lb_algo wrr      #LVS調度算法,rr|wrr|lc|wlc|lblc|sh|dh

lb_kind DR      #LVS集羣模式 ,NAT|DR|TUN

persistence_timeout 60    #會話保持時間

protocol TCP    #使用的協議是TCP仍是UDP

real_server 192.168.187.132 3306 {

weight 3   #權重

notify_down   /usr/local/bin/mysql.sh    #檢測到服務down後執行的腳本

TCP_CHECK {

connect_timeout 10   #鏈接超時時間

nb_get_retry 3      #重連次數

delay_before_retry 3 #重連間隔時間

connect_port 3306    #健康檢查端口

}

}

腳本/usr/local/bin/mysql.sh

#vi  /usr/local/bin/mysql.sh

#!/bin/sh

killall keepalived

 

3.4 KeepAlived測試

可參照「高可用的負載均衡配置方法(Haproxy+KeepAlived)」5.4 中KeepAlived測試

4.Mysql測試

Step1:打開三個服務器進行查看,剛開始三個都爲空

 

 

Step2:在VIP(192.168.187.61)服務器中插入一條數據

 

 

Step3:再查看三個服務器中的數據都已經同步過來了

 

 

當關掉作爲主機的192.168.187.129作爲宕機處理,一樣也不會出問題,虛擬IP由192.168.187.129漂移

到192.168.187.132上面。

 

5.安裝時出現的問題及處理方法

NO1: Slave將沒法連接到 Master狀況

錯誤:Slave將沒法連接到 Master  

緣由:bind-address默認是127.0.0.1你必須更改它

解決辦法:修改my.cnf,加上以下圖紅框所示的配置!

 

NO2: mysql error 1129 錯誤

錯誤:mysql 1129錯誤!以下圖:

     

緣由:是由於mysql將ip鏈接阻塞了。

解決辦法:登陸到mysql數據庫服務器端,使用命令:

# mysqladmin -u root -p  flush-hosts;  

Enter password:

相關文章
相關標籤/搜索