• 0
  • 0
分享
  • 高阶测试人员:Redis-Shake工具研究(上)——软件测试圈
  • 曼倩诙谐 2021-07-20 10:45:17 字数 9873 阅读 1365 收藏 0

  因项目组需求,需要更换一套Redis集群,为减少开发工作量,调研了一些Redis数据迁移工具,后决定使用Redis-Shake进行集群数据迁移,前期进行了一些测试。

  本文主要包括两部分内容:

  ·Redis集群搭建和模拟数据初始化:为了模拟生产环境的新旧两套Redis集群,首先在本机上进行环境的搭建,并准备迁移所需要的测试数据。

  ·Redis-Shake测试:测试利用Redis-Shake进行数据迁移。

  Redis集群搭建

  在本部分,首先搭建一套3主3备的集群作为源集群,然后搭建一套5主5备的集群作为目标集群。为了简便起见,我们采用Docker来简化部署。

  配置文件准备

  首先,准备配置文件:

port ${PORT} 
protected-mode no 
cluster-enabled yes 
cluster-config-file nodes.conf 
cluster-node-timeout 5000 
cluster-announce-ip 172.25.253.0
cluster-announce-port ${PORT} 
cluster-announce-bus-port 1${PORT} 
appendonly yes
requirepass 123456
masterauth 123456

  其中,port是Redis运行的端口,关闭protected-mode使得集群可以通信而不用配置bind,并配置集群的相关信息。

  其中announce-port是命令端口,announce-bus-port是集群桥接端口,其余配置包括开权aof和集群密码,此处为了演示,使用简单密码。

  此外,文件中的${PORT}是占位符,随后使用envsubst进行替换,以达到避免重复复制粘贴配置文件的效果。

  接下来,我们准备脚本,为每个Redis节点生成一个文件夹,结构如下,其中conf保存配置文件,data保存数据文件:

├─7000
│  ├─conf
│  └─data
#!/bin/zsh
for port in {7000..7005}
do
    if [ ! -d "./${port}/conf" ]; then
    mkdir -p ./${port}/conf
    fi
    PORT=${port} envsubst < ./redis-conf.template > ./${port}/conf/redis.conf
    if [ ! -d "./${port}/data" ]; then
        mkdir -p ./${port}/data
    fi
done

  如上,7000-7005六个端口留作部署3主3备的源Redis集群,8000-8009十个端口留作部署5主5备的目的Redis集群。

  准备好每个节点的文件夹后,需要启动Redis节点。此处,借助于docker-compose简化部署。

  利用docker简化部署并构建集群

  首先,准备源集群的docker-compose文件,如下:

version: "3.4"
x-image:
  &default-image
  redis:5.0.12
x-restart:
  &default-restart
  always
x-command:
  &default-command
  redis-server /etc/redis/redis.conf
services:
  redis1-3:
    image: *default-image
    restart: *default-restart
    container_name: redis3-m1
    command: *default-command
    volumes:
      - ./7000/data:/data
      - ./7000/conf/redis.conf:/etc/redis/redis.conf
    ports:
      - 7000:7000
      - 17000:17000
    networks:
      - redisNet
  
  redis2-3:
    image: *default-image
    restart: *default-restart
    container_name: redis3-m2
    command: *default-command
    volumes:
      - ./7001/data:/data
      - ./7001/conf/redis.conf:/etc/redis/redis.conf
    ports:
      - 7001:7001
      - 17001:17001
    networks:
      - redisNet
  
  redis3-3:
    image: *default-image
    restart: *default-restart
    container_name: redis3-m3
    command: *default-command
    volumes:
      - ./7002/data:/data
      - ./7002/conf/redis.conf:/etc/redis/redis.conf
    ports:
      - 7002:7002
      - 17002:17002
    networks:
      - redisNet
  redis4-3:
    image: *default-image
    restart: *default-restart
    container_name: redis3-s1
    command: *default-command
    volumes:
      - ./7003/data:/data
      - ./7003/conf/redis.conf:/etc/redis/redis.conf
    ports:
      - 7003:7003
      - 17003:17003
    networks:
      - redisNet
  redis5-3:
    image: *default-image
    restart: *default-restart
    container_name: redis3-s2
    command: *default-command
    volumes:
      - ./7004/data:/data
      - ./7004/conf/redis.conf:/etc/redis/redis.conf
    ports:
      - 7004:7004
      - 17004:17004
    networks:
      - redisNet
    
  redis6-3:
    image: *default-image
    restart: *default-restart
    container_name: redis3-s3
    command: *default-command
    volumes:
      - ./7005/data:/data
      - ./7005/conf/redis.conf:/etc/redis/redis.conf
    ports:
      - 7005:7005
      - 17005:17005
    networks:
      - redisNet
networks:
  redisNet:

  其中,源集群共启动了6个Redis实例,占据7000-7005六个端口,每个实例的配置和数据文件夹都挂载到对应端口下的对应文件夹中。

1.png

  如下,编辑好docker-compose文件后,可以启动源Redis集群所对应的6个Redis实例。

  启动了相关的实例后,进入某个容器,进行集群构建。

  5.0.12版本已经支持使用redis-cli创建集群,只需要将待构建集群的Redis实例全部作为参数传递,如下所示。

  可以看出,首先进行了slot分配,接下来,分配主从节点,并为每个slave匹配相应的master,然后是集群的构建,检查后:

/mnt/c/Users/wangy/redis-cluster ? docker exec -it redis3-m1 /bin/bash
root@b7a3d4d2261d:/data# redis-cli --cluster create 172.25.253.0:7000 172.25.253.0:7001 172.25.253.0:7002 172.25.253.0:7003 172.25.253.0:7004 172.25.253.0:7005 --cluster-replicas 1 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 172.25.253.0:7004 to 172.25.253.0:7000
Adding replica 172.25.253.0:7005 to 172.25.253.0:7001
Adding replica 172.25.253.0:7003 to 172.25.253.0:7002
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 9ac43c00a5a0efd5e35d6019673881e1794a9159 172.25.253.0:7000
   slots:[0-5460] (5461 slots) master
M: c9170bddeb0da122efe7b1d36528ad3940341477 172.25.253.0:7001
   slots:[5461-10922] (5462 slots) master
M: 5bd620cedffe15bf58f2ad86fb5ab4274671e92c 172.25.253.0:7002
   slots:[10923-16383] (5461 slots) master
S: 50bd4229fe1d93a7d5fa9ed79ba5a7c8d12ad991 172.25.253.0:7003
   replicates 5bd620cedffe15bf58f2ad86fb5ab4274671e92c
S: 54e45d4f5047d26bdd52b7e9312f8e60a4c3872b 172.25.253.0:7004
   replicates 9ac43c00a5a0efd5e35d6019673881e1794a9159
S: 08fabb337b6a1393788749c904dd15071c29a692 172.25.253.0:7005
   replicates c9170bddeb0da122efe7b1d36528ad3940341477
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
..
>>> Performing Cluster Check (using node 172.25.253.0:7000)
M: 9ac43c00a5a0efd5e35d6019673881e1794a9159 172.25.253.0:7000
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 54e45d4f5047d26bdd52b7e9312f8e60a4c3872b 172.25.253.0:7004
   slots: (0 slots) slave
   replicates 9ac43c00a5a0efd5e35d6019673881e1794a9159
M: 5bd620cedffe15bf58f2ad86fb5ab4274671e92c 172.25.253.0:7002
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: c9170bddeb0da122efe7b1d36528ad3940341477 172.25.253.0:7001
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 50bd4229fe1d93a7d5fa9ed79ba5a7c8d12ad991 172.25.253.0:7003
   slots: (0 slots) slave
   replicates 5bd620cedffe15bf58f2ad86fb5ab4274671e92c
S: 08fabb337b6a1393788749c904dd15071c29a692 172.25.253.0:7005
   slots: (0 slots) slave
   replicates c9170bddeb0da122efe7b1d36528ad3940341477
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

  同时,还可以连接到集群,使用cluster info查看集群状态:

root@b7a3d4d2261d:/data# redis-cli -p 7000 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:7000> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:350
cluster_stats_messages_pong_sent:348
cluster_stats_messages_sent:698
cluster_stats_messages_ping_received:343
cluster_stats_messages_pong_received:350
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:698

  同理,我们准备一份搭建目的集群的docker-compose文件:

version: "3.4"
x-image:
  &default-image
  redis:5.0.12
x-restart:
  &default-restart
  always
x-command:
  &default-command
  redis-server /etc/redis/redis.conf
services:
  redis1-5:
    image: *default-image
    restart: *default-restart
    container_name: redis5-m1
    command: *default-command
    volumes:
      - ./8000/data:/data
      - ./8000/conf/redis.conf:/etc/redis/redis.conf
    ports:
      - 8000:8000
      - 18000:18000
    networks:
      - redisNet
  
  redis2-5:
    image: *default-image
    restart: *default-restart
    container_name: redis5-m2
    command: *default-command
    volumes:
      - ./8001/data:/data
      - ./8001/conf/redis.conf:/etc/redis/redis.conf
    ports:
      - 8001:8001
      - 18001:18001
    networks:
      - redisNet
  
  redis3-5:
    image: *default-image
    restart: *default-restart
    container_name: redis5-m3
    command: *default-command
    volumes:
      - ./8002/data:/data
      - ./8002/conf/redis.conf:/etc/redis/redis.conf
    ports:
      - 8002:8002
      - 18002:18002
    networks:
      - redisNet
  redis4-5:
    image: *default-image
    restart: *default-restart
    container_name: redis5-m4
    command: *default-command
    volumes:
      - ./8003/data:/data
      - ./8003/conf/redis.conf:/etc/redis/redis.conf
    ports:
      - 8003:8003
      - 18003:18003
    networks:
      - redisNet
  redis5-5:
    image: *default-image
    restart: *default-restart
    container_name: redis5-m5
    command: *default-command
    volumes:
      - ./8004/data:/data
      - ./8004/conf/redis.conf:/etc/redis/redis.conf
    ports:
      - 8004:8004
      - 18004:18004
    networks:
      - redisNet
    
  redis6-5:
    image: *default-image
    restart: *default-restart
    container_name: redis5-s1
    command: *default-command
    volumes:
      - ./8005/data:/data
      - ./8005/conf/redis.conf:/etc/redis/redis.conf
    ports:
      - 8005:8005
      - 18005:18005
    networks:
      - redisNet
  redis7-5:
    image: *default-image
    restart: *default-restart
    container_name: redis5-s2
    command: *default-command
    volumes:
      - ./8006/data:/data
      - ./8006/conf/redis.conf:/etc/redis/redis.conf
    ports:
      - 8006:8006
      - 18006:18006
    networks:
      - redisNet
  redis8-5:
    image: *default-image
    restart: *default-restart
    container_name: redis5-s3
    command: *default-command
    volumes:
      - ./8007/data:/data
      - ./8007/conf/redis.conf:/etc/redis/redis.conf
    ports:
      - 8007:8007
      - 18007:18007
    networks:
      - redisNet
  redis9-5:
    image: *default-image
    restart: *default-restart
    container_name: redis5-s4
    command: *default-command
    volumes:
      - ./8008/data:/data
      - ./8008/conf/redis.conf:/etc/redis/redis.conf
    ports:
      - 8008:8008
      - 18008:18008
    networks:
      - redisNet
  redis10-5:
    image: *default-image
    restart: *default-restart
    container_name: redis5-s5
    command: *default-command
    volumes:
      - ./8009/data:/data
      - ./8009/conf/redis.conf:/etc/redis/redis.conf
    ports:
      - 8009:8009
      - 18009:18009
    networks:
      - redisNet
networks:
  redisNet:



作者:王译锌   

来源:51Testing软件测试网原创

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 快速迭代测试中经常遇到这种场景:假设今天17号周三,接到测试任务26号(周五)必须发布现场,22号(周一)给版本,能测试完成么?下周一:研发延期,周三才能给出,能测试完成么,周五必须发布现场........思路:测试这些功能+环境的工作量测试预估多少,现在可以安排几个人,根据人员、时间确定测试那些测试以及测试颗粒度。版本发布现象需要哪些测试:1、每个(dev--->test--->stage--->prod)环境冒烟测试—各2H;2、Bug验证,根据Bug数量、复现难易程度来确定;3、每个环境测试,详细测试(安装部署+功能详细测试+异常+专项等)预计两周;4、上版本服务器(必...
            1 2 3656
            分享
          •   第一部分:复用思想概述  在工作中,你有没有过这种感觉 ,某个功能用例之前设计过或者类似的工作之前干过。  再次干还需要重新设计,所以感觉有一种浪费时间或者没有意义的感觉。  本文希望提供一种策略和原则,指出测试工作的中的‘道’,让我们找到工作中的解决方案即‘复用思想’,那么何为复用?  复用是一种软件开发原则,它鼓励使用现有的资源来构建新的软件系统或其组件。这种思想基于一个简单的观察:许多软件问题和需求在不同的项目和上下文中是相似的,因此可以利用已有的解决方案,而不是从头开始。  比如深入现代软件开发中,库和框架的广泛使用是复用思想的一个明显例子,如Java的Spring框架或Pytho...
            0 0 879
            分享
          • 环境首先环境是非常重要的,需要尽可能跟生产环境靠近。比方说,使用同样的nginx版本,php的话需要启用fpm,zend-optimizer等等,参数配置也最好跟生产环境保持一致。当然,php的版本更加需要保持一致,不能说线上是跑5.3,而测试环境却是php 7;除非是要测试不同php版本的性能。网络也需要注意,测试机跟服务器之间是什么网络连接?100M还是千兆的网线?也同样需要跟生产环境尽可能保持一致。我曾经看过有人直接在自己的笔记本上跑压测的客户端,然后笔记本使用的wifi;这直接就变成是在测试wifi的性能了。当然,也可以考虑直接在服务器本机上面跑压测程序,这样就可以规避掉网络层的,更有...
            0 0 875
            分享
          • 前言:本篇讲堂是紧接【安全测试工具-进阶篇[密码重置和安全密码]】的内容。例牌,先说下安全测试工具的更新情况【工具地址:https://gitee.com/samllpig/SafeTool-51testing】服务平台,HTTP服务增加XXE外部实体引用集成平台,增加嗅探器插件POC平台,增加经典XXE和盲注XXE的POC脚本正文:漏洞讲解:所属模块: (A3) Sensitive Data Exposure [敏感信息泄露]4.1 菜单项: Insecure Login [登录信息泄露],本章共2个小节4.1.1 第一节主题:为什么需要对敏感数据进行加密?内容:在本课程...
            0 0 72
            分享
          • 一、判断题软件测试就是为了验证软件功能实现的是否正确,是否完成既定目标的活动,所以软件测试在软件工程的后期才开始具体的工作。(×)发现错误多的模块,残留在模块中的错误也多。(√)测试人员在测试过程中发现一处问题,如果问题影响不大,而自己又可以修改,应立即将此问题正确修改,以加快、提高开发的进程。(×)单元测试通常应该先进行“人工走查”,再以白盒法为主,辅以黑盒法进行动态测试。(√)功能测试是系统测试的主要内容,检查系统的功能、性能是否与需求规格说明相同。(√)软件质量管理即QM由QA和QC构成,软件测试属于QC的核心工作内容。(√)软件测试只能发现错误,但不能保证测试后的软件没有错误。(√)软...
            11 11 1121
            分享
      • 51testing软件测试圈微信