什么是集群
容量不够,redis如何进行扩容?并发写操作,redis如何分摊
Redis 集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N。
Redis 集群通过分区(partition)来提供一定程度的可用性(availability):即使集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求
集群无中心化,任何一个节点都是集群的入口,它们之间能互相访问。无论从哪台主机写的数据,其他主机上都能读到数据
集群的创建
Appendonly 关掉
include /myredis/redis.confpidfile "/var/run/redis_6379.pid"port 6379dbfilename "dump6379.rdb"cluster-enabled yescluster-config-file nodes-6379.confcluster-node-timeout 15000
创建6个实例
一个集群至少要有三个主节点
选项 —cluster-replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。
分配原则:尽量保证每个主数据库运行在不同的IP地址,每个从库和主库不在一个IP地址上
配置集群基本信息
- cluster-enabled yes 打开集群模式
- cluster-config-file nodes-6379.conf 设定节点配置文件名
- cluster-node-timeout 15000 设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换。


查找替换
//例如:%s/6379/6380
启动6个redis的服务
//例如redis-server redis6379.conf
将6个节点合成一个集群
组合之前,请确保所有redis实例启动后,nodes-xxxx.conf文件都生成正常
进入到redis安装的src目录下
需要用到这个rb环境,redis6以及集成好了;直接合体就行
//合体redis-cli --cluster create --cluster-replicas 1 192.168.135.124:6379 192.168.135.124:6380 192.168.135.124:6381 192.168.135.124:6389 192.168.135.124:6390 192.168.135.124:6391
注:用真实IP地址
-replicas 1 采用最简单的方式配置集群,一台主机,一台从机,正好三组

集群方式连接redis
redis-cli -c -p 6379 // -c 采用集群策略连接,设置数据会自动切换到相应的写主机cluster nodes //命令查看集群信息

slots
一个 Redis 集群包含 16384 个插槽(hash slot),数据库中的每个键都属于这 16384个插槽的其中一个,
集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键key 的 CRC16校验和 。
集群中的每个节点负责处理一部分插槽
例如:如果一个集群可以有主节点, 其中:
节点 A 负责处理 0 号至 5460 号插槽
节点 B 负责处理 5461 号至 10922 号插槽
节点 C 负责处理 10923 号至 16383 号插槽
不在一个slot下的键值,是不能使用mget,mset等多键操作
可以通过 {} 来定义组的概念,从而使key中{}内相同内容的键值对放到一个slot中去
查询集群中的值
//计算插槽值cluster keyslot key//计算插槽中有几个键 只能查看当前连接端口号的键cluster countkeysinslot 5474//返回插槽中指定数量的值cluster getkeysinslot 5474 5


故障恢复
某台主机宕机后,从机会上线替代主机。宕机主机再上线后,会成为新主机的从机
redis.conf中的参数 cluster-require-full-coverage
- 如果某一段插槽的主从都挂掉,而cluster-require-full-coverage为yes ,整个集群都挂掉
- 如果某一段插槽的主从都挂掉,而cluster-require-full-coverage为no,该插槽数据全都不能使用,也无法存储。
jedis操作集群
public class JedisClusterTest {public static void main(String[] args) {//相当于redis-cli -c -p 6379Set<HostAndPort>set =new HashSet<HostAndPort>();set.add(new HostAndPort("192.168.31.211",6379));JedisCluster jedisCluster=new JedisCluster(set);jedisCluster.set("k1", "v1");System.out.println(jedisCluster.get("k1"));}}
集群优缺点
优:实现扩容,分摊压力,无中心配置相对简单
缺:多键操作是不被支持, 多键的Redis事务是不被支持的。lua脚本不被支持
