Redis学习笔记十(集群)

集群

解决问题

  1. 容量不够
  2. 并发写操作
  3. 修改主机的相关信息
  4. 之前通过代理主机来解决,redis3.0之后提供了解决无中心化集群配置
  5. 代理主机方式
    graph LR; 客户端-->A["代理"]-->B1["主机1"]-->C1["从机1"]; A["代理"]-->B2["主机2"]-->C2["从机2"]; A["代理"]-->B3["主机3"]-->C3["从机3"]; A["代理"]-->B4["代理从机1"];
    6.无中心化集群方式
    graph LR; B1["主机1"]-->B2["主机2"]-->C2["从机2"]; B2-->B3["主机3"]-->C3["从机3"]; B3-->B1; B1-->C1["从机1"]; 客户端-->B1;

集群特点

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

配置集群

  1. redis.conf配置文件修改
开启daemonize yes
Pid文件名字
指定端口
Log文件名字
Dump.rdb名字
Appendonly 关掉或者换名字
cluster-enabled yes    打开集群模式
cluster-config-file nodes-xxx.conf  设定节点配置文件名
cluster-node-timeout 15000   设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换。

redis.conf主要内容配置

include /myredis/redis.conf
pidfile /var/run/redis_6380.pid
port 6380
dbfilename dump6380.rdb
cluster-enabled yes
cluster-config-file nodes-6380.conf
cluster-node-timeout 15000
  1. 依照以上配置建立redis6380.conf、redis6381.conf、redis6382.conf、redis6390.conf、redis6391.conf、redis6392.conf文件。只需要将redis6380.conf复制五份,在对应的文件下输入:%s/6380/63xx,修改数字。

  2. 启动6个redis服务(此时文件夹下,应该有对应的nodes-xxxx文件生成)

root@LK:/myredis# redis-server redis6380.conf
root@LK:/myredis# redis-server redis6381.conf
root@LK:/myredis# redis-server redis6382.conf
root@LK:/myredis# redis-server redis6389.conf
root@LK:/myredis# redis-server redis6390.conf
root@LK:/myredis# redis-server redis6392.conf
root@LK:/myredis# ps -ef| grep redis
root       86630    2002  0 13:04 ?        00:00:00 redis-server 127.0.0.1:6382 [cluster]
root       86641    2002  0 13:05 ?        00:00:00 redis-server 127.0.0.1:6392 [cluster]
root       86715    2002  0 13:07 ?        00:00:00 redis-server 127.0.0.1:6380 [cluster]
root       86721    2002  0 13:08 ?        00:00:00 redis-server 127.0.0.1:6390 [cluster]
root       86731    2002  0 13:08 ?        00:00:00 redis-server 127.0.0.1:6381 [cluster]
root       86738    2002  0 13:08 ?        00:00:00 redis-server 127.0.0.1:6391 [cluster]
root       86749   59701  0 13:08 pts/0    00:00:00 grep --color=auto redis
  1. 将6个服务集成为集群
    在redis安装目录下/opt/redis-7.0.2/src
redis-cli --cluster create --cluster-replicas 1 127.0.0.1:6382 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6392 127.0.0.1:6390 127.0.0.1:6391

如果有远程连接,尽量不要用127.0.0.1
--replicas 1 采用最简单的方式配置集群,主机要有一个从机。

root@LK:/opt/redis-7.0.2/src# redis-cli --cluster create --cluster-replicas 1 127.0.0.1:6382 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6392 127.0.0.1:6390 127.0.0.1:6391
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:6390 to 127.0.0.1:6382
Adding replica 127.0.0.1:6391 to 127.0.0.1:6380
Adding replica 127.0.0.1:6392 to 127.0.0.1:6381
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 3e81415f445fcfb480732a1550abc482a830513c 127.0.0.1:6382
   slots:[0-5460] (5461 slots) master
M: c6724e82265a3277458ef7e21e9ef0aa0e0965a6 127.0.0.1:6380
   slots:[5461-10922] (5462 slots) master
M: e761f014598833ba20d6c0256dd520b9824cf082 127.0.0.1:6381
   slots:[10923-16383] (5461 slots) master
S: 0f240fe2623bedb042c74917f75f65b5b8b45bcc 127.0.0.1:6392
   replicates 3e81415f445fcfb480732a1550abc482a830513c
S: 7052c51e19ee25dfb568cb09cd463383083eb4ea 127.0.0.1:6390
   replicates c6724e82265a3277458ef7e21e9ef0aa0e0965a6
S: ce2aa0395048c81e9e47c7344cf7fb20f9d2fc8c 127.0.0.1:6391
   replicates e761f014598833ba20d6c0256dd520b9824cf082
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join

>>> Performing Cluster Check (using node 127.0.0.1:6382)
M: 3e81415f445fcfb480732a1550abc482a830513c 127.0.0.1:6382
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: c6724e82265a3277458ef7e21e9ef0aa0e0965a6 127.0.0.1:6380
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 7052c51e19ee25dfb568cb09cd463383083eb4ea 127.0.0.1:6390
   slots: (0 slots) slave
   replicates c6724e82265a3277458ef7e21e9ef0aa0e0965a6
M: e761f014598833ba20d6c0256dd520b9824cf082 127.0.0.1:6381
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 0f240fe2623bedb042c74917f75f65b5b8b45bcc 127.0.0.1:6392
   slots: (0 slots) slave
   replicates 3e81415f445fcfb480732a1550abc482a830513c
S: ce2aa0395048c81e9e47c7344cf7fb20f9d2fc8c 127.0.0.1:6391
   slots: (0 slots) slave
   replicates e761f014598833ba20d6c0256dd520b9824cf082
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
  1. 集群方式连接
res-cli -c -p 6380
  1. 查看主从机情况,插槽范围
cluster nodes
127.0.0.1:6380> cluster nodes
e761f014598833ba20d6c0256dd520b9824cf082 127.0.0.1:6381@16381 master - 0 1656134521873 3 connected 10923-16383
ce2aa0395048c81e9e47c7344cf7fb20f9d2fc8c 127.0.0.1:6391@16391 slave e761f014598833ba20d6c0256dd520b9824cf082 0 1656134522877 3 connected
7052c51e19ee25dfb568cb09cd463383083eb4ea 127.0.0.1:6390@16390 slave c6724e82265a3277458ef7e21e9ef0aa0e0965a6 0 1656134521000 2 connected
0f240fe2623bedb042c74917f75f65b5b8b45bcc 127.0.0.1:6392@16392 slave 3e81415f445fcfb480732a1550abc482a830513c 0 1656134520000 1 connected
c6724e82265a3277458ef7e21e9ef0aa0e0965a6 127.0.0.1:6380@16380 myself,master - 0 1656134518000 2 connected 5461-10922
3e81415f445fcfb480732a1550abc482a830513c 127.0.0.1:6382@16382 master - 0 1656134521000 1 connected 0-5460
  1. 实际使用过程中集群的要求

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

    1. 一个 Redis 集群包含 16384 个插槽(hash slot),数据库中的每个键都属于这 16384 个插槽的其中一个,每个主机拥有其中的一部分插槽。
    2. 集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和 。
127.0.0.1:6380> set k1 v1
-> Redirected to slot [12706] located at 127.0.0.1:6381
OK
127.0.0.1:6381> 

根据输入的key计算插槽位置,选择存储位置并跳转到对应的服务器地址

#多值插入,通过组的方式
127.0.0.1:6381> mset t1{cust} v1 t2{cust} v2 t3{cust} v3 
-> Redirected to slot [4847] located at 127.0.0.1:6382
OK
#键也将以组的形式存在
127.0.0.1:6382> keys *
1) "t2{cust}"
2) "k2"
3) "t3{cust}"
4) "t1{cust}"
#查询键也将以组的形式
127.0.0.1:6382> get t2{cust}
"v2"
#查询当前键值的插槽位置
cluster keyslot <cust>
#查询当前槽位有几个值,只能查询当前服务器的插槽
cluster countkeysinslot  <slot>
# 获取当前槽位count数量的值
cluster getkeysinslot  <slot> <count>
  1. 故障恢复
    1. 主机挂掉,挂掉的主机的从机会成为新的主机
    2. 原来主机恢复后,会成为新主机的从机。
    3. 如果一个主机以及下面的从机都挂掉,如果redis.conf文件中的cluster-require-full-coverage yes,则集群都挂掉;如果为no, 则仅挂掉部分的插槽不能使用

jedis配置集群

public class JedisClusterTest {
	public static void main(String[] args) { 
		Set<HostAndPort> set =new HashSet<HostAndPort>();
		//集群中任意一个主机ip都可以使用,会自动发现其他主机,也可以手动放入多个
		//需要保持后台redis运行
		set.add(new HostAndPort("127.0.0.1",6380));
		JedisCluster jedisCluster=new JedisCluster(set);
		jedisCluster.set("kk1", "vv1");
		System.out.println(jedisCluster.get("kk1"));
		//节点数
		Map<String, JedisPool> clusterNodes = jedisCluster.getClusterNodes();
		clusterNodes.forEach((s, jedisPool) -> System.out.println(s+jedisPool.toString()));
	}
}

jedis的操作参考学习笔记六

vv1
127.0.0.1:6382redis.clients.jedis.JedisPool@7f690630
127.0.0.1:6390redis.clients.jedis.JedisPool@edf4efb
127.0.0.1:6392redis.clients.jedis.JedisPool@2f7a2457
127.0.0.1:6381redis.clients.jedis.JedisPool@566776ad
127.0.0.1:6380redis.clients.jedis.JedisPool@6108b2d7
127.0.0.1:6391redis.clients.jedis.JedisPool@1554909b

集群的优劣

  1. 优势:
    1. 实现扩容
    2. 分摊压力
    3. 无中心配置相对简单
  2. 不足
    1. 多键操作是不被支持的
    2. 多键的Redis事务是不被支持的。lua脚本不被支持
    3. 由于集群方案出现较晚,很多公司已经采用了其他的集群方案,而代理或者客户端分片的方案想要迁移至redis cluster,需要整体迁移而不是逐步过渡,复杂度较大。
posted @ 2022-06-25 14:29  小懒虫LK  阅读(58)  评论(0编辑  收藏  举报