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;
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。