第十章、Redis 集群搭建
一、概述
-
Redis3.0之后的版本支持集群
- 集群管理,cluster xxx
- 给予配置(nodes-port.conf)的集群管理
- ASK转向/MOVED转向机制
- Hot resharding:在线分片
- slave->master选举,集群容错
- 节点自动发现
二、redis cluster 集群安装搭建步骤
-
下载安装包
wget http://download.redis.io/releases/redis-3.2.1.tar.gz tar -zxvf /redis-3.2.1.tar.gz #或者管网下载 tar 包,然后上传至服务器进行解包。
-
编译并进行安装
#因为 redis 是用 c 实现的,所有要进行编译。 cd redis-3.2.1 make && make install #相当于: - make - make install
-
安装 ruby 环境
redis 集群是用的 ruby 脚本,所以要想执行该脚本,需要 ruby 环境.。对应 redis 的源码 src 目录下的redis-trib.rb,redis-trib.rb 是redis 官方推出的管理 redis 集群的工具,是基于 redis 提供的集群命令封装成简单、便捷、实用的操作工具。所以为了方便管理集群,可安装一下 ruby 环境。
yum install ruby yum install rubygems #或者执行 yum -y install ruby ruby-devel rubygems rpm-build #gem 命令安装 redis 接口,gem 是 ruby 的一个工具包 gem install redis #安装完成之后运行一下 redis-trib.rb 命令,出现 redis-trib 命令的使用参数就说明 ruby 环境是可靠的 /usr/local/redis-3.2.1/src/redis-trib.rb
-
搭建集群 (redis-cluster)
#1、创建 redis-cluster 目录以及 redis 节点实例文件目录
cd /usr/local
mkdir redis-cluster
cd /usr/local/redis-cluster
mkdir redis-8001 redis-8002 redis-8003 redis-8004 redis-8005 redis-8006#2、复制 redis.conf 到 redis 节点目录下
cd /usr/local/redis-3.2.1
cp redis.conf /usr/local/redis-cluster/redis-8001
cp redis.conf /usr/local/redis-cluster/redis-8002
cp redis.conf /usr/local/redis-cluster/redis-8003
...#3、分别修改节点下 redis-conf 文件,由于在一台机器(192.16819.129 伪分布式集群)上,因此每个实例应该有不同的端口。同时,每个实例显然会有自己的存放数据的地方。
#端口
port 8001#注释 bind ip
#开启 AOF 日志模式
appendonly yes#开启后台模式
daemonize yes
#Redis 以后台模式运行时默认会把 pid 文件放在 /var/run/redis_6379.pid
pidfile /usr/local/redis-3.0.0/pid/redis_8001.pid#RDB 持久化 dump 备份文件目录
dir /usr/local/redis-cluster/redis-8001#4、开启集群配置
cluster-config-file nodes-8001.conf
cluster-enabled yes
cluster-node-timeout 15000#5、编写 shell 脚本批量启动 startall.sh 与关闭 shutdown.sh redis 实例
startall.sh
/usr/local/redis-3.0.0/src/redis-server /usr/local/redis-cluster/redis-8001/redis.conf
/usr/local/redis-3.0.0/src/redis-server /usr/local/redis-cluster/redis-8002/redis.conf
/usr/local/redis-3.0.0/src/redis-server /usr/local/redis-cluster/redis-8003/redis.conf
/usr/local/redis-3.0.0/src/redis-server /usr/local/redis-cluster/redis-8004/redis.conf
/usr/local/redis-3.0.0/src/redis-server /usr/local/redis-cluster/redis-8005/redis.conf
/usr/local/redis-3.0.0/src/redis-server /usr/local/redis-cluster/redis-8006/redis.confchmod +x startall.sh 修改 startall.sh 文件的执行权限
运行 startall.sh 文件启动 redis:$ /usr/local/redis-cluster/startall.sh
ps -ef | grep redis 查看 redis 是否启动成功!shutdown.sh
cd /usr/local/redis-3.0.0/src
./redis-cli -h 47.95.38.201 -p 8001 shutdown
./redis-cli -h 47.95.38.201 -p 8002 shutdown
./redis-cli -h 47.95.38.201 -p 8003 shutdown
./redis-cli -h 47.95.38.201 -p 8004 shutdown
./redis-cli -h 47.95.38.201 -p 8005 shutdown
./redis-cli -h 47.95.38.201 -p 8006 shutdownchmod +x shutdown.sh 修改 shutdown.sh 文件的执行权限
运行 shutdown.sh 文件关闭 redis:$ /usr/local/redis-cluster/shutdown.sh#6、使用 ruby 脚本创建集群,建立集群结点间得主从关系
./redis-trib.rb create --replicas 1 47.95.38.201:8001 47.95.38.201:8002 47.95.38.201:8003 47.95.38.201:8004 47.95.38.201:8005 47.95.38.201:8006问题 :Redis 集群一直 Waiting for the cluster to join....
redis 集群不仅需要开通 redis 客户端连接的端口,而且需要开通集群总线端口,集群总线端口为 redis 客户端连接的端口 + 10000。如redis端口为 6379 则集群总线端口为 16379 故,所有服务器的点需要开通redis 的客户端连接端口和集群总线端口。问题:创建 redis 集群报错:ERR Slot 0 is already busy (Redis::CommandError)
slot 插槽被占用了、这是因为 搭建集群前时,以前 redis 的旧数据和配置信息没有清理干净。
用 redis-cli 登录到每个节点执行 flushall 和 cluster reset 就可以了;或者清除掉每个节点下的 rdb和node-conf文件。#运行下方命令检查是否搭建成功
cd /usr/local/redis-cluster
./redis-trib.rb check 47.95.38.201:8001
集群初步搭建成功! -
集群搭建参考教程