什么是集群

容量不够,redis如何进行扩容?并发写操作,redis如何分摊
Redis 集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N。
Redis 集群通过分区(partition)来提供一定程度的可用性(availability):即使集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求

集群无中心化,任何一个节点都是集群的入口,它们之间能互相访问。无论从哪台主机写的数据,其他主机上都能读到数据
image.png

集群的创建

Appendonly 关掉

  1. include /myredis/redis.conf
  2. pidfile "/var/run/redis_6379.pid"
  3. port 6379
  4. dbfilename "dump6379.rdb"
  5. cluster-enabled yes
  6. cluster-config-file nodes-6379.conf
  7. cluster-node-timeout 15000


创建6个实例

一个集群至少要有三个主节点
选项 —cluster-replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。
分配原则:尽量保证每个主数据库运行在不同的IP地址,每个从库和主库不在一个IP地址上

配置集群基本信息

  • cluster-enabled yes 打开集群模式
  • cluster-config-file nodes-6379.conf 设定节点配置文件名
  • cluster-node-timeout 15000 设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换。

image.png
image.png

查找替换

  1. //例如
  2. :%s/6379/6380

启动6个redis的服务

  1. //例如
  2. redis-server redis6379.conf

将6个节点合成一个集群
组合之前,请确保所有redis实例启动后,nodes-xxxx.conf文件都生成正常
image.png

进入到redis安装的src目录下
需要用到这个rb环境,redis6以及集成好了;直接合体就行
image.png

  1. //合体
  2. 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 采用最简单的方式配置集群,一台主机,一台从机,正好三组
image.png
image.png

集群方式连接redis

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

image.png

slots

一个 Redis 集群包含 16384 个插槽(hash slot),数据库中的每个键都属于这 16384个插槽的其中一个,
集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键key 的 CRC16校验和
集群中的每个节点负责处理一部分插槽

例如:如果一个集群可以有主节点, 其中:
节点 A 负责处理 0 号至 5460 号插槽
节点 B 负责处理 5461 号至 10922 号插槽
节点 C 负责处理 10923 号至 16383 号插槽
image.png

不在一个slot下的键值,是不能使用mget,mset等多键操作
image.png
可以通过 {} 来定义组的概念,从而使key中{}内相同内容的键值对放到一个slot中去
image.png

查询集群中的值

  1. //计算插槽值
  2. cluster keyslot key
  3. //计算插槽中有几个键 只能查看当前连接端口号的键
  4. cluster countkeysinslot 5474
  5. //返回插槽中指定数量的值
  6. cluster getkeysinslot 5474 5

image.pngimage.png

故障恢复

某台主机宕机后,从机会上线替代主机。宕机主机再上线后,会成为新主机的从机

redis.conf中的参数 cluster-require-full-coverage

  • 如果某一段插槽的主从都挂掉,而cluster-require-full-coverage为yes整个集群都挂掉
  • 如果某一段插槽的主从都挂掉,而cluster-require-full-coverage为no该插槽数据全都不能使用,也无法存储。

jedis操作集群

  1. public class JedisClusterTest {
  2. public static void main(String[] args) {
  3. //相当于redis-cli -c -p 6379
  4. Set<HostAndPort>set =new HashSet<HostAndPort>();
  5. set.add(new HostAndPort("192.168.31.211",6379));
  6. JedisCluster jedisCluster=new JedisCluster(set);
  7. jedisCluster.set("k1", "v1");
  8. System.out.println(jedisCluster.get("k1"));
  9. }
  10. }

集群优缺点

优:实现扩容,分摊压力,无中心配置相对简单
缺:多键操作是不被支持, 多键的Redis事务是不被支持的。lua脚本不被支持