单个redis的安装与启动:项目学习记录-Redis的安装与启动
以及redis的数据类型与存储指令:项目学习记录-缓存数据类型与持久化
Redis集群
有多个redis节点构成的缓存结构。每个节点通过ping-pong机制通信,客户端只需要连上集群中的任意一个节点即可。
且每个redis节点的缓存数据都不相同,也不同担心其中一个节点蹦掉的问题。redis允许设置备份节点,来防止节点崩塌的问题。而且,redis集群存在通票容错机制确保redis节点不被误认为挂了,即当redis集群中,超过半数的节点ping某个节点不通时,才会认为该节点崩塌。
slot : 槽
redis集群一共有16384个哈希槽,redis cluster会根据节点的数量和服务器的性能分配这些槽,使得相应的槽负责相关的节点。即当客户端需要缓存数据时,cluster会拿缓存数据的key根据CRC16算法生成一个数值,再将这个数值对16384取余,得到的一个槽值,这个值就决定这个缓存数据会被缓存到哪个redis节点。
例如:
server1的槽为:0-5000
server2的槽为:5001-1000
server3的槽为:10001-16383
hello的key根据crc16算法的到数值对16384取余得500,所以存放到server1.
同理,hello2存放到server3.
集群的搭建
为了实现投票容错机制,且每个节点至少有一个备份节点。所以我们总共需要6个redis节点。
根据项目学习记录-Redis的安装与启动,我们已经存在一个单机版的redis节点。
- 将bin目录拷贝,并修改名字
cp -rf bin redis01
修改其中热redis.conf配置
– cluster-enabled为yes;
– port为7001;
– bind: [redis所在服务器IP] 127.0.0.1
eg bind:192.168.25.133 127.0.0.1创建redis-cluster目录,并将redis01复制六份,分别改名为redis01-06
cp -rf redis01 redis06
并修改每个文件中的redis.conf的port分别为7001-7006
再在redis-cluster目录下创建批处理启动多个redis
vim start-all.sh
cd redis01
./redis-server redis.conf
cd ..
cd redis02
./redis-server redis.conf
cd ..
cd redis03
./redis-server redis.conf
cd ..
cd redis04
./redis-server redis.conf
cd ..
cd redis05
./redis-server redis.conf
cd ..
cd redis06
./redis-server redis.conf然后 esc : wq 保存退出。
添加start-all的当前用户可执行权限
chmod u+x start-all.sh
启动并检查
– 启动 ./start-all.sh
– 检查 ps -ef|grep reids
接着使用ruby脚本搭建集群
i. 先进入redis的源代码目录,将后缀为rb的文件复制到redis-clustser中。
这就是一个ruby的脚本,需要ruby的环境才能执行。ii. 先安装ruby环境
yum install ruby
yum install rubygems
在安装第三方包,redis-3.0.0.gem
gem install redis-3.0.0.gem
【该命令会把gem安装到redis中】iii. 执行该脚本。
进入redis-cluster目录,执行命令
./redis-trib.rb create –replicas 1 192.168.25.153:7001 192.168.25.153:7002 192.168.25.153:7003 192.168.25.153:7004 192.168.25.153:7005 192.168.25.153:7006
relicas参数会根据后面的1计算:每个节点一个备份机的方式去分槽
PS:其中ip按照你redis.conf配置的bind来。
中间输入yes.
三个M为主机,三个S为备份机。slot为所分他们的槽。
【关闭防火墙:因为redis除了用到了你看到的这些7001-7006的端口还有用到了17001-17006的端口】
遇到的问题
- 问题1:
在执行rb时: ./redis-trib.rb……
报错:/usr/local/rvm/gems/ruby-2.4.2/gems/redis-4.0.1/lib/redis/client.rb:119:in
`call’: ERR Slot 0 is already busy (Redis::CommandError)
slot插槽被占用了(这是搭建集群前时,以前redis的旧数据和配置信息没有清理干净。)
解决方案是:
用redis-cli 登录到每个节点执行 flushall 和 cluster reset 就可以了。
./redis-cli.sh -h ip -p port (更换IP)
- 问题2:
bind 参数;
开始看了很多博文之类的,有说直接配置0.0.0.0(这个可以连接,但是会接受所以的连接请求,不安全)。
有说是需要绑定请求端的IP地址, 这个完全就连不上了。
自己试了才知道,正确的是配置redis所在服务器的IP地址。 如果服务器有客户端需要连此redis的话,要加配上127.0.0.1
bind redis服务端所在IP 127.0.0.1
其实还碰到了一些琐碎的问题,有的解决了,有的还没有解决。。很奇怪
有一个属于网络问题,有一个虚拟机,能ping同其他虚拟机,也能ping通网关,但是其他虚拟机ping不通他,网络连接方式是使用NAT,也确定关了防火墙。
在执行./redis-trib.rb……时,一直停在waiting for the cluster to join………..
我查了,说是没有关防火墙的原因,可是确实都关了,用的ubuntu服务器,现在换成centos就可以了。还有开始在安装redis时,执行以下指令时,
make install PREFIX=/usr/redis/
报错:[root@bogon redis-3.2.11]# make install PREFIX =/usr/redis
make: * empty variable name. Stop.
原来是指令中间多了个空格 - -!make install PREFIX=/usr/redis
基本上就是这样了,其中bind这个配置着实是被误导的很久,试了很多都连不上!
总体上,觉得还是需要再细心些。