從阿里雲遷移分布式redis實例到華為雲解決方案(詳細)


如果要換多數是經濟因素啦~

一、 准備工作

先在華為雲上買一台redis數據庫,配置一定要注意多數要保持一致,至於4.0還是5.0倒問題不大親測兼容

可用區要找現有ECS雲主機中的相同的機器。記下:這台雲主機ECS的基本公網ip和密碼、新的redis的連接串和密碼。

在阿里雲上的原redis數據庫創建一個有“復制”權限的賬號、記下賬號密碼和原redis的賬號密碼

二、配置華為雲主機ECS上的nginx以達到公網訪問內網redis數據庫

安裝Nginx

買了ECS后,需要在ECS上安裝Nginx。

  1. 執行以下命令,添加Nginx到yum源。

     

    sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

     

  2. 添加完之后,執行以下命令,查看是否已經添加成功。

     

    yum search nginx

     

  3. 添加成功之后,執行以下命令,安裝Nginx。

     

    sudo yum install -y nginx

     

  4. 啟動Nginx並設置為開機自動運行。

     

    sudo systemctl start nginx.service

    sudo systemctl enable nginx.service

     

  5. 在本地瀏覽器中輸入服務器地址(ECS公網IP地址),查看安裝是否成功。

     

    如果出現下面頁面,則表示安裝成功。

     

配置Nginx

Nginx安裝后,需要配置請求轉發規則,告訴Nginx哪個端口收到的請求,應該轉發到后端哪個Redis實例。

  1. 修改配置文件。

     

    cd /etc/nginx

    vi nginx.conf

    配置示例如下,如果有多個redis實例需要公網連接,可以配置多個server,在proxy_pass中配置Redis實例連接地址。

    stream {
        server {
            listen 8080;
            proxy_pass 192.168.0.5:6379;
        }
    	    server {
            listen 8081;
            proxy_pass 192.168.0.6:6379;
        }
    }
     
    圖4 Nginx配置

     

  2. 重啟Nginx服務。

     

    service nginx restart

     

  3. 驗證啟動是否成功。

     

    netstat -an|grep 808

    圖5 啟動Nginx及驗證

    8080和8081兩個端口都在監聽狀態,Nginx啟動成功。

     

通過Nginx訪問Redis

    1. 登錄虛擬私有雲控制台,確認跳板機的安全組規則是否放開,如果沒有,則需要為安全組放開8080和8081兩個端口。
      圖6 添加安全組入方向規則
    • 在公網環境中打開Redis命令行界面,輸入如下命令,登錄與查詢都正常,大功告成。

      ./redis-cli -h {myeip} -p {port} -a {mypassword}

      其中,命令中的{myeip}為主機連接地址,需要填寫ECS的彈性IP,端口需要填寫ECS上Nginx的監聽端口。

      如下圖所示,設置的2個監聽端口分別為8080和8081,對應后端2個Redis實例。

      圖7 通過Nginx代理連接第一個Redis實例
      圖8 通過Nginx代理連接第二個Redis實例

      至此,就完成了通過跳板機的搭建,實現公網訪問Redis4.0和Redis5.0的操作了。

三、下載使用阿里雲同步工具redis-shake

Redis-shake的sync(同步)模式支持全量數據遷移和增量數據遷移,可實現同一或不同阿里雲賬號下Redis實例間的數據遷移。

前提條件

源和目標Redis實例需分別滿足下述條件:
 
Redis實例 需滿足的條件
源Redis實例
目標Redis實例
 
說明
  • 如果尚未創建目標Redis實例,請參見步驟1:創建實例
  • 如需跨版本遷移(例如從4.0遷移至5.0),建議您創建按量付費的Redis實例以進行兼容性驗證,驗證無誤后可轉換為包年包月。關於如何轉換付費模式,請參見轉包年包月

Redis-shake介紹

Redis-shake是阿里雲自研的開源Redis數據傳輸工具,支持對Redis數據進行解析(decode)、恢復(restore)、備份(dump)和同步(sync或rump),易於部署,靈活高效。Redis-shake的sync(同步)模式支持全量數據遷移和增量數據遷移,詳細的遷移流程如下圖所示: 圖 1. redis-shake遷移示意圖 redis-shake遷移示意圖
 
說明 通過DTS的數據同步功能也可以實現數據遷移的需求,且支持更加豐富的場景與功能。更多信息,請參見 Redis數據同步方案概覽

注意事項

  • 如果目標庫的數據逐出策略(maxmemory-policy)配置為noeviction以外的值,可能導致目標庫的數據與源庫不一致。關於數據逐出策略詳情,請參見Redis數據逐出策略介紹
  • 如果源庫中的某些Key使用了過期(expire)機制,由於可能存在Key已過期但未被及時刪除的情形,所以在目標庫中查看(如通過info命令)到的Key數量會比源庫的Key數量少。
     
    說明 源和目標庫中,未設置過期機制或未過期的Key數量是一致的。

適用場景

  • 跨阿里雲賬號實例間遷移
  • 同一阿里雲賬號實例間遷移

操作步驟

  1. 確認Redis-shake待安裝的位置,並完成下述操作:
    說明
    • 下表中的Redis實例包含源Redis實例和目標Redis實例,即源和目標Redis實例均需要完成下述操作。
    • 推薦在ECS實例上安裝Redis-shake,通過專有網絡連接源和目標Redis實例,可獲得更低的網絡延遲和更高的安全性。
    • 如需執行跨阿里雲賬號遷移,推薦將Redis-shake部署在源Redis實例所屬的阿里雲賬號的ECS中,通過專有網絡連接源Redis實例,可通過公網連接目標Redis實例。
    Redis-shake待安裝位置 需完成的操作
    ECS實例(推薦)
    1. 確保ECS實例與Redis實例屬於同一專有網絡(即實例基本信息中的專有網絡ID一致)。
      說明
    2. 獲取ECS實例的內網IP地址。具體操作,請參見查詢ECS實例的IP地址
    3. 將ECS實例的內網IP地址添加至Redis實例的白名單中。具體操作,請參見設置IP白名單
    本地設備
    1. Redis實例默認僅提供內網連接地址,通過公網連接時您需要手動申請公網連接地址。具體操作,請參見申請公網連接地址
    2. 在本地設備上執行curl ipinfo.io |grep ip命令,獲取其公網IP地址,返回示例如下:查看公網IP結果
    3. 將本地設備的公網IP地址添加至Redis實例的白名單中。具體操作,請參見設置IP白名單
  2. 安裝Redis-shake。
    1. 登錄待安裝Redis-shake的設備,例如ECS實例或本地設備。
    2. 執行下述命令下載Redis-shake文件:
      wget 'http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/120287/cn_zh/1608173646665/redis-shake-v2.0.3.tar.gz'
      說明 本文以2.0.3版本為例演示操作流程,您也可以安裝其他版本。更多信息,請參見 RedisShake版本列表
    3. 執行下述命令解壓Redis-shake文件:
      tar xzf redis-shake-v2.0.3.tar.gz
  3. 在安裝Redis-shake的設備上,執行數據遷移。
    1. 執行下述命令進入解壓后的目錄並修改配置文件:
      cd redis-shake-v2.0.3/ && vim redis-shake.conf
      說明 執行命令后,系統將進入編輯界面,輸入 a可進入編輯模式。
      表 1. 主要參數說明
      參數 是否必選 說明 取值示例
      source.type 根據源Redis實例的架構選擇,取值: standalone
      source.address 源Redis實例的連接地址與端口號,連接地址和端口號之間使用英文冒號(:)分隔。關於如何獲取連接地址和端口號,請參見查看連接地址
      • ECS實例通過專有網絡連接:需獲取Redis實例的專有網絡連接地址。
      • 本地設備通過公網連接:需獲取Redis實例的公網連接地址。
      說明 如果源Redis實例為集群架構,您需要通過直連地址連接(網絡類型為專有網絡),且在填寫連接地址時需要添加 master@前綴,例如 master@r-bp1mfnrflszg75w****.redis.rds.aliyuncs.com:6379。關於如何申請直連地址,請參見 開通直連訪問
      r-bp1mfnrflszg75w****.redis.rds.aliyuncs.com:6379
      source.password_raw 源Redis實例的賬號(需具備復制權限)及其密碼,賬號和密碼之間使用英文冒號(:)分隔。關於如何創建賬號,請參見創建與管理賬號
      說明 集群架構的實例暫不支持創建 復制權限的賬號,您需要提交工單申請開通該功能。
      testaccount:Rp829dlwa
      target.type 根據目標Redis實例的架構選擇,取值: cluster
      target.address 目標Redis實例的連接地址與端口號,連接地址和端口號之間使用英文冒號(:)分隔。關於如何獲取連接地址和端口號,請參見查看連接地址
      • ECS實例通過專有網絡連接:需獲取Redis實例的專有網絡連接地址。
      • 本地設備通過公網連接:需獲取Redis實例的公網連接地址。
      說明 如果目標實例為集群架構,您需要通過直連地址連接(網絡類型為專有網絡),且在填寫連接地址時需要添加 master@前綴,例如 master@r-bp1mfnrflszg75w****.redis.rds.aliyuncs.com:6379。關於如何申請直連地址,請參見 開通直連訪問
      master@r-bp1mfnrflszg75w****.redis.rds.aliyuncs.com:6379
      target.password_raw 目標Redis實例的賬號(需具備讀寫權限)及其密碼,賬號和密碼之間使用英文冒號(:)分隔。關於如何創建賬號,請參見創建與管理賬號 testaccount:Rp829dlwa
      target.db 是否將源Redis實例中所有庫的數據都遷移至目標Redis實例的指定庫中,取值:
      • -1(默認值):不啟用該功能。
      • 0~255:啟用該功能並將取值作為目標Redis實例的指定庫。例如取值為0,表示將源Redis實例中所有庫的數據匯總遷移至目標Redis實例的數據庫0中。
      說明 如果源Redis實例為 標准架構,目標Redis實例為 集群架構,此場景僅會同步數據庫0,其他數據庫的數據不會被遷移。此時,將該參數設置為0,可將源實例的所有數據庫全部遷移至目標實例的數據庫0中。
      -1
      key_exists 當源Redis實例中的Key與目標Redis實例中的Key相同時,采取的數據寫入策略,取值:
      • rewrite:覆蓋寫入至目標庫。
      • none:默認值,停止運行Redis-shake程序並提示沖突的Key。
      • ignore:直接跳過當前遷移的Key,保留目標庫的數據,繼續執行數據遷移。
      rewrite
      filter.db.whitelist 需要遷移的庫名,多個庫名間用英文分號(;)分隔,默認為空,即遷移所有庫。 0;1
      filter.db.blacklist 不需要遷移的庫名(即黑名單),多個庫名間用英文分號(;)分隔。默認為空,即不設置黑名單。 1;2
      parallel Redis-shake執行遷移的並發線程數,適當調大該值可提高同步性能。
      說明 默認值為32,最小值為1,最大值取決於Redis-shake所在服務器的性能。
      32
      說明 其他參數如無特殊需求不需要配置,如需了解更多,請查看 redis-shake.conf文件中各參數的注釋。
    2. 按下ECS鍵退出編輯模式,輸入:wq並按回車鍵保存配置並退出編輯界面。
    3. 執行下述命令啟動Redis-shake,開始執行數據遷移:
      ./redis-shake.linux -type=sync -conf=redis-shake.conf
      Redis-shake將在屏幕上打印運行的日志信息。
      說明 如果出現提示報錯,相關原因及解決方法,請參見 常見報錯及解決方法
  4. 可選:選擇合適的時機,結束數據遷移任務。
    說明 如果您需要長期運行Redis-shake用於實時遷移數據,無需執行本步驟。
    1. 觀察打印的日志,等待遷移任務進入增量數據遷移狀態。
      遷移任務階段 對應打印的日志
      全量數據遷移
      2020/12/16 21:02:36 [INFO] DbSyncer[0] total = 4.00MB -       2.18MB [ 54%]  entry=52199
      2020/12/16 21:02:36 [INFO] DbSyncer[0] total = 4.00MB -       4.00MB [100%]  entry=97531
      2020/12/16 21:02:36 [INFO] DbSyncer[0] sync rdb done
      說明 當打印的日志出現 sync rdb done,表示完成全量數據遷移,接下來進入增量數據遷移階段。
      增量數據遷移
      2020/12/16 21:03:07 [INFO] DbSyncer[0] sync:  +forwardCommands=5      +filterCommands=0      +writeBytes=5095
      2020/12/16 21:03:08 [INFO] DbSyncer[0] sync:  +forwardCommands=7      +filterCommands=0      +writeBytes=7133
      2020/12/16 21:03:09 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
      2020/12/16 21:03:10 [INFO] DbSyncer[0] sync:  +forwardCommands=645    +filterCommands=0      +writeBytes=657255
      2020/12/16 21:03:11 [INFO] DbSyncer[0] sync:  +forwardCommands=28     +filterCommands=0      +writeBytes=28532
      2020/12/16 21:03:12 [INFO] DbSyncer[0] sync:  +forwardCommands=0      +filterCommands=0      +writeBytes=0
      日志信息中各參數說明如下:
      • forwardCommands:源Redis實例發送過來的命令數。
      • filterCommands:被過濾的命令數,例如在Redis-shake配置文件中設置了過濾某些庫。
      • writeBytes:源Redis實例發送過來的字節數。

暫停向源Redis實例寫入數據,等待返回日志中writeBytes對應值連續多次為0時,使用Ctrl+C組合鍵停止運行Redis-shake。

圖 2. 停止運行示例 停止運行示例
 
說明 此時源和目標實例的數據完全一致,您可以將業務的數據庫服務由源Redis實例切換至目標Redis實例。
 

 

四、檢查服務是否正常

 

參考:

https://help.aliyun.com/document_detail/117311.html?spm=a2c4g.11186623.6.653.344f3b69KaDUif
https://support.huaweicloud.com/bestpractice-dcs/dcs-bp-0514001.html

 


免責聲明!

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



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