缓存服务器Redis 07 Redis集群

redis集群

优势

采用redis集群,可以保证数据分散存储(主机-主机),同时保证数据存储的一致性(主机-从机),并且在内部实现高可用的机制,实现了服务故障的自动迁移.

搭建计划

主从--3台主/3台从(1主1从)
端口--7000/7001/7002/7003/7004/7005

集群搭建

1.准备集群文件夹:
准备集群文件夹Mkdir cluster
在cluster文件夹中分别创建7000-7005文件夹

2.复制配置文件:
将redis根目录中的redis.conf文件复制到cluster/7000/ 并以原名保存
cp redis.conf cluster/7000/

3.编辑配置文件:
1).注释本地绑定IP地址(69行)#bind 127.0.0.1
2).关闭保护模式(88行)protected-mode no
3).修改端口号(92行)port 7000
4).启动后台启动(136行)daemonize yes
5).修改pid文件(158行)
pidfile /usr/local/src/redis/cluster/7000/redis.pid
6).修改持久化文件(263行)
dir /usr/local/src/redis/cluster/7000
7).设定内存优化策略(597行)maxmemory-policy volatile-lru
8).关闭AOF模式(699行)appendonly no
9).开启集群配置(838行)cluster-enabled yes
10).开启集群配置文件(846行)cluster-config-file nodes.conf
11).修改集群超时时间(852行)cluster-node-timeout 15000

4.复制修改后的配置文件:
说明:将7000文件夹下的redis.conf文件分别复制到7001-7005中

[root@localhost cluster]# cp 7000/redis.conf 7001/
[root@localhost cluster]# cp 7000/redis.conf 7002/
[root@localhost cluster]# cp 7000/redis.conf 7003/
[root@localhost cluster]# cp 7000/redis.conf 7004/
[root@localhost cluster]# cp 7000/redis.conf 7005/

5.批量修改配置文件:
说明:分别将7001-7005文件中的7000改为对应的端口号的名称,修改时注意方向键的使用
在vim编辑器内底行模式,通过:%s/7000/7001/g命令修改
g--表示批量修改,将文件内7000都替换为7001/7002...

6.通过脚本编辑启动/关闭指令:
1).创建启动脚本 vim start.sh

#!/bin/sh
redis-server 7000/redis.conf &
redis-server 7001/redis.conf &
redis-server 7002/redis.conf &
redis-server 7003/redis.conf &
redis-server 7004/redis.conf &
redis-server 7005/redis.conf &

2).编辑关闭的脚本 vim shutdown.sh

#!/bin/sh
redis-cli -p 7000 shutdown &
redis-cli -p 7001 shutdown &
redis-cli -p 7002 shutdown &
redis-cli -p 7003 shutdown &
redis-cli -p 7004 shutdown &
redis-cli -p 7005 shutdown &

3).启动redis节点 sh start.sh
4).检查redis节点启动是否正常 ps -ef | grep redis

7.创建redis集群

redis-cli --cluster create --cluster-replicas 1 192.168.126.129:7000 192.168.126.129:7001 192.168.126.129:7002 192.168.126.129:7003 192.168.126.129:7004 192.168.126.129:7005
redis创建错误做法

前提条件: redis.conf的配置文件首先应该配置正确
步骤:
1.关闭所有的Redis服务项 sh stop.sh
2.删除nodes.conf配置文件
由于搭建集群之后,所有的集群的信息都会写入nodes.conf文件中,如果下次重启会读取其中的配置信息实现redis集群的主从的搭建. 所以如果需要重新搭建集群,则必须删除该文件重新生成.

rm -rf 700*/nodes.conf
rm -rf 700*/dump.rdb

3.重启Redis服务器之后重新搭建集群

集群工作原理说明

redis集群高可用测试

1.检查redis主机的状态 info replication
2.将主机关闭 redis-cli -p 7000 shutdown
3.检查主机是否切换
4.重启7000服务器.检查是否为7003的从机(我的项目中7003为7000的从机)

集群工作原理

原理说明:
Redis的所有节点都会保存当前redis集群中的全部主从状态信息.并且每个节点都能够相互通信.当一个节点发生宕机现象.则集群中的其他节点通过PING-PONG检测机制检查Redis节点是否宕机.当有半数以上的节点认为宕机.则认为主节点宕机.同时由Redis剩余的主节点进入选举机制.投票选举链接宕机的主节点的从机.实现故障迁移.

redis集群面试题

原则: Redis的 内存缺失(缺少主机) 则集群崩溃
1.如果3主3从(1主1从) 最少宕机几台集群崩溃?---2台
2.如果3主6从(1主2从) 最少宕机几台集群崩溃?---5台
说明: 如果没有子节点 则会借用其他主机的多余的从机

特点:
集群中如果主机宕机,那么从机可以继续提供服务,当主机中没有从机时,则向其它主机借用多余的从机(若只剩一个主机则不能借).继续提供服务.如果主机宕机时没有从机可用,则集群崩溃.

SpringBoot整合Redis

  /**
     * redis集群的入门案例
     * jedisCluster 操作整个redis集群,链接redis的所有的节点
     */
    @Test
    public void testCluster(){
        Set<HostAndPort> sets = new HashSet<>();
        sets.add(new HostAndPort("192.168.126.129", 7000));
        sets.add(new HostAndPort("192.168.126.129", 7001));
        sets.add(new HostAndPort("192.168.126.129", 7002));
        sets.add(new HostAndPort("192.168.126.129", 7003));
        sets.add(new HostAndPort("192.168.126.129", 7004));
        sets.add(new HostAndPort("192.168.126.129", 7005));
        JedisCluster jedisCluster = new JedisCluster(sets);
        jedisCluster.set("cluster", "集群测试");
        System.out.println(jedisCluster.get("cluster"));
    }
spring整合redis

1.修改pro配置文件

#配置Redis集群 redis.nodes=192.168.126.129:7000,192.168.126.129:7001,192.168.126.129:7002,192.168.126.129:7003,192.168.126.129:7004,192.168.126.129:7005

2.编辑配置类

@Configuration //标识我是一个配置类
@PropertySource("classpath:/properties/redis.properties")
public class JedisConfig {

    @Value("${redis.nodes}")
    private String nodes; //node,node,node

    @Bean //实例化集群的对象之后交给Spring容器管理
    public JedisCluster jedisCluster(){
        Set<HostAndPort> set = new HashSet<>();
        String[] nodeArray = nodes.split(",");
        for(String node : nodeArray){ //host:port
            String[] nodeTemp = node.split(":");
            String host = nodeTemp[0];
            int port = Integer.parseInt(nodeTemp[1]);
            HostAndPort hostAndPort = new HostAndPort(host, port);
            set.add(hostAndPort);
        }
        return new JedisCluster(set);
    }
  }

3.修改AOP类
注入JedisCluster类型

@Autowired
private JedisCluster jedis;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值