Redis集群
1 为什么要搭建集群
通常,为了提高网站响应速度,总是把热点数据保存在内存中而不是直接从后端数据库中读取。
Redis是一个很好的Cache工具。大型网站应用,热点数据量往往巨大,几十G上百G是很正常的事儿。
由于内存大小的限制,使用一台 Redis 实例显然无法满足需求,这时就需要使用多台 Redis作为缓存数据库。但是如何保证数据存储的一致性呢,这时就需要搭建redis集群.采用合理的机制,保证用户的正常的访问需求.
采用redis集群,可以保证数据分散存储,同时保证数据存储的一致性.并且在内部实现高可用的机制.实现了服务故障的自动迁移.
2 集群搭建计划
-
主从划分:
3台主机 3台从机共6台 端口划分7000-7005 -
准备集群文件夹cluster
cd /usr/local/src/redis5.5
mkdir cluster
- 在cluster文件夹中分别创建7000-7005文件夹
cd /usr/local/src/redis5.5/cluster
mkdir 7000 7001 7002 7003 7004 7005
- 将redis根目录中的redis.conf文件复制到cluster/7000/ 并以原名保存
cd cd /usr/local/src/redis5.5
cp redis.conf cluster/7000/
- 编辑配置文件Redis.conf
cd /usr/local/src/redis5.5/cluster/7000
[root@localhost 7000]# vim redis.conf
//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/redis5.5/cluster/7000/redid.pid
//6.修改持久化文件路径
263 dir /usr/local/src/redis5.5/cluster/7000
//7.设定内存优化策略
597 maxmemory-policy volatile-lru
//8.关闭AOF模式
699 appendonly no
//9.开启集群配置
832 cluster-enabled yes
//10.开启集群配置文件
840 cluster-config-file nodes.conf
//11.修改集群超时时间
846 cluster-node-timeout 15000
- 说明:将7000文件夹下的redis.conf文件分别复制到7001-7005中
- 修改7001到7005的端口号
%s/7000/7001/g
%s/7000/7002/g
%s/7000/7003/g
%s/7000/7004/g
%s/7000/7005/g
- 创建启动脚本 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 &
- 编辑关闭的脚本 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 &
开启集群
//启动redis节点
sh start.sh
//检查redis节点启动是否正常
ps -ef | grep redis
//创建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
//yes
关闭集群
[root@localhost cluster]# pwd
/usr/local/src/redis/cluster
[root@localhost cluster]# sh shutdown.sh
[root@localhost cluster]# rm -f 700?/nodes.conf
[root@localhost cluster]# rm -f 700?/dump.rdb
3 Redis集群高可用测试
- 关闭redis主机.检查是否自动实现故障迁移.
- 再次启动关闭的主机.检查是否能够实现自动的挂载.
一般情况下 能够实现主从挂载
个别情况: 宕机后的节点重启,可能挂载到其他主节点中(7001-7002) 正确的
4 Redis集群原理
原理说明:
Redis的所有节点都会保存当前redis集群中的全部主从状态信息.并且每个节点都能够相互通信.当一个节点发生宕机现象.则集群中的其他节点通过PING-PONG检测机制检查Redis节点是否宕机.当有半数以上的节点认为宕机.则认为主节点宕机.同时由Redis剩余的主节点进入选举机制.投票选举链接宕机的主节点的从机.实现故障迁移
5 Redis集群宕机条件
特点:集群中如果主机宕机,那么从机可以继续提供服务,
当主机中没有从机时,则向其它主机借用多余的从机.继续提供服务.如果主机宕机时没有从机可用,则集群崩溃.
答案:9个redis节点,节点宕机5-7次时集群才崩溃.
6 redis入门案例
package com.jt.test;
import java.util.HashSet;
import java.util.Set;
import org.junit.jupiter.api.Test;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
public class TestCluster {
/**
* 通过程序操作redis 3主机 读写 3从机 数据备份
*/
@Test
public void test01() {
Set<HostAndPort> nodes = new HashSet<HostAndPort>();
nodes.add(new HostAndPort("192.168.126.129", 7000));
nodes.add(new HostAndPort("192.168.126.129", 7001));
nodes.add(new HostAndPort("192.168.126.129", 7002));
nodes.add(new HostAndPort("192.168.126.129", 7003));
nodes.add(new HostAndPort("192.168.126.129", 7004));
nodes.add(new HostAndPort("192.168.126.129", 7005));
//利用程序操作redis集群
JedisCluster jedisCluster = new JedisCluster(nodes);
jedisCluster.set("AAAAA", "redis集群测试");
System.out.println(jedisCluster.get("AAAAA"));
}
}