如何搭建 redis 集群环境?

如何搭建 redis 集群环境?

1 个解决方案

AllenJiang
中间件研发,关注微信公众号 : 小哈学Java, 回复"666", 即可免费领取10G学习&面试资料

下面以一个 Redis 最基础的集群为例,我们将搭建一个三主三从的环境为例:

环境

我这里准备了 3 台虚拟机,分别是:

  • 192.168.0.11
  • 192.168.0.12
  • 192.168.0.13

每台机器一主一从,相关包路径放在 /root/svr

部署

下载

wget http://download.redis.io/releases/redis-3.2.9.tar.gz
tar xvf redis-3.2.9.tar.gz
cd redis-3.2.9

安装

make install PREFIX=/root/svr/redis-3.2.9

配置

cd /usr/local/redis-3.2.9
mkdir cluster-conf # 创建集群配置文件夹
cd cluster-conf
mkdir 7001 
mkdir 7002 # 创建集群端口文件夹
cd 7001
cp /root/svr/redis-3.2.9/redis.conf ./ # 复制配置文件

Redis 的 log 及持久化文件建议存储到磁盘空间较大的目录,本次存储路径:

/root/svr/redis-cluster/

修改配置文件 vim redis.conf

port 7001
logfile "/root/svr/redis-3.2.9/cluster-conf/7001/redis.log" # 指定了记录日志的文件
dir /root/svr/redis-cluster/7001/ # 事先创建好 (数据目录,数据库的写入会在这个目录。rdb、aof 文件也会写在这个目录)
cluster-enabled yes # 是否开启集群
cluster-config-file nodes.conf # 集群配置文件的名称,每个节点都有一个集群相关的配置文件,持久化保存集群的信息。这个文件并不需要手动配置,这个配置文件有 Redis 生成并更新,每个 Redis 集群节点需要一个单独的配置文件,请确保与实例运行的系统中配置文件名称不冲突
cluster-node-timeout 5000 # 节点互连超时的阀值。集群节点超时毫秒数
appendonly yes # 默认 redis 使用的是 rdb 方式持久化,这种方式在许多应用中已经足够用了。但是 redis 如果中途宕机,会导致可能有几分钟的数据丢失,根据 save 来策略进行持久化,Append Only File 是另一种持久化方式,可以提供更好的持久化特性。Redis 会把每次写入的数据在接收后都写入 appendonly.aof 文件,每次启动时 Redis 都会先把这个文件的数据读入内存里,先忽略 RDB 文件
bind 0.0.0.0

复制 redis.conf 至 7002 并修改端口及存储路径, 然后对其他虚拟机做同样的配置,这里直接使用 scp 命令:

scp -r redis-3.2.9/ root@192.168.0.13:/root/svr/

启动

/root/svr/redis-3.2.9/bin/redis-server /root/svr/redis-3.2.9/cluster-conf/7002/redis.conf &

创建集群

./redis-trib.rb create --replicas 1 192.168.0.11:7001 192.168.0.12:7001 192.168.0.13:7001 192.168.0.11:7002 192.168.0.12:7002 192.168.0.13:7002

以上命令的意思就是让 redis-trib 程序创建一个包含三个主节点和三个从节点的集群。命令的意义如下:

  • 1、给定 redis-trib.rb 程序的命令是 create , 这表示我们希望创建一个新的集群。

  • 2、选项 --replicas 1 表示我们希望为集群中的每个主节点创建一个从节点(百分比 选举 master 按先后顺序)。

  • 3、之后跟着的其他参数则是实例的地址列表, 我们希望程序使用这些地址所指示的实例来创建新集群

含义如下:

节点 ID IP: 端口 标志: master, slave, myself, fail 如果是个从节点, 这里是它的主节点的 NODE ID 集群最近一次向节点发送 PING 命令之后, 过去了多长时间还没接到回复。. 节点最近一次返回 PONG 回复的时间。 本节点的网络连接情况 节点目前包含的槽:例如 127.0.0.1:7001 目前包含号码为 5960 至 10921 的哈希槽 (master)

查看是否搭建成功

./redis-cli -c -p 7001

运行 cluster nodes, 若如下图所示,则表示搭建成功:

其他一些命令(安装过程中不需要执行)

# 增加
./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000
# 从节点(masterid 和被加的节点)
./redis-trib.rb add-node --slave masterid 192.168.0.11:7002
# 移除
./redis-trib del-node 127.0.0.1:7000 `<node-id>`
# 关闭服务
./redis-cli -h 192.168.0.11 -p 7001 shutdown
# 删除
rm -rf /root/svr/redis-cluster/7001/*

你可能遇到的问题

1.执行 ./redis-trib.rb create 报错:

/usr/bin/env: ruby: No such file or directory

解决:yum install ruby

2、执行 ./redis-trib.rb create 报错:

./redis-trib.rb:24:in `require': no such file to load -- rubygems (LoadError)
from ./redis-trib.rb:24

解决:yum install rubygems

3.执行 ./redis-trib.rb create 报错:

/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- redis (LoadError)
		from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'

解决:gem install redis

4.telnet 192.168.0.xx 7001 不通

如果 telnet 不通,但是 ps -ef|grep redis 可以看到服务或者本地客户端可以连接,远程客户端连接不了。这个时候就要修改 redis.conf 参数了:

vim 7001(2)/redis.conf, 注释 bind 或者改为 bind 0.0.0.0

关闭受保护模式: