1 环境准备
本篇介绍搭建6节点的redis cluster的过程,需准备以下环境
- 3台机器
- 每台机器上安装有一个单机的redis,参考文章redis的安装配置
- 每台机器上的redis和哨兵处于关闭状态
- 如果redis.conf 中配置slaveof,请删除,否则无法启动
注:下面是redis和redis哨兵的关闭命令
redis-cli [-h host] [-p port] [-a password] shutdown ## port指的是对应的哨兵或redis的端口号
2 新建需要的文件夹
mkdir -p /etc/redis-cluster ## redis-cluster的node配置文件位置
mkdir -p /var/log/redis ## 每个节点的日志位置
mkdir -p /var/redis/7001 ## redis-cluster的存储位置,请按照端口号创建从7001到7006 6个文件夹,我是每台上面创建两个
3 修改配置文件
复制redis配置文件到/etc/redis
文件夹下:
cp /usr/local/redis-3.2.8/redis.conf /etc/redis/7001.conf
修改/etc/redis/7001.conf
文件:
port 7001
cluster-enabled yes
cluster-config-file /etc/redis-cluster/node-7001.conf
cluster-node-timeout 15000
daemonize yes
pidfile /var/run/redis_7001.pid
dir /var/redis/7001
logfile /var/log/redis/7001.log
bind 192.168.31.187
appendonly yes
依次修改配置7002-7006节点的配置,修改相应配置
4 复制redis_init_script脚本并重命名和修改权限
cp /usr/local/redis-3.2.8/utils/redis_init_script /etc/init.d/redis_7001
chmod 777 /etc/init.d/redis_6379
修改redis_7001中的端口号为7001
vi /etc/init.d/redis_7001
修改如下配置:
REDISPORT=7001
按照以上命令依次配置7002-7006几个节点
5 启动每个节点
/etc/init.d/redis_7001 start
按照以上命令依次启动每个节点
6 在一台机器上安装ruby、rubygems、使用redis-trib开启集群
6.1 安装ruby
wget https://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.2.tar.gz ## 下载
tar xf ruby-2.2.2.tar.gz ## 解压
cd ruby-2.2.2 ## 进入ruby文件夹
./configure --prefix=/usr/local/ruby-2.2.2 ## 配置
make && make install ## 编译安装
ln -s /usr/local/ruby-2.2.7/bin/ruby /usr/bin/ruby ## 配置环境变量
ruby -v ## 查看ruby版本
或者直接执行以下命令安装:
yum install -y ruby
6.2 安装配置rubygems
yum install -y rubygems
gem install redis-3.2.2.gem
6.3 使用redis-trib开启集群
cp /usr/local/redis-3.2.8/src/redis-trib.rb /usr/local/bin
redis-trib.rb create --replicas 1 192.168.247.4:7001 192.168.247.4:7002 192.168.247.5:7003 192.168.247.5:7004 192.168.247.6:7005 192.168.247.6:7006 ## 此处一定要用IP地址,否则报错
redis-trib.rb check 192.168.31.187:7001 ## 检查集群状态
注意:
1. 如果是使用redis-trib.rb工具构建集群,集群构建完成前不要配置密码,集群构建完毕再通过config set + config rewrite命令逐个机器设置密码
2. 如果对集群设置密码,那么requirepass和masterauth都需要设置,否则发生主从切换时,就会遇到授权问题,可以模拟并观察日志
3. 各个节点的密码都必须一致,否则Redirected就会失败
config set masterauth hadoop
config set requirepass hadoop
config rewrite
7 redis cluster的水平扩容
7.1 新增master
7.1.1 安装一台新的redis单机节点,并修改集群配置
参考步骤2和3,比如本次安装7007节点,启动7007节点
7.1.2 使用redis-trib新增集群节点
redis-trib.rb add-node 192.168.247.6:7007 192.168.247.4:7001
add-node是加入集群节点,192.168.247.6:7007为要加入的节点,192.168.247.4:7001 表示加入的集群的一个节点,用来辨识是哪个集群,理论上那个集群的节点都可以。
7.1.3 使用redis-trib分配hash槽
redis-trib.rb reshard 192.168.247.4:7001
reshard
命令是用来分配hash槽的,后面的192.168.247.4:7001
是表示是哪个集群,可以是集群中的任何一个节点。
结果如下:
上图提示我们需要迁移多少slot到7007上,我们平分16384个哈希槽给4个节点:16384/4 = 4096,我们需要移动4096个槽点到7007上,输入4096,结果如下:
What is the receiving node ID?
上述提示询问我们接收这些hash槽的节点ID,我们输入7007节点的ID:ee3efb90e5ac0725f15238a64fc60a18a71205d7
结果如下:
redis-trib 会向你询问重新分片的源节点(source node),
done:从特定的节点中取出 4096 个哈希槽。
all:从全部节点提取4096个哈希槽, 并将这些槽移动到7007节点上面。
我们不打算从特定的节点上取出指定数量的哈希槽,输入 all,这样集群中的所有主节点都会成为源节点,redis-trib从各个源节点中各取出一部分哈希槽,凑够4096个,然后移动到7007节点上
然后再输入yes,redis集群就开始分配哈希槽了。
至此,一个新的主节点就添加完成了,执行命令查看现在的集群中节点的状态
7.2 新增slave
7.2.1 安装一台新的redis单机节点,并修改集群配置
参考步骤2和3,比如本次安装7008节点,启动7008节点
7.2.2 执行添加slave节点的命令
redis-trib.rb add-node --slave [--master-id 主节点nodeID] 从节点的IP+端口号 集群中任一节点的IP和端口号
–master-id可以不指定,如果不指定,redis-trib将会将新增的从节点随机到从节点较少的主节点上。
我们执行以下命令:
redis-trib.rb add-node --slave --master-id 28927912ea0d59f6b790a50cf606602a5ee48108 192.168.247.6:7008 192.168.247.4:7001
上述命令含义:添加一个从节点192.168.247.6:7008
,集群为192.168.247.4:7001
所在的集群,主节点ID为28927912ea0d59f6b790a50cf606602a5ee48108
添加完成
7.3 删除节点
待写
8 常见错误排查
报错信息:
/opt/ruby/lib/ruby/gems/2.3.0/gems/redis-3.3.0/lib/redis/client.rb:121:in `call': ERR Invalid node address specified: node-200:7200 (Redis::CommandError)
from /opt/ruby/lib/ruby/gems/2.3.0/gems/redis-3.3.0/lib/redis.rb:2700:in `block in method_missing'
from /opt/ruby/lib/ruby/gems/2.3.0/gems/redis-3.3.0/lib/redis.rb:58:in `block in synchronize'
from /opt/ruby/lib/ruby/2.3.0/monitor.rb:214:in `mon_synchronize'
from /opt/ruby/lib/ruby/gems/2.3.0/gems/redis-3.3.0/lib/redis.rb:58:in `synchronize'
from /opt/ruby/lib/ruby/gems/2.3.0/gems/redis-3.3.0/lib/redis.rb:2699:in `method_missing'
from src/redis-trib.rb:811:in `block in join_cluster'
from src/redis-trib.rb:809:in `each'
from src/redis-trib.rb:809:in `join_cluster'
from src/redis-trib.rb:1301:in `create_cluster_cmd'
from src/redis-trib.rb:1700:in `<main>'
原因:redis 集群启动请使用IP形式,不要使用域名。
报错信息:
/opt/ruby/lib/ruby/gems/2.3.0/gems/redis-3.3.0/lib/redis/client.rb:121:in `call': ERR Slot 0 is already busy (Redis::CommandError)
from /opt/ruby/lib/ruby/gems/2.3.0/gems/redis-3.3.0/lib/redis.rb:2700:in `block in method_missing'
from /opt/ruby/lib/ruby/gems/2.3.0/gems/redis-3.3.0/lib/redis.rb:58:in `block in synchronize'
from /opt/ruby/lib/ruby/2.3.0/monitor.rb:214:in `mon_synchronize'
from /opt/ruby/lib/ruby/gems/2.3.0/gems/redis-3.3.0/lib/redis.rb:58:in `synchronize'
from /opt/ruby/lib/ruby/gems/2.3.0/gems/redis-3.3.0/lib/redis.rb:2699:in `method_missing'
from src/redis-trib.rb:212:in `flush_node_config'
from src/redis-trib.rb:776:in `block in flush_nodes_config'
from src/redis-trib.rb:775:in `each'
from src/redis-trib.rb:775:in `flush_nodes_config'
from src/redis-trib.rb:1296:in `create_cluster_cmd'
from src/redis-trib.rb:1700:in `<main>'
错误原因:这是由于上一次配置集群失败时留下的配置信息导致的。 只要把redis.conf中定义的 cluster-config-file
所在的文件删除,重新启动redis-server及运行redis-trib即可。