CentOS7上的Redis集群搭建
- 下载并解压:地址
wget http://download.redis.io/releases/redis-4.0.9.tar.gz
tar -zxvf redis-4.0.9.tar.gz
- 编辑安装
cd redis-4.0.9
make && make install
- 将 redis-trib.rb 复制到 /usr/local/bin 目录下,方便直接执行命令
cd src
cp redis-trib.rb /usr/local/bin/
cp redis-server /usr/local/bin/
cp redis-cli /usr/local/bin/
- 创建redis节点
mkdir redis-cluster
cd redis-cluster
mkdir 7001 7002 7003
cp /home/pro/redis/redis-4.0.9/redis.conf 7001/
cp /home/pro/redis/redis-4.0.9/redis.conf 7002/
cp /home/pro/redis/redis-4.0.9/redis.conf 7003/
- 分别修改这三个节点的配置文件redis.conf
###############集群##########
# 端口7001,7002,7003
port 7001
# 默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群
# 0.0.0.0意味着所有ip都可访问,本次测试环境无所谓
bind 0.0.0.0
# redis后台运行
daemonize yes
# pidfile文件对应7001,7002,7003
pidfile /var/run/redis_7001.pid
# 开启集群
cluster-enabled yes
# 集群的配置 配置文件首次启动自动生成 7003,7001,7002
cluster-config-file /home/pro/redis/redis-cluster/7001/nodes_7001.conf
# 验证密码
requirepass root
# 请求超时 默认15秒,可自行设置
cluster-node-timeout 15000
# aof日志开启 有需要就开启,它会每次写操作都记录一条日志
appendonly yes
appendfilename "appendonly.aof"
# 日志保存路径,修改成自己服务器上的路径
logfile "/home/pro/redis/redis-cluster/7001/redis-7001.log"
#############################
- 启动节点
cd /home/pro/redis-4.0.9/src
redis-server /home/pro/redis/7001/redis.conf
redis-server /home/pro/redis/7002/redis.conf
redis-server /home/pro/redis/7003/redis.conf
# 启动失败后,先检查日志文件redis-700x.log
# 看具体原因具体分析,我本身就因为系统某个应用占用了7001端口导致了启动失败
- 检查启动情况
ps -ef | grep redis
# root 13307 1 0 09:16 ? 00:00:16 ./redis-server 0.0.0.0:7002 [cluster]
# root 13344 1 0 09:16 ? 00:00:16 ./redis-server 0.0.0.0:7003 [cluster]
# root 13359 1 0 09:16 ? 00:00:16 ./redis-server 0.0.0.0:7001 [cluster]
# root 30171 24936 0 11:47 pts/2 00:00:00
# grep --color=auto redis
netstat -tnlp | grep redis
# tcp 0 0 0.0.0.0:17002 0.0.0.0:* LISTEN 13307/./redis-serve
# tcp 0 0 0.0.0.0:17003 0.0.0.0:* LISTEN 13344/./redis-serve
# tcp 0 0 0.0.0.0:17001 0.0.0.0:* LISTEN 13359/./redis-serve
# tcp 0 0 0.0.0.0:7002 0.0.0.0:* LISTEN 13307/./redis-serve
# tcp 0 0 0.0.0.0:7003 0.0.0.0:* LISTEN 13344/./redis-serve
# tcp 0 0 0.0.0.0:7001 0.0.0.0:* LISTEN 13359/./redis-serve
-
创建集群
-
方式一:Redis官方提供了 redis-trib.rb 这个工具,就在解压目录的 src 目录中,已将它复制到 /usr/local/bin 目录中,可以直接在命令行中使用了。使用下面这个命令即可完成安装。注意:如果是只有三个节点,这里一定要是
--replicas 0
,因为--replicas 1
参数最少需要有六个节点redis-trib.rb create --replicas 0 192.168.153.129:7001 192.168.153.129:7002 192.168.153.129:7003 # 注意:一定要数据 yes,不能输入 y,否则之后验证操作就会报错 Can I set the above configuration? (type 'yes' to accept): yes # 显示下列数据代表创建成功了 # >>> Check for open slots... # >>> Check slots coverage... # [OK] All 16384 slots covered.
- 如果提示下列错误:
-
/usr/share/rubygems/rubygems/core_ext/kernel_require.rb:55:in `require’: cannot load such file – redis (LoadError)
# 说明需要安装Ruby,因为这个工具是Ruby实现的 yum -y install ruby ruby-devel rubygems rpm-build # 这步很关键,一定要执行 gem install redis
-
redis requires Ruby version >= 2.2.2
# 说明安装的Ruby版本过低,需要升级或者重新安装
-
can’t connect to node 192.168.153.129:7004
# 需要配置client.rb的password,然后再重新创建集群即可 find / -name client.rb # /usr/share/ruby/xmlrpc/client.rb # /opt/rh/rh-ruby23/root/usr/local/share/gems/gems/redis-4.2.5/lib/redis/client.rb # /opt/rh/rh-ruby23/root/usr/share/ruby/xmlrpc/client.rb vim /opt/rh/rh-ruby23/root/usr/local/share/gems/gems/redis-4.2.5/lib/redis/client.rb # 将以下参数中的:password 填写成你自己设置的验证密码:requirepass 对应的值 class Redis class Client # Defaults are also used for converting string keys to symbols. DEFAULTS = { url: -> { ENV["REDIS_URL"] }, scheme: "redis", host: "127.0.0.1", port: 6379, path: nil, read_timeout: nil, write_timeout: nil, connect_timeout: nil, timeout: 5.0, password: "root", db: 0, ... } ...
-
Invalid configuration for cluster creation.
# 因为只有三个节点而使用 '--replicas 1' 创建集群导致启动创建失败 >>> Creating cluster *** ERROR: Invalid configuration for cluster creation. *** Redis Cluster requires at least 3 master nodes. *** This is not possible with 3 nodes and 1 replicas per node. *** At least 6 nodes are required.
-
[ERR] Node xxx is not empty. Either the node already knows other no…
# redis集群没有配置成功,生成了每个节点的配置文件和db的备份文件 # 需要删除每个节点下的下列文件 rm -rf /home/pro/redis/7001/redisappendonly.aof dump.rdb node_7001.conf rm -rf /home/pro/redis/7002/redisappendonly.aof dump.rdb node_7002.conf rm -rf /home/pro/redis/7003/redisappendonly.aof dump.rdb node_7003.conf # 然后进入每个节点执行清空数据操作 redis-cli -c -p 7001 flushdb # 或 flushall cluster reset
-
Waiting for the cluster to join…
一直在等待加入集群的状态,这个可能原因: redis集群不仅需要开通redis客户端连接的端口,而且需要开通集群总线端口 集群总线端口为redis客户端连接的端口 + 10000 如redis端口为6379,则集群总线端口为16379 所以如果是阿里云ECS,需要放开这些node的端口
-
- 如果提示下列错误:
-
方式二:直接用redis-cli创建,但是redis-5.0.0版本才开始支持 ,否则会报错提示:
Unrecognized option or bad number of args for: '--cluster'
redis-cli --cluster create 192.168.31.245:7001 192.168.153.129:7002 192.168.31.210:7003 --cluster-replicas 0
-
-
验证
- 在一个节点set数据,然后在另一个节点get数据,连接方式为:
/redis-cli -h 192.168.153.129 -c -p 7002
,加参数-C
可连接到集群,如果上面redis.conf
将bind
改为了ip地址,那-h
参数不可以省略
redis-cli -c -p 7002 127.0.0.1:7002> set hello world
- 如果提示下列错误
-
(error) NOAUTH Authentication required.
# 先验证密码,再执行操作 127.0.0.1:7002> auth root
-
(error) CLUSTERDOWN Hash slot not served.
集群搭建失败,没有分配槽,因为redis集群要分配16384个槽来储存数据,那么没有分配槽则报如上错误 原因:执行:redis-trib.rb create --replicas 0 192.168.153.129:7001 192.168.153.129:7002 192.168.153.129:7003 会出现提示:Can I set the above configuration? (type 'yes' to accept): 此时你需要输入yes,而并非缩写 y,全拼yes才可以。 引申: 槽(slot)概念 Redis Cluster中有一个16384长度的槽的概念,他们的编号为0、1、2、3……16382、16383。 这个槽是一个虚拟的槽,并不是真正存在的。正常工作的时候,Redis Cluster中的每个Master节点都会负责一部分的槽, 当有某个key被映射到某个Master负责的槽,那么这个Master负责为这个key提供服务, 至于哪个Master节点负责哪个槽,这是可以由用户指定的,也可以在初始化的时候自动生成(redis-trib.rb脚本)。 这里值得一提的是,在Redis Cluster中,只有Master才拥有槽的所有权, 如果是某个Master的slave,这个slave只负责槽的使用,但是没有所有权
-
- 在一个节点set数据,然后在另一个节点get数据,连接方式为: