使用keepalived打造redis雙機熱備

redis是很是實用的優秀nosql開源產品,在高併發的服務器環境中,能夠做爲緩存和隊列使用.美中不足的是,到如今爲止,redis並無推出本身的集羣方案,對一個完善的生產環境,負載均衡,高可用,主從備份都是必不可少的選項,redis提供了穩定·的主從備份功能,提供了數種持久化策略,在主從備份上也提供了增量備份的功能,如今經過sentinel提供主從熱備的功能,惋惜功能上並不完善,達不到生產環境的要求。java

如今咱們選定keepalived做爲redis的高可用支持,keepalived不只能夠比較完善的支持redis的高可用,並且做爲lvs負載均衡的配套產品,和lvs自然具備較好的配合,對於搭建redis集羣有較好的擴展性。linux

redis和keepalived的安裝很是簡單,網上大把的文章能夠參考,這裏就再也不贅述,這裏按照redis雙機主從熱備的場景,講須要注意的幾點,網上的不少文章沒有講清楚。redis

1,lvs和keepalived的關係,lvs起的是負載均衡功能,而keepalived則是高可用(熱備)的支持,keeplaived能夠單獨使用。sql

2,keepalived經過VIP虛擬ip的綁定轉換來打造熱備支持,在轉化主從身份的過程當中,還支持腳本的調用,根據不一樣的腳本,keepalived能夠用於不一樣的場景要求,可謂功能強centos

3,centos環境中keepalived的使用須要安裝ipvsadm支持。緩存

4,若是負載均衡使用的是nat策略,那麼能夠不設置linux的arp_ignore(arp組播忽略)選項。服務器

5,/etc/sysconfig/keeaplived 爲keepalived的啓動腳本,這個能夠不用修改,若是keepalived的啓動配置不在/etc/keepalived/keepalived.conf下則須要在這裏指定配置文件的位置併發

  /etc/keepalived/keepalived.conf爲kaapalived的默認配置文件所在位置負載均衡

  /var/log/messages中記載了keepalived的啓動,vip轉化等log信息,至於角色轉化過程當中的腳本執行日誌,由各個腳本本身指定nosql

下面貼出主從的keepalived.conf設置,在centos7下測試經過

主機keepalived.conf

! 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 128.0.0.1
   smtp_connect_timeout 30
   router_id LVS_MASTER
}

vrrp_script chk_redis 
{ 
     script "/usr/local/redis/sh/redis_check.sh 127.0.0.1 6379" 
     interval 2 
     timeout 2
     fall 3
}

vrrp_instance VI_1 {
    state MASTER
    interface eno16777736
    virtual_router_id 60
    priority 100
    advert_int 3
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.72.115
       # 192.168.200.17
       # 192.168.200.18
    }
     track_script {
        chk_redis
    }
    notify_master "/usr/local/redis/sh/redis_master_master.sh 127.0.0.1 192.168.72.128 6379"
    notify_backup "/usr/local/redis/sh/redis_master_slave.sh 127.0.0.1 192.168.72.128 6379"
    notify_fault "/usr/local/redis/sh/redis_fault.sh" 
}

virtual_server 192.168.72.115 6379 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP
    sorry_server 127.0.0.1 80
    real_server 192.168.72.11 6379 {
        weight 1
    TCP_CHECK {
          connect_timeout 3
          nb_get_retry 3
          delay_before_retry 3
          connect_port 6379
        }
    }

   real_server 192.168.72.128 6379 {
        weight 1
        TCP_CHECK {
          connect_timeout 3
          nb_get_retry 3
          delay_before_retry 3
          connect_port 6379
        }
    }



}

從機的keepalived.conf配置

! 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 128.0.0.1
   smtp_connect_timeout 30
   router_id LVS_BACKUP
}

vrrp_script chk_redis 
{ 
     script "/usr/local/redis/sh/redis_check.sh 127.0.0.1 6379" 
     interval 2 
     timeout 2
     fall 3
}

vrrp_instance VI_1 {
    state BACKUP
    interface eno16777736
    virtual_router_id 60
    priority 99
    advert_int 3
    nopreempt
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.72.115
       # 192.168.200.17
       # 192.168.200.18
    }
     track_script {
        chk_redis
    }
    notify_master "/usr/local/redis/sh/redis_backup_master.sh 127.0.0.1 192.168.72.11 6379"
    notify_backup "/usr/local/redis/sh/redis_backup_slave.sh 127.0.0.1 192.168.72.11 6379"
    notify_fault "/usr/local/redis/sh/redis_fault.sh" 
}

virtual_server 192.168.72.115 6379 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP
    sorry_server 127.0.0.1 80
    real_server 192.168.72.11 6379 {
        weight 1
    TCP_CHECK {
          connect_timeout 3
          nb_get_retry 3
          delay_before_retry 3
          connect_port 6379
        }
    }

   real_server 192.168.72.128 6379 {
        weight 1
        TCP_CHECK {
          connect_timeout 3
          nb_get_retry 3
          delay_before_retry 3
          connect_port 6379
        }
    }



}

請你們注意幾點:

1,同一組裏的各個機器配置文件中router_id不能相同,不少文章講這裏能夠相同是錯誤的,這個是組中身份的標識。同一個組裏的virtual_router_id必須相同,這是組標識。

2,priority是設置優先級別的,主服務器的優先級必須高於從服務器,即這個數字要大些。

3,interface後跟的是網卡名,在centos7中可不叫eth0,最好在配置以前使用ifconfig查看下你的網卡名稱。

4,real_server中的weight設置的是負載均衡優先級,若是主從熱備的場景下,這裏能夠設置爲相同。

 

keeaplived能夠在主從都運行良好的狀況下檢測主從狀態,當主服務器down掉,或者進程意外終止時,先將VIP綁定到從服務器上,而後經過指定的腳原本提高從服務器的應用層面的角色定位,在redis中就是運行slave no one,當主服務器恢復服務後,將VIP恢復綁定至主服務器,而後調用腳本同步主服務器宕機時間中從服務器儲存的數據,而後將主服務器redis進程提高爲主redis,從服務器redis降格爲備份進程。這些功能的實現都是經過主動調用notify_master腳本實現,這個腳本固然能夠配置爲其餘的功能,因此,這就可使keepalived在不少場合發揮做用。

相關文章
相關標籤/搜索