Redis集群搭建
环境:
1、 在linux中创建redis-cluster目录(名字自己指定), 复制redis的bin目录,配置其中的redis.conf(要是没有就从redis解压目录中复制一份),并命名目录为7001、7002....7006;即,每个目录下有一个bin目录,还有一个redis.conf配置文件。
2、修改redis.conf配置文件
在建立集群时更改端口 port
cluster-enabled yes //开启集群,将注释去掉
daemonize yes //redis可以使用后台运行,将注释去掉
bind 本机ip //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip,否则创建集群时无法访问对应的端口,无法创建集群,直接可以注释掉
pidfile "/var/run/redis_6379.pid" //7001 7002 不能重复
appendonly yes //aof日志开启 有需要就开启,它会每次写操作都记录一条日志,默认是rdb的方式
dir "/usr/local/redis-cluster/7004" //改为7001 、7002、7003...
2、 将6个redis全部开启(这里可以编写脚本控制开启和关闭)
开启6个redis脚本:startall.sh
cd 7001
./redis-server redis.conf
cd ..
cd 7002
./redis-server redis.conf
cd ..
cd 7003
./redis-server redis.conf
cd ..
cd 7004
./redis-server redis.conf
cd ..
cd 7005
./redis-server redis.conf
cd ..
cd 7006
./redis-server redis.conf
cd..
关闭6个redis脚本: stopall.sh
cd 7001
./redis-cli -p 7001 shutdown
cd ..
cd 7002
./redis-cli -p 7002 shutdown
cd ..
cd 7003
./redis-cli -p 7003 shutdown
cd ..
cd 7004
./redis-cli -p 7004 shutdown
cd ..
cd 7005
./redis-cli -p 7005 shutdown
cd ..
cd 7006
./redis-cli -p 7006 shutdown
cd ..
在编写好脚本文件后,记得使用chmod 777 为文件赋予可执行权限。
3、 安装ruby环境
因为集群管理工具(redis-trib.rb)是使用ruby脚本语言编写的。
注意:redis版本和ruby版本不匹配经常会导致集群无法建立成功;我使用的是redis4.0.9,之前通过yum方式安装的是默认ruby2.0.0,建立时老是集群报错!最后升级ruby为2.4.1,就可以成功建立集群了。参考:如何升级ruby版本
4、 通过在redis.4.0.9解压目录下的src中找到redis-trib.rb,移动至redis-cluster目录下,运行命令:./redis-trib.rbcreate --replicas 1 主机IP:7001 主机IP:7002 主机IP:7003 主机IP:7004 主机IP:7005 主机IP:7006
开始创建集群
出现如下信息说明集群搭建成功:
5、 连接集群
随便进入一个redis目录,如进入7001目录,运行。./redis-cli –h 主机IP –p 7001 –c
-c指的连接方式是集群连接。
表明集群已经搭建成功!
集群存储原理:集群管理器内置了16384个哈希槽,集群管理器对集群中redis结点都映射到哈希槽中。当需要在 Redis 集群中放置一个key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。
1、我安装的是redis4.0.9,若是ruby版本过低,在搭建集群的时候会报错;因此我使用的是ruby2.4.1,亲测可用.
2、在搭建集群时出现Waiting for the cluster to join...一直等待问题,查资料解决办法:redis集群不仅需要开通redis客户端连接的端口,而且需要开通集群总线端口,集群总线端口为redis客户端连接的端口 + 10000;如redis端口为6379,则集群总线端 口为16379;
3、在集群创建失败时,要停止各个redis进程,然后把各个redis目录的持久化文件、nodes.conf文件全部清除掉;之后重新开启各个redis进程,再输入命令建立集群,一般就能成功,可以写一个脚本clearall.sh
cd 7001
rm -rf dump.rdb nodes.conf
cd ..
cd 7002
rm -rf dump.rdb nodes.conf
cd ..
cd 7003
rm -rf dump.rdb nodes.conf
cd ..
cd 7004
rm -rf dump.rdb nodes.conf
cd ..
cd 7005
rm -rf dump.rdb nodes.conf
cd ..
cd 7006
rm -rf dump.rdb nodes.conf
4、之前在创建集群时:/redis-trib.rbcreate --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004127.0.0.1:7005 127.0.0.1:7006,这里的IP是回环地址,但是在使用Java代码远程连接的时候,可能会出现连接不上的情况,can not get a resource from pool,我是使用阿里云搭建的,因此直接使用公网地址创建集群,解决远程连接不上的问题。
5、当注释掉bind时 && 没有设置密码 ,保护模式就会生效,因此在用Java代码远程连接时就会出错。
解决方法:①在redis.conf中注释掉保护模式(不安全) ②设置密码(推荐)-> 为redis集群设置密码