redis cluster集群搭建

1 环境准备

本篇介绍搭建6节点的redis cluster的过程,需准备以下环境

  1. 3台机器
  2. 每台机器上安装有一个单机的redis,参考文章redis的安装配置
  3. 每台机器上的redis和哨兵处于关闭状态
  4. 如果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是表示是哪个集群,可以是集群中的任何一个节点。
结果如下:
redis cluster集群搭建_第1张图片

上图提示我们需要迁移多少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即可。

你可能感兴趣的:(redis,redis)