華為云計算 云知識 使用分布式緩存服務DCS改造傳統(tǒng)應用系統(tǒng)數(shù)據(jù)庫
使用分布式緩存服務DCS改造傳統(tǒng)應用系統(tǒng)數(shù)據(jù)庫

方案概述

應用場景

隨著互聯(lián)網(wǎng)等 數(shù)據(jù)庫 應用行業(yè)的逐漸發(fā)展,業(yè)務需求急速增加,數(shù)據(jù)量和并發(fā)訪問量呈指數(shù)級增長,僅依附于傳統(tǒng)關系型數(shù)據(jù)庫難以支撐上層業(yè)務。傳統(tǒng)數(shù)據(jù)庫存在結構復雜、維護成本高、訪問性能差、功能有限、無法輕松適應數(shù)據(jù)模型或模式的變化等問題。

解決方案

將Redis作為應用與數(shù)據(jù)庫之間的緩存層可以解決上述問題,通過Redis緩存數(shù)據(jù),提高數(shù)據(jù)讀取速度,減輕數(shù)據(jù)庫負載,提高應用性能,保證數(shù)據(jù)的可靠性。

因此,對于傳統(tǒng)的關系型數(shù)據(jù)庫例如MySQL,可以將其 數(shù)據(jù)遷移 到Redis中。Redis中的數(shù)據(jù)是以鍵值結構進行存儲的,在 遷移 前需要將傳統(tǒng)的數(shù)據(jù)庫轉換為特定的結構。本文以將MySQL數(shù)據(jù)庫中的一張表遷移到華為云DCS Redis中為例,介紹數(shù)據(jù)遷移的過程。

前提條件

  • 已創(chuàng)建DCS Redis實例,作為遷移的目的數(shù)據(jù)庫。請參考創(chuàng)建DCS Redis緩存實例。
    說明:

    如果您的源端是華為云的MySQL數(shù)據(jù)庫,Redis實例請選擇與MySQL數(shù)據(jù)庫實例相同的VPC。

  • 已有MySQL數(shù)據(jù)庫,并在其中創(chuàng)建一張表,作為源端數(shù)據(jù)庫中的數(shù)據(jù)。

    例如,在MySQL數(shù)據(jù)庫中創(chuàng)建一張名為student_info的表格,表中共有4列,遷移后表中的id列的值將成為Redis中的hash的key,其余的列名將成為hash的field,而列的值作為field對應的value。

  • MySQL數(shù)據(jù)庫所在服務器與DCS緩存實例網(wǎng)絡互通。
    • MySQL數(shù)據(jù)庫與Redis實例所在VPC為同一VPC

      同一VPC內(nèi)網(wǎng)絡默認互通。

    • MySQL數(shù)據(jù)庫與Redis實例所在VPC為相同region下的不同VPC

      如果MySQL數(shù)據(jù)庫所在VPC與Redis實例不在相同VPC中,可以通過建立VPC對等連接方式連通網(wǎng)絡,具體請參考:緩存實例是否支持跨VPC訪問?。

    • MySQL數(shù)據(jù)庫與Redis實例所在VPC不在相同region

      如果MySQL數(shù)據(jù)庫和Redis實例不在同一region,僅支持通過 云專線 打通網(wǎng)絡,請參考云專線

    • 公網(wǎng)訪問

      MySQL數(shù)據(jù)庫所在服務器公網(wǎng)訪問Redis 4.0/5.0/6.0實例時,需要開啟實例公網(wǎng)訪問開關,具體請參考開啟Redis 4.0/5.0/6.0公網(wǎng)訪問并獲取公網(wǎng)訪問地址。

  • MySQL數(shù)據(jù)庫所在服務器已安裝JDK1.8以上版本和Intellij IDEA開發(fā)工具,下載jedis客戶端(點此處下載jar包)。

    本文檔下載的開發(fā)工具和客戶端僅為示例,您可以選擇其它類型的工具和客戶端。

實施步驟

  1. 登錄MySQL數(shù)據(jù)庫所在服務器。
  2. 在MySQL數(shù)據(jù)庫所在服務器安裝Redis客戶端用來進行數(shù)據(jù)的提取、傳輸和轉換。安裝Redis客戶端請參考安裝Redis客戶端
  3. 分析源端數(shù)據(jù)結構,在MySQL數(shù)據(jù)庫所在服務器中創(chuàng)建如下的遷移腳本,保存文件名為migrate.sql。

     

    SELECT CONCAT(
    "*8\r\n",  #這里的8是下方字段的數(shù)量,由MySQL表中的數(shù)據(jù)結構決定
    '$', LENGTH('HMSET'), '\r\n',  #HMSET是在Redis中寫入數(shù)據(jù)時使用的命令
    'HMSET', '\r\n',
    '$', LENGTH(id), '\r\n',   #id是HMSET字段后的第一個字段,遷移后會成為Redis Hash中的key
    id, '\r\n',
    '$', LENGTH('name'), '\r\n',   #'name'將以字符串形式傳入hash中,作為其中一個field。下面的'birthday'等與它相同
    'name', '\r\n',
    '$', LENGTH(name), '\r\n',  #name是一個變量,代表了MySQL表中公司的名稱,遷移后會成為上一參數(shù)'name'生成的field所對應的value。下面的birthday等與它相同
    name, '\r\n',
    '$', LENGTH(' birthday'), '\r\n',
    ' birthday', '\r\n',
    '$', LENGTH(birthday), '\r\n',
    birthday, '\r\n',
    '$', LENGTH('city'), '\r\n',
    'city', '\r\n',
    '$', LENGTH(city), '\r\n',
    city, '\r'
    )
    FROM student_info AS s
     

     

  4. 在MySQL數(shù)據(jù)庫所在服務器中使用如下命令遷移數(shù)據(jù)。

     

    mysql -h <MySQL host> -P <MySQL port> -u <MySQL username> -D <MySQL database name> -p --skip-column-names --raw < migrate.sql | redis-cli -h <Redis host> -p<Redis port> --pipe  -a <Redis password>
     
    表1 參數(shù)項說明

    參數(shù)項

    說明

    示例

    -h

    MySQl數(shù)據(jù)庫的連接地址。

    xxxxxx

    -P

    MySQL的服務端口。

    3306

    -u

    MySQL的用戶名。

    root

    -D

    待遷移的表所在的庫。

    mysql

    -p

    MySQL的連接密碼。如果沒有密碼,-p后為空。

    為了提高安全性,可以只輸入-p,不在其后輸入密碼,執(zhí)行命令后再根據(jù)命令行提示輸入密碼。

    xxxxxx

    --skip-column-names

    不在查詢結果中寫入列名。

    無需設置

    --raw

    輸出列的值時不進行轉義。

    無需設置

    Redis-cli之后的-h

    Redis的連接地址。

    redis-xxxxxxxxxxxx.com

    Redis-cli 后的-p

    Redis的端口。

    6379

    --pipe

    使用Redis的Pipeline功能進行傳輸。

    無需設置

    -a

    Redis的連接密碼。如果沒有密碼則不需設置。

    xxxxxx

    上圖中以Redis實例沒有設置密碼為例,執(zhí)行結果中的errors表示執(zhí)行過程中的錯誤數(shù),replies表示收到的回復數(shù)。如果errors為0,且replies與MySQL表中的記錄數(shù)相同,則整表遷移成功。

     

  5. 遷移完成后,一條MySQL數(shù)據(jù)對應一條Redis的Hash數(shù)據(jù)??梢赃B接Redis后用HGETALL命令查詢驗證。結果如下:

     

    [root@ecs-cmtest mysql-8.0]# redis-cli -h redis-xxxxxxxxxxxx.com -p 6379
    redis-xxxxxxxxxxxx.com:6379> HGETALL 1
    1) "name"
    2) "Wilin"
    3) " birthday"
    4) "1995-06-12"
    5) "city"
    6) "Nanjing"
    redis-xxxxxxxxxxxx.com:6379> HGETALL 4
    1) "name"
    2) "Anbei"
    3) " birthday"
    4) "1969-10-19"
    5) "city"
    6) "Dongjing"
     
    說明:

    也可以根據(jù)實際場景中需要的查詢方式調(diào)整遷移方案。例如把MySQL數(shù)據(jù)中的其他列轉換為hash中的key,把id列轉換為field。