方案概述
應用場景
隨著互聯(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
- 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ā)工具和客戶端僅為示例,您可以選擇其它類型的工具和客戶端。
實施步驟
- 登錄MySQL數(shù)據(jù)庫所在服務器。
- 在MySQL數(shù)據(jù)庫所在服務器安裝Redis客戶端用來進行數(shù)據(jù)的提取、傳輸和轉換。安裝Redis客戶端請參考安裝Redis客戶端。
- 分析源端數(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
- 在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ù)相同,則整表遷移成功。
- 遷移完成后,一條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。