一,为什么要搭建redis集群
个人理解,redis是个内存数据库,数据都存在内存中,既然存在内存中,那么大小肯定受服务器内存大小的限制。比如一个64G内存的服务器,一个redis撑死也就能存储64G的数据量,而对于大型网站架构,数据量岂止是64G,有的网站甚至存储了上T的数据量,遇见这种情况,怎么办?
在redis 3.0版本之前,通常是获取key的hashcode,然后取模(mod),但是这种做法的缺点是无法很好的支持动态伸缩要求,一但有节点的增加或者删除操作,都会导致key无法在redis上命中。redis 3.0版本之后开始支持集群(cluster),采用的是哈希槽(hash slot)。他可以把多个redis实例整合在一起,形成一个集群。比如100G的数据量,一台服务器存储不下,那我可以将它分散到多台机器上,每个客户端都连接一个redis服务实例,这是一个无中心结构,每个节点都保存数据和整个集群的状态。每个节点也都知道其他节点所负责的槽。比如下面的例子:
我在集群7001几点set了一个key:“cluster7001” value : "test"
那么我在集群的7002节点访问这个key:
可以看到,redis会指引你转向至正确的节点(7001)和槽的位置(1391)
二,mac下redis集群的搭建
好,我们简单介绍了一下redis集群出现的背景,由于本片博客重点在于搭建redis集群,所以关于redis集群的知识不做详细的介绍,我们言归正传:
要想让redis集群工作,至少需要3个主节点,那我们在这里要创建6个节点,三个主,三个从。对应的节点端口,我们定义为7001-7006
1、下载和安装redis
这里不做详细介绍,直接去官网下载最新版本的redis即可。
2、创建集群目录
找到redis的安装目录,在里面创建集群文件夹
sudo mkdir redis-cluster
cd 到redis-cluster文件夹里,创建六个节点文件夹:
mkdir redis01
mkdir redis02
mkdir redis03
mkdir redis04
mkdir redis05
mkdir redis06
3、修改配置文件
找到redis安装目录,vi redis.conf,需要修改下面信息:
port 7001 --端口
daemonize yes --指定redis是否以后台进程方式启动
cluster-eanbled yes --集群开启开关
cluster-config-file nodes.conf --节点配置说明文件,redis自己维护
cluster-node-timeout 5000 --心跳测试反应时间,超过5s没有反应认为该节点挂掉
appendonly yes --Redis持久化第二种方式,AOF,默认开启,默认每秒执行一次持久化保存,也可以设置成实时保持,这个比save更安全。
修改完这个配置文件后,分辨拷贝到六个文件节点文件夹中,redis01-06,同时修改对应端口7001-7006,然后将redis安装包src路径下的redis-server文件分别拷贝到六个节点文件夹中。
4、分别启动redis6个实例
打开终端,分别执行以下命令:
cd /usr/local/redis/redis-cluster/redis01/
sudo redis-server redis.conf
cd /usr/local/redis/redis-cluster/redis02/
sudo redis-server redis.conf
6个实例都启动完毕,检验一下redis启动情况:
ps -ef|grep redis
会看到6个实例都已启动成功:
但是现在只是分别启动了6个单独的redis实例,还不存在“群”的概念,我们要做的,是把这六个实例串联起来,组成“群”
5、升级ruby安装gem
gem的安装要求ruby的版本在1.8.7以上,先看一下本机的版本
我的版本是2.0.0,复合要求。然后安装:
gem install redis
出现上述情况,安装成功。
6、创建redis集群
cd 到redis安装目录下的src路径下,找到redis-trib.rb文件,执行一下命令:
./redis-trib.rb create --replicas 1 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 127.0.0.1:7006
至此,redis集群搭建成功!我们来测试一下:
cd到redis安装目录的src目录,会看到redis-cli 这个文件,然后执行:
redis-cli -c -p 7001
set test yeah
然后会看到7001(主)7004(从)都有这个key,ok,测试通过!