一、项目背景:
最近接手的项目需要使用redis,经讨论为了高可用目的决定使用redis集群方式部署。于是着手研究搭建,因为项目环境为离线环境,所以依赖和搭建需要下载离线包进行搭建。另外因为本人申请的环境已经预装了redis 4.0,为了保证文档的完整性,所以离线安装redis的过程为网上查询整理。
系统:redhat 7.3
二、实施过程:
1、redis离线安装
- 下载redis资源
http://download.redis.io/releases/redis-4.0.8.tar.gz
- 把下载的离线包上传至服务器,通过解压命令解压离线包。
tar xzvf redis-4.0.8.tar.gz
- 离线安装redis
打开至redis目录,使用make install 命令进行安装。
cd redis-4.0.8
make
cd src
make install PREFIX=/usr/local/redis
- 启动redis
redis-server /usr/local/redis/redis.conf
redis的默认端口是6379
连接redis客户端使用
redis-cli
如果连接报错如下:
Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients.
需要更改redis.conf文件
# bind 127.0.0.1 --> 去掉注释,改为实际ip地址
至此,redis安装成功。
2、redis集群搭建
redis集群官方建议最小集群环境为 6 server,3主3从。
因为redis从3.0开始支持集群部署,目前版本都支持,但是需要安装ruby环境,才能运行集群命令 redis-trib.rb,需要安装的资源如下,可自行搜索下载,需要说明的是ruby版本不得低于2.2.2,不然搭建集群会报错。
redis-4.0.1.gem
ruby-2.4.4.tar.gz
rubygems-2.7.6.tgz
ruby官网下载最新的稳定版本:https://www.ruby-lang.org/en/downloads/
rubygems:
http://www.oschina.net/news/19237/rubygems-v-185
- 把下载好的文件上传到服务器
- 安装ruby环境
tar xzvf ruby-2.4.4.tar.gz
cd ruby-4.4.0
./configure –prefix=/usr/local/ruby
make && make instal
-prefix是将ruby安装到指定目录,安装的时候开始没有使用root用户安装,出现问题,于是切换到root用户执行 make && make install,完成。
- 添加ruby环境变量
编辑/etc/profile文件
vim /etc/profile
在最后添加环境变量配置
export RUBY_HOME=/usr/local/ruby2.4.4
export PATH=$RUBY_HOME/bin:$PATH
其中$RUBY_HOME/bin:$PATH的作用是,把ruby环境变量添加到PATH的前面。
保存环境变量
source /etc/profile
确认ruby版本ruby --version
- 安装rubygems
tar xzvf rubygems-2.7.6.tgz
cd rubygems-2.7.6/
ruby setup.rb
gem –version
gem install redis-4.0.1.gem
- 集群搭建
#创建集群文件夹,用于存在集群配置和数据
cd /app ;
mkdir rediscluster
#创建conf,data,logs文件
#192.168.100.1
mkdir /app/redis{7000/{conf,data,logs},7001/{conf,data,logs}}
#192.168.100.2
mkdir/app/redis{7002/{conf,data,logs},7003/{conf,logs,data}}
#192.168.100.3
mkdir/app/redis{7004/{conf,data,logs},7005/{conf,data,logs}}
复制redis.conf文件到redis7000/conf文件下,每个集群文件夹都要复制一份。
修改每个配置文件下的redis.conf文件
1.#bind 127.0.0.1
2.protected-mode no
3.port 7000
4.daemonize yes
5.pidfile /app/redis7000/data/redis7000.pid
6.logfile /app/redis7000/logs/redis7000.log
7.save ""
#save 900 1
#save 300 10
#save 60 10000
12.dir /app/redis7000/data
13.cluster-enabled yes
14.cluster-config-file /app/redis7000/conf/nodes7000.conf
15.cluster-node-timeout 15000
使用命令启动每个redis服务
redis-server /app/redis7000/conf/redis.conf
执行集群命令,搭建集群环境。src/redis-trib.rb create --replicas 1 192.168.100.1:7000 192.168.100.1:7001 192.168.100.2:7002 192.168.100.2:7003 192.168.100.3:7004 192.168.100.3:7005
replicas 1 代表每个主生成一个从,
- 调整主从结构
删除从节点
./redis-trib.rb del-node 192.168.100.3:7005 99d7c37c6b9d86bb2275895719e82115f4676752
删除nodes.conf文件 dump.rdb文件
重启redis
执行添加命令
./redis-trib.rb add-node --slave --master-id a1006e659ccd59c002b35c4d7b4994e271d83f7d 192.168.100.1:7001 192.168.100.3:7004
3、问题总结:
- 问题1:
client.rb:119:in `call': ERR Slot 14091 isalready busy
解决方法:all nodes did FLUSHALL and then CLUSTER RESET SOFT
另外所有的操作中,报错服务有数据或者in user 都可以使用以上办法解决,其中从服务器(slave)在集群中是readonly状态,所以需要先执行cluster reset soft 才能执行刷新操作。