分布式集群及Redis的集群

1 篇文章 0 订阅
1 篇文章 0 订阅

1.集群

将相同应用部署在不同服务器上,增强应用可用性。例如多个收银台,都是收银功能,有多个,可以解决单点故障,实现应用高可用。每个应用都是一个整体,可以单独运作。这里可以使用nginx来实现多个应用间的调度(负载均衡),可以设置轮询(一个一次),IPhash,随机分配。nginx也可主备结构,防止nginx崩溃导致服务不可用,通过keepalived实现统一使用。

2.分布式

同一应用的不同模块,比如用户模块,订单模块,商品模块,分开来部署,多个模块合起来才是一个整体。此种情况,可以将大应用进行拆分。

3.Redis集群方案

  1. Redis为什么做集群
  • redis数据存储在内存中,存储不了大量数据
  • 防止单点故障
  • 处理高并发,太多请求,一台服务器搞不定
  1. 方案一主从复制
  • 主从复制即主Redis服务可以读写,从Redis服务只可读,实现读写分离。可以解决大量频繁读的问题
  • 图示在这里插入图片描述
  • 优缺点
    • 支持主从复制,主机数据自动复制到从机,实现读写分离
    • 不具备自动容错和恢复功能,主机和从机宕机都会导致部分读写请求失败,需要机器重启或者手动切换IP才可恢复
    • 主机宕机,如果有数据未同步到从机,即使切换IP为从机,也会出现数据不一致的问题,降低了数据可用性
    • 较难支持在线扩容,集群数量达到上限时在线扩容变得很复杂
  1. 方案二哨兵模式
  • 主要功能
    监视主从服务器是否正常运行
    主服务器出现问题时,自动将从服务器提升为主服务器
  • 优点
    主从可以自动切换
    系统可用性更高
  • 缺点
    没有解决大量数据存储的问题
  1. 方案三Redis-Cluster集群
  • 多主多从的无中心结构
  • 数据分布式存储
  • 使用槽来确定数据分配在哪个主服务器上(16384分配在多个主服务器上),key根据CRC16的算法,再对16384求余,得到某个槽,放到槽所在的节点。
  • 节点互联,可以相互获取状态,当半数主节点认为某个主节点宕机了,就认为该节点宕机了。

4.集群环境搭建

  1. 修改配置文件(修改6379)
    port
    cluster-enabled yes
    cluster-config-file nodes-6379.conf
    cluster-node-timeout 15000
    appendonly yes
  2. 编写启动脚本bat(修改6379)
    title redis-6379 redis-server.exe redis.windows.conf
  • 安装Ruby rubyinstaller-2.6.3-1-x64.exe
    redis集群脚本使用Ruby编写,所以需要安装Ruby
  • 安装Redis的Ruby驱动redis-xxxx.gem
    下载地址
    下载后,解压目录执行命令行ruby setup.rb
    切换到Redis安装目录,命令行执行gem install redis
  • 启动每个节点并执行集群构建脚本
    点击之前编写的bat启动Redis服务器(6个)
    拷贝redis-trib.rb到redis节点(一个节点即可)
    执行redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384,命令中的IP端口根据实际情况进行修改
  • 测试
    启动一个redis-cli.exe,使用命令redis-cli.exe -c -h 127.0.0.1 -p 6379
    使用redis命令如:set name 小小,get name
  • Jedis使用Redis集群
		Set<HostAndPort> nodes = new HashSet<>();
        nodes.add(new HostAndPort("127.0.0.1",6379));
        nodes.add(new HostAndPort("127.0.0.1",6380));
        nodes.add(new HostAndPort("127.0.0.1",6381));
        nodes.add(new HostAndPort("127.0.0.1",6382));
        nodes.add(new HostAndPort("127.0.0.1",6383));
        nodes.add(new HostAndPort("127.0.0.1",6384));
        //创建JedisCluster集群对象,通过集群对象进行Redis操作
        JedisCluster jedisCluster = new JedisCluster(nodes);

        String name = null;
        try {
            name = jedisCluster.get("name");
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(name);

5.面试题

1)简单说一下你对分布式理解?
2)简单说一下你对集群理解?
3)说一下分布式和集群联系和区别
4)redis集群方式有哪些?
5)简单说一下redis-cluster里面槽?
槽是存放数据,存放是要通过key计算槽位,选择对应的服务器来存储,获取也是同样的算法.
默认16384个槽位要均匀分布到主节点上面
为了槽里面数据安全要对主节点进行1-N从节点备份
6)简单说一下redis-cluster里面选举投票机制
所有主节点都参与投票,默认半数以上挂点,启动容错机制,提升从节点为主节点.
7)怎么通过命令连接redis集群 -c
8)怎么通过jedis连接集群

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值