redis cluster集群搭建
2018-04-01 10:01
471 查看
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/r 4000 edis/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即可。
相关文章推荐
- Redis Cluster集群的搭建与实践
- 11.重新搭建一套主从复制+高可用+多master的redis cluster集群
- Redis Cluster 初探(1) - 集群搭建与扩容
- Redis Cluster高可用(HA)集群环境搭建详细步骤
- 搭建redis cluster集群,JedisCluster带密码访问【解决当中各种坑】!
- redis cluster集群搭建
- Zookeeper,SolrCloud,Redis Cluster三种集群(伪集群)的搭建
- Redis Cluster集群的搭建与实践
- Redis Cluster集群搭建后,客户端的连接研究(Spring/Jedis)(待实践)
- Redis Cluster 搭建高可用Redis服务器集群
- Redis Cluster集群的搭建与实践
- Redis Cluster集群的搭建与实践
- Redis Cluster集群的搭建与实践 集群节点的管理
- redis集群与分片(2)-Redis Cluster集群的搭建与实践
- Redis Cluster集群搭建测试
- Redis Cluster集群搭建与应用
- redis cluster集群服务的搭建
- Redis Cluster 初探(1) - 集群搭建与扩容
- Redis Cluster集群的搭建与实践