AWS Elasticcache Redis 集群的構建與管理


AWS Elasticcache Redis 集群的構建與管理
20180706 Chenxin

一般說明
創建,修改,刪除Redis實例均大約需要10分鍾(空實例).
通過EC2可以直接SSH登錄redis集群的集群機器嗎?不能
Redis集群(開啟集群模式):指的是具有分片功能,可以增加實例數量的方式擴大集群.可以有最多15個分片.
Redis集群(禁用集群模式):指的是無分片,只是主從模式(讀寫分離),數據大小取決於單機的負載能力.只有1個分片.
節點組(分片):每個分片可以擁有1-6個節點(包括分片模式或主從模式).分片也可以稱之為"節點組".1個分片可以由1-6個節點構成

我們這里計划創建禁用集群模式的方式來創建Redis集群.

創建
創建帶有多個副本的Redis,終端節點和第一個副本會落在1個內網IP上.(會不會是同一個數據源呢?是的)
其他副本分別落在不同IP上.

Redis設置
端口:6379 (安全考慮,最好不要用默認端口.如使用9001端口)
參數組:選擇默認
節點類型:選擇適當配置的實例類型
副本數量:1 (通過主副角色增強性能).提高容錯能力,我們建議在 Redis 群集中包含至少兩個節點(副本數量1),並啟用具有自動故障轉移功能的多可用區

高級Redis設置
具有自動故障轉移功能的多可用區
子網組:選擇跟EC2訪問實例相同的子網組(ElastiCache 使用該緩存子網組選擇一個子網和此子網內的 IP 地址,以便與您的緩存節點相關).

安全性
安全組:選擇Redis實例的"防火牆",具有內網流量不受限制的訪問(這里默認會有1個安全組,屬於自身訪問自身不受限制.另外需要再添加1個10.0.0.0/8不受限制的安全組)
密碼相關:ElasticCache-Redis不支持redis密碼訪問方式.aws只建議采用他們提供的方式(如安全組控制內網流量訪問)

備份
啟用自動備份
備份保留X天
備份時段:選擇北美早上8點,也就是UTC時間12:00

維護
維護時段:不能跟備份時段重疊,選擇"周三",UTC 10:00

SNS通知主題:可以創建1個

創建
可能會因為當地沒有適用的資源造成無法成功申請.可以嘗試更換可用區和實例類型的方式嘗試.

測試連通性
因上面選擇的1個副本,故這里會總共生成2個,1個主,1個副.主的掛001,副的掛002.
主終端節點:集群的主終端節點redis-0706-1550.ua0lui.ng.0001.apse1.cache.amazonaws.com:9001 用於應用程序連接執行讀寫(主終端節點域名始終自動指向可寫的節點)
終端節點redis-0706-1550-001.ua0lui.0001.apse1.cache.amazonaws.com:9001 當前角色:primary (用於應用程序連接執行讀操作,節點變化后,需要更新應用程序)
終端節點redis-0706-1550-002.ua0lui.0001.apse1.cache.amazonaws.com:9001 當前角色:replica (用於應用程序連接執行讀操作,節點變化后,需要更新應用程序)
連接:
/usr/local/redis/src/redis-cli -h redis-0706-1550.ua0lui.ng.0001.apse1.cache.amazonaws.com -p 9001
redis-0706-1550.ua0lui.ng.0001.apse1.cache.amazonaws.com:9001> set a "hello"
OK
redis-0706-1550.ua0lui.ng.0001.apse1.cache.amazonaws.com:9001> get a
"hello"

添加節點
點開redis實例,可以創建新的"只讀節點"到"復制組中.
ID:redis-0706-1550
redis-0706-1550.ua0lui.0001.apse1.cache.amazonaws.com:9001 當前角色:replica (這里的url跟主終端節點是不同的).
創建節點大約5分鍾,刪除節點大約20分鍾.

備份
如果實例類型配置選擇的過低,備份按鈕會是灰色的,無法備份.所以請選擇t2以上類型的配置.
執行備份時候有一定性能影響.性能影響可以參考 https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/backups.html#backups-performance

備份過程有時無法創建備份 (包括最終備份),不過這種情況很少見。預留內存不足通常是導致備份失敗的原因。因此,您應確保在嘗試備份之前有足夠的預留內存。如果您擁有的內存不足,可以移出一些密鑰或者增大 reserved-memory-percent 的值。

提升備份性能
以下是提高備份性能的准則。

  • 設置 reserved-memory-percent 參數—為了緩解過多分頁問題,我們建議設置 reserved-memory-percent 參數。此參數可防止 Redis 使用節點的所有可用內存,有助於減少分頁量。只需使用更大的節點,您也可以獲得性能改進。有關 reserved-memory 和 reserved-memory-percent 參數的更多信息,請參閱 管理預留內存。
  • 從只讀副本創建備份—如果您正在具有多個節點的節點組中運行 Redis,則可以從主節點或一個只讀副本進行備份。由於在 BGSAVE 期間需要系統資源,因此我們建議您從一個只讀副本上創建備份。從副本創建備份時,主節點不受 BGSAVE 資源要求的影響,可以繼續為請求提供服務,而不會降低速度。

手動備份
選中redis實例,執行備份.或者通過aws cli 命令(對應腳本)來實現自動備份.

自動備份
創建redis的snapshot.在redis的"修改"選項中,可以隨時調整自動備份頻率和保存時間.

"備份"->"復制"
復制備份,導出備份-導出snapshot到自己的S3.
在備份控制台上,選中某個備份,點擊"復制",選擇一個自建的s3.
如果留空不選的話,會備份到默認的s3中.備份下來的snapshot默認是放到1個看不到的s3中.之后還可以導出備份到自建的s3里.

復制到自建的S3

創建S3
這里S3名稱不能為redis-backup,否則會提示已經存在這個存儲桶(應該是系統默認就有這個了).
這里創建名稱為redis-backup-smhy的bucket.
自建的s3需要配置對應的權限才能接收到Redis復制動作的請求.見如下
需要在此bucket權限里配置"其他 AWS 賬戶的訪問權限".

  1. 在其他 AWS 賬戶的訪問權限下,選擇+ 添加賬戶。
  2. 在框中,添加區域的規范 ID,如以下列表中所示:
    • 中國(北京) 和 中國 (寧夏) 區域:b14d6a125bdf69854ed8ef2e71d8a20b7c490f252229b806e514966e490b8d83
    • AWS GovCloud (US)區域: 40fa568277ad703bd160f66ae4f83fc9dfdfd06c2f1b5060ca22442ac3ef8be6
      重要,該備份必須導出到 AWS GovCloud (US) 中的 S3 存儲桶。
    • 所有其他區域:540804c33a284a299d2547575ce1010f2312ef3da9b3a053c8bc45bf233e4353
  3. 通過為以下對象選擇是來對存儲桶設置權限: 1. 列出對象 2. 寫入對象 3. 讀取存儲桶權限
  4. 選擇 Save。
    具體請參見"導出備份": https://docs.aws.amazon.com/zh_cn/AmazonElastiCache/latest/red-ug/backups-exporting.html

復制
點擊復制,選擇對應的bucket,進行復制(exploring).
完成后,查看S3,會多出1個redis-20180706-1733-0001.rdb 文件.

放在s3上的rbd文件,可以作為種子,創建1個具有相同數據內容的Redis.

手動創建備份(腳本)
CLI方式 https://docs.aws.amazon.com/zh_cn/AmazonElastiCache/latest/red-ug/backups-manual.html
在預熱服上,到/home/xbzj/server-bin/server-ip/目錄下,以xbzj身份執行 aws configure 配置好密鑰(默認放置在根目錄/home/xbzj/.aws/下).

僅備份:
[xbzj@ip-10-0-0-200 server-ip]$ vim redis-bak.sh

!/bin/bash

20180809 Chenxin

echo "redis備份啟動中 備份集群名稱(副本):taihe-redis01-002 備份redis大約需要幾分鍾.這里源為只讀從庫.備份成功會收到郵件提醒."
Datadate=date +%Y%m%d%H%M%S
aws elasticache create-snapshot --region us-east-1 --cache-cluster-id taihe-redis01-002 --snapshot-name manage-redis-bk-"$Datadate"

備份,以及刪除過期的備份文件:
[xbzj@ip-10-0-0-200 server-ip]$ cat redis-bak.sh

!/bin/bash

20180809 Chenxin

20180913 Chenxin update

source /etc/profile
cd /home/xbzj/server-bin/server-ip

當前時間

Datadate=date +%Y%m%d%H%M%S

多日前時間

olddate=date -d '-20day' +%Y%m%d%H%M%S

echo "redis備份啟動中 備份集群名稱(副本):taihe-redis01-002 備份redis大約需要幾分鍾.這里源為只讀從庫."

執行當天的備份

aws elasticache create-snapshot --region us-east-1 --cache-cluster-id taihe-redis01-002 --snapshot-name manage-redis-bk-"$Datadate"

獲取手動備份的列表文件名

aws elasticache describe-snapshots --region us-east-1 |grep SnapshotName|grep "manage-redis-bk"|awk -F """ '{print $4}' >./redis-bak-file-list.txt

執行判斷時間,滿足條件的刪除

for i in cat ./redis-bak-file-list.txt
do
filedatetime=echo $i|awk -F "-" '{print $4}'

如果ElasticCache上手動(腳本)備份的文件時間小於這里給予的時間,則刪除該備份文件

if [ $filedatetime -le $olddate ];then
aws elasticache delete-snapshot --region us-east-1 --snapshot-name $i
echo "delete $i Successfuly"
fi
done
[xbzj@ip-10-0-0-200 server-ip]$

[xbzj@ip-10-0-0-200 ~]$ crontab -l
*/5 * * * * /home/xbzj/server-bin/server-ip/proc-check.sh
10 0,6,12 * * * /home/xbzj/server-bin/server-ip/redis-bak.sh #18:00-19:00還有個自動備份任務(保留7天)

恢復,還原,導出到內網供測試
恢復到實例
在"備份"里選中某個snapshot,然后"還原".
恢復備份會自動創建1個新的redis實例.該實例與原實例不會落在同一個IP上.域名會有所變化.端口保持不變.

導出rdb文件到內網
參考: https://docs.aws.amazon.com/zh_cn/AmazonElastiCache/latest/red-ug/backups-exporting.html
先在S3上申請一個S3,如 redis-tmp(然后在該S3的訪問控制列表上賦予權限 ):

  1. 選擇 Permissions。
  2. 選擇訪問控制列表。
  3. 在其他 AWS 賬戶的訪問權限下,選擇+ 添加賬戶。
  4. 在框中,添加區域的規范 ID:540804c33a284a299d2547575ce1010f2312ef3da9b3a053c8bc45bf233e4353
    到ElasticCache的控制台->備份列表->復制->選擇對應的S3桶,確定.
    這樣就可以將一個rdb文件復制到s3內了.然后開發人員就可以從s3下載該文件.

回檔說明
回檔需要創建新的實例(將備份文件直接生成新的實例)
注意實例名稱,最好跟老的一致(如taihe-redis01)
修改所有服務器上redis的URL地址
確認redis定時備份是否正常(放在預熱服上的每日4次備份腳本,涉及到region地區和redis的cluster-id)

維護時段
指的是備份時間窗口,你可以指定你希望的備份時間窗,也可以讓系統自動選擇.

問題或坑說明
1.程序連接redis一段時間后,偶爾報錯如下(含game服,gateway服):
RedisTimeoutException: Redis server response timeout (3000 ms)

解決方案(待測試)
參考: https://www.cnblogs.com/junge8618/p/9241927.html
內網兩條機器通過nat服務都連上遠程的reids-server。空閑不操作,導致服務器上的鏈接被銷毀。但連接客戶端沒有響應,導致繼續連接發生異常.
查看資料,該問題在2017年11月23號已經修復(參見:https://github.com/redisson/redisson/issues/946),更新ressdion到3.7版本以上.並且:
在java的代碼里(或配置文件),設置setPingConnectionInterval為60秒.

主從模式集群修改為多分片模式集群
需要先備份,再創建帶有分片的新集群,指定備份數據做為種子.
修改所有訪問redis實例的配置文件里對應的url地址
修改備份腳本


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM