纯手动创建Redis Cluster集群,最原始的三主三从创建方法

Cluster集群
Redis Cluster是官方提供的高可用方案,一个去中心化的Redis集群方案,所有的Redis节点彼此间互联(PING-PONG机制),客户端直连任意节点即可连接到Cluster集群,无需haproxy中间件。
总结:
1、 去中心化,分片存储,把所有的物理节点映射到[0-16383]共16384个slot(槽位)上,并不一定平均分配。
2、 Redis集群预分好16384个桶,当需要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod 16384的值,决定将一个key放到哪个桶中。
3、 支持主从机制,一个master可以有一个或多个从节点来保证集群的高可用性。
4、 master宕机需要经过集群中的所有master投票,如果有半数以上节点通信超时,则认为当前master宕掉。
5、 如果Cluster集群中的master没有slave,那么任意一台master宕掉后,集群不可用。
6、 集群如果超多半数以上master挂掉,无论是否有slave,集群进入fail状态。
7、 slave节点不会分配槽位
8、 Cluster集群最多支持1000个节点

环境
三台虚拟机,启动redis双实例,部署三主三从集群;此次是讲解最原始的Cluster集群创建,不使用官方的redis.trib.rb脚本创建,这是一个官方的ruby脚本。因为在公司生产中使用官方的脚本创建三台虚拟机双实例的Cluster集群,发现最后一台虚拟机始终是自己的6379和6380组成一对主从,即并非三台都是互为主从,有一对主从的是自己的实例。
172.16.1.7
172.16.1.31
172.16.1.61
#yum安装redis(需要epel源)
yum install -y redis
#创建多实例
mkdir -p /data/redis/{6379,6380}/{db,log}
配置文件

[[email protected] 6379]# cat /data/redis/6379/redis.conf
bind 172.16.1.7
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile /data/redis/6379/redis.pid
loglevel notice
logfile /data/redis/6379/log/redis.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 /data/redis/6379/db
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
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

#启动redis实例
redis-server /data/redis/6379/redis.conf
redis-server /data/redis/6380/redis.conf

#配置requirepass认证
#临时配置(不重启配置)

redis-cli -h 172.16.1.7 -p 6379
172.16.1.7:6379> config get requirepass
1) "requirepass"
2) ""
172.16.1.7:6379> config set requirepass 123456
OK
172.16.1.7:6379> config get requirepass
(error) NOAUTH Authentication required.
172.16.1.7:6379> auth 123456
OK
172.16.1.7:6379> config get requirepass
1) "requirepass"
2) "123456"

#永久配置,必须修改配置文件
#手动修改
requirepass "123456"

#直接保存在命令行中的配置
172.16.1.7:6380> config rewrite
#该命令会把配置刷到配置文件中(刷到磁盘永久化)
requirepass "123456"
#刷入redis.conf、nodes.conf配置文件,如果是集群的配置需要使用
#cluster saveconfig命令

创建cluster集群
修改配置文件

#每个cluster节点都必须启动对cluster集群的支持

cluster-enabled yes
cluster-config-file nodes-6379.conf #(会保存在数据目录下)
cluster-node-timeout 15000

#cluster集群中不能有slaveof的定义

slaveof 172.16.1.61 6379
cluster-enabled yes
cluster-config-file nodes-6380.conf
cluster-node-timeout 15000

Reading the configuration file, at line 57
>>> ‘slaveof 172.16.1.61 6379‘
slaveof directive not allowed in cluster mode

#查看redis进程,是以集群模式启动的

[[email protected] ~]# ps -ef|grep redis
root      1193     1  0 00:08 ?        00:00:01 redis-server 172.16.1.7:6379 [cluster]
root      1212     1  0 00:24 ?        00:00:00 redis-server 172.16.1.7:6380 [cluster] 

#此时集群的状态还是fail,因为还没有把其它的节点都加进来,槽位也还没有分配

redis-cli -h 172.16.1.7 -p 6379 -a 123456
172.16.1.7:6379> cluster info
cluster_state:fail
cluster_slots_assigned:1
cluster_slots_ok:1
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:1
cluster_size:1
cluster_current_epoch:0
cluster_my_epoch:0
cluster_stats_messages_sent:0
cluster_stats_messages_received:0
172.16.1.7:6379> cluster nodes
82424bf0ff964ca5486b7f904b95c155e6dceeb1 :6379 myself,master - 0 0 0 connected 15197

#在任意一个节点上把所有节点加入集群中
#把指定的节点添加到集群中

cluster meet 172.16.1.7 6380
172.16.1.7:6379> cluster nodes
965276bda73d2bce4a44a8fab6e18f676de54f15 172.16.1.61:6380 master - 0 1543768223343 0 connected
56572d4ef3b7e30c30a4956c87d4a6ea0050bef5 172.16.1.31:6379 master - 0 1543768221299 2 connected
673443984a3610fcaa2fcbf3d295f60b2f7f32ae 172.16.1.31:6380 master - 0 1543768222323 3 connected
26d3142fb8766e1cfc01978d01c17e287f4ebd38 172.16.1.61:6379 master - 0 1543768225389 4 connected
85142215ac8c6af9ad0a72fb6ac2a5d2be2608a1 172.16.1.7:6380 master - 0 1543768224368 0 connected
82424bf0ff964ca5486b7f904b95c155e6dceeb1 172.16.1.7:6379 myself,master - 0 0 1 connected 15197
172.16.1.7:6379> cluster info
cluster_state:fail
cluster_slots_assigned:1
cluster_slots_ok:1
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:1
cluster_current_epoch:5
cluster_my_epoch:1
cluster_stats_messages_sent:96
cluster_stats_messages_received:9

#在slave节点上指定master节点
#把当前节点设置为node_id的slave,即指定当前节点的master节点,在每个slave节点上执行

[[email protected] ~]#  redis-cli -h 172.16.1.7 -p 6380 -a 123456
172.16.1.7:6380> cluster nodes
85142215ac8c6af9ad0a72fb6ac2a5d2be2608a1 172.16.1.7:6380 myself,master - 0 0 5 connected
26d3142fb8766e1cfc01978d01c17e287f4ebd38 172.16.1.61:6379 master - 0 1543768446773 4 connected
82424bf0ff964ca5486b7f904b95c155e6dceeb1 172.16.1.7:6379 master - 0 1543768444120 1 connected 15197
965276bda73d2bce4a44a8fab6e18f676de54f15 172.16.1.61:6380 master - 0 1543768445753 0 connected
56572d4ef3b7e30c30a4956c87d4a6ea0050bef5 172.16.1.31:6379 master - 0 1543768441669 2 connected
673443984a3610fcaa2fcbf3d295f60b2f7f32ae 172.16.1.31:6380 master - 0 1543768444734 3 connected
172.16.1.7:6380> cluster replicate 26d3142fb8766e1cfc01978d01c17e287f4ebd38
OK

#最终结果

172.16.1.61:6380> cluster nodes
82424bf0ff964ca5486b7f904b95c155e6dceeb1 172.16.1.7:6379 master - 0 1543768678663 1 connected 15197
56572d4ef3b7e30c30a4956c87d4a6ea0050bef5 172.16.1.31:6379 master - 0 1543768682754 2 connected
965276bda73d2bce4a44a8fab6e18f676de54f15 172.16.1.61:6380 myself,slave 56572d4ef3b7e30c30a4956c87d4a6ea0050bef5 0 0 0 connected
85142215ac8c6af9ad0a72fb6ac2a5d2be2608a1 172.16.1.7:6380 slave 26d3142fb8766e1cfc01978d01c17e287f4ebd38 0 1543768683780 5 connected
673443984a3610fcaa2fcbf3d295f60b2f7f32ae 172.16.1.31:6380 slave 82424bf0ff964ca5486b7f904b95c155e6dceeb1 0 1543768679697 3 connected
26d3142fb8766e1cfc01978d01c17e287f4ebd38 172.16.1.61:6379 master - 0 1543768681741 4 connected

分配槽位
#redis3.0.0规定槽位一共有16384个,我们这里是平均分配到三个主节点上。

for i in {0..5460};do redis-cli -h 172.16.1.7 -p 6379 -a 123456 cluster addslots $i >/dev/null;done
for i in {5461..10922};do redis-cli -h 172.16.1.31 -p 6379 -a 123456 cluster addslots $i >/dev/null;done
for i in {10923..16383};do redis-cli -h 172.16.1.61 -p 6379 -a 123456 cluster addslots $i >/dev/null;done

#把集群配置写入磁盘,每个节点都需要执行
cluster saveconfig

#检查集群状态

172.16.1.7:6379> 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:5
cluster_my_epoch:1
cluster_stats_messages_sent:2972
cluster_stats_messages_received:2972
172.16.1.7:6379> cluster nodes
965276bda73d2bce4a44a8fab6e18f676de54f15 172.16.1.61:6380 slave 56572d4ef3b7e30c30a4956c87d4a6ea0050bef5 0 1543769558241 2 connected
56572d4ef3b7e30c30a4956c87d4a6ea0050bef5 172.16.1.31:6379 master - 0 1543769553136 2 connected 5461-10922
673443984a3610fcaa2fcbf3d295f60b2f7f32ae 172.16.1.31:6380 slave 82424bf0ff964ca5486b7f904b95c155e6dceeb1 0 1543769559263 3 connected
26d3142fb8766e1cfc01978d01c17e287f4ebd38 172.16.1.61:6379 master - 0 1543769556196 4 connected 10923-15196 15198-16383
85142215ac8c6af9ad0a72fb6ac2a5d2be2608a1 172.16.1.7:6380 slave 26d3142fb8766e1cfc01978d01c17e287f4ebd38 0 1543769557220 5 connected
82424bf0ff964ca5486b7f904b95c155e6dceeb1 172.16.1.7:6379 myself,master - 0 0 1 connected 0-5460 15197

#配置集群masterauth认证,在集群创建成功之后配置,不然集群会创建失败

172.16.1.7:6379> config set masterauth 123456
OK
172.16.1.7:6379> config get masterauth
1) "masterauth"
2) "123456"
172.16.1.7:6379> config rewrite
OK

原文地址:http://blog.51cto.com/13691477/2328115

时间: 2024-09-30 08:02:22

纯手动创建Redis Cluster集群,最原始的三主三从创建方法的相关文章

Redis Cluster集群搭建测试

# Redis Clutser # ## 一.Redis Cluster集群 ## 参考资料: http://www.cnblogs.com/lykxqhh/p/5690923.html Redis集群搭建的方式有多种,例如使用zookper等,但从redis3.0之后版本支持redis cluster集群,Redis Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接.其redis cluster架构图如下: 其结构特点: 1.所有的redis节点彼此互

深入分析redis cluster 集群

深入分析redis cluster 集群安装配置详解 下面小编来为各位介绍一篇深入分析redis cluster 集群安装配置详解,如果你希望做数据库集群就可以来看看此文章的哦. http://ruby.taobao.org/  # gem source -l    # gem install redis --version 3.0.0  //安装gem_redis  Successfully installed redis-3.0.0  1 gem installed  Installing

Redis Cluster集群总结性梳理

前面已经介绍了Redis Cluster集群及其部署过程,下面再补充下有关Redis Cluster应用原理部分内容,以便更加深刻透彻地理解Redis Cluster. 一.Redis Cluster集群最核心的三个目标 性能:这是Redis赖以生存的看家本领,增加集群功能后当然不能对性能产生太大影响,所以Redis采取了P2P而非Proxy方式.异步复制.客户端重定向等设计,而牺牲了部分的一致性.使用性. 水平扩展:集群的最重要能力当然是扩展,文档中称可以线性扩展到1000结点. 可用性:在C

Redis Cluster集群搭建与应用

1.redis-cluster设计 Redis集群搭建的方式有多种,例如使用zookeeper,但从redis 3.0之后版本支持redis-cluster集群,redis-cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接.其redis-cluster架构图如下: 其结构特点 所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽. 节点的fail是通过集群中超过半数的节点检测失效时才生效. 客户端与redis节点直

redis集群与分片(2)-Redis Cluster集群的搭建与实践

Redis Cluster集群 一.redis-cluster设计 Redis集群搭建的方式有多种,例如使用zookeeper等,但从redis 3.0之后版本支持redis-cluster集群,Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接.其redis-cluster架构图如下: 其结构特点: 1.所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.     2.节点的fail是通过集群中超过半

Redis Cluster 集群使用(3)

简介 Redis3.0版本之前,可以通过Redis Sentinel(哨兵)来实现高可用(HA),从3.0版本之后,官方推出了Redis Cluster,它的主要用途是实现数据分片(Data Sharding),不过同样可以实现HA,是官方当前推荐的方案.在Redis Sentinel模式中,每个节点需要保存全量数据,冗余比较多,而在Redis Cluster模式中,每个分片只需要保存一部分的数据,对于内存数据库来说,还是要尽量的减少冗余.在数据量太大的情况下,故障恢复需要较长时间. Redis

Kubernetes 通过statefulset部署redis cluster集群

Kubernetes 通过statefulset部署redis cluster集群 作者: 张首富 时间: 2019-02-19 个人博客地址: https://www.zhangshoufu.com QQ群: 895291458 需要有redis基础 Redis集群架构图 每个Mater 都可以拥有多个slave.当Master掉线后,redis cluster集群会从多个Slave中选举出来一个新的Matser作为代替,而旧的Master重新上线后变成 Master 的Slave. 部署re

Redis Cluster集群部署搭建

在Oracle的路上走了许多年,换换感觉,尝试一下新的知识,也是一个不错的感觉.Redis,一个超轻量化的内存数据库,只做一小块数据库功能实现,却非常优秀的一个产品.今天,就分享一下安装Redis集群的过程. 搭建redis集群,建议至少需要准备3台服务器,共搭建6个节点,3个master,3个slave,并且要求3个master节点不能全部跑到同一台服务器上,保证节点安全,3台服务器的配置相同,使用redistest账号搭建,对应的端口是7000/7001/7002端口 我的集群分配如下,每个

JFinal redis cluster集群插件

JFinal 框架到了2.1版本号,可是依旧仅仅支持redis的主从集群,没有看到Cluster集群的插件.笔者照着主从的插件方式,改了改,实现了个简单的插件,先使用起来,兴许会更新完好版本号. 插件地址:点击打开链接 附上源代码: package com.sxt.jfinal.rediscluster; import java.util.Set; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import redis