在很多应用中都需要使用redis进行缓存,这也是redis最主要的一个用途。然而当缓存到了一定大小时,一台服务器的容量也是有限,所以就出现了redis集群。
redis集群允许将缓存分配到多个服务器上共同协作。
本文中使用到的是centos6.8,redis-3.0.0.
一、安装redis相关环境
redis是C语言开发的,所以需要在服务器上安装gcc环境。
yum install gcc-c++
二、安装redis
将redis-3.0.0.tar.gz拷贝到/usr/local下解压
tar -zxvf redis-3.0.0.tar.gz
cd /usr/local/redis-3.0.0
make
## 安装到指定目录,如 /usr/local/redis 这里选择安装到/usr/local/redis中
cd /usr/local/redis-3.0.0
make PREFIX=/usr/local/redis install
cp /usr/local/redis-3.0.0/redis.conf /usr/local/redis/bin/
默认监听 6379 端口,但是这种启动方式:当将终端关闭后,redis-server也会跟着关闭,这不是我们想要的。所以需要后端模式启动
在redis.conf文件中修改后端模式 daemonize yes
再次启动redis
./redis-server ./redis.conf
以下是引用网上总结的集群实现细节。
架构细节:
(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.
(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value
Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,
** 在上面的介绍中说了集群中有(过半数的节点检测失效)。所以我们需要准备三台机器来作为服务器,同时为三台服务器分别准备一台备用
redis集群的搭建需要使用到Ruby环境,所以需要在服务器上安装Ruby环境
yum install ruby
yum install rubygems
这里在同一台服务器用不同的端口表示不同的redis服务器,如下:
主节点:192.168.0.120:7001 192.168.0.120:7002 192.168.0.120:7003
从节点:192.168.0.120:7004 192.168.0.120:7005 192.168.0.120:7006
在/usr/local中创建redis-cluster目录,创建7001...7006目录,并将 /usr/local/redis/bin目录下的文件拷贝到这6个文件夹中
然后分别修改redis.conf
[root@localhost redis-cluster]# vi 7001/redis.conf
[root@localhost redis-cluster]# vi 7002/redis.conf
[root@localhost redis-cluster]# vi 7003/redis.conf
[root@localhost redis-cluster]# vi 7004/redis.conf
[root@localhost redis-cluster]# vi 7005/redis.conf
[root@localhost redis-cluster]# vi 7006/redis.conf
port xxx 所在文件夹指定的端口
cluster-enabled yes
分别启动7001—7006中的redis,使用脚本/usr/local/redis-cluster/start.sh
#!/bin/sh
for i in 1 2 3 4 5 6
do
cd 700$i
./redis-server ./redis.conf
cd ..
done
ps aux | grep redis
执行ruby脚本,依赖ruby环境(这里用到redis-3.0.0.gem,)
将redis-3.0.0.gem拷贝至/usr/local
执行gem install /usr/local/redis-3.0.0.gem
在/usr/local/redis-3.0.0/src/中有文件:redis-trib.rb
运行:
./redis-trib.rb create --replicas 1 192.168.0.120:7001 192.168.0.120:7002 192.168.0.120:7003 192.168.0.120:7004 192.168.0.120:7005 192.168.0.120:7006
注意:
如果执行时报如下错误:
[ERR] Node XXXXXX is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0
解决方法是删除生成的配置文件nodes.conf,如果不行则说明现在创建的结点包括了旧集群的结点信息,需要删除redis的持久化文件后再重启redis,比如:appendonly.aof、dump.rdb
已经启动成功了。
现在登录集群,登录任意节点
[root@localhost 7001]# ./redis-cli -c -h 192.168.0.120 -p 7001
192.168.0.120:7001> set a name
-> Redirected to slot [15495] located at 192.168.0.120:7003
OK
192.168.0.120:7003>