因为Redis要求每个集群最少要有3台服务器才能正常运行,所以接下来搭建一个3主3从的集群。
3主3从代表着要有6个redis服务实例,这里先预设6个实例的端口为6380~6385,先创建这6个redis实例相关的配置文件redis-xxx.conf,可以先copy redis.conf文件然后重命名,新建一个redis-cluster文件夹来存放集群相关文件,最后redis-cluster文件夹中有如下6个文件:
修改以上每个配置文件中的内容,参考如下:
#端口改为服务实例相关的端口号,这里以6380端口实例为例
port 6380
#开启后台启动
daemonize yes
#修改pid文件名,避免和其它redis进程冲突,这里以6380端口实例为例
pidfile /var/run/redis_6380.pid
#rdb操作对应的文件名,这里以6380端口实例为例
dbfilename dump_6380.rdb
#开启集群相关配置,改为yes
cluster-enabled yes
#该选项指定的文件是用来存储当前节点记录的集群状态的,所以不能重名,不然会启动失败,这里以6380端口实例为例
cluster-config-file nodes-6380.conf
然后在同一目录下,编写一个启动脚本,用来统一启动6个实例,输入vim startCluster.sh
,编辑内容如下:
redis-server redis-6380.conf
redis-server redis-6381.conf
redis-server redis-6382.conf
redis-server redis-6383.conf
redis-server redis-6384.conf
redis-server redis-6385.conf
再写一个关闭脚本,用来统一关闭6个实例,安全退出集群,输入vim shutdownCluster.sh
如下:
redis-cli -p 6380 shutdown
redis-cli -p 6381 shutdown
redis-cli -p 6382 shutdown
redis-cli -p 6383 shutdown
redis-cli -p 6384 shutdown
redis-cli -p 6385 shutdown
在redis-cluster文件夹下运行启动脚本,结果如下:
接着随便进入一个实例的客户端模式,输入info cluster
命令,结果如下:
cluster_enabled结果为1表示集群正常启用了。
再输入CLUSTER INFO
查看节点状态,如下:
可以发现此时的集群状态是fail。
此时每个节点都是完全独立的,现在要将它们加入到同一个集群,由于使用的redis版本是5.0.5,所以建议使用redis-cli来创建集群。
redis-cli创建集群的基本语法如下:
redis-cli --cluster create host1:port1 ... hostN:portN --cluster-replicas <arg>
<arg> 参数表示每个主数据库拥有的从数据库个数
运行redis-cli --cluster create 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385 --cluster-replicas 1
命令,该命令表示以哪些ip和端口的redis实例构建集群,同时每个主数据库要有一个从数据库,这样就形成3主3从的集群系统了,运行后结果如下:
从以上输出的内容可以看出集群大致的分配方案,比如插槽是怎么分配的,哪两个redis数据库形成了主从等,输入yes表示同意这个方案,那么就会创建出相应的集群了,结果如下:
出现如上图的信息,表明所有槽都已经分配到节点上了,因为Redis集群中就内置了16384个哈希槽。
再通过CLUSTER INFO
命令查看此时节点状态,如下:
可以发现集群状态变为了ok。
随意连接一个节点客户端输入CLUSTER NODES
命令看下结果,如下:
从上图中可以看到所有节点的运行ID、ip地址和端口、角色、状态以及负责的插槽等信息。
测试下集群的效果
这时候因为要在集群中设置数据,那么肯定涉及到数据的重定向,所以进入客户端的命令要加个-c的参数,让节点之间可以自动跳转,如下:
接着进入端口为6380的主数据库客户端,尝试着设值,如下:
发现提示,数据被重定向到6382端口实例的12539插槽中了,去6382端口的redis实例去查看搜索下key,结果如下:
6382端口实例能够正常查到结果。
总结
Redis的简单集群搭建完成。