编辑配置文件
1)这里以3M-3S为例,先创建/usr/loca/redis-cluster集群目录。为了简化配置,copy原生的redis.conf文件到该目录下,作为所有redis实例的公用配置。其中主要对以下参数进行了修改。
[root@localhost redis-cluster]# cp ../redis-4.0.14/redis.conf redis-common.conf
# bind 127.0.0.1 # 关闭bind绑定,开放连接访问
daemonize yes #开启后台运行
protected-mode no #测试环境下关闭保护模式
cluster-enabled yes #启用集群模式
appendonly yes #启用aof持久化机制
cluster-node-timeout 5000 #节点宕机发现时间,可以理解为主节点宕机后从节点升级为主节点时间
2)接下来在redis-cluster目录下创建6700—6705六个文件夹,用来存放不同redis实例生成的pid文件、rdb/aof文件等。然后分别在对应文件夹下创建redis6700.conf—redis6705.conf文件。以redis6700.conf为例,内容如下
include /usr/local/redis-cluster/redis-common.conf
port 6700
dir /usr/local/redis-cluster/6700/ #指定工作目录,rdb,aof持久化文件将会放在该目录下,不同实例一定要配置不同的工作目录
cluster-config-file nodes6700.conf #生成的集群配置文件名称,集群搭建成功后会自动生成,在工作目录下
pidfile /usr/local/redis-cluster/6700/redis6700.pid
appendfilename "appendonly-6700.aof"
启动实例:为了方便启动,在redis-cluster下创建start.sh文件,并启动
[root@localhost redis-cluster]# cat start.sh
#!/bin/bash
/usr/local/redis-4.0.14/src/redis-server 6700/redis6700.conf
/usr/local/redis-4.0.14/src/redis-server 6701/redis6701.conf
/usr/local/redis-4.0.14/src/redis-server 6702/redis6702.conf
/usr/local/redis-4.0.14/src/redis-server 6703/redis6703.conf
/usr/local/redis-4.0.14/src/redis-server 6704/redis6704.conf
/usr/local/redis-4.0.14/src/redis-server 6705/redis6705.conf
[root@localhost redis-cluster]#
[root@localhost redis-cluster]# ./start.sh
29319:C 08 Sep 12:48:04.196 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
29319:C 08 Sep 12:48:04.196 # Redis version=4.0.14, bits=64, commit=00000000, modified=0, pid=29319, just started
29319:C 08 Sep 12:48:04.196 # Configuration loaded
29321:C 08 Sep 12:48:04.203 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
29321:C 08 Sep 12:48:04.203 # Redis version=4.0.14, bits=64, commit=00000000, modified=0, pid=29321, just started
29321:C 08 Sep 12:48:04.203 # Configuration loaded
...
[root@localhost redis-cluster]#
[root@localhost redis-cluster]# ps -ef | grep redis
root 29320 1 0 12:48 ? 00:00:00 /usr/local/redis-4.0.14/src/redis-server *:6700 [cluster]
root 29325 1 0 12:48 ? 00:00:00 /usr/local/redis-4.0.14/src/redis-server *:6701 [cluster]
root 29330 1 0 12:48 ? 00:00:00 /usr/local/redis-4.0.14/src/redis-server *:6702 [cluster]
root 29335 1 0 12:48 ? 00:00:00 /usr/local/redis-4.0.14/src/redis-server *:6703 [cluster]
root 29337 1 0 12:48 ? 00:00:00 /usr/local/redis-4.0.14/src/redis-server *:6704 [cluster]
root 29345 1 0 12:48 ? 00:00:00 /usr/local/redis-4.0.14/src/redis-server *:6705 [cluster]
root 29355 20955 0 12:48 pts/0 00:00:00 grep --color=auto redis
[root@localhost redis-cluster]#
通过集群命令,创建集群
1)进入到redis的安装目录/src目录下,执行./redis-trib.rb命令,redis-trib.rb是官方提供的Redis Cluster的管理工具,默认位于源码包的src目录下,因为该工具是用ruby开发的,所以需要准备相关的依赖环境。
[root@localhost redis-cluster]# cd ../redis-4.0.14/src
[root@localhost src]# ./redis-trib.rb create --replicas 1 192.168.192.128:6700 192.168.192.128:6701 192.168.192.128:6702 192.168.192.128:6703 192.168.192.128:6704 192.168.192.128:6705
/usr/bin/env: ruby: 没有那个文件或目录
[root@localhost src]#
2)安装./redis-trib.rb依赖环境
[root@localhost src]# yum -y install ruby ruby-devel rubygems rpm-build
...
完毕!
[root@localhost src]# gem install redis
Fetching: redis-4.1.3.gem (100%)
ERROR: Error installing redis:
redis requires Ruby version >= 2.3.0.
Centos环境下执行gen install redis时,我这里报错,查了相关资料,是因为Centos支持的ruby默认版本到2.0.0,因此需要安装RVM即Ruby的版本管理器。安装完成之后再执行gen install redis
yum -y install curl #如果安装了可以跳过
yum -y install git #如果安装了git可以跳过这步
curl -L get.rvm.io | bash -s stable # 这一步和下面一步,经常出网络问题,执行了N次才成功,fuck
source /usr/local/rvm/scripts/rvm
rvm install 2.4 # 差不多花了半个多小时,才下成功,失败N次
rvm use 2.4
gem install redis
3)执行创建集群命令 ./redis-trib.rb create --replicas 1 ip:port...,其中create操作表示创建集群, --replicas参数指定集群中每个主节点配备几个从节点,这里设置为1。
./redis-trib.rb支持的操作如下
create:创建集群
check:检查集群
info:查看集群信息
fix:修复集群
reshard:在线迁移slot
rebalance:平衡集群节点slot数量
add-node:添加新节点
del-node:删除节点
set-timeout:设置节点的超时时间
call:在集群所有节点上执行命令
import:将外部redis数据导入集群
安装完成后可以通过./redis-trib.rb check ip:port,或者./redis-trib.rb info ip:port查看集群信息
[root@localhost src]# ./redis-trib.rb info 192.168.192.128:6705
192.168.192.128:6701 (e2d047cd...) -> 0 keys | 5462 slots | 1 slaves.
192.168.192.128:6700 (97934460...) -> 0 keys | 5461 slots | 1 slaves.
192.168.192.128:6702 (ca7b7c54...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
[root@localhost src]#
测试集群
集群搭建好后,通过redis-cli连接集群,来测试一下(-c 表示自动重定向)
从结果可以看出,uname这个Key经过计算后,落在了10359这个slot上,这个slot属于6704Mater节点,所以Redis返回了一个Redirected结果,并告诉了客户端目标ip:port,这里客户端自动帮我们做了重定向。如果key对应的slot落在当前节点,就会直接返回操作结果。
./redis-trib.rb命令
[root@localhost src]# ./redis-trib.rb help
Usage: redis-trib <command> <options> <arguments ...>
create host1:port1 ... hostN:portN
--replicas <arg>
check host:port
info host:port
fix host:port
--timeout <arg>
reshard host:port
--from <arg>
--to <arg>
--slots <arg>
--yes
--timeout <arg>
--pipeline <arg>
rebalance host:port
--weight <arg>
--auto-weights
--use-empty-masters
--timeout <arg>
--simulate
--pipeline <arg>
--threshold <arg>
add-node new_host:new_port existing_host:existing_port
--slave
--master-id <arg>
del-node host:port node_id
set-timeout host:port milliseconds
call host:port command arg arg .. arg
import host:port
--from <arg>
--copy
--replace
help (show this help)
For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.