Redis5.0集群搭建(Redis Cluster)

2023-11-09

Redis集群

redis集群是一个由多个主从节点群组成的分布式服务器群,它具有复制、高可用和分片特性。Redis集群不需要sentinel也能完成节点移除和故障转移的功能。需要将每个节点设置成集群模式,这种集群模式没有中心节点,可水平扩展,据官方文档称可以线性扩展到上万个节点(官方推荐不超过1000个节点)。redis集群的性能和高可用性均优于之前版本的哨兵模式,且集群配置非常简单。

1.编译与安装

编译安装完成后,在单实例下确保正常启动。

1.1 下载、解压文件
tar xzvf /usr/redis/redis-5.0.3.tar.gz -C /usr/
mv redis-5.0.3 redis

1.2 编译及安装
[root@localhost redis]# make && make install

2.搭建集群环境

Redis要求一主一从的搭配至少要 六个节点,形成三对主从。

创建节点目录

创建用于Redis集群的配置文件、运行的pid、日志logs、数据文件存储等目录

[root@localhost redis]# mkdir -p /usr/redis/{redis-6379,redis-6380,redis-6381,redis-6382,redis-6383,redis-6384}/{conf,run,logs,dbcache}

修改节点配置文件

复制redis.conf到redis-6379/conf/目录,修改节点配置参数并保存,作为原文件复制并进行其他节点的相同配置。

cd /usr/redis/
cp /usr/redis/redis.conf /usr/redis/redis-6379/conf/
cd /usr/redis/redis-6379/conf/
mv redis.conf redis-6379.conf

redis-6379.conf

vi redis-6379.conf


#bind 127.0.0.1 #开启外网访问
daemonize yes #开启后台运行
requirepass 123456 #设置redis数据库密码
masterauth 123456 #设置集群节点间访问密码


#修改端口、pid文件、日志文件、数据文件路径
protected-mode no
port 6379
pidfile /usr/redis/redis-6379/run/redis_6379.pid
logfile "/usr/redis/redis-6379/logs/redis.log"
dir /usr/redis/redis-6379/dbcache/ 或(dir ./redis/redis-6379/dbcache)

#开启redis-cluster
cluster-enabled yes
#设置节点之间超时时间
cluster-node-timeout 15000
#指定cluster-config-file,不能与别的节点相同
cluster-config-file nodes-6379.conf

复制一份到redis-6380,同理其他

cd /usr/redis/redis-6379/conf/ && cp redis-6379.conf /usr/redis/redis-6380/conf/ && cd /usr/redis/redis-6380/conf/ && mv redis-6379.conf redis-6380.conf && vim redis-6380.conf

#执行vim替换命令,或手动修改配置参数
:1,$s/6379/6380/g 或(%s/源字符串/目的字符串/g) 

启动节点服务

使用conf文件启动服务
/usr/redis/src/redis-server /usr/redis/redis-6379/conf/redis-6379.conf
/usr/redis/src/redis-server /usr/redis/redis-6380/conf/redis-6380.conf
/usr/redis/src/redis-server /usr/redis/redis-6381/conf/redis-6381.conf
/usr/redis/src/redis-server /usr/redis/redis-6382/conf/redis-6382.conf
/usr/redis/src/redis-server /usr/redis/redis-6383/conf/redis-6383.conf
/usr/redis/src/redis-server /usr/redis/redis-6384/conf/redis-6384.conf

进程状况

[root@localhost conf]# ps -ef |grep redis
root      10740      1  0 16:29 ?        00:00:40 /usr/redis/src/redis-server *:6379 [cluster]
root      10747      1  0 16:30 ?        00:00:39 /usr/redis/src/redis-server *:6380 [cluster]
root      10753      1  0 16:30 ?        00:00:40 /usr/redis/src/redis-server *:6381 [cluster]
root      11445      1  0 20:34 ?        00:00:01 /usr/redis/src/redis-server *:6382 [cluster]
root      11486      1  0 20:38 ?        00:00:00 /usr/redis/src/redis-server *:6383 [cluster]
root      11507      1  0 20:41 ?        00:00:00 /usr/redis/src/redis-server *:6384 [cluster]

创建集群

redis5.0创建集群命令使用redis-cli --cluster create [IP:PORT]
(输入redis-cli --cluster help来查看命令帮助)

[root@localhost ~]# redis-cli --cluster create 192.168.236.128:6379 192.168.236.128:6380 192.168.236.128:6381 192.168.236.128:6382 192.168.236.128:6383 192.168.236.128:6384 --cluster-replicas 1

--cluster-replicas 1 #表示为集群中的每一个主节点指定一个从节点,即一比一的复制

config get protected-mode
config set protected-mode no 关闭保护模式(protected mode),防止redis-cli远程访问

redis.log分配记录

系统自动为6379、6380、6381分配了master,为6382、6383、6384分配了slave。

6379与6383对应为一主一从,两者redis.log日志分配记录如下

#6379 master 

11931:M 31 Aug 2019 21:36:37.392 # configEpoch set to 1 via CLUSTER SET-CONFIG-EPOCH
11931:M 31 Aug 2019 21:36:37.412 # IP address for this node updated to 192.168.236.12
11931:M 31 Aug 2019 21:36:42.272 * Replica 192.168.236.128:6383 asks for synchronizaton
11931:M 31 Aug 2019 21:36:42.272 * Partial resynchronization not accepted: Replicatio ID mismatch (Replica asked for '7f74829c12a77a34f6616cfd609ee704221c0925', my repliction IDs are 'ec8163a98cc9c9e0ede0d3b8b5c9427da3e9c968' and '000000000000000000000000000000000000000')
11931:M 31 Aug 2019 21:36:42.272 * Starting BGSAVE for SYNC with target: disk
11931:M 31 Aug 2019 21:36:42.274 * Background saving started by pid 11976
11976:C 31 Aug 2019 21:36:42.299 * DB saved on disk
11976:C 31 Aug 2019 21:36:42.300 * RDB: 4 MB of memory used by copy-on-write
11931:M 31 Aug 2019 21:36:42.371 * Background saving terminated with success
11931:M 31 Aug 2019 21:36:42.372 # Cluster state changed: ok
11931:M 31 Aug 2019 21:36:42.373 * Synchronization with replica 192.168.236.128:6383 ucceeded

#6383 slave 

11951:M 31 Aug 2019 21:36:37.406 # configEpoch set to 5 via CLUSTER SET-CONFIG-EPOCH
11951:M 31 Aug 2019 21:36:37.614 # IP address for this node updated to 192.168.236.128
11951:S 31 Aug 2019 21:36:41.430 * Before turning into a replica, using my master parameters to synthesize a cached master: I may be able to synchronize with the new master with just a partial transfer.
11951:S 31 Aug 2019 21:36:41.431 # Cluster state changed: ok
11951:S 31 Aug 2019 21:36:42.268 * Connecting to MASTER 192.168.236.128:6379
11951:S 31 Aug 2019 21:36:42.269 * MASTER <-> REPLICA sync started
11951:S 31 Aug 2019 21:36:42.269 * Non blocking connect for SYNC fired the event.
11951:S 31 Aug 2019 21:36:42.271 * Master replied to PING, replication can continue...
11951:S 31 Aug 2019 21:36:42.271 * Trying a partial resynchronization (request 7f74829c12a77a34f6616cfd609ee704221c0925:1).
11951:S 31 Aug 2019 21:36:42.278 * Full resync from master: 3d7e943070ba13ad2a244dec083f1153df4529a4:0
11951:S 31 Aug 2019 21:36:42.278 * Discarding previously cached master state.
11951:S 31 Aug 2019 21:36:42.373 * MASTER <-> REPLICA sync: receiving 175 bytes from master
11951:S 31 Aug 2019 21:36:42.374 * MASTER <-> REPLICA sync: Flushing old data
11951:S 31 Aug 2019 21:36:42.375 * MASTER <-> REPLICA sync: Loading DB in memory
11951:S 31 Aug 2019 21:36:42.375 * MASTER <-> REPLICA sync: Finished with success

连接集群

[root@localhost ~]# redis-cli -c -h 192.168.236.128 -p 6383 # -c 表示连接集群节点
192.168.236.128:6383> cluster info #查看集群信息
192.168.236.128:6383> cluster nodes #查看节点列表

[root@localhost ~]# redis-cli -c -h 192.168.236.128 -p 6383
192.168.236.128:6383> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:5185
cluster_stats_messages_pong_sent:5273
cluster_stats_messages_meet_sent:4
cluster_stats_messages_sent:10462
cluster_stats_messages_ping_received:5271
cluster_stats_messages_pong_received:5189
cluster_stats_messages_meet_received:2
cluster_stats_messages_received:10462


192.168.236.128:6383> cluster nodes
0e0f13baf6a10261cb694b3d150fefb227bf262f 192.168.236.128:6380@16380 master - 0 1567263846604 2 connected 5461-10922
4d3c1753318cb3364a14801ca77f485fa01b62bc 192.168.236.128:6384@16384 slave 0e0f13baf6a10261cb694b3d150fefb227bf262f 0 1567263847618 6 connected
bec2a9fb5c3c69aec63c9f3c3e8f92cf0a59f739 192.168.236.128:6379@16379 master - 0 1567263844583 1 connected 0-5460
b15cb72d2ea51f2384cb87c425cb7edc26615f79 192.168.236.128:6383@16383 myself,slave bec2a9fb5c3c69aec63c9f3c3e8f92cf0a59f739 0 1567263846000 5 connected
93fc8d29b49d9cc1b3fefa26153306004b00a31c 192.168.236.128:6381@16381 master - 0 1567263845593 3 connected 10923-16383
ff05109dc86728522cf8bbaed6acdd302a69a2dd 192.168.236.128:6382@16382 slave 93fc8d29b49d9cc1b3fefa26153306004b00a31c 0 1567263846000 3 connected

Reids测试

连接任意一个客户端,输入set get语句后,数据按照slot存储分布在多个redis实例上

[root@localhost ~]# redis-cli -c -h 192.168.236.128 -p 6381
192.168.236.128:6381> dbsize
192.168.236.128:6381> flushdb
OK
192.168.236.128:6381> set name helloworld
-> Redirected to slot [5798] located at 192.168.236.128:6380
OK
192.168.236.128:6380> set age 18
-> Redirected to slot [741] located at 192.168.236.128:6379
OK
192.168.236.128:6379> get name
-> Redirected to slot [5798] located at 192.168.236.128:6380
"helloworld"
192.168.236.128:6380> get age
-> Redirected to slot [741] located at 192.168.236.128:6379
"18"

集群命令

集群
cluster info :打印集群的信息
cluster nodes :列出集群当前已知的所有节点( node),以及这些节点的相关信息。
CLUSTER RESET [HARD|SOFT] 彻底reset一个master, 需要将它的所有key先移除,如先使用FLUSHALL

节点
cluster meet <ip> <port> :将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子
cluster forget <node_id> :从集群中移除 node_id 指定的节点。
cluster replicate <master_node_id> :将当前从节点设置为 node_id 指定的master节点的slave节点。只能针对slave节点操作。
cluster saveconfig :将节点的配置文件保存到硬盘里面。

槽(slot)
cluster addslots <slot> [slot ...] :将一个或多个槽( slot)指派( assign)给当前节点。
cluster delslots <slot> [slot ...] :移除一个或多个槽对当前节点的指派。
cluster flushslots :移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
cluster setslot <slot> node <node_id> :将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给
另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
cluster setslot <slot> migrating <node_id> :将本节点的槽 slot 迁移到 node_id 指定的节点中。
cluster setslot <slot> importing <node_id> :从 node_id 指定的节点中导入槽 slot 到本节点。
cluster setslot <slot> stable :取消对槽 slot 的导入( import)或者迁移( migrate)。

键
cluster keyslot <key> :计算键 key 应该被放置在哪个槽上。
cluster countkeysinslot <slot> :返回槽 slot 目前包含的键值对数量。
cluster getkeysinslot <slot> <count> :返回 count 个 slot 槽中的键 。

节点分配

目前遇到6个节点错乱显示1主4从问题。可能是之前使用了meet命令

192.168.236.128:6379> cluster nodes
60bfe95530807ec3c1c7db35345440426e3c7cdf 192.168.236.128:6382@16382 slave 4868acd5cf2f948293bf10f75cfcccaf997e193a 0 1568109506858 32 connected
4868acd5cf2f948293bf10f75cfcccaf997e193a 192.168.236.128:6379@16379 myself,master - 0 1568109507000 32 connected 0-16383
65c2e5b2901e58fb09d8948a351c533c10026e89 192.168.236.128:6381@16381 slave 4868acd5cf2f948293bf10f75cfcccaf997e193a 0 1568109507868 32 connected
bf7b1c9613d9a746eae79a38dc6a1797aba6186b 192.168.236.128:6384@16384 master - 0 1568109508878 27 connected
66a8ae9041fe5d831f624d05e89ea27a5cf5c816 192.168.236.128:6383@16383 slave 4868acd5cf2f948293bf10f75cfcccaf997e193a 0 1568109505848 32 connected
e8302843f3eacfd2bfea6517424bee9be4f86170 192.168.236.128:6380@16380 slave 4868acd5cf2f948293bf10f75cfcccaf997e193a 0 1568109506000 32 connected

新增slave节点6382, 分配到master6380下
redis-cli --cluster add-node 192.168.236.128:6382 192.168.236.128:6380 --cluster-slave --cluster-master-id 96a8255d493411f561f46f6321e412457839b3e8 -a 123456

将节点6382作为6380的从节点
(删除/redis/redis-6380/dbcache的数据文件、节点配置文件dump.rdb nodes-6380.conf)

1.删除slave节点
redis-cli --cluster del-node 192.168.236.128:6380 e8302843f3eacfd2bfea6517424bee9be4f86170 -a 123456

2.修改6382slave节点, 分配到master6380下
redis-cli -h 192.168.236.128 -p 6382 -a 123456 cluster replicate 96a8255d493411f561f46f6321e412457839b3e8

节点检查

redis-cli --cluster check 192.168.236.128:6379 #检查集群状态slots详细分配。

redis-cli --cluster fix 192.168.236.128:6379 #显示修正结果,槽位重新分配。

[root@localhost ~]# redis-cli --cluster check 192.168.236.128:6379

192.168.236.128:6379 (bec2a9fb...) -> 0 keys | 5461 slots | 1 slaves.
192.168.236.128:6380 (0e0f13ba...) -> 0 keys | 5462 slots | 1 slaves.
192.168.236.128:6381 (93fc8d29...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.236.128:6379)
M: bec2a9fb5c3c69aec63c9f3c3e8f92cf0a59f739 192.168.236.128:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: ff05109dc86728522cf8bbaed6acdd302a69a2dd 192.168.236.128:6382
   slots: (0 slots) slave
   replicates 93fc8d29b49d9cc1b3fefa26153306004b00a31c
S: 4d3c1753318cb3364a14801ca77f485fa01b62bc 192.168.236.128:6384
   slots: (0 slots) slave
   replicates 0e0f13baf6a10261cb694b3d150fefb227bf262f
M: 0e0f13baf6a10261cb694b3d150fefb227bf262f 192.168.236.128:6380
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: b15cb72d2ea51f2384cb87c425cb7edc26615f79 192.168.236.128:6383
   slots: (0 slots) slave
   replicates bec2a9fb5c3c69aec63c9f3c3e8f92cf0a59f739
M: 93fc8d29b49d9cc1b3fefa26153306004b00a31c 192.168.236.128:6381
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

[ERR] Not all 16384 slots are covered by nodes.

这个往往是由于主node移除了,但是并没有移除node上面的slot,从而导致了slot总数没有达到16384,其实也就是slots分布不正确。所以在删除节点的时候一定要注意删除的是否是Master主节点。

Jedis连接Redis集群

JedisCluster 原理介绍
https://www.jianshu.com/p/5ca98b5a336b

JedisCluster初始化时,所有的集群连接信息都是封装在JedisClusterInfoCache里,由于jedis本身不是线程安全的,所以使用对象池JedisPool来保证线程安全,在JedisClusterInfoCache中,除了要保存节点和槽的一一对应关系,还要为每个节点建立一个对象池JedisPool,并保存在map。这个类主要用于保存集群的配置信息,并且是JedisCluster初始化部分的核心所在。JedisClusterConnectionHandler是cache类的一个窗口,cache类似数据管理层,而Handler就类似于操控数据提供服务的Service层。
//
从上图可以看出,Jedis建立集群的过程很清晰,传入节点信息,通过其中一个节点从redis服务器拿到整个集群的信息,包括槽位对应关系,主从节点的信息,将这些信息保存在JedisClusterInfoCache中。

在发送请求时,JedisCluster对象先从初始化得到的集群map中获取key对应的节点连接,即一个可用的Jedis对象。然后通过这个对象发送get key 命令。

通常,根据key计算槽位得到的节点不会报错。所以如果发生connectionException,或者MovedDataException,说明初始化得到的槽位与节点的对应关系有问题,即与实际的对应关系不符,应当重置map。 如果出现ASK异常,说明数据正在迁移,需要临时使用返回消息指定的地址,重新发送命令。在这里,Jedis通过异常反馈,智能地同步了客户端与服务端的集群信息。

import java.util.HashSet;
import java.util.Set;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;

public class ConnectRedisCluster {
	public static final int TIMEOUT = 3000; //连接超时时间
	public static final int SO_TIMEOUT = 100; //间隔超时时间
	public static final int MAX_ATTEMPTS = 100; //重试次数
	public static final String REDIS_AUTH = "123456"; //Redis数据库访问密码
	//
	public static final int MAX_TOTAL = 1000; //最大连接数
	public static final int MAX_IDEL = 200; // 空闲连接数
	public static final int MAX_WAIT_MILLIS = 1000; //最大等待时间
	public static final boolean TEST_ON_BORROW = true;// 进行连接测试,以保证返回的连接为可用连接
	
	public static void main(String args[]) throws Exception
	{
		JedisPoolConfig poolConfig = new JedisPoolConfig();
		poolConfig.setMaxTotal(MAX_TOTAL);// 最大连接数
		poolConfig.setMaxIdle(MAX_IDEL); // 空闲连接数(最小维持连接数)
		poolConfig.setMaxWaitMillis(MAX_WAIT_MILLIS);// 最大等待时间
		poolConfig.setTestOnBorrow(TEST_ON_BORROW);
		//
		Set<HostAndPort> clusters = new HashSet<HostAndPort>();
		clusters.add(new HostAndPort("192.168.236.128",6379));
		clusters.add(new HostAndPort("192.168.236.128",6380));
		clusters.add(new HostAndPort("192.168.236.128",6381));
		clusters.add(new HostAndPort("192.168.236.128",6382));
		clusters.add(new HostAndPort("192.168.236.128",6383));
		clusters.add(new HostAndPort("192.168.236.128",6384));
		
		//创建RedisCluster集群访问对象
		JedisCluster jedis= new JedisCluster(clusters, TIMEOUT, SO_TIMEOUT, MAX_ATTEMPTS, REDIS_AUTH, poolConfig);
		jedis.set("id", "1002");
		jedis.set("name", "zhangsan2");
		jedis.set("level", "2");
		System.out.println(jedis.get("id") + ", " + jedis.get("name") + ", " + jedis.get("level"));
		jedis.close();
	}
}

(完)

其他

集群的工具create-cluster

Redis的utils目录中提供了集群的工具create-cluster,可以进行启动、关闭等操作。

vim /usr/redis/utils/create-cluster/create-cluster
修改端口参数(PORT=6378),NODES为6,工具会自动累加1,生成 6379-6384六个节点用于操作。

[root@localhost create-cluster]# cat create-cluster
#!/bin/bash
# Settings
PORT=6378
TIMEOUT=2000
NODES=6
REPLICAS=1

......

echo "Usage: $0 [start|create|stop|watch|tail|clean]"
echo "start       -- Launch Redis Cluster instances."
echo "create      -- Create a cluster using redis-cli --cluster create."
echo "stop        -- Stop Redis Cluster instances."
echo "watch       -- Show CLUSTER NODES output (first 30 lines) of first node."
echo "tail <id>   -- Run tail -f of instance at base port + ID."
echo "clean       -- Remove all instances data, logs, configs."
echo "clean-logs  -- Remove just instances logs."

停止、启动集群,及自动生成的日志

[root@localhost create-cluster]# ./create-cluster stop
Stopping 6379
Stopping 6380
Stopping 6381
Stopping 6382
Stopping 6383
Stopping 6384

[root@localhost create-cluster]# ./create-cluster start
Starting 6379
Starting 6380
Starting 6381
Starting 6382
Starting 6383
Starting 6384

[root@localhost create-cluster]# ll
总用量 56
-rw-r--r--. 1 root root 1236 9月   1 00:04 6379.log
-rw-r--r--. 1 root root 1236 9月   1 00:04 6380.log
-rw-r--r--. 1 root root 1236 9月   1 00:04 6381.log
-rw-r--r--. 1 root root 1236 9月   1 00:04 6382.log
-rw-r--r--. 1 root root 1236 9月   1 00:04 6383.log
-rw-r--r--. 1 root root 1236 9月   1 00:04 6384.log
-rw-r--r--. 1 root root    0 9月   1 00:04 appendonly-6379.aof
-rw-r--r--. 1 root root    0 9月   1 00:04 appendonly-6380.aof
-rw-r--r--. 1 root root    0 9月   1 00:04 appendonly-6381.aof
-rw-r--r--. 1 root root    0 9月   1 00:04 appendonly-6382.aof
-rw-r--r--. 1 root root    0 9月   1 00:04 appendonly-6383.aof
-rw-r--r--. 1 root root    0 9月   1 00:04 appendonly-6384.aof
-rwxrwxr-x. 1 root root 2343 9月   1 00:02 create-cluster
-rw-r--r--. 1 root root  114 9月   1 00:04 nodes-6379.conf
-rw-r--r--. 1 root root  114 9月   1 00:04 nodes-6380.conf
-rw-r--r--. 1 root root  114 9月   1 00:04 nodes-6381.conf
-rw-r--r--. 1 root root  114 9月   1 00:04 nodes-6382.conf
-rw-r--r--. 1 root root  114 9月   1 00:04 nodes-6383.conf
-rw-r--r--. 1 root root  114 9月   1 00:04 nodes-6384.conf
-rw-rw-r--. 1 root root 1317 5月  16 00:07 README

新增节点

新增一个 Redis节点 使用如下命令将其加入集群

redis-cli --cluster add-node {新节点IP}:{新节点端口} {任意集群节点IP}:{对应端口} #添加为主节点
–cluster-slave --cluster-master-id {对应的主节点ID} # 在上一条命令后面加上此行命令将新节点添加为 对应主节点的从节点

优缺点

https://www.linuxidc.com/Linux/2018-12/155772.htm

Redis在3.0版正式引入redis-cluster集群这个特性。Redis集群是一个提供在多个Redis间节点间共享数据的程序集。Redis集群是一个分布式(distributed)、容错(fault-tolerant)的Redis内存K/V服务,集群可以使用的功能是普通单机Redis所能使用的功能的一个子集(subset),比如Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误。还有比如set里的并集(unions)和交集(intersections)操作,就没有实现。通常来说,那些处理命令的节点获取不到键值的所有操作都不会被实现。在将来,用户或许可以通过使用MIGRATE COPY命令,在集群上用计算节点(Computation Nodes) 来执行多键值的只读操作, 但Redis集群本身不会执行复杂的多键值操作来把键值在节点间移来移去。Redis集群不像单机版本的Redis那样支持多个数据库,集群只有数据库0,而且也不支持SELECT命令。Redis集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下继续处理命令。

Redis集群的优点:

无中心架构,分布式提供服务。数据按照slot存储分布在多个redis实例上。增加slave做standby数据副本,用于failover,使集群快速恢复。实现故障auto failover,节点之间通过gossip协议交换状态信息;投票机制完成slave到master角色的提升。支持在线增加或减少节点。降低硬件成本和运维成本,提高系统的扩展性和可用性。

Redis集群的缺点:

client实现复杂,驱动要求实现smart client,缓存slots mapping信息并及时更新。目前仅JedisCluster相对成熟,异常处理部分还不完善,比如常见的“max redirect exception”。客户端的不成熟,影响应用的稳定性,提高开发难度。节点会因为某些原因发生阻塞(阻塞时间大于clutser-node-timeout),被判断下线。这种failover是没有必要,sentinel也存在这种切换场景。

参考资料

快速搭建redis5.0集群
https://blog.csdn.net/qq_20597727/article/details/83385737

Redis-5.0.5集群配置
https://www.cnblogs.com/aquester/p/10916284.html

5.0中redis-cli的集群管理测试
https://blog.51cto.com/8370646/2309693

Java连接Redis集群
https://blog.csdn.net/wsc912406860/article/details/85341463

JedisCluster 原理介绍
https://www.jianshu.com/p/5ca98b5a336b

Redis 键(key) 命令
http://www.redis.com.cn/commands

Redis 5.0之后版本的高可用集群搭建
https://www.jianshu.com/p/8045b92fafb2

Redis的基础介绍与安装使用步骤:https://www.jianshu.com/p/2a23257af57b
Redis的基础数据结构与使用:https://www.jianshu.com/p/c95c8450c5b6
Redis核心原理:https://www.jianshu.com/p/4e6b7809e10a
Redis 5 之后版本的高可用集群搭建:https://www.jianshu.com/p/8045b92fafb2
Redis 5 版本的高可用集群的水平扩展:https://www.jianshu.com/p/6355d0827aea
Redis 5 集群选举原理分析:https://www.jianshu.com/p/e6894713a6d5
Redis 5 通信协议解析以及手写一个Jedis客户端:https://www.jianshu.com/p/575544f68615

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis5.0集群搭建(Redis Cluster) 的相关文章

  • Node.js 上通过套接字连接 Redis

    由于共享托管 目标主机上的我的 redis 服务器不在端口上运行 而是在非常特定的套接字上运行 可以通过套接字文件连接到该套接字 只有我的用户可以访问 但是 我还没有找到如何通过套接字指定连接node redis and connect r
  • Stackexchange.redis 缺乏“WAIT”支持

    我在客户端应用程序正在使用的负载均衡器后面有 3 个 Web API 服务器 我正在使用这个库来访问具有一个主服务器和几个从服务器的 Redis 集群 目前不支持 WAIT 操作 我需要此功能来存储新创建的用户会话并等待它复制到所有从属服务
  • 我的 Redis 自动生成的密钥

    我不知道我的 Redis 版本 4 0 9 到底发生了什么 我正在运行一个应用程序并使用 Redis 来存储我的数据库 但是 然后 Redis 自动创建 3 个新键 Backup1 Backup2 Backup3 并删除我的所有数据 这是我
  • 仅当尚未设置时才进行原子设置

    仅当尚未在 Redis 中设置时 是否有办法执行原子设置 具体来说 我正在创建一个像 myapp user user email 这样的用户 并且希望 Redis 在 user email 已被占用时返回错误 而不是默默地替换旧值 比如声明
  • PooledRedisClientManager 未释放连接

    我将 json 数据列表存储在 redis 中并使用 ServiceStack c 客户端访问它 我本质上是在管理自己的外键 我在其中存储zrangeid 我使用应用程序内部的接口从zrange然后从 Redis 获取底层 json 对象并
  • 如何在节点redis客户端上设置读取超时?

    在 github 上我没有看到读取超时的选项 https github com NodeRedis node redis https github com NodeRedis node redis There s connect timeo
  • Docker-compose Predis 不通过 PHP 连接

    我正在尝试使用 docker compose 将 PHP 与 redis 连接 docker compose yml version 2 services redis image redis 3 2 2 php image company
  • Redis INCRBY 有限制

    我想知道是否有一种方法可以通过我的应用程序的单次往返在 Redis 中执行此操作 对于给定的键K 其可能值V是范围内的任意整数 A B 基本上 它有上限和下限 When an INCRBY or DECRBY发出命令 例如INCRBY ke
  • Spring Data Redis JedisConnectionException:流意外结束

    雷迪斯3 0 5Spring数据Redis 1 3 6绝地武士2 6 3 我们的 Web 应用程序通过 pub sub 从 Redis 接收数据 还以键 值对的形式在 Redis 上执行数据读 写 读 写发生在监听线程 独立监控线程和htt
  • 如何将node.js管道传输到redis?

    我有很多数据要插入 SET INCR 到redis DB 所以我正在寻找pipeline http redis io topics pipelining 质量插入 http redis io topics mass insert通过node
  • 如何设置和获取Redis中存储的对象?

    我试图在 redis 中存储一个对象 当我获取该对象时 它似乎不起作用 I tried u User new u name blankman redis set test u x redis get test x name error 我想
  • 使用 Sentinels 升级 Redis 的最佳实践?

    我有 3 个 Redis 节点 由 3 个哨兵监视 我进行了搜索 文档似乎不清楚如何最好地升级此类配置 我目前使用的是 3 0 6 版本 我想升级到最新的 5 0 5 我对这方面的程序有几个疑问 升级两个大版本可以吗 我在我们的暂存环境中执
  • Spring Data JPA Redis:无法编写基于自定义方法的查询

    我已经使用 Redis 配置了 Spring Data JPA 并使用RedisRepositorieswith 提供了类似的方法find findAll 所有这些方法似乎都工作得很好 但我无法编写我的自定义方法 RedisEntity f
  • Laravel 所有会话 ID 与 Redis 驱动程序

    在我的应用程序中 我希望允许某些用户能够注销除他 她之外的所有其他用户 当会话驱动程序设置为文件时 我已经完成了此功能 但现在我使用 redis 作为会话驱动程序 并且我无法找到任何方法来列出所有当前会话 就像我在文件时所做的那样司机 问题
  • StackExchange.Redis Get 函数抛出 TimeoutException

    我在用着StackExchange Redis与 C 和StackExchangeRedisCacheClient Get函数抛出以下异常 myCacheClient Database StringGet txtKey Text myCac
  • 使用redis进行树形数据结构

    我需要为基于树的键值开发一个缓存系统 与Windows注册表编辑器非常相似 其中缓存键是字符串 表示树中到值的路径 可以是原始类型 int string bool double 等 或子树本身 例如 key root x y z w val
  • 如何将“.csv”数据文件导入Redis数据库

    如何将 csv 数据文件导入 Redis 数据库 csv 文件中包含 id 时间 纬度 经度 列 您能否向我建议导入 CSV 文件并能够执行空间查询的最佳方法 这是一个非常广泛的问题 因为我们不知道您想要什么数据结构 您期望什么查询等等 为
  • Spring Redis删除不删除key

    我正在尝试删除一个 Redis 键 但由于某种原因它没有删除 但也没有抛出异常 这是我要删除的代码 import com example service CustomerService import com example model Cu
  • 如何使用 Redis 自动删除与模式匹配的键

    在我的 Redis DB 中 我有很多prefix
  • 当 Jedis 与 Spring Data 一起使用时,为什么数据会以奇怪的键存储在 Redis 中?

    我将 Spring Data Redis 与 Jedis 一起使用 我正在尝试存储带有密钥的哈希值vc list id 我能够成功插入到redis 但是 当我使用 redis cli 检查密钥时 我没有看到密钥vc 501381 相反我看到

随机推荐

  • bat日期时间字符串的格式化处理

    bat日期时间字符串的格式化处理 一 时间 日期 二 字符串处理 一 时间 日期 Windows在批处理中显示的时间和日期格式如下 echo date 2023 05 25 周四 echo time 12 44 27 45 二 字符串处理
  • 【算法】 丑数 2,3,5。求第n个丑数

    因子中仅仅包含2 3 5的数 称为丑数 比如说14 就不是丑数 因为因子包含7 请输出所有丑数中的第n个丑数 include
  • ADNI数据集-数据分析11.17

    1 RID 是 Relative IDentifier 的英文缩写 相对标识符的意思 https www aoetc com 172960 html 2 ADNI1和ADNI2是医学研究上经常使用的数据集 ADNI数据集介绍 仅用于个人纪录
  • 应用在k8s上运行的几种网络模式

    k8s deployment service默认配置 应用部署在k8s上 首先想到的是应用k8s的默认service模式配置 应用通过service向集群内部 ClusterIP 和集群外部 NodePort 暴露服务 k8s中的其他应用通
  • linux系统一些网络配置文件

    etc hosts文件 etc hosts文件的作用是主机名映射到相应的主机IP地址 可以使用任意文本编辑器编辑 etc hosts 文件 如果系统中不存在 etc hosts 文件 请将 usr newconfig etc hosts 复
  • Elasticsearch 8.0 installation

    after creating an enrollment token on your existing cluster You can complete the following actions at any time Reset the
  • js&ts 常用工具函数

    JavaScript TypeScript 常用工具函数 Utils RGB转换 export const rgbToHex r number g number b number gt string r g b gt 1 lt lt 24
  • Windows Server服务器安全加固基线配置

    一 账户管理 认证授权 一 账户 1 管理缺省账户 安全基线项说明 对于管理员账号 要求更改缺省账户名称 禁用Guest 来宾 账户 操作步骤 进入控制面板 gt 管理工具 gt 计算机管理 在系统工具 gt 本地用户和组 缺省账户Admi
  • Spring Cloud简介,为什么需要Spring Cloud?

    一 为什么需要Spring Cloud 从分布式 微服务的角度而言 就是把我们一个大的项目分解成多个小的模块 这些小的模块组合起来 完成功能 而拆分出多个模块以后 就会出现各种各样的问题 而Spring Cloud提供了一整套的解决方案 S
  • 总结:eclipse编写struts.xml没有提示的问题

    原因 找不到约束文件 解决 联网 手工配 手工配置struts2的dtd约束文件 步骤说明 1 选择 Window gt preferences gt XML gt 点击Add 按钮 2 Location值 通过File System 选择
  • python 财务系统开源系统_10 大顶级开源 ERP 系统

    2014十大顶级开源ERP系统点评 原文网址链接 http www ctocio com hotnews 17865 html 如今 企业资源规划 ERP 和客户关系管理 CRM 系统的必要性已经被各种组织和企业所认可 ERP和CRM能够直
  • 关于“expected ';', ',' or ')' before '&' token”错误

    在GCC编译器上 出现该错误的主要原因是 在C语言里没有C 所谓的 按引用传递 例如C 可以写这样一个函数 void func int a 函数功能 在C语言无法这样使用 所以需要改为地址引用 void func int a 函数功能 具体
  • 基于Jenkins自动打包并部署Tomcat环境

    目录 1 配置git主机 2 配置jenkins主机 3 配置web主机 4 新建Maven项目 5 验证 Jenkins 自动打包部署结果 Jenkins 的工作原理是先将源代码从 SVN Git 版本控制系统中拷贝一份到本地 然后根据设
  • XSS、CSRF、SSRF漏洞的攻击原理以及防御

    目录 XSS 攻击原理 攻击方式 xss漏洞防范 CSRF CSRF攻击成功的两个必要条件 csrf漏洞防范
  • 安装Esxi系统&重装Esxi系统

    安装esxi系统 或者已经安装了esxi需要重装环境 Dell R730服务器 前期准备 将VMware ESXi 5 5 0的安装镜像要提前准备好 通过光碟 U盘 idrac管理界面挂载方式安装都行 1 加载VMware ESXi 5 5
  • 组装一台电脑需要选购哪些基本部件

    1 机箱 一般电脑的主要零件都放在这里 2 显示器 用来看电脑的工作过程 要不然 你都不知道电脑究竟在做什么 3 键盘和鼠标 向电脑输入有用的命令 让它去为我们工作 4 主板 这里是决定你这台电脑性能的重要零件之一 5 内存 当电脑工作时
  • Go Web编程实战(2)----流程控制语句

    目录 流程控制语句 if else语句 for循环语句 用for循环实现do while 用for循环实现while break指定跳出循环 continue语句 for range循环 遍历数组 遍历字符串 遍历map 遍历通道 chan
  • c语言程序位置式pid算法,增量式与位置式PID算法(C语言实现与电机控制项目)...

    4 2核心代码 函数功能 增量PI控制器 入口参数 编码器测量值 目标速度 返回 值 电机PWM 根据增量式离散PID公式 pwm Kp e k e k 1 Ki e k Kd e k 2e k 1 e k 2 e k 代表本次偏差 e k
  • linux 终端使用aplay播放wav

    aplay D plughw 0 0 xxx wav plughw后面的0 0指的是card0 device0 声卡id和设备id 根据个人情况会有不同 声卡id和设备id可以通过aplay l命令来查看 比如 upsquared ubun
  • Redis5.0集群搭建(Redis Cluster)

    Redis集群 redis集群是一个由多个主从节点群组成的分布式服务器群 它具有复制 高可用和分片特性 Redis集群不需要sentinel也能完成节点移除和故障转移的功能 需要将每个节点设置成集群模式 这种集群模式没有中心节点 可水平扩展