目前线上redis使用的架构是一主一从+一个哨兵。这个架构很稳定,主从切换做的也很好。但缺点是扩展性不高,会有性能的瓶颈,并且主从切换的速度还不够快。官方出了redis-cluster的方案,自认为感觉不错。可扩展性不说了,其引入了数据槽分片的概念。扩容性做到了,性能也就自然而然上去了。主从切换的速度也加快了。
目前实验环境我用的是3主+3从的概念。如果用官方集群,肯定是要为每个主各分配一个从的。因为数据分片后,每个主节点的是数据不一样的,如果主节点挂掉,没有从节点的话,整个集群就会失效。下面先给出我搭建集群后得到的几个结论。
1.一套主从节点挂掉的话,集群将不可用,这应该是一部分数据丢失的原因;此事重启的话,要先启动主节点。
2.任意一个主挂掉没有问题,并且主从切换的时间在1s之内;
3.3个从节点都挂掉,没有问题;
4.如果你连接了一台从节点去写数据,集群会自动调度到主上面去写数据;
5.3个主节点,数据做分片是不重复的。
下面给出集群搭建的过程。
从官方下载最新的redis包,redis-5.0.3.tar.gz。因为是测试环境,这里我用的是最新的5.0版本。下载后进行解压,并进行make。
tar -xzvf redis-5.0.3.tar.gz
cd redis-5.0.3
make
之后编辑 redis.conf 配置文件,编写基础的配置文件,配置下面几个参数即可。
port 7000 //监听端口
cluster-enabled yes //打开集群模式
cluster-config-file nodes-7000.conf //集群节点配置文件的路径
cluster-node-timeout 5000 //节点超时时间
appendonly yes //开启aof模式,数据持久化使用
bind 172.16.51.171 //监听的ip
dbfilename dump.rdb //数据库文件名
dir "/opt/redis/7000/redis-4.0.11" //数据库文件目录
logfile "/opt/webapps/7000/redis-4.0.11/log/redis.log" /日志文件位置
之后,其余5个节点皆按照这个配置文件配置即可。
之后使用 src/redis-server redis.conf 启动redis服务即可。
在6个节点都正常起来后,使用下面命令创建集群。
src/redis-trib.rb create --replicas 1 172.16.51.171:7000 172.16.51.172:7001 172.16.51.173:7002 172.16.51.172:7003 172.16.51.173:7004 172.16.51.171:7005
直接运行这个命令有错,会报缺少ruby的错误;/usr/bin/env: ruby: 没有那个文件或目录,这个时候安装ruby即可。
yum install ruby rubygems -y
之后再次运行命令,报了下面错误提示。这个提示是说,在5.0版本中,redis不再使用src/redis-trib.rb这个命令,而是使用redis-cli这个命令。于是按照提示,使用redis-cli命令去建立集群。
src/redis-cli --cluster create 172.16.51.171:7000 172.16.51.172:7001 172.16.51.173:7002 172.16.51.172:7003 172.16.51.173:7004 172.16.51.171:7005 --cluster-replicas 1
其中 --cluster-replicas 1 是指为每个主节点创建一个从节点。下面是集群创建过程。出现最后一个图片字样,集群创建成功。