1 个解决方案
下面以一个 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
关闭受保护模式: