51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 3342|回复: 0
打印 上一主题 下一主题

[原创] 高阶测试人员:Redis-Shake工具研究(上)

[复制链接]
  • TA的每日心情
    擦汗
    昨天 08:46
  • 签到天数: 981 天

    连续签到: 1 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2021-7-5 09:39:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    因项目组需求,需要更换一套Redis集群,为减少开发工作量,调研了一些Redis数据迁移工具,后决定使用Redis-Shake进行集群数据迁移,前期进行了一些测试。
      本文主要包括两部分内容:
      ·Redis集群搭建和模拟数据初始化:为了模拟生产环境的新旧两套Redis集群,首先在本机上进行环境的搭建,并准备迁移所需要的测试数据。
      ·Redis-Shake测试:测试利用Redis-Shake进行数据迁移。

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

      配置文件准备
      首先,准备配置文件:
    1. port ${PORT}
    2. protected-mode no
    3. cluster-enabled yes
    4. cluster-config-file nodes.conf
    5. cluster-node-timeout 5000
    6. cluster-announce-ip 172.25.253.0
    7. cluster-announce-port ${PORT}
    8. cluster-announce-bus-port 1${PORT}
    9. appendonly yes
    10. requirepass 123456
    11. masterauth 123456
    复制代码
    其中,port是Redis运行的端口,关闭protected-mode使得集群可以通信而不用配置bind,并配置集群的相关信息。
      其中announce-port是命令端口,announce-bus-port是集群桥接端口,其余配置包括开权aof和集群密码,此处为了演示,使用简单密码。
      此外,文件中的${PORT}是占位符,随后使用envsubst进行替换,以达到避免重复复制粘贴配置文件的效果。
      接下来,我们准备脚本,为每个Redis节点生成一个文件夹,结构如下,其中conf保存配置文件,data保存数据文件:
    1. ├─7000
    2. │  ├─conf
    3. │  └─data
    4. #!/bin/zsh
    5. for port in {7000..7005}
    6. do
    7.     if [ ! -d "./${port}/conf" ]; then
    8.     mkdir -p ./${port}/conf
    9.     fi
    10.     PORT=${port} envsubst < ./redis-conf.template > ./${port}/conf/redis.conf
    11.     if [ ! -d "./${port}/data" ]; then
    12.         mkdir -p ./${port}/data
    13.     fi
    14. done
    复制代码
    如上,7000-7005六个端口留作部署3主3备的源Redis集群,8000-8009十个端口留作部署5主5备的目的Redis集群。
      准备好每个节点的文件夹后,需要启动Redis节点。此处,借助于docker-compose简化部署。

      利用docker简化部署并构建集群
      首先,准备源集群的docker-compose文件,如下:
    1. version: "3.4"

    2. x-image:
    3.   &default-image
    4.   redis:5.0.12
    5. x-restart:
    6.   &default-restart
    7.   always
    8. x-command:
    9.   &default-command
    10.   redis-server /etc/redis/redis.conf

    11. services:
    12.   redis1-3:
    13.     image: *default-image
    14.     restart: *default-restart
    15.     container_name: redis3-m1
    16.     command: *default-command
    17.     volumes:
    18.       - ./7000/data:/data
    19.       - ./7000/conf/redis.conf:/etc/redis/redis.conf
    20.     ports:
    21.       - 7000:7000
    22.       - 17000:17000
    23.     networks:
    24.       - redisNet
    25.   
    26.   redis2-3:
    27.     image: *default-image
    28.     restart: *default-restart
    29.     container_name: redis3-m2
    30.     command: *default-command
    31.     volumes:
    32.       - ./7001/data:/data
    33.       - ./7001/conf/redis.conf:/etc/redis/redis.conf
    34.     ports:
    35.       - 7001:7001
    36.       - 17001:17001
    37.     networks:
    38.       - redisNet
    39.   
    40.   redis3-3:
    41.     image: *default-image
    42.     restart: *default-restart
    43.     container_name: redis3-m3
    44.     command: *default-command
    45.     volumes:
    46.       - ./7002/data:/data
    47.       - ./7002/conf/redis.conf:/etc/redis/redis.conf
    48.     ports:
    49.       - 7002:7002
    50.       - 17002:17002
    51.     networks:
    52.       - redisNet

    53.   redis4-3:
    54.     image: *default-image
    55.     restart: *default-restart
    56.     container_name: redis3-s1
    57.     command: *default-command
    58.     volumes:
    59.       - ./7003/data:/data
    60.       - ./7003/conf/redis.conf:/etc/redis/redis.conf
    61.     ports:
    62.       - 7003:7003
    63.       - 17003:17003
    64.     networks:
    65.       - redisNet

    66.   redis5-3:
    67.     image: *default-image
    68.     restart: *default-restart
    69.     container_name: redis3-s2
    70.     command: *default-command
    71.     volumes:
    72.       - ./7004/data:/data
    73.       - ./7004/conf/redis.conf:/etc/redis/redis.conf
    74.     ports:
    75.       - 7004:7004
    76.       - 17004:17004
    77.     networks:
    78.       - redisNet
    79.    
    80.   redis6-3:
    81.     image: *default-image
    82.     restart: *default-restart
    83.     container_name: redis3-s3
    84.     command: *default-command
    85.     volumes:
    86.       - ./7005/data:/data
    87.       - ./7005/conf/redis.conf:/etc/redis/redis.conf
    88.     ports:
    89.       - 7005:7005
    90.       - 17005:17005
    91.     networks:
    92.       - redisNet

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


      如下,编辑好docker-compose文件后,可以启动源Redis集群所对应的6个Redis实例。
      启动了相关的实例后,进入某个容器,进行集群构建。
      5.0.12版本已经支持使用redis-cli创建集群,只需要将待构建集群的Redis实例全部作为参数传递,如下所示。
      可以看出,首先进行了slot分配,接下来,分配主从节点,并为每个slave匹配相应的master,然后是集群的构建,检查后:
    1. /mnt/c/Users/wangy/redis-cluster ? docker exec -it redis3-m1 /bin/bash
    2. 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
    3. Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
    4. >>> Performing hash slots allocation on 6 nodes...
    5. Master[0] -> Slots 0 - 5460
    6. Master[1] -> Slots 5461 - 10922
    7. Master[2] -> Slots 10923 - 16383
    8. Adding replica 172.25.253.0:7004 to 172.25.253.0:7000
    9. Adding replica 172.25.253.0:7005 to 172.25.253.0:7001
    10. Adding replica 172.25.253.0:7003 to 172.25.253.0:7002
    11. >>> Trying to optimize slaves allocation for anti-affinity
    12. [WARNING] Some slaves are in the same host as their master
    13. M: 9ac43c00a5a0efd5e35d6019673881e1794a9159 172.25.253.0:7000
    14.    slots:[0-5460] (5461 slots) master
    15. M: c9170bddeb0da122efe7b1d36528ad3940341477 172.25.253.0:7001
    16.    slots:[5461-10922] (5462 slots) master
    17. M: 5bd620cedffe15bf58f2ad86fb5ab4274671e92c 172.25.253.0:7002
    18.    slots:[10923-16383] (5461 slots) master
    19. S: 50bd4229fe1d93a7d5fa9ed79ba5a7c8d12ad991 172.25.253.0:7003
    20.    replicates 5bd620cedffe15bf58f2ad86fb5ab4274671e92c
    21. S: 54e45d4f5047d26bdd52b7e9312f8e60a4c3872b 172.25.253.0:7004
    22.    replicates 9ac43c00a5a0efd5e35d6019673881e1794a9159
    23. S: 08fabb337b6a1393788749c904dd15071c29a692 172.25.253.0:7005
    24.    replicates c9170bddeb0da122efe7b1d36528ad3940341477
    25. Can I set the above configuration? (type 'yes' to accept): yes
    26. >>> Nodes configuration updated
    27. >>> Assign a different config epoch to each node
    28. >>> Sending CLUSTER MEET messages to join the cluster
    29. Waiting for the cluster to join
    30. ..
    31. >>> Performing Cluster Check (using node 172.25.253.0:7000)
    32. M: 9ac43c00a5a0efd5e35d6019673881e1794a9159 172.25.253.0:7000
    33.    slots:[0-5460] (5461 slots) master
    34.    1 additional replica(s)
    35. S: 54e45d4f5047d26bdd52b7e9312f8e60a4c3872b 172.25.253.0:7004
    36.    slots: (0 slots) slave
    37.    replicates 9ac43c00a5a0efd5e35d6019673881e1794a9159
    38. M: 5bd620cedffe15bf58f2ad86fb5ab4274671e92c 172.25.253.0:7002
    39.    slots:[10923-16383] (5461 slots) master
    40.    1 additional replica(s)
    41. M: c9170bddeb0da122efe7b1d36528ad3940341477 172.25.253.0:7001
    42.    slots:[5461-10922] (5462 slots) master
    43.    1 additional replica(s)
    44. S: 50bd4229fe1d93a7d5fa9ed79ba5a7c8d12ad991 172.25.253.0:7003
    45.    slots: (0 slots) slave
    46.    replicates 5bd620cedffe15bf58f2ad86fb5ab4274671e92c
    47. S: 08fabb337b6a1393788749c904dd15071c29a692 172.25.253.0:7005
    48.    slots: (0 slots) slave
    49.    replicates c9170bddeb0da122efe7b1d36528ad3940341477
    50. [OK] All nodes agree about slots configuration.
    51. >>> Check for open slots...
    52. >>> Check slots coverage...
    53. [OK] All 16384 slots covered.
    复制代码
    同时,还可以连接到集群,使用cluster info查看集群状态:
    1. root@b7a3d4d2261d:/data# redis-cli -p 7000 -a 123456
    2. Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
    3. 127.0.0.1:7000> cluster info
    4. cluster_state:ok
    5. cluster_slots_assigned:16384
    6. cluster_slots_ok:16384
    7. cluster_slots_pfail:0
    8. cluster_slots_fail:0
    9. cluster_known_nodes:6
    10. cluster_size:3
    11. cluster_current_epoch:6
    12. cluster_my_epoch:1
    13. cluster_stats_messages_ping_sent:350
    14. cluster_stats_messages_pong_sent:348
    15. cluster_stats_messages_sent:698
    16. cluster_stats_messages_ping_received:343
    17. cluster_stats_messages_pong_received:350
    18. cluster_stats_messages_meet_received:5
    19. cluster_stats_messages_received:698
    复制代码

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

    2. x-image:
    3.   &default-image
    4.   redis:5.0.12
    5. x-restart:
    6.   &default-restart
    7.   always
    8. x-command:
    9.   &default-command
    10.   redis-server /etc/redis/redis.conf

    11. services:
    12.   redis1-5:
    13.     image: *default-image
    14.     restart: *default-restart
    15.     container_name: redis5-m1
    16.     command: *default-command
    17.     volumes:
    18.       - ./8000/data:/data
    19.       - ./8000/conf/redis.conf:/etc/redis/redis.conf
    20.     ports:
    21.       - 8000:8000
    22.       - 18000:18000
    23.     networks:
    24.       - redisNet
    25.   
    26.   redis2-5:
    27.     image: *default-image
    28.     restart: *default-restart
    29.     container_name: redis5-m2
    30.     command: *default-command
    31.     volumes:
    32.       - ./8001/data:/data
    33.       - ./8001/conf/redis.conf:/etc/redis/redis.conf
    34.     ports:
    35.       - 8001:8001
    36.       - 18001:18001
    37.     networks:
    38.       - redisNet
    39.   
    40.   redis3-5:
    41.     image: *default-image
    42.     restart: *default-restart
    43.     container_name: redis5-m3
    44.     command: *default-command
    45.     volumes:
    46.       - ./8002/data:/data
    47.       - ./8002/conf/redis.conf:/etc/redis/redis.conf
    48.     ports:
    49.       - 8002:8002
    50.       - 18002:18002
    51.     networks:
    52.       - redisNet

    53.   redis4-5:
    54.     image: *default-image
    55.     restart: *default-restart
    56.     container_name: redis5-m4
    57.     command: *default-command
    58.     volumes:
    59.       - ./8003/data:/data
    60.       - ./8003/conf/redis.conf:/etc/redis/redis.conf
    61.     ports:
    62.       - 8003:8003
    63.       - 18003:18003
    64.     networks:
    65.       - redisNet

    66.   redis5-5:
    67.     image: *default-image
    68.     restart: *default-restart
    69.     container_name: redis5-m5
    70.     command: *default-command
    71.     volumes:
    72.       - ./8004/data:/data
    73.       - ./8004/conf/redis.conf:/etc/redis/redis.conf
    74.     ports:
    75.       - 8004:8004
    76.       - 18004:18004
    77.     networks:
    78.       - redisNet
    79.    
    80.   redis6-5:
    81.     image: *default-image
    82.     restart: *default-restart
    83.     container_name: redis5-s1
    84.     command: *default-command
    85.     volumes:
    86.       - ./8005/data:/data
    87.       - ./8005/conf/redis.conf:/etc/redis/redis.conf
    88.     ports:
    89.       - 8005:8005
    90.       - 18005:18005
    91.     networks:
    92.       - redisNet

    93.   redis7-5:
    94.     image: *default-image
    95.     restart: *default-restart
    96.     container_name: redis5-s2
    97.     command: *default-command
    98.     volumes:
    99.       - ./8006/data:/data
    100.       - ./8006/conf/redis.conf:/etc/redis/redis.conf
    101.     ports:
    102.       - 8006:8006
    103.       - 18006:18006
    104.     networks:
    105.       - redisNet

    106.   redis8-5:
    107.     image: *default-image
    108.     restart: *default-restart
    109.     container_name: redis5-s3
    110.     command: *default-command
    111.     volumes:
    112.       - ./8007/data:/data
    113.       - ./8007/conf/redis.conf:/etc/redis/redis.conf
    114.     ports:
    115.       - 8007:8007
    116.       - 18007:18007
    117.     networks:
    118.       - redisNet

    119.   redis9-5:
    120.     image: *default-image
    121.     restart: *default-restart
    122.     container_name: redis5-s4
    123.     command: *default-command
    124.     volumes:
    125.       - ./8008/data:/data
    126.       - ./8008/conf/redis.conf:/etc/redis/redis.conf
    127.     ports:
    128.       - 8008:8008
    129.       - 18008:18008
    130.     networks:
    131.       - redisNet

    132.   redis10-5:
    133.     image: *default-image
    134.     restart: *default-restart
    135.     container_name: redis5-s5
    136.     command: *default-command
    137.     volumes:
    138.       - ./8009/data:/data
    139.       - ./8009/conf/redis.conf:/etc/redis/redis.conf
    140.     ports:
    141.       - 8009:8009
    142.       - 18009:18009
    143.     networks:
    144.       - redisNet

    145. networks:
    146.   redisNet:
    复制代码





    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-7-9 07:44 , Processed in 0.065867 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表