• Redis -- 分片集群


     因为每个master之间都会检测彼此的健康状态,并且客户端请求可以访问集群的任意节点,自动路由到正确的节点上,并且默认是读写分离的,写在master上,读在slaver上,则作用和哨兵模式一样,则分片集群时就不设置哨兵模式。

    搭建分表集群

     

    1.创建目录

     创建出7001,7002,7003,8001,8002,8003

    1. cd /tmp
    2. rm -rf 7001 7002 7003 8001 8002 8003
    3. mkdir 7001 7002 7003 8001 8002 8003

    2.Redis 配置文件

    1. port 6379
    2. #开启集群功能
    3. cluster-enable yes
    4. #集群的配置文件名称,不需要我们创建,由redis自己维护
    5. cluster-config-file /tmp/6379/nodes.conf
    6. #节点心跳失败的超时时间
    7. cluster-node-timeout 5000
    8. #持久化文件存放的目录
    9. dir /tmp/6379
    10. #绑定地址
    11. bind 0.0.0.0
    12. #让redis后台运行
    13. daemonize yes
    14. #注册的实例ip
    15. replic-announce-ip 192.168.99.100
    16. #保护模式
    17. protected-mode no
    18. #数据库数量1
    19. databases 1
    20. #日志
    21. logfile /tmp/6379/run.log

    拷贝文件到每个目录

    1. cd /tmp
    2. echo 7001 7002 7003 8001 8002 8003 |xargs -t -n 1 cp redis.conf

    修改每个目录下的redis.conf。将其中的6379修改为与所在目录一致

    1. cd /tmp
    2. printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t sed -i 's/6379/{}/g' {}/redis.conf

     

     

    3.启动Redis

    1. cd /tmp
    2. printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-server {}/redis.conf

     4.创建集群

    虽然服务启动了,但是目前每个服务之间都是独立的,没有任何关联。

    需要Redis 5.0以后的版本

    redis-cli --cluster create --cluster-replicas 1 192.168.99.100:7001 192.168.99.100:7002 192.168.99.100:7003 192.168.99.100:8001 192.168.99.100:8002 192.168.99.100:8003

     命令说明:

    redis-cli --cluster :代表集群操作命令

    create: 代表创建集群

    --replicas 1 或者 --cluster-replicas 1 : 指定集群中每个master的副本个数为1,此时 节点总数 ÷ (replicas + 1) 得到的就是master的数量。因此节点数列表中的前n个就是master,其他节点都是slaver节点,随机分配到不同的master

     5.查看集群状态

    redis-cli -p 7001 cluster nodes

     散列插槽

     

     Note:集群时在使用redis-cli登录时要带上-c参数表示为集群模式

    redis-cli -c -p 7001

     总结

     

     集群伸缩

     

     难点:怎么让num存储到7004上,因为之前num计算出的插槽在7001上 

     实现

    1.配置文件 - 启动

    1. cd /tmp
    2. mkdir 7004
    3. cp redis.conf 7004
    4. sed -i s/6379/7004/g 7004/redis.conf
    5. redis-server 7004/redis.conf

    2.增加节点

    redis-cli --cluster add-node 192.168.99.100:7004  192.168.99.100:7001

    查看节点信息:

    根据add-node指令在不设置参数的情况下,新增的节点默认是master节点

    查看集群信息

    但是发现7004没有分配任何的插槽 

     3.分配插槽

    redis-cli --cluster reshard 192.168.99.100:7001

    根据上面get num已经知道num的插槽值为2765

     当输入done后,则会将插槽1-2999,从7001 转移到 7004

     

     当转移完毕后再查看节点信息

      故障转移

    已删除了7004节点,当前集群信息如下:

    1. #可以通过watch的方式一直监控集群信息
    2. watch redis-cli -p 7001 cluster nodes

    在另一个窗口执行删除节点的操作,让7002节点宕机

     可以发现7002的状态变成disconnected,fail、并且8003节点变成了master节点

     此刻让7002再次启动

    redis-server 7002/redis.conf
    

     

    可以发现7002的状态已经变成connected,并且是slave节点,则8003依然是master节点,7002成为8003的slave节点。则分片集群已经实现了哨兵模式提供的功能。 

     

     以上是自动的故障转移,就是当服务器发生故障时Redis自动给我们完成,那如果当我们主动想替换一台master节点呢? -- 手动故障转移 -- 数据迁移

     

     手动故障转移 -- 数据转移

    cluster failover

    执行指令后,7002变成master节点,8003成为7002的slave节点

     RedisTemplate访问分片集群

     

    1. #配置分片集群
    2. spring:
    3. redis:
    4. cluster:
    5. nodes: #配置分片集群的每一个节点信息
    6. - 192.168.99.100:7001
    7. - 192.168.99.100:7002
    8. - 192.168.99.100:7003
    9. - 192.168.99.100:8001
    10. - 192.168.99.100:8002
    11. - 192.168.99.100:8003
    1. @Autowired
    2. private StringRedisTemplate stringRedisTemplate;
    3. @Test
    4. void testString() {
    5. //写操作将交给主节点
    6. stringRedisTemplate.opsForValue().set("name", "李四");
    7. //读操作交给从节点
    8. String value = stringRedisTemplate.opsForValue().get("name");
    9. System.out.println(value);
    10. }

    Note:分片集群,默认就是读写分离的,写在master上,读在slaver上。并且根据key计算插槽值的不同会自动切换与插槽值与之对应的服务器。

  • 相关阅读:
    APT 组织 Kimsuky 瞄准大学研究人员
    C++11的一些新特性|线程库|包装器|lambda表达式
    逆向第一课---安装ADB工具,并使用夜神模拟器连接
    微服务架构 | 服务稳定性治理
    【云原生】Kubernetes----RBAC用户资源权限
    LeetCode 6. Z 字形变换 找规律
    Unity3D智慧交通AI插件Urban Traffic System ,大量人物和车辆模型。
    AI基础设施Grass零撸空投,最新融资350万美元!
    Jenkins实战中的一些技巧
    博客无限滚动加载(html、css、js)实现
  • 原文地址:https://blog.csdn.net/qq_33753147/article/details/126545002