中间件之 Redis 迁移方案

3.2 环境搭建
3.2.1 安装Python框架,安装Redis插件通过cloudshell
登录ecs-redis服务器,输入以下命令安装相关插件:
升级pip
pip3 install –upgrade pip
安装web.py框架
pip3 install web.py
安装Redis框架
pip3 install Redis
3.2.2 安装源端Redis
执行以下命令获取安装包
wget http://download.Redis.io/releases/redis-5.0.5.tar.gz
解压安装包
tar -zxvf redis-5.0.5.tar.gz
进入解压文件
cd redis-5.0.5
编译安装Redis
make && make install
在当前目录下修改redis.conf
vim redis.conf
找到“bind 127.0.0.1”并将其注释
#bind 127.0.0.1
修改保护模式,不修改保护模式也是只能内网访问的“protected-mode yes”改成protected-mode no”
protected-mode no
找到“daemonize no”改为yes 后台一直运行
daemonize yes
找到“requirepass”去掉注释设置密码
requirepass 密码
进入src目录
cd src
启动Redis
./redis-server ../redis.conf
3.2.3 使用Redis获取在线用户列表的集合
1)使用touchzaixian.py创建脚本并使用vim zaixian.py编辑
touch zaixian.py
vim zaixian.py
将如下代码粘贴至zaixian.py中,使用ecs-redis1的私有ip和前面设置的密码替换代码里的host与password
#-*-coding: utf-8 -*-
import web
import time
import redis
r = redis.StrictRedis(host='192.168.xx.xx',port=6379,password='xxxxx') #Redis实例的地址密码。
""" 
配置路由规则
'/':       模拟用户的访问
'/online': 查看在线用户
"""
urls = (
    '/', 'visit',
    '/online', 'online'
)
app = web.application(urls, globals())
""" 返回当前时间对应的键名
如28分对应的键名是active.users:28
"""
def time_to_key(current_time):
    return 'active.users:' + time.strftime('%M', time.localtime(current_time))
""" 返回最近10分钟的键名
结果是列表类型
"""
def keys_in_last_10_minutes():
    now = time.time()
    result = []
    for i in range(10):
        result.append(time_to_key(now - i * 60))
    return result

class visit:
    """ 模拟用户访问
    将用户的User Agent作为用户的ID加入当前时间对应的键中
    """
    def GET(self):
        user_id = web.ctx.env['HTTP_USER_AGENT']
        current_key = time_to_key(time.time())
        pipe = r.pipeline()
        pipe.sadd(current_key, user_id)
        # 设置键的生存时间为10分钟
        pipe.expire(current_key, 10 * 60)
        pipe.execute()
        return 'User:\t' + user_id + '\r\nKey:\t' + current_key

class online:
    """ 查看当前在线的用户列表
    """
    def GET(self):
        online_users = r.sunion(keys_in_last_10_minutes())
        result = ''
        for user in online_users:
            result += 'User agent:' + user.decode() + '\r\n'
        return result
if __name__ == "__main__":
    app.run()
3.2.5 访问页面
在代码中我们建立了两个页面。首先我们打开http://ECS公网ip:8080,该页面对应visit类,每次访问该页面都会将用户的浏览器User Agent存储在记录当前分钟在线用户的键中,并将User Agent和键名显示出来,如图所示
从键名可知该次访问是在某时多少分钟的时候发生的。最后我们访问http://ECS公网ip:8080/online来查看当前在线用户列表,如图所示。
4. Redis迁移方案实验
4.1 Redis常见的迁移方案介绍
A.DCS控制台界面迁移
B.Redis-Shake迁移
4.2 DCS在线迁移方式实验
4.2.1 使用客户端连接Redis,构建源端数据
新建连接ecs-redis服务器,进入redis安装目录里的src目录执行命令:
./redis-cli -h 192.168.0.175 -a sooele
1、查询库中key数量
dbsize
2、生产数据,新建key名为aa 值为AA
set aa AA
4.2.2 创建在线迁移任务
1、登录分布式缓存服务控制台。
2、购买一台 DCS 实例
① 计费模式:按需计费
② 产品类型:基础版③ 版本号:5.0
④ 版本类型:单机其他默认即可。等待购买配置完成。
3、创建完成后,单击左侧菜单栏的“数据迁移”。页面显示迁移任务列表页面。
4、单击右上角的“创建在线迁移任务”。
5、设置迁移任务名称和描述。
6、配置在线迁移任务虚拟机资源的VPC、子网和安全组。创建在线迁移任务时,需要选择迁移虚拟机资源的VPC和安全组,并确保迁移资源能访问源Redis和目标Redis实例。
点击下一步,确认提交。
4.2.3 迁移后抽样数据验证等待迁移完成后,登录目标端Redis,输入
get aa
4.3 Redis-shake在线迁移至DCS实验
4.3.1 方案概述Redis支持单机到单机,单机到集群,集群到单机。方式如下:单机到单机:A->B,修改 sync.toml,改为如下配置:(此处仅举例)
[source]
address = “xxx.xx.xx.xxx:6379” #
password = “”
[target]
type = “standalone”
address = “xxx.xxx.xx.xxx:6379”
password = “xxxxxxxxx”
4.3.2 写入增量数据至自建Redis
进入ecs-redis2服务器中,执行以下命令连接目标端Redis:
./redis-cli -h 192.168.xx.xxx -a 密码
1、查询库中key数量
dbsize
2、生产数据,新建key名为aa 值为AA
set bb BB
3、获取key
get bb
4.3.3 配置Redis-shake1、
进入ecs-redis1服务器中执行以下命令下载Redis-shake
wget https://github.com/tair-opensource/RedisShake/releases/download/v3.1.11/redis-shake-linux-amd64.tar.gz
解压工具
tar -zxvf redis-shake-linux-amd64.tar.gz
2、编辑RedisShake配置文件。编辑Redis-shake工具配置文件Redis-shake.toml ,补充源端与目标端所有master节点的连接信息:
[source]
address = ” 192.168.16.164:6379″
password = “123456@qwer”
[target]
type = “standalone” #单机为:standalone 集群为 cluster
address = “
192.168.16.241:6379″
password = “123456@qwer”
3、在线迁移,同步数据在当前目录下使用如下命令同步源Redis集群和目标Redis集群数据:
./redis-shake-linux-amd64 redis-shake.toml
执行日志中出现如下信息,代表全量数据同步完成,进入增量同步阶段:
执行日志出现如下信息时,代表增量同步无新增内容,可手动停止同步(Ctrl + C):
4.3.4 迁移后抽样数据验证
登录目标端Redis
输入
get bb