Redis5.0集群搭建(Redis Cluster)

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

面试官:介绍一下 Redis 三种集群模式
https://blog.csdn.net/qq_42700121/article/details/128062476
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值