集群搭建
- 1安装redis
* 处理步骤
cd /usr/local/
wget http://download.redis.io/releases/redis-4.0.6.tar.gz
tar -zxvf redis-4.0.6.tar.gz
cd redis-4.0.6
make && make install
- 2新建集群文件夹
- 处理步骤
cd /usr/local/
mkdir redis_cluster
cd redis_cluster
mkdir 7000 7001 7002 7003 7004 7005
cp /usr/local/redis-4.0.6/redis.conf /usr/local/redis_cluster/7000
- 3修改redis_cluster/7000到redis_cluster/7005文件夹下面的Redis.conf
* 处理步骤
daemonize yes //redis后台运行
port 7000 //端口7000,7002,7003
cluster-enabled yes //开启集群 把注释#去掉
cluster-config-file nodes.conf //集群的配置 配置文件首次启动自动生成 7000,7001,7002
cluster-node-timeout 5000 //请求超时 设置5秒够了
appendonly yes //aof日志开启 有需要就开启,它会每次写操作都记录一条日志
bind 127.0.0.1 172.16.244.144(此处为自己内网的ip地址,centos7下面采用ip addr来查看,其他系统试一下ifconfig查看,ip为)
dir /root/application/program/redis-cluster/7000/ //修改数据文件存放地址,以端口号为目录名来区分(这点一定要注意)
- 在其他节点也修改完Redis.conf
* 处理步骤
cp /usr/local/redis_cluster/7000/redis.conf /usr/local/redis_cluster/7001
cp /usr/local/redis_cluster/7000/redis.conf /usr/local/redis_cluster/7002
cp /usr/local/redis_cluster/7000/redis.conf /usr/local/redis_cluster/7003
cp /usr/local/redis_cluster/7000/redis.conf /usr/local/redis_cluster/7004
cp /usr/local/redis_cluster/7000/redis.conf /usr/local/redis_cluster/7005
- 4启动所有redis节点cd redis-server所在的路径
* 处理步骤
cp /usr/local/redis-4.0.6/src/redis-server /usr/local/ redis-cluster
cd /usr/local/redis_cluster/7000 ../redis-server ./redis.conf
cd /usr/local/redis-cluster/7001 ../redis-server ./redis.conf
cd /usr/local/redis-cluster/7002 ../redis-server ./redis.conf
cd /usr/local/redis-cluster/7003 ../redis-server ./redis.conf
cd /usr/local/redis-cluster/7004 ../redis-server ./redis.conf
cd /usr/local/redis-cluster/7005 ../redis-server ./redis.conf
- 5创建集群
* 前面已经准备好了搭建集群的redis节点,接下来我们要把这些节点都串连起来搭建集群。官方提供了一个工具:redis-trib.rb(/usr/local/redis-4.0.6/src/redis-trib.rb) 看后缀就知道这鸟东西不能直接执 行,它是用ruby写的一个程序,所以我们还得安装ruby.
yum -y install ruby ruby-devel rubygems rpm-build
gem install redis
- 如果gem install redis发现报错
curl -L get.rvm.io | bash -s stable
source /usr/local/rvm/scripts/rvm
rvm list known
rvm install 2.3.3
rvm use 2.3.3
ruby --version
gem install redis
- 6开启集群工作
cd /usr/local/redis-4.0.6/src
redis5.0以下用如下命令启动
./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
redis5.0及以上用如下命令启动
redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 --cluster-replicas 1

- 测试集群是否正常
./redis-cli -c -p 7000
- 如果搭建失败,请用此命令将所有启动的redis server一个个关闭掉
./redis-cli -p 7000 shutdown
---------------------------------------------------------------------------------割-----------------------------------------------------------------------------------------------
Redis 集群的数据分片
概念:Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽,
* 举个例子,比如当前集群有3个节点,那么:
* 节点 A 约包含 0 到 5500号哈希槽.
* 节点 B 约包含5501 到 11000 号哈希槽.
* 节点 C 约包含11001 到 16384号哈希槽.
* 查看集群信息redis-cli -p 7000 cluster nodes | grep master
* 这种结构很容易添加或者删除节点. 比如如果我想新添加个节点D, 我需要从节点 A, B, C中得部分槽到D上. 如果我想移除节点A,需要将A中的槽移到B和C节点上,然后将没有任何槽的A节点从集群中移除即可. 由于从一个节点将哈希槽移动到另一个节点并不会停止服务,所以无论添加删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态.
- 从Redis宕机讲解分布式锁执行的异常场景流程
- 从Server服务宕机讲解分布式锁执行的异常场景流程
- Redis 集群的主从复制模型
- 为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有N-1个复制品. 在我们例子中具有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少5501-11000这个范围的槽而不可用.Redis集群做主从备份解决了这个问题
- Redis 一致性保证(redis是先返回数据再进行主从复制)
- 主节点对命令的复制工作发生在返回命令回复之后, 因为如果每次处理命令请求都需要等待复制操作完成的话, 那么主节点处理命令请求的速度将极大地降低 —— 我们必须在性能和一致性之间做出权衡。 注意:Redis 集群可能会在将来提供同步写的方法。 Redis 集群另外一种可能会丢失命令的情况是集群出现了网络分区, 并且一个客户端与至少包括一个主节点在内的少数实例被孤立。
- 手把手测试故障转移
redis-cli -p 7000 debug segfault //关闭
redis-cli -p 7001 cluster nodes | grep master
------------------------------------------------------------------------------------------------------------割--------------------------------------------------------------------------------------
Redis集群分片重哈希
- 采用SSH连接远程服务器
- ssh命令安装过程:https://blog.csdn.net/DanielAntony/article/details/87997574
- 集群重新分片

手动处理solt节点槽重新分片
- ./redis-trib.rb reshard 127.0.0.1:6383或./redis-cli --cluster reshard 127.0.0.1:6383
- 你想移动多少个槽( 从1 到 16384)? all

- 添加一个新的主节点
./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000
或./redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000
- 添加一个新的从节点
./redis-trib.rb add-node --slave 127.0.0.1:7006 127.0.0.1:7000
或./redis-cli --cluster add-node --slave 127.0.0.1:7006 127.0.0.1:7000
- 移除一个节点
./redis-trib.rb del-node 127.0.0.1:7000 `<node-id>`
或./redis-cli --cluster del-node 127.0.0.1:7000 `<node-id>`
第一个参数是任意一个节点的地址,第二个节点是你想要移除的节点地址。
* 移除主节点【先确保节点里面没有slot】
* 使用同样的方法移除主节点,不过在移除主节点前,需要确保这个主节点是空的. 如果不是空的,需要将这个节点的数据重新分片到其他主节点上.
* 替代移除主节点的方法是手动执行故障恢复,被移除的主节点会作为一个从节点存在,不过这种情况下不会减少集群节点的数量,也需要重新分片数据.
* 移除从节点 直接移除成功
---------------------------------------------------------------------------割---------------------------------------------------------------------------------------
Redis集群整合Springboot
- 大多数用户可能会使用RedisTemplate它及其相应的包org.springframework.data.redis.core- 由于其丰富的功能集,该模板实际上是Redis模块的中心类。该模板为Redis交互提供了高级抽象。虽然RedisConnection提供了接受和返回二进制值(byte数组)的低级方法,但模板负责序列化和连接管理,使用户无需处理这些细节。
- 引入spring-data-redis pom依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- 引入redistemplate
* 引入bean redisTemplate的使用,类型于:monogoTemplate、jdbcTemplate数据库连接工具
* 编写redisTemplate类,设置redisConnectFactory
- 配置yml配置文件
spring: redis: timeout: 6000 password: #host: 47.105.163.46 #port: 6379 cluster: nodes: 47.105.163.46:6379,47.105.163.46:6380,47.105.163.46:6381,47.105.163.46:6382,47.105.163.46:6383,47.105.163.46:6384 # 获取失败 最大重定向次数 max-redirects: 3 lettuce: pool: #max-active: 1000 #连接池最大连接数(使用负值表示没有限制) max-idle: 10 # 连接池中的最大空闲连接 min-idle: 5 # 连接池中的最小空闲连接 max-wait: -1 max-active: 1000
源码地址:https://gitee.com/jiawenzhang/RedisCluster.git
