1. 程式人生 > >redis擴縮容時重新分片及遷移技術

redis擴縮容時重新分片及遷移技術

redis分片

分片場景

在業務量相對較小的時候,可以將所有資料都存到一臺機器上,只使用redis單機模式,不存在分片問題。如果業務的資料量超過一臺物理機器的記憶體大小時,則會面對擴充套件問題,需要多臺機器去存資料,此時,需要使用到redis的分片技術。

如何分片

redis通過分slot的方式進行分片。例如有A、B、C三臺機器組成的一個叢集。對於叢集裡面的節點而言,三者會全部覆蓋16384個slots(2K位元組bit)。對於每一個請求而言,會通過一個hash演算法,得到一個2K位元組(16384個slots)範圍內的一個值,這個值則對應唯一一個節點,這個節點處理該請求。

擴容場景

當資源不夠,需要增加節點時,需要對slots進行節點的重複分配。而此時,又不能停止對外服務,解決方案如何?
假設原來有三個節點:A(0至5000),B(5001至10000),C(10001到16383)。現在需要增加第四個節點D節點進來,重新分配如下:

節點 範圍
A 0~5000
B 5001~10000
C 10001~13000
D 13000~16383

需要將C節點的slots,從13000~16383的slot遷移到D節點中。redis通過提供一組命令原語完成遷移操作。

遷移邏輯

遷移工作,可以使用redis-trib管理軟體進行遷移,具體原理如下:
1、對目標節點,即是D節點發送cluster setslot import 命令,讓目標節點做好準備接收遷移準備。
2、對源節點,即是C節點,傳送cluster setslot migrating命令,讓源節點做好準備遷移準備。
3、對源節點,傳送cluster getkeysinslot <slot> <count>命令,獲取對應slot的最多count個屬於slot的key名。
4、對於步驟3中獲取的key,向源節點發送命令migrate <target ip> <target port> <key_name> 0 <timeout> 命令,將被選中的鍵原子地從源節點遷移到目標節點。
5、重複上述3,4步驟,直到所有key都遷移成功

遷移期間訪問問題

當在遷移過程中,如果被訪問的slot,可能會有部分key存在在源節點,有部分在目標節點中。
1、當客戶端傳送請求到源節點的時候,源節點會檢視對應的key是否還在本節點,如果存在,則直接執行命令返回給客戶。如果不存在,則會給客戶端返回一個ASK錯誤,指引客戶端往正在匯入的目標slot去請求對應的key。客戶端可以通過返回的ASK錯誤中的目標節點進行對應KEY的請求。
2、當客戶端傳送請求到目標節點時
1)如果客戶端請求時,帶上ASKING標識,由目標節點會執行對應KEY的查詢。正常情況下,如果是通過查詢源slot,獲取ASK錯誤之後,再到目標節點進行查詢的時候,需要帶上ASKING標識。
2)如果客戶端請求時,未帶上ASKING標識,原由上,對應的slot還屬於源節點,則目標節點會拒絕執行KEY查詢,會返回一個MOVED錯誤給客戶端,告訴客戶端對應的KEY的slot屬於源節點。正常情況下,如果第一次請求KEY到了正在遷移的目標節點,則會收到MOVED錯誤。

總結

不僅是redis,自己設計的業務系統,如果遇到資料需要不間斷對外服務的遷移擴容情況時,也可以參考redis的資料分片的遷移方案。
學習經典,是一個快速提升水平的途徑!COME ON!

相關推薦

redis重新分片遷移技術

redis分片 分片場景 在業務量相對較小的時候,可以將所有資料都存到一臺機器上,只使用redis單機模式,不存在分片問題。如果業務的資料量超過一臺物理機器的記憶體大小時,則會面對擴充套件問題,需要多臺機器去存資料,此時,需要使用到redis的分片技術。 如何分

檢測tomcat假死重新啟動郵件通知

curl -i elif grep list send http 計劃 dev tom 腳本內容: #!/bin/bash IP=10.78.1.183 PORT=8114 TOMCAT_DIR=/data/tomcat_8114 function send_mail(){

Pod控制器應用進階四(Pod更新,

vim deploy-demo.yaml [[email protected] test]# cat deploy-demo.yaml apiVersion: apps/v1 kind: Deployment metadata: name: myapp-deploy name

android dialogfragment彈出問題跳轉微信支付返回重新執行閃屏問題

一個activity裡面彈出dialogfragment彈窗輸入金額跳轉微信支付,當返回的時候看到彈出重新彈出,還閃屏了,加上如果有請求dialog圈圈,這尼瑪看起來有點頭痛,測試的人都說眼睛都閃瞎,哎逼到沒法只有去看看怎麼解決,我先看了一下小米商城,因為上面支付的方式很多,隨便找了一個訂單去支

kubernetes命令式容器應用編排/部署應用/探查應用詳情/部署service對象//修改刪除對象

接受 set lan 活動 iptables ron nav dba times 部署Pod應用 創建delpoyment控制器對象 [root@master ~]# kubectl run myapp --image=ikubernetes/myapp:v1 --port

Knative 基本功能深入剖析:Knative Serving 自動 Autoscaler

Knative Serving 預設情況下,提供了開箱即用的快速、基於請求的自動擴縮容功能 - Knative Pod Autos

Centos7下安裝php-redis簡單使用

簡單使用 默認安裝路徑 lan 使用 ges l數據庫 sta https log 前言: 在本篇博客中,我將給大家介紹如何在Centos7上安裝PHP-Redis擴展以及一些簡單的實用,關於如何在Centos上安裝redis的,可以參考我的上一篇博客 Redis在Cen

CentOS 7 PHP-redis展安裝,瀏覽器不顯示數據redis無法儲存數據常見問題解決辦法

edi RR class all IT -c write 不知道 常見問題解決 首先使用php -m 可以查看到自己安裝了那些擴展。 1、使用wget下載redis壓縮包 wget https://github.com/phpredis/phpredis/archive/d

Ubuntu上PHP7.1安裝路徑redis展安裝

pin 文件路徑 php7.1安裝 package bin ava 使用 con figure 1. Ubuntu16.04上使用sudo apt-get install php7.1 安裝php的默認路徑如下:   a. php可執行命令:/usr/bin/php7.1

Redis集群重新分片(新增/移除節點)【理論】

redis集群新增節點 redis集群移除節點 redis集群重新分片 redis集群重新分片時數據獲取 redis集群重新分片原理:(增加或移除節點) 以增加節點為例: 我們只需要將已經分配給節點的哈希槽(hash slot),重新分配即可。

搭建Redis 集群,測試集群:對節點主機重新分片

... 配置文件 lock open with amp 14. phpredis -s 搭建Redis 集群 準備6臺redis服務器,具體要求如下: ip地址 端口 etho

redis cluster 叢集重新分片故障處理(基於redis 4.0.6)

redis cluster 叢集重新分片故障處理(基於redis 4.0.6)  環境: redis:4.0.6 現象: 開始gem安裝redis預設版本,gem install redis,部署叢集完畢後,測試程式碼寫入叢集資料,然後進行分片,發現一隻報錯,錯誤如下

redis cluster 叢集配置示例: 建立, 新增節點, 重新分片, 刪除節點

1 redis叢集搭建 Redis 從3.0.0正式版開始官方支援叢集,  下面開始做一個叢集配置的示例. [[email protected] ~]# tar xf redis-3.2.0.tar.gz [[email protected]

Redis 備份、高可用實戰

作者介紹 郝朝陽,宜搜科技,運維工程師,負責前端運維工作。專注於運維自動化的實現。致力於DevOps思想的推廣,幫助企業形成形成自有文化的運維體系建設。 一、Redis簡單介紹 Redis是一個高效能的key-value非關係型資料庫,由於其具有高效能的特性,支援高可用、持久化、多種資料結構、叢集

php7安裝redis展和memcache

php安裝redis擴展wget https://github.com/phpredis/phpredis/archive/php7.zip unzip php7.zip cd phpredis-php7 /usr/local/data/php/bin/phpize ./configure --with-p

使用redis減小數據庫訪問壓力提高系統性能

基礎上 磁盤 log 配置 關系 mas strong 小項目 內存 什麽是redis   redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(

Centos7安裝php-redis

服務器 源碼包 get js xml systemctl -c ace redis ase 前言: 在本篇博客中,我將給大家介紹如何在Centos7上安裝PHP-redis擴展以及一些簡單的實用,關於如何在Centos上安裝redis的,可以參考我的上一篇博客 Redis在

為php5.6.30安裝redis

highlight log config -c 默認 -- 解壓 redis擴展 tag 1.下載phpredis3.1.2 https://github.com/phpredis/phpredis/releases/tag/3.1.2    2.解壓後在phpred

公司網絡重新規劃拓撲圖和VPN

是的 一個 拓撲圖 自己的 任務 log vlan 技術分享 完成 因為公司沒有網絡工程師,所以這個任務就交由我來完成,但是我之前對網絡也不懂,然後查找資料,最後完成了網絡的重新規劃; 是的,其實我也不知道為什麽會接下這個任務,但是通過這個任務自己的確的學到不少東西; 先上

Linux下php安裝Redis

centos 6 end pecl php.ini restart ext 目錄 安裝完成 con http://pecl.php.net/package/redis 安裝環境:CentOS 6.4 1、下載 下載地址:http://pecl.php.n