工作原理
节选自redis官方文档:http://www.redis.cn/topics/cluster-tutorial.html
Redis集群介绍
Redis 集群是一个提供在多个Redis间节点间共享数据的程序集。
Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误.
Redis 集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下继续处理命令. Redis 集群的优势:
- 自动分割数据到不同的节点上。
- 整个集群的部分节点失败或者不可达的情况下能够继续处理命令。
Redis 集群的数据分片
Redis 集群没有使用一致性hash, 而是引入了 哈希槽的概念.
Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽,举个例子,比如当前集群有3个节点,那么: - 节点 A 包含 0 到 5500号哈希槽.
- 节点 B 包含5501 到 11000 号哈希槽.
- 节点 C 包含11001 到 16384号哈希槽.
这种结构很容易添加或者删除节点. 比如如果我想新添加个节点D, 我需要从节点 A, B, C中得部分槽到D上. 如果我像移除节点A,需要将A中得槽移到B和C节点上,然后将没有任何槽的A节点从集群中移除即可. 由于从一个节点将哈希槽移动到另一个节点并不会停止服务,所以无论添加删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态.
Redis 集群的主从复制模型
为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有N-1个复制品.
在我们例子中具有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少5501-11000这个范围的槽而不可用.
然而如果在集群创建的时候(或者过一段时间)我们为每个节点添加一个从节点A1,B1,C1,那么整个集群便有三个master节点和三个slave节点组成,这样在节点B失败后,集群便会选举B1为新的主节点继续服务,整个集群便不会因为槽找不到而不可用了
不过当B和B1 都失败后,集群是不可用的.
redis安装过程
1、下载redis安装包
2、解压
cd /app
tar zxf redis-3.2.11.tar.gz
mv redis-3.2.11.tar.gz redis
3、编译安装
cd redis
make && make install
4、创建相关目录,将相关命令从src目录复制到bin目录
mkdir -pv /app/redis/{bin,conf,data,logs}
5、使用utils中的install_server.sh安装redis server
部署过程
Redis-cluster搭建
1、从测试打包已经编译redis文件夹,上传至需要安装的服务器
2、解压至app目录,目录结构如下,其中data,conf,logs为编译完成后自行创建的目录,分别用来存放数据文件,配置文件,日志文件,data目录下自行创建以端口号命名的文件夹,分别用来存放各个端口号实例的数据文件
-rw-rw-r-- 1 root root 92766 Sep 21 22:20 00-RELEASENOTES
drwxr-xr-x 2 root root 4096 Dec 20 16:40 bin
-rw-rw-r-- 1 root root 53 Sep 21 22:20 BUGS
drwxr-xr-x 2 root root 4096 Jan 4 15:37 conf
-rw-rw-r-- 1 root root 1805 Sep 21 22:20 CONTRIBUTING
-rw-rw-r-- 1 root root 1487 Sep 21 22:20 COPYING
drwxr-xr-x 10 root root 4096 Jan 3 11:24 data
drwxrwxr-x 7 root root 4096 Dec 20 14:50 deps
-rw-rw-r-- 1 root root 11 Sep 21 22:20 INSTALL
drwxr-xr-x 2 root root 4096 Jan 4 15:37 logs
-rw-rw-r-- 1 root root 151 Sep 21 22:20 Makefile
-rw-rw-r-- 1 root root 4223 Sep 21 22:20 MANIFESTO
-rw-rw-r-- 1 root root 6834 Sep 21 22:20 README.md
-rw-rw-r-- 1 root root 46695 Sep 21 22:20 redis.conf
-rwxrwxr-x 1 root root 271 Sep 21 22:20 runtest
-rwxrwxr-x 1 root root 280 Sep 21 22:20 runtest-cluster
-rwxrwxr-x 1 root root 281 Sep 21 22:20 runtest-sentinel
-rw-rw-r-- 1 root root 7606 Sep 21 22:20 sentinel.conf
drwxrwxr-x 2 root root 4096 Dec 20 14:51 src
drwxrwxr-x 10 root root 4096 Sep 21 22:20 tests
drwxrwxr-x 7 root root 4096 Jan 4 14:36 utils
3、修改各个端口的配置文件,以node1:7000的配置文件为例,根据情况修改
bind node1
protected-mode yes
port 7000
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile /var/run/redis_7000.pid
loglevel notice
logfile /app/redis/logs/redis_7000.log
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /app/redis/data/7000
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 15000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
4、启动对应端口的服务(所有节点的主从都启动),以7000为例
/app/redis/bin/redis-server /app/redis/conf/7000.conf
5、创建集群
/app/redis/bin/redis-trib.rb create node1:7000 node2:7000 node2:7000
[root@node1 bin]# ./redis-trib.rb check node1:7000
>>> Performing Cluster Check (using node node1:7000)
M: 3b485951a72e16133464585dc2920c10ce75967b node1:7000
slots:5461-10922 (5461 slots) master
0 additional replica(s)
M: 54d5eb9415289228b05b28fe585bd5ab6e9bc0bc node3:7000
slots:0-5460 (5461 slots) master
0 additional replica(s)
M: b6dd7c3d5af4ffc37e70d7eb538a3f9b0ae5a84f node2:7000
slots:10923-16383 (5461 slots) master
0 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
6、从节点的添加需要在数据迁移之后
数据迁移
根据实际情况,参考:https://www.18188.org/articles/2016/04/23/1461374145366.html 进行数据迁移。
1、将所有的slot都转移到一台主实例
[root@node1 bin]# ./redis-trib.rb reshard --from b6dd7c3d5af4ffc37e70d7eb538a3f9b0ae5a84f --to 3b485951a72e16133464585dc2920c10ce75967b --slots 5462 --yes node1:7000
[root@node1 bin]# ./redis-trib.rb reshard --from 54d5eb9415289228b05b28fe585bd5ab6e9bc0bc --to 3b485951a72e16133464585dc2920c10ce75967b --slots 5462 --yes node1:7000
2、将原有的阿里云redis备份rdb文件下载放到对应目录
cp /app/hins2533955_data_20180105195042.rdb /app/redis/data/7000/dump.rdb
3、重启将备份文件读入,重启完成连接进入使用dbsize查看数据是否导入
/app/redis/bin/redis-cli -h node1 -p 7000 shutdown
/app/redis/bin/redis-server /app/redis/conf/7000.conf
4、重新分配slot
[root@node1 bin]# ./redis-trib.rb reshard --from 3b485951a72e16133464585dc2920c10ce75967b --to b6dd7c3d5af4ffc37e70d7eb538a3f9b0ae5a84f --slots 5462 --yes node2:7000
[root@node1 bin]# ./redis-trib.rb reshard --from 3b485951a72e16133464585dc2920c10ce75967b --to 54d5eb9415289228b05b28fe585bd5ab6e9bc0bc --slots 5462 --yes node3:7000
5、增加从节点,各节点对应关系:
1.node1:7000(主)---》node4:7000(从)
2.node2:7000(主)---》node5:7000(从)
3.node3:7000(主)---》 node6:7000(从)
[root@node1 bin]# ./redis-trib.rb check node1.7000
Invalid IP or Port (given as node1.7000) - use IP:Port format
[root@node1 bin]# ./redis-trib.rb check node1:7000
>>> Performing Cluster Check (using node node1:7000)
M: 3b485951a72e16133464585dc2920c10ce75967b node1:7000
slots:10924-16383 (5460 slots) master
0 additional replica(s)
M: b6dd7c3d5af4ffc37e70d7eb538a3f9b0ae5a84f node2:7000
slots:0-5461 (5462 slots) master
0 additional replica(s)
M: 54d5eb9415289228b05b28fe585bd5ab6e9bc0bc node3:7000
slots:5462-10923 (5462 slots) master
0 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@node1 bin]# ./redis-trib.rb add-node --slave --master-id 3b485951a72e16133464585dc2920c10ce75967b node4:7000 node1:7000
>>> Adding node node4:7000 to cluster node1:7000
>>> Performing Cluster Check (using node node1:7000)
M: 3b485951a72e16133464585dc2920c10ce75967b node1:7000
slots:10924-16383 (5460 slots) master
0 additional replica(s)
M: b6dd7c3d5af4ffc37e70d7eb538a3f9b0ae5a84f node2:7000
slots:0-5461 (5462 slots) master
0 additional replica(s)
M: 54d5eb9415289228b05b28fe585bd5ab6e9bc0bc node3:7000
slots:5462-10923 (5462 slots) master
0 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node node4:7000 to make it join the cluster.
Waiting for the cluster to join...
>>> Configure node as replica of node1:7000.
[OK] New node added correctly.
[root@node1 bin]# ./redis-trib.rb add-node --slave --master-id b6dd7c3d5af4ffc37e70d7eb538a3f9b0ae5a84f node5:7000 node2:7000
>>> Adding node node5:7000 to cluster node2:7000
>>> Performing Cluster Check (using node node2:7000)
M: b6dd7c3d5af4ffc37e70d7eb538a3f9b0ae5a84f node2:7000
slots:0-5461 (5462 slots) master
0 additional replica(s)
S: 8ff59145b1d3d7fd57923f3cb9c3444f7236d7b1 node4:7000
slots: (0 slots) slave
replicates 3b485951a72e16133464585dc2920c10ce75967b
M: 54d5eb9415289228b05b28fe585bd5ab6e9bc0bc node3:7000
slots:5462-10923 (5462 slots) master
0 additional replica(s)
M: 3b485951a72e16133464585dc2920c10ce75967b node1:7000
slots:10924-16383 (5460 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.
>>> Send CLUSTER MEET to node node5:7000 to make it join the cluster.
Waiting for the cluster to join.
>>> Configure node as replica of node2:7000.
[OK] New node added correctly.
[root@node1 bin]# ./redis-trib.rb add-node --slave --master-id 54d5eb9415289228b05b28fe585bd5ab6e9bc0bc node6:7000 node3:7000
>>> Adding node node6:7000 to cluster node3:7000
>>> Performing Cluster Check (using node node3:7000)
M: 54d5eb9415289228b05b28fe585bd5ab6e9bc0bc node3:7000
slots:5462-10923 (5462 slots) master
0 additional replica(s)
S: c09449b9dce5af4ac485ccedb664188229d75430 node5:7000
slots: (0 slots) slave
replicates b6dd7c3d5af4ffc37e70d7eb538a3f9b0ae5a84f
S: 8ff59145b1d3d7fd57923f3cb9c3444f7236d7b1 node4:7000
slots: (0 slots) slave
replicates 3b485951a72e16133464585dc2920c10ce75967b
M: b6dd7c3d5af4ffc37e70d7eb538a3f9b0ae5a84f node2:7000
slots:0-5461 (5462 slots) master
1 additional replica(s)
M: 3b485951a72e16133464585dc2920c10ce75967b node1:7000
slots:10924-16383 (5460 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.
>>> Send CLUSTER MEET to node node6:7000 to make it join the cluster.
Waiting for the cluster to join.
>>> Configure node as replica of node3:7000.
[OK] New node added correctly.
[root@node1 bin]# ./redis-trib.rb check node1:7000
>>> Performing Cluster Check (using node node1:7000)
M: 3b485951a72e16133464585dc2920c10ce75967b node1:7000
slots:10924-16383 (5460 slots) master
1 additional replica(s)
S: 8ff59145b1d3d7fd57923f3cb9c3444f7236d7b1 node4:7000
slots: (0 slots) slave
replicates 3b485951a72e16133464585dc2920c10ce75967b
S: 7501954b635724d66285afbb95841f4b49df5645 node6:7000
slots: (0 slots) slave
replicates 54d5eb9415289228b05b28fe585bd5ab6e9bc0bc
S: c09449b9dce5af4ac485ccedb664188229d75430 node5:7000
slots: (0 slots) slave
replicates b6dd7c3d5af4ffc37e70d7eb538a3f9b0ae5a84f
M: 54d5eb9415289228b05b28fe585bd5ab6e9bc0bc node3:7000
slots:5462-10923 (5462 slots) master
1 additional replica(s)
M: b6dd7c3d5af4ffc37e70d7eb538a3f9b0ae5a84f node2:7000
slots:0-5461 (5462 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.
原贴地址:http://blog.51cto.com/13544424/2058280
相关推荐
Redis Cluster是Redis官方提供的分布式解决方案,它通过分片(sharding)技术将数据分散存储在多个节点上,实现了数据的高可用性和可扩展性。这个压缩包“redis-cluster”应该是包含了一组配置好的Redis Cluster环境...
本篇将详细介绍如何使用Docker Compose来部署一个Redis Cluster集群,并对Redis的相关配置进行解析。 **一、Docker Compose简介** Docker Compose是一个定义和运行多容器Docker应用的工具。通过YAML文件(如docker-...
Redis Cluster 自动处理主节点故障,通过选举新的主节点并迁移数据。然而,你仍然需要定期检查集群状态,确保一切正常。使用 `redis-cli` 的 `CLUSTER` 命令,如 `CLUSTER NODES` 和 `CLUSTER INFO`。 ### 8. 扩展...
以下是对"Linux-CentOS中redisCluster部署指南(redis-5.0.3)"的详细解释和相关知识点: 一、Redis Cluster简介 Redis Cluster是Redis官方提供的分布式解决方案,通过数据分片技术实现了数据的自动分发和容灾,支持...
在CacheCloud自动化运维中,Redis-Cluster的应用实例管理是非常重要的一个环节,它涉及到节点的上下线、故障迁移以及数据迁移等多个方面。接下来,我们将详细探讨这些知识点。 ##### 1-节点运维 **(1)Master节点...
Redis Cluster是Redis官方提供的分布式解决方案,它通过分片(sharding)技术将数据分散存储在多个节点上,实现了数据的高可用性和可扩展性。在本压缩包中,你将找到关于配置Redis Cluster的详细步骤和相关文件。...
Redis Cluster是Redis官方提供的分布式解决方案,它允许用户在多个节点之间分发数据,提供高可用性和可扩展性。本文将详细解析如何搭建Redis Cluster集群,包括集群的基本概念、配置、节点间通信以及常见问题处理。 ...
10. **Cluster 集群**:Redis Cluster 提供了数据分区和分布式功能,允许多个 Redis 实例共享同一个键空间,支持自动分片和容错能力。 通过理解和掌握这些知识点,你将能够有效地在 Windows 环境中安装、配置和使用...
`redis-trib.rb reshard` 提供了这个功能,但同样需要注意可能的数据迁移影响。 要运行 `redis-trib.rb`,你需要确保环境已经安装了 Ruby 并且 Ruby Gem 包含 `redis` 和 `redis-trib`。在命令行中,你可以通过 `...
除了介绍概念和配置之外,为了全面掌握Redis集群,需要深入了解的数据迁移、故障转移、负载均衡、扩展性、性能优化以及数据一致性等高级主题。例如,在数据迁移时,集群必须在不影响对外服务的情况下将数据从一个...
随着数据量的增长,单机的Redis可能无法满足高可用性和扩展性的需求,这时就需要引入Redis集群(Redis Cluster)。Redis Cluster提供了一种分布式解决方案,可以在多台服务器上分布数据,实现数据的自动分片...
标题“DB-Redis-Cluster-Lib”...通过深入研究这个压缩包的内容,你可以获得实践经验,不仅学会如何部署和管理Redis集群,还能了解到集群环境中的常见问题及解决方案。这对于提升你的数据库管理和运维技能非常有帮助。
5. **兼容性**:支持多种Redis版本及集群模式,包括Redis Standalone、Sentinel、Cluster等,适应不同的部署环境。 6. **命令过滤**:可以根据需要过滤迁移的命令类型,比如只迁移特定的数据结构或排除敏感数据。 ...
Redis 是一个高性能的键值数据库,常用于缓存和数据持久化。它的高效性得益于其内存存储特性,以及丰富的数据结构支持,如字符串、哈希、列表、集合和有序集合。Redis-3.2.11.tar.gz 文件是Redis 3.2.11版本的源代码...
9. **Cluster 分片**:Redis Cluster 实现了数据分片,可以将数据分散在多个节点上,支持大规模数据存储和分布式操作。 10. **内存管理**:Redis 默认使用 LRU(Least Recently Used)策略进行内存淘汰,当内存达到...
7. **故障转移**:当某个节点发生故障时,Redis集群能够自动将该节点的槽和数据迁移到其他节点,保持服务的连续性。 8. **客户端连接**:连接到Redis集群的客户端需要支持集群模式,它们需要知道集群的所有节点,...
Redis 是一个高性能的键值数据库,常用于缓存、数据持久化等场景。在 Redis 的早期版本中,创建集群功能需要借助 `redis-trib.rb` 这个脚本来完成。这个脚本是用 Ruby 语言编写的,主要用于帮助用户设置和管理 Redis...
在分布式系统中,为了提高服务的可用性和扩展性,通常会采用集群(Cluster)模式部署 Redis。标题中的 "redis-3.2.0.gem" 文件是用于在 Ruby 环境下安装 Redis 3.2.0 版本的 Gem 包,它包含了构建和管理 Redis 集群...
RedisSyncer是一个redis多任务同步工具集,应用于redis单实例及集群同步。 该工具集包括: redis 同步服务引擎 redissyncer-server redissycner 客户端 redissyncer-cli dashboard web控制面板 redissycner-...