MySql雙機熱備解決方案

jopen 9年前發布 | 97K 次閱讀 MySQL 數據庫服務器

1.KeepAlived+Mysql

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

布署環境拓樸如下:

 Mysql VIP :192.168.187.61

Master1:192.168.187.129

Master:192.168.187.132

OS 環境:Cent OS 5.9

Mysql版本:Mysql5.5.31

2.安裝mysql

2.1.Mysql升級安裝

因為CentOS的Mysql還是停留在5.0.19,而我們做Mysql之間的同步復制,Mysql版本至少要在Mysql5.1以上,所以要對其進行升級安裝。

>>使用 yum安裝, yum 可以幫你解決依賴于沖突

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

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

</td> </tr> </tbody> </table>

 

>>開啟mysql服務

  • # service mysqld start  //開啟mysql服務

    </td> </tr> </tbody> </table>

     

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

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

    </td> </tr> </tbody> </table>

    >>更改mysql配置文件

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

    # service mysqld restart//重啟mysql服務

    </td> </tr> </tbody> </table>

     

    >>登陸Mysql

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

    Mysql>     //登陸進了mysql

    </td> </tr> </tbody> </table>

    2.2.Mysql主/主配置

    2.2.1 設置配置文件

    Mysql是通過日志進行同步復制的,先建立日志文件

  • #touch /var/log/mysql/mysql-bin.log   //建立日志文件

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

    </td> </tr> </tbody> </table>

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

  • Master1(192.168.187.129)

    </td>

    Master(192.168.187.132)

    </td> </tr>

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

    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_offset1設置步長,這里設置為1,這樣Masterauto_increment字段產生的數值是:1, 3, 5, 7, …等奇數ID

    auto_increment_offset=1

    auto_increment_increment=2

    #進行鏡像處理的數據庫

    replicate-do-db = test

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

    replicate-ignore-db= mysql

    </td>

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

    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_offset2設置步長,這里設置為2,這樣Masterauto_increment字段產生的數值是:2, 4, 6, 8, …等奇數ID

    auto_increment_offset=2

    auto_increment_increment=2

    #進行鏡像處理的數據庫

    replicate-do-db = test

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

    replicate-ignore-db= mysql

    </td> </tr> </tbody> </table>

    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            |

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

    </td> </tr> </tbody> </table>

    NO2:Master1(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            |

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

    </td> </tr> </tbody> </table>

    2.2.3建立權限帳戶,實現同步

    a.創建賬戶并授予REPLICATION SLAVE權限

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

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

    </td> </tr> </tbody> </table>

    因為進行雙向復制,兩邊服務器都需要建立一個用于復制的的用戶。兩邊可以復用上面的語句,用戶名和密碼可以自行進行修改。

    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了

    </td> </tr> </tbody> </table>

     

    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了

    </td> </tr> </tbody> </table>

    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

    </td> </tr> </tbody> </table>

     

    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:

    </td> </tr> </tbody> </table>

     

     本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
     轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
     本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!
  • sesese色