redis 3.0以上支持集群,由于集群需要ruby支持,需要先安装ruby环境并下载通信管理包
redis命令参考:http://doc.redisfans.com/
ruby处理好后,开始实现集群的搭建
1、新建cluster文件夹,并在里面再新建10010、10020、10030、10040、10050、10060文件夹
(主10010,从10020;主10030,从10040;主10050,从10060)
2、把redis安装目录下的redis.conf文件,cp到10010文件夹
修改redis.conf配置文
A、修改bind 127.0.0.1的ip为你服务器ip
B、修改port的端口为10010
C、修改daemonize的no为yes;启动守护进程,生成pid文件
D、修改pidfile值,pid文件存放路径
E、修改loglevel值,log等级,可改为debug
F、修改logfile值,log文件存放路径
G、修改appendonly值,启动aof持久化。不过搭建主从的话,考虑禁用主redis持久化,从redis进行持久化就行了
H、启动cluster-enabled yes;启动集群
I、启动cluster-conf-file nodes-10010.conf;存放哈希槽
J、启动cluster-node-timeout 15000;节点超时时间
修改并保存文件后,再分别把该redis.conf文件,cp到10020、10030、10040、10050、10060文件夹,并做相应修改
3、分别启动各节点
启动后,连接redis客户端
命令:redis-cli -c -h [IP] -p [port];连接集群客户端,命令加-c。
连接上,查看集群状态信息
命令:cluster info
可以看到状态是fail,哈希槽数量也是0;
4、通过redis提供的redis-trib.rb集群管理工具进行管理(redis-trib.rb使用ruby写的,所以需要安装ruby环境,并下载相关redis包)。
在redis安装目录下,进入src目录,可以看到redis-trib.rb
执行命令:./redis-trib.rb create --replicas 1 [IP]:[port] [IP]:[port] [IP]:[port] [IP]:[port] [IP]:[port] [IP]:[port]
--replicas 1,标识设置从节点数1个
[IP]:[port],前面三个是主节点,后面三个是从节点
在這一步如果你安装了ruby还是会提示以下错误
rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- redis (LoadError)
请安装redis集群通信相关包
命令:gem install redis
5、以上操作,通过集群管理器实现了集群的管理和主从的实现。再次连接集群客户端查看集群信息
可以看到状态ok,并且有16384个哈希槽。這16384个哈希槽被平均分配到三个主节点上
(看上图中10010节点是0-5460(5461 slots),10030节点是5461-10922(5462 slots),10040节点是10923-16383(5461 slots))
6、redis通过对key使用crc16 算法算出一个结果,然后把结果对16384求余数,对应在哪个节点就数据就会存入哪个节点
-----------------------------------------------------------------------------------------------------------
集群关闭,我的方法
1、kill -9 所遇redis集群相关进程
2、清理redis集群相关文件夹下的nodexxx.conf文件
3、重启redis并创建redis集群管理节点
-----------------------------------------------------------------------------------------------------------
集群节点的动态增加
1、增加节点,新建10070文件夹,并且cp配置文件redis.conf到该目录下,修改配置文件再启动
命令:./redis-trib.rb add-node [ip]:[port] [ip]:[port];redis安装目录下src目录下执行
前面一个[ip]:[port]是刚才新建需要加入的服务节点,后面一个是目标服务
2、查看集群节点信息,连接集群客户端后执行命令
命令:cluster nodes;可以看到10070已经加入集群,但是还没有分配哈希槽
3、分配哈希槽
命令:./redis-trib.rb reshard [ip]:[port];redis安装目录下src目录下执行
执行命令后,需要确认分哈希槽数量,确认后需再次确认目标节点的ID,确认后需再次确认是否节点均分(#1:all);所有确认完成开始节点调整
4、再次查看集群节点信息,连接集群客户端后执行命令
命令:cluster nodes;可以看到10070已经加入集群,并且分配哈希槽
-----------------------------------------------------------------------------------------------------------
集群节点的动态删除
1、回收哈希槽
命令:./redis-trib.rb reshard [ip]:[port];redis安装目录下src目录下执行
执行命令后,需要确认接收哈希槽的节点ID,确认后需再次确认会被回收哈希槽的节点ID,确认后(#1:done);所有确认完成开始节点调整
2、查看集群节点信息,连接集群客户端后执行命令
命令:cluster nodes;可以看到10070节点的哈希槽已经被分配到10010节点
3、删除节点
命令:./redis-trib.rb del-node [ip]:[port] [nodeid];需要删除节点的ip和端口,nodeid是该节点的id
4、再次查看集群节点信息,连接集群客户端后执行命令
命令:cluster nodes;可以看到10070节点已经被删除了
sentinel down-after-milliseconds [和自定义名称保持一致] [超时时间,单位毫秒]
sentinel failover-timeout [和自定义名称保持一致] [超时时间,单位毫秒]
sentinel parallel-syncs [和自定义名称保持一致] [进行sync的slave个数]