MySQL數據庫運維之MySQL高可用01

前面文章介紹了MySQL的讀寫分離及分庫分表過程。對於分庫和分表,實現策略有好多種,須要根據業務來肯定最適合的分庫分表架構,文章中還有好多未涉及到的,讀者能夠本身找資料學習。分庫分表完成以後,數據容量及性能增長了,可是緊接着會面臨着可用性的問題。從本篇文章開始,將會介紹MySQL的高可用實現方案!

1、基本概念

一、什麼是高可用mysql

"高可用性"(High Availability),簡稱HA,一般來描述一個系統通過專門的設計,從而減小停工時間,而保持其服務的高度可用性。 --來自"百度百科"算法

二、高可用架構的工做方式sql

(1)主從
服務同時部署在主從服務器上。初始,主服務器上的服務正常運行,從服務器經過心跳等方式實時監測主服務器的運行狀態,一旦出現主服務器宕機或者主服務器上的服務異常終止等故障,從服務器會自動接管主服務器的工做,對外提供服務。數據庫

(2)雙主
服務同時部署在兩臺主服務器上。起初,只有一臺主服務器對外提供服務,另一臺服務器只處於實時監聽狀態,當其中的一臺主服務器宕機或者服務不可用時,另一臺主服務器會馬上接管出故障的主服務器,對外提供服務,通常經過VIP自動切換來實現。segmentfault

(3)集羣
服務同時部署在多臺服務器上。多臺服務器共同工做,每個服務器都有一臺或者多臺備機。起初,多臺服務器能夠經過反向代理共同對外提供服務,當某一臺服務器出現故障或者其上的服務不可用時,其餘服務能夠馬上進行接管,對外提供服務,一般可使用Nginx,HaProxy,LVS等代理實現服務的高可用。可是,Nginx,HaProxy,LVS自己也是單點,須要實現高可用,後面介紹Web應用高可用時會詳細介紹。windows

三、高可用的衡量指標-系統可用率bash

計算方法:可用率=系統無端障運行時間/(系統無端障運行時間+系統故障維護時間)
根據可用率估計系統可用性指標以下:
圖片描述服務器

2、實現方案

(1)KeepAlived+MySQL+MM複製
實現方法:經過雙主複製,在每一個節點上部署Keepalived,經過vip向外提供服務,當某個節點故障時,vip自動轉移到可用的節點上。架構

(2)HeartBeat+DRBD+MySQL
實現方法:分佈式複製塊設備,相似於RAID1,當數據保存到一臺服務器上的時候,會同時將數據冗餘備份一份到另一臺服務器,經過HeartBeat向服務器發送心跳信息監聽服務器的存活狀態,當一臺服務器故障時,服務會自動轉移到另一個服務器上。負載均衡

(3)MySQL Cluster
實現方法:MySQL集羣是由一組服務器組成,每一個服務器上都運行着多個服務進程,MySQL的數據節點,MySQL的管理服務,以及轉們的數據訪問程序,搭建起來十分複雜。時間成本特別高,可是能夠經過MySQL Cluster Manager來快速完成搭建,可是這個軟件是收費的,因此這種方案使用的特別少。

(4)MySQL主從+讀寫分離+自定義腳本
實現方法:插入數據的時候,經過MySQL的主從複製將數據分別保存到兩個服務器上,當其中某一臺服務器出現故障時,會自動將其中的一臺從庫提高爲主庫,對外提供服務器。

3、雙主+KeepAlived實現MySQL的高可用

一、環境準備

(1)服務器:CenterOS6.9

(2)MySQL環境
版本:mysql-5.6.39
節點一:192.168.0.4(mysql-master01)
節點二:192.168.0.5(mysql-master02)

二、搭建過程

  • 搭建雙主複製

(1)創建複製用戶,在節點一上創建一個複製用戶'repl'@'192.168.0.%'

#登錄mysql
[root@mysql-master01 ~]# mysql -uroot -proot -h127.0.0.1 -P3306

#創建複製用戶,注意主機權限是'192.168.0.%',由於等會須要導入數據到節點二上
mysql> grant all on *.* to 'repl'@'192.168.0.%' identified by 'repl';

(2)全備節點一的全部數據,而後發送到節點二上

[root@mysql-master01 ~]# mysqldump -uroot -proot -h127.0.0.1 -P3306 --all-databases --flush-logs --single-transaction --triggers --routines --master-data=2 --events --hex-blob > /tmp/mysql_all_data.sql
[root@mysql-master01 ~]# scp /tmp/mysql_all_data.sql 192.168.0.5:/tmp/

(3)在節點二所在的服務器上導入節點一備份的數據

[root@mysql-master02 ~]# mysql -uroot -proot -h127.0.0.1 -P3306 < /tmp/mysql_all_data.sql

(4)修改節點一的配置文件,添加以下內容

[mysqld]
server_id = 4
log_bin=/mysql_data/mysql-bin
log_bin_index=/mysql_data/mysql-bin.index
#讓主節點同時做爲其餘節點的從節點
log_slave_updates = 1
binlog_format = mixed
relay_log = /mysql_data/mysql-relay
relay_log_index = /mysql_data/mysql-relay.index

(5)修改節點二的配置文件,添加以下內容

[mysqld]
server_id = 5
log_bin = /mysql_data/mysql-bin
log_bin_index = /mysql_data/mysql-bin.index
log_slave_updates = 1
relay_log = /mysql_data/mysql-relay
relay_log_index = /mysql_data/mysql-relay.index

(6)重啓節點一和節點二
(7)登錄節點一中,而後查看當前二進制日誌的位置點及日誌文件

root@127.0.0.1 (none)> show master status \G
*************************** 1. row ***************************
             File: mysql-bin.000075
         Position: 120
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.10 sec)

(8)登錄節點二中,執行"change master"命令,將節點二配置爲節點一的從庫,而後啓動複製

mysql> change master to master_host='192.168.0.4',master_port=3306,master_user='repl',master_password='repl',master_log_file='mysql-bin.000075',master_log_pos=120;
mysql> start slave;
#查看複製狀態
mysql> show slave status \G

#看到輸出結果中以下兩個參數的值爲Yes,表示節點二到節點一的複製配置成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

(9)在節點二中查看當前二進制日誌的位置點及日誌文件

root@127.0.0.1 (none)> show master status \G
*************************** 1. row ***************************
             File: mysql-bin.000050
         Position: 160
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)

(10)在節點一中執行"change master"命令,將節點一配置爲節點二的從庫,而後啓動複製

mysql> change master to master_host='192.168.0.5',master_port=3306,master_user='repl',master_password='repl',master_log_file='mysql-bin.000050',master_log_pos=160;
mysql> start slave;
#查看略,同上

(11)驗證,在節點一上建立一張表,而後登錄節點二查看。而後在節點二上建立一張表,而後登錄節點一查看,正常的話,會相互複製,驗證過程省略。

至此,MySQL的雙主複製搭建完成。

  • 安裝及配置keepalived

(1)在節點一上,掛載CentOS6.9的鏡像,而後使用yum方式安裝keepalived,對於鏡像的掛載,能夠參考以前的博客:https://segmentfault.com/a/11... 此處再也不贅述。安裝過程以下:

[root@mysql-master01 ~]# yum install -y keepalived

#安裝完成以後,使用該命令查看是否安裝成功
[root@mysql-master01 ~]# rpm -qa | grep keep
  keepalived-1.2.13-5.el6_6.x86_64

(2)在節點二上,一樣掛載CentOS6.9的鏡像,而後安裝keepalived。此處略。
(3)keepalived安裝完成以後,配置文件默認在/etc/keepalived目錄下,首先配置節點一上的keepalived,以下:

[root@mysql-master01 ~]# cd /etc/keepalived/
#備份配置文件,須要養成習慣
[root@mysql-master01 keepalived]# cp keepalived.conf keepalived.conf.bak

寫入以下內容:

! Configuration File for keepalived
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   !負載均衡器標識,在同一網段內,能夠相同 
   router_id LVS_DEVEL
}
!定義VRR實例
vrrp_instance VI_1 {
    state BACKUP   !指定主節點和備節點,此處都是用BACKUP備機
    interface eth0 !虛擬IP綁定的網卡,根據本身的狀況而定
    virtual_router_id 51  !同一個VRR實例下virtual_router_id必須相同
    priority 100   !節點的優先級(範圍爲:1-254之間),備用節點必須比主節點優先級低
    advert_int 1   !組播信息發送間隔,兩個節點設置必須同樣
    nopreempt  !表示不搶佔的模式,只須要在優先級高的機器上設置便可,優先級低的機器可不設置
    !設置驗證信息,兩個節點必須一致,不一致會失敗
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    !配置VIP,能夠隨意取,可是須要和數據庫所在服務器在同一個IP端內,兩個節點必須相同
    virtual_ipaddress {
        192.168.0.100
    }
}
!配置監聽的VIP及端口
virtual_server 192.168.0.100 3306 {
    delay_loop 2  !健康檢查時間間隔,單位爲s
    lb_algo wrr  !調度算法權重輪訓Weight Round robin
    lb_kind DR  !LVS實現負載均衡的機制,能夠有NAT、TUN和DR三個模式能夠選擇
    nat_mask 255.255.255.0
    persistence_timeout 60 !回話保持時間
    protocol TCP !轉發協議類型,有tcp和udp兩種 

    real_server 192.168.0.4 3306 {
        weight 1  #權重,此處和第二個節點設置的相同,表示均衡輪訓
        notify_down /server/scripts/shutdown.sh !檢測到服務故障以後執行的腳本
        TCP_CHECK {
                connect_timeout 10    !鏈接超時時間
                nb_get_retry 3        !重連次數
                delay_before_retry 3  !重連間隔時間
                connect_port 3306     !健康檢查端口
        }
    }
}

shutdown.sh的內容請繼續往下看。

(4)配置節點二上的keepalived配置文件

[root@mysql-master02 ~]# cd /etc/keepalived/
[root@mysql-master02 keepalived]# cp keepalived.conf keepalived.conf.bak

寫入以下內容:

! Configuration File for keepalived
!注意,global_defs能夠徹底不用動
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
vrrp_instance VI_1 {
    state BACKUP 
    interface eth0
    virtual_router_id 51
    priority 90   
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.0.100
    }
}
! 配置VIP及監聽的端口
virtual_server 192.168.0.100 3306 {
    delay_loop 2
    lb_algo wrr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 60
    protocol TCP

    real_server 192.168.0.5 3306 {
        weight 1
        notify_down /server/scripts/shutdown.sh
        TCP_CHECK {
                connect_timeout 10
                nb_get_retry 3
                delay_before_retry 3
                connect_port 3306
        }
    }
}

shutdown.sh的內容以下,主要是用來關閉keepalived進程的:

[root@mysql-master01 keepalived]# cat /server/scripts/shutdown.sh 
    #!/bin/bash
    #
    killall keepalived

#注意,編輯完成以後,須要受權,不然不能執行,節點二上的腳本與此相同
[root@mysql-master01 keepalived]# chmod +x /server/scripts/shutdown.sh

(5)keepalived安裝完成以後,默認會生成Sysv腳本,使用service命令啓動節點一上的keepalived,並監控試試日誌,以下:

[root@mysql-master01 keepalived]# service keepalived start
[root@mysql-master01 keepalived]# tail -f /var/log/messages
#若是未看到錯誤消息,就是好消息。正常的話,能夠在啓動日誌中看到VIP的啓動信息。

#查看進程
[root@mysql-master01 keepalived]# ps -ef | grep keep
root       8258      1  0 May20 ?        00:00:02 /usr/sbin/keepalived -D
root       8260   8258  0 May20 ?        00:00:07 /usr/sbin/keepalived -D
root       8261   8258  0 May20 ?        00:00:12 /usr/sbin/keepalived -D
root       9434   8463  1 04:08 pts/0    00:00:00 grep keep

(6)啓動節點二上的keepalived

[root@mysql-master02 keepalived]# service keepalived start

(7)驗證主從功能是否正常,驗證方法爲在節點一上建立數據庫,觀察節點二上是否同步;而後在節點二上建立數據庫,觀察節點一上是否同步。驗證過程此處略。
(8)兩個節點都啓動以後,在先啓動的節點上查看VIP,以下:

[root@mysql-master01 keepalived]# ip addr | grep "0.100"
    inet 192.168.0.100/32 scope global eth0

(9)驗證高可用
在另外一個客戶端上使用VIP鏈接數據庫,好比windows上(VIP須要和windows宿主機在同一個ip段內,不然沒法鏈接),而後查看當前的主機名稱,以下:

C:\Users\wangbin>mysql -uroot -proot -h192.168.0.100 -P3306
#查看主機名
mysql> show variables like 'hostname';
+---------------+----------------+
| Variable_name | Value          |
+---------------+----------------+
| hostname      | mysql-master01 |
+---------------+----------------+
1 row in set (0.00 sec)

關閉節點一上的數據庫服務:

[root@mysql-master01 keepalived]# service mysqld stop
#過5秒左右,查看VIP,能夠發現,ip已經不在了
[root@mysql-master01 keepalived]# ip addr | grep "0.100"

此時再查看主機名稱,以下:

mysql> show variables like 'hostname';
+---------------+----------------+
| Variable_name | Value          |
+---------------+----------------+
| hostname      | mysql-master02 |
+---------------+----------------+
1 row in set (0.00 sec)
#發現已經變成server02了,VIP已經能夠自動切換了

建立一個數據庫,而後從新啓動節點一上的mysql服務和keepalived服務,登錄節點一查看建立的數據庫是否複製。

[root@mysql-master01 keepalived]# service keepalived start
[root@mysql-master01 keepalived]# service mysqld start

通過查看,發現已經複製,在數據庫節點從新啓動以後,會開始同步節點二上的數據。

後續更多文章將更新在我的小站上,歡迎查看。

另外提供一些優秀的IT視頻資料,可免費下載!如須要請查看https://www.592xuexi.com

至此,MySQL的高可用概念及使用(Keepalived+MySQL)實現的MySQL高可用已經搭建驗證完畢,篇幅較長,不免有筆誤,歡迎評論轉發!

相關文章
相關標籤/搜索