在AWS ec2上實現Redis哨兵+複製+VIP漂移方案

2020-08-29 小兵挖DB

目前Redis的HA架構中使用Redis sentinel哨兵模式的居多,使用該架構後,應用只需要連接到哨兵集群,再由哨兵提供主節點的IP位址,應用拿到主節點的地址後再次發起連接請求,該種方案成熟穩定,但是可以看到這種方式也有一定的弊端,即應用需要發起兩次連接,而且還要在代碼依賴的第三方庫支持哨兵部署,目前公司緩存方案採用的是AWS的elasticache服務,只提供了一個endpoint給應用,應用連接該endpoint後就會被轉發到對應的主節點,即使發生主從切換,應用不需要做出任何改變,通過endpoint還是可以連接到切換後的新的主節點,所以主從切換對應用來說也是透明的,如果我們想在哨兵模式中實現該endpoint功能,就需要在哨兵中引入VIP的方案,即應用連接的是VIP,默認VIP在主節點,當主從切換後,VIP漂移到了新的主節點,這樣就實現了elasticache的endpoint功能,目前我們準備採用該方案來實現elasticache到ec2 redis的數據遷移,這樣應用幾乎不要改動太多代碼,只需要在遷移完成後,將連接的endpoint修改為ec2的VIP即可.

集群規劃方案:

集群架構

在上述集群方案中

  • VIP默認在主節點上,當哨兵檢測到主節點故障後,從節點failover變成主節點,同時VIP漂移到新的主節點上
  • 從節點的虛擬網卡ens5:0默認處於關閉狀態,進行主從切換後由腳本啟動該網卡.

主節點和從節點的redis配置文件

bind 0.0.0.0protected-mode notcp-backlog 2048timeout 86400tcp-keepalive 0daemonize yessupervised systemdpidfile &34;loglevel noticelogfile &34;databases 64save 900 1save 300 10save 60 10000stop-writes-on-bgsave-error yesrdbcompression yesrdbchecksum yesdbfilename &34;dir &34;replica-serve-stale-data yesreplica-read-only yesrepl-diskless-sync norepl-diskless-sync-delay 5repl-ping-replica-period 5repl-timeout 30repl-disable-tcp-nodelay norepl-backlog-size 10mbrepl-backlog-ttl 7200replica-priority 100maxclients 65000maxmemory 14gbmaxmemory-policy allkeys-lrumaxmemory-samples 5replica-ignore-maxmemory yeslazyfree-lazy-eviction nolazyfree-lazy-expire nolazyfree-lazy-server-del noreplica-lazy-flush noappendonly noappendfilename &34;appendfsync everysecno-appendfsync-on-rewrite noauto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mbaof-load-truncated yesslowlog-log-slower-than 10000slowlog-max-len 256aof-use-rdb-preamble yes

主節點和從節點的sentinel配置文件

protected-mode noport 26379daemonize yessupervised systemdpidfile &34;logfile &34;dir &34;sentinel myid eb94724e56ac043f0d38f002e40ff77793fa1434sentinel deny-scripts-reconfig yessentinel monitor userredis-b 10.191.102.157 6379 2sentinel down-after-milliseconds userredis-b 5000sentinel failover-timeout userredis-b 30000sentinel notification-script userredis-b /usr/local/redis/dba/shell/notify.shsentinel client-reconfig-script userredis-b /usr/local/redis/dba/shell/reconfig.sh

其中notification-script和client-reconfig-script參數只要在主節點和從節點上配置即可.

這裡注意最後面一行的參數,該行參數定義發生主從切換後sentinel執行的腳本,sentinel會向該攪拌傳遞8個參數,每個參數如下所示.

<master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>

其中第六個參數<to-ip>就是集群failover後新的主節點信息,我們在準備腳本的時候接收sentinel傳遞的第六個參數,相當於腳本知道了新的主節點信息,那麼我們就可以在腳本中定義在新的主節點和老的主節點上做的操作,例如在老的主節點將VIP解綁,並將VIP綁定到新的主節點上.

我們準備的切換VIP的腳本,AWS ec2的vip解綁和重新綁定到新的ec2的機器上需要調用aws專有的命令,如果是普通的伺服器的話,直接用ip address或者ifconfig將VIP配到新的機器即可.

The following arguments are passed to the script: <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port> <state> is currently always &34;34;leader&34;observer& the old address of the master and the new address of the elected replica define global envionment variablesec1_userredis_b_01_ids=&34;ec1_userredis_b_01_ip=&34;ec1_userredis_b_01_hostname=&34;ec1_userredis_b_02_ids=&34;ec1_userredis_b_02_ip=&34;ec1_userredis_b_02_hostname=&34;vip=&34;new_master_ip=$6email_list=&34;my_ip=`netstat -rn | grep UG | awk &39; | /usr/bin/xargs -i /sbin/ifconfig {} | grep &34; | awk &39;`my_if=`netstat -rn | grep UG| awk &39;`my_vif=&34;current_time=`date &34;` find out new master and old master instance nework interface IDnew_master_instance_interface_id=`/usr/local/bin/aws ec2 describe-instances --region us-east-1 --instance-ids ${new_master_instance_id} --query &39; --output text`old_master_instance_interface_id=`/usr/local/bin/aws ec2 describe-instances --region us-east-1 --instance-ids ${old_master_instance_id} --query &39; --output text` When Slave: Stop old master vitrual ip netork card if [ ${new_master_ip} = ${my_ip} ]; then retry_unassign_times=0 /usr/local/bin/aws ec2 unassign-private-ip-addresses --region us-east-1 --network-interface-id ${old_master_instance_interface_id} --private-ip-addresses ${vip} get_unassign_status=$? while [ ${get_unassign_status} -ne 0 ] do let retry_unassign_times++ if [ ${retry_unassign_times} == 3 ];then /bin/mail -s &34; ${email_list} < /dev/null exit 2 fi sleep 1 /usr/local/bin/aws ec2 unassign-private-ip-addresses --region us-east-1 --network-interface-id ${old_master_instance_interface_id} --private-ip-addresses ${vip} get_unassign_status=$? done /bin/mail -s &34; ${email_list} < /dev/null retry_assign_times=0 /usr/local/bin/aws ec2 assign-private-ip-addresses --region us-east-1 --allow-reassignment --network-interface-id ${new_master_instance_interface_id} --private-ip-addresses ${vip} get_assign_status=$? while [ ${get_assign_status} -ne 0 ] do let retry_assign_times++ if [ ${retry_assign_times} == 3 ];then /bin/mail -s &34; ${email_list} < /dev/null exit 2 fi sleep 1 /usr/local/bin/aws ec2 assign-private-ip-addresses --region us-east-1 --allow-reassignment --network-interface-id ${new_master_instance_interface_id} --private-ip-addresses ${vip} get_assign_status=$? done /bin/mail -s &34; ${email_list} < /dev/null retry_up_times=0 /sbin/ifup ${my_vif} get_up_status=$? while [ ${get_up_status} -ne 0 ] do let retry_up_times++ if [ ${retry_up_times} == 3 ];then /bin/mail -s &34; ${email_list} < /dev/null exit 2 fi sleep 1 /sbin/ifup ${my_vif} get_up_status=$? done /bin/mail -s &34; ${email_list} < /dev/null /sbin/arping -q -c 3 -A ${vip} -I ${my_if}else /sbin/ifdown ${my_vif} if [ $? -ne 0 ]; then /bin/mail -s &34; ${email_list} < /dev/null exit 2 else /bin/mail -s &34; ${email_list} < /dev/null fifi

這裡需要特別留意一下:

  • 如果定義的腳本有語法錯誤等問題,sentinel不會告知你的腳本是否有錯.
  • sentinel的進程以超級用戶root來運行,否則ifup,ifdown等命令sentinel無法正常調用.即使加了sudo並且給運行sentinel的用戶sudo的權限.
  • 在初次運行時VIP需要手動綁定到主節點上.

相關焦點

  • 將ElastiCache Redis遷移到ec2 Linux實例
    更高的費用:例如我們在AWS ec2上部署一臺同等2核16GB內存大小的Linux實例,價格為¥595.00/月,使用ElastiCache for Redis單節點的費用是¥2331.00/月.升級不便,在ec2上部署redis集群後可以在線升級Redis版本或者內存大小,但是使用ElastiCache for Redis需要將整個集群重啟,緩存業務需要暫停.監控不便,雖然ElastiCache for Redis提供了監控指標,但是不夠詳細,無法深入到Redis內部.
  • Redis精華所在,一口氣說完Redis的主從複製和哨兵模式
    主從複製概念主從複製指將一臺redis的數據複製另外一臺redis伺服器上,前者稱為主節點(master),後者稱為從節點(slave)。注意複製的過程是單向的,只能從主節點到從節點,主節點以寫為主,從節點以讀為主。
  • Redis高可用之哨兵(sentinel)實際部署和分析篇
    我們以一主兩從的複製方式結合案例學習一下哨兵的部署,相關環境如下redis+sentinelredis複製部署redis複製部署請參考另外一篇文章部署完成後效果如下主節點ec2-redis-01> info replication34;master&34;192.168.100.4&34;6379&34;368018&34;192.168.100.3&
  • Redis高可用之哨兵(sentinel)在客戶端一側的實現
    redis哨兵是對主從複製技術的補充,負責監控redis主從複製並在主節點宕機後執行自動故障轉移,同時更新故障轉移後新的配置,並提供客戶端最新的主節點和從節點信息.客戶端也被明確要求支持redis哨兵功能redis客戶端通過哨兵發現redis服務redis哨兵通過一個別名來唯一標註一個主從複製架構中的主節點信息
  • Redis系列:高可用哨兵方案部署
    自動故障遷移(Automatic failover):當一個主伺服器不能正常工作時, Sentinel 會開始一次自動故障遷移操作, 它會將失效主伺服器的其中一個從伺服器升級為新的主伺服器,並讓失效主伺服器的其他從伺服器改為複製新的主伺服器;當客戶端試圖連接失效的主伺服器時
  • 如何實現redis主從複製?
    最後也為後續集成哨兵機制和集群的實現提供了依據。 一、多臺伺服器上配置主從複製 Redis從5.0以後主從配置屬性發生了變化,在5.0之前配置的是slaveof,5.0以後變成了replicaof 伺服器用途redis埠號備註centos7 192.168.1.6主機Master(寫)6379redis5.0centos7 192.168.1.4
  • 一文把Redis主從複製、哨兵、Cluster三種模式摸透
    概述Redis作為緩存的高效中間件,在我們日常的開發中被頻繁的使用,今天就來說一說Redis的四種模式,分別是「單機版、主從複製、哨兵、以及集群模式」。maxmemory-policy volatile-lru aof文件名appendfilename &34; 有些作業系統會真的把數據馬上刷到磁碟上;有些則會儘快去嘗試這麼做。 no:不要立刻刷,只有在作業系統需要刷的時候再刷。比較快。 everysec:每秒寫一次。折中方案。
  • Redis高可用之哨兵(sentinel)技術原理
    哨兵的基礎概念Redis哨兵(sentinel)為redis提供高可用解決方案,在傳統的主從複製模式中,當主節點宕機後,我們需要手動將從節點切換成主節點,並且客戶端也需要同步修改配置文件中的主節點信息,當哨兵模式啟用後,主從節點的切換是自動化的,客戶端由原來的連接主節點到現在的客戶端連接哨兵節點,主從切換時客戶端幾乎不會感知
  • Redis哨兵機制Sentinel在windows下的部署
    前言RedisSentinels:主節點,從節點,若干哨兵節點(哨兵節點不一定要等於主節點數量+從節點數量)一.安裝redis並且修改配置文件1.下載Linux、windows都兼容的redis.zip壓縮包,我這裡以windows環境下為例,解壓後的文件再複製出2個出來做slave從伺服器!
  • 為什麼需要 Redis 哨兵?
    作者 | 阿文責編 | 郭芮在說哨兵之前,我們先說下主從複製,Redis 的主從複製模式,一旦主節點出現故障無法提供服務,需要人工介入手工將從節點調整為主節點,同時應用端還需要修改新的主節點地址,這種故障轉移的方式對於很多應用場景是不能容忍的。正式由於這個問題,Redis 提供了 Sentinel(哨兵) 架構來解決這個問題。
  • Redis高可用之哨兵(sentinel)客戶端(Python)連接
    在前文介紹redis主從複製的時候,我們是通過Python的redis模塊來連接到redis的主節點,從而實現數據的查詢與寫入操作.;, &34;)pipe.execute()print(&34; + str(redis_connection.get(&34;)))print(&34; + str(redis_connection.get(&34;)))print(&34; + str(redis_connection.get(&34;)))print(redis_connection.keys())print(str(redis_connection.dbsize
  • 一文帶你了解Redis哨兵模式和高可用集群解析
    1.redis cluster集群是什麼?redis cluster集群是一個由多個主從節點群組成的分布式伺服器群,它具有複製、高可用和分片特 性。Rediscluster集群不需要sentinel哨兵也能完成節點移除和故障轉移的功能。
  • Redis哨兵模式,面試你被問了嗎
    前言最近面試被問到了,哨兵模式,一聽名詞感覺很陌生,搜索下記憶,還好了解過Redis集群的知識,沒被難倒。哨兵模式是實現Redis集群的一種方案。Redis的集群方案大致有三種:redis cluster集群方案;master/slave主從方案;哨兵模式來進行主從替換以及故障恢復。
  • Redis主從模式和哨兵模式,這篇看完就足夠了
    同時主資料庫收到SYNC命令後會開始在後臺保存快照(即RDB持久化,在主從複製時,會無條件觸發RDB),並將保存快照期間接收到的命令緩存起來,當快照完成後,redis會將快照文件和所有緩存命令發送給資料庫。從資料庫接收到快照文件和緩存命令後,會載入快照文件和執行命令,也就是說redis是通過RDB持久化文件和redis緩存命令來實現主從複製。一般在建立主從關係時,一次同步會進行複製初始化。
  • Redis如何從ElastiCache中遷移增量或變化的key導入到新的環境中
    將該RDB導入到S3存儲,再從S3存儲下載到ec2,將該快照文件加載到新Redis集群.應用將連接從ElastiCache修改為ec2的Redis集群這裡可以看到,第一步到第三步的遷移過程.實際上應用還是一直在往ElastiCache中寫數據,這裡就有一個gap的數據存在,那麼我們怎麼將gap的key找出來呢,這裡有兩種方案.
  • 7、redis 主從節點配置已經哨兵集群搭建
    按照上一篇文章搭建好redis環境之後。為了解決 大並發的讀取操作。可以設置一主多從的redis集群。設置相對簡單找到redis.conf找到要設置成從節點的redis的redis.conf-# slaveof <masterip> <masterport>打開這個配置 並寫上主節點的 ip和埠號就可以了slave-read-only yes // 這個配置是強制性的讀寫分類 從節點只能做讀操作
  • CentOS 7安裝Redis集群(哨兵模式)
    注意,緊接上一步,當前已經在/usr/redis目錄下,如不在此目錄下,注意添加全路徑/usr/redis。複製完成後,該目錄下共有6個文件。至此,準備工作完畢。此時,使用VMWare在此拍攝快照並保存。
  • Redis的哨兵模式是如何實現的呢?
    一、Redis哨兵模式Redis的哨兵模式(Sentienl)是為了解決複製中的問題:在「Redis複製」架構中,如果主節點出現了故障,那麼, 就需要手動將一個從節點晉升變為主節點,這個過程需要人工幹預,比較麻煩主節點的寫能力受到單機的限制主節點的存儲能力受到單機的限制
  • Spring Boot 如何快速集成 Redis 哨兵?
    Redis Sentinel 介紹Redis Sentinel:哨兵,放哨,看中文名字就知道它是一種 Redis 高可用解決方案,主要是針對 Redis 主從模式實現主從節點監控、故障自動切換。哨後架構的搭建這裡不展開了,大家可以移步公眾號Java技術棧,關於 Redis 單機、哨後、集群的搭建、以及往期 Redis 和 Spring Boot 集成、分布式鎖實戰教程等在公眾號Java技術棧後臺回復redis進行翻閱。
  • 你真的懂Redis哨兵技術嗎?
    複製:複製是高可用Redis的基礎,哨兵和集群都是在複製基礎上實現高可用的。複製主要實現了數據的多機備份,以及對於讀操作的負載均衡和簡單的故障恢復。缺陷是故障恢復無法自動化;寫操作無法負載均衡;存儲能力受到單機的限制。