欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

redis cluster集群搭建

程序员文章站 2022-05-22 08:22:36
...

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集群搭建

上图提示我们需要迁移多少slot到7007上,我们平分16384个哈希槽给4个节点:16384/4 = 4096,我们需要移动4096个槽点到7007上,输入4096,结果如下:

What is the receiving node ID? 

上述提示询问我们接收这些hash槽的节点ID,我们输入7007节点的ID:ee3efb90e5ac0725f15238a64fc60a18a71205d7
结果如下:
redis cluster集群搭建

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