① 集群原理
在redis集群中,所有的redis节点彼此互相连接,节点内部使用二进制协议优化传输速度和带宽。当一个节点挂掉之后,集群中超过半数的节点检测此节点失效时才认为该节点已经失效。redis集群中的任意节点都可以直接和JAVA客户端连接。redis集群上数据分配规则采用hash slot即哈希槽,redis集群中内置了16384个hash slot,当有数据需要存储时,redis会首先使用crc16算法对key进行计算,将计算结果对16384取余,这样每个key都会对一个取值在0~16384之间的哈希槽,redis则根据这个余数将该条数据存储在对应的redis节点上,开发者可以根据每个redis实例的性能来调整每个redis实例上hash slot的分布范围。
② 集群规划
本次测试采用伪分布式集群方式搭建,采用不同端口表示不同的redis服务器。
主节点:192.168.216.133:8001、192.168.216.133:8002、192.168.216.133:8003
从节点:192.168.216.133:8004、192.168.216.133:8005、192.168.216.133:8006
③ 集群配置
redis集群管理工具redis-trib.rb依赖Ruby环境,首先需要安装Ruby环境,所以需要进行安装。
安装RVM,RVM是一个命令行工具,可以提供一个便捷的多版本Ruby环境的管理和切换,安装方式可以参考我另一篇博客:https://editor.csdn.net/md/?articleId=128752991
安装完RVM环境后,需要安装redis依赖
gem install redis
准备redis环境
准备redis的包,此次测试使用redis的redis-3.2.1.tar.gz这个版本;
cd ~
# mkdir redis-cluster
将redis-3.2.1.tar.gz复制到redis-cluster目录
# cd redis-cluster
# tar -zxvf redis-3.2.1.tar.gz
# cd redis-3.2.1
# make MALLOC=libc
# make install
安装成功后将redis-3.2.1/src目录下的redis-trib.rb文件复制到redis-cluster目录下;
当前目录在redis-cluster
cp ./redis-3.2.1/src/redis-trib.rb ./
在redis-cluster目录创建8001~8006六个目录,并将redis-3.2.1目录下redis.conf文件复制到这个6个目录,然后对每个目录中的redis.conf进行修改,具体修改内容如下:
port 8001
#bind 127.0.0.1
cluster-enabled yes
cluster-config-file nodes-8001.conf
protected-mode no
damonized yes
requirepass 123@456
masterauth 123@456
按照此修改方式将8002~8006的redis.conf配置修改一下,全部修改完毕后则需要启动redis实例。
redis-server ./8001/redis.conf
redis-server ./8002/redis.conf
redis-server ./8003/redis.conf
redis-server ./8004/redis.conf
redis-server ./8005/redis.conf
redis-server ./8006/redis.conf
启动成功后通过命令查看一下是否启动成功,实例是否存在;
ps -ef|grep redis
启动成功后,需要修改一下redis-trib.rb文件,因为设置了密码登录,而redis-trib.rb里面如下命令没有设置密码,所以登录不上各个redis实例,此时需要通过vim编辑器打开redis-trib.rb文件,找到如下这行,进行修改。
此处我已经修改了,增加了password,密码为123@456
以上就是搭建redis集群的准备工作,接下来就开始真正创建redis集群了。
④ 创建集群
./redis-trib.rb create --replicas 1 192.168.216.133:8001 192.168.216.133:8002 192.168.216.133:8003 192.168.216.133:8004 192.168.216.133:8005 192.168.216.133:8006
replicas 表示每个主节点的slave数量。在集群的创建过程中会分配主机和从机,每个集群在创建过程中都将分配一个唯一的id并分配到一段slot。
当集群创建成功后,进入redis-3.2.1目录,登录任意redis实例,命令如下:
redis-cli -p 8001 -a 123@456 -c
-p: 表示要登录的集群端口
-a: 表示要登录的集群密码
-c: 表示以集群的方式登录
查询集群状态信息
# cluster info
查询集群节点信息(集群信息中,可以看到每个节点的id,该节点是slave还是master,如果是slave,那么它的master的id是什么,如果master那么每个master的slot范围是多少,等等!!!)
# cluster nodes
⑤ 添加主节点
首先需要增加一个redis节点
redis-server ./8007/redis.conf
执行成功后,通过如下命令添加节点到集群中
./redis-trib.rb add-node 192.168.216.133:8007 192.168.216.133:8001
192.168.216.133:8007 这个参数表示添加的节点实例地址;
192.168.216.133:8001这个是集群中的实例。
查看redis实例是否添加到集群中
# cluster nodes
添加成功后需要重新分配slot,执行如下命令:
./redis-trib.rb reshard 192.168.216.133:8001
第二个参数表示集群中的任意一个实例。
在执行命令的过程中,有三个核心配置需要手动配置,第一个配置是要拿出多少个slot分配给新实例。
第二个配置是把拿出来的slot分配给谁,输入接收这些slot的redis实例的id。
第三个配置是这些slot由那个实例出。
slot分配成功后,再查看节点信息,就可以看到新实例也有slot了;
⑥ 添加从节点
./redis-trib.rb add-node --slave --master-id a1e170d576142536755ff6c178d7ef6ff77745e4 192.168.216.133:8008 192.168.216.133:8001
⑦ 删除节点
./redis-trib.rb del-node 192.168.216.133:8001 f5ba09370513b59bfdd2939aa59f25e62847a6f9
① 创建spring boot web项目
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-redisartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>