Redis集群部署
Posted ^亚飞$
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis集群部署相关的知识,希望对你有一定的参考价值。
0, 先决条件
Redis安装依赖 gcc-c++
Redis集群依赖 ruby rubygems
安装命令:
$ yum -y install ruby rubygems
1,安装
1.1, 下载 Redis,下载地址:http://download.redis.io/releases/redis-3.2.9.tar.gz
$ wget http://download.redis.io/releases/redis-3.2.9.tar.gz
1.2, 解压安装包
$ tar xzf redis-3.2.9.tar.gz
1.3, 进入安装包目录
$ cd redis-3.2.9
1.4, 编译安装
$ make PREFIX=/usr/local/redis install
1.5, 配置集群
1.5.1 在redis 目录下创建 cluster-etc 目录,然后将 redis.conf 拷贝到这个目录中
$ mkdir cluster-etc
$ cp redis.conf cluster-etc/redis.conf
1.5.2, 修改配置文件redis.conf 中的如下配置项
# 真实的IP和port
bind 127.0.0.1
port port
pidfile /var/run/redis_port.pid
daemonize yes
# 开启日志记录
appendonly yes
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
# 开启集群
cluster-enabled yes
cluster-config-file nodes_port.conf
cluster-node-timeout 15000
1.5.3 拷贝6份配置文件redis.conf,并替换关键字port
$ cp redis.conf redis-2001.conf
$ vi redis-2001.conf
$ :.,$s/port/2001/g
$ :wq
1.6, 启动各个节点
$ cd /usr/local/redis
$ redis-server ./cluster-etc/redis-2001.conf
$ redis-server ./cluster-etc/redis-2002.conf
$ redis-server ./cluster-etc/redis-2003.conf
$ redis-server ./cluster-etc/redis-2004.conf
$ redis-server ./cluster-etc/redis-2005.conf
$ redis-server ./cluster-etc/redis-2006.conf
1.7,创建集群
redis-trib.rb create --replicas 1 127.0.0.1:2001 127.0.0.1:2002 127.0.0.1:2003 127.0.0.1:2004 127.0.0.1:2005 127.0.0.1:2006
1.8, 集群验证
在一台机器上连接集群的2002端口的节点,在另外一台连接2005节点.
连接方式为 redis-cli -h 127.0.0.1 -c -p 2002
参数 -c 可连接到集群,因为上面 redis.conf 将 bind 改为了127.0.0.1地址,所以 -h 参数不可以省略。
备注:编译后在安装目录 src 目录下会出现redis服务程序redis-server和客户端程序redis-cli
2, 常用命令
2.1, 启动命令
$ ./redis-server redis.conf
2.2, 启动命令
$ ./redis-cli -h ip -p port shutdown
2.3, 查看Redis版本
$ redis-server --version
3, 集群管理
3.1 查看集群中机器ID,主从,及hash槽情况,可以查看集群中机器的情况
/usr/local/redis/bin/redis-trib.rb check IP:port
3.2 对数据重新分片:
/usr/local/redis/bin/redis-trib.rb reshard IP:port
3.3 列出集群中的所有主节点
/usr/local/redis/bin/redis-cli -h IP -p port cluster nodes | grep master
3.4 让某个主节点崩溃,测试故障转移
/usr/local/redis/bin/redis-cli -h IP -p port debug segfault
3.5 增加主节点到集群
/usr/local/redis/bin/redis-trib.rb add-node new-IP:new-port IP:port
#new-IP:new-port是新节点,IP:port是一个已在集群中的节点
#需要注意的是此时新节点不能成为真正的主节点,需要进行重新分片才可以
/usr/local/redis/bin/redis-trib.rb reshard new-IP:new-port
1).自动分片程序会询问移动几个hash槽,如果要保证数据的均匀,此时应该是16384/N,
N代表包括当前主机的所有希望成为主节点的数量。
2).然后会询问移动到哪个节点,输入新的主节点的id即可。
3).会询问从哪些节点移动数据,此时可以选择某些节点的ID,也可以直接选择all,从所有主节点,这样数据就会均分。
3.6 增加从节点到集群
/usr/local/redis/bin/redis-trib.rb add-node --slave new-IP:new-port IP:port
#此时没有指定从节点的主节点,一般会自动选择一个,也可以指定主节点,如下:
/usr/local/redis/bin/redis-trib.rb add-node --slave --master-id 6b45acde96e4225856c8652089e8c8edeec00c79 new-IP:new-port IP:port
#new-IP:new-port新加的节点,IP:port已在集群中的节点
3.7 删除一个节点(删除后redis实例会被关闭)
1).从节点删除:d598f4cf29cc4fea3616a00a0e707f71a7777cf1是指被删除的redis的ID
/usr/local/redis/bin/redis-trib.rb del-node IP:port 56cfd4a0d4631fdf046c20acac7e5f1a0fce3b39
2).主节点删除,此时应该确保主节点数据为空,如果不为空,需要将该节点的数据重新分片到其他节点上
# 被删除的主节点,先进行数据迁移,到其他主节点上
/usr/local/redis/bin/redis-trib.rb reshard IP:port
/usr/local/redis/bin/redis-trib.rb del-node IP:port 791b834b1a5292bba236656c076849bb45a0ff17
3.8 集群相关命令:
CLUSTER NODES :集群信息,包括了节点ID,主从关系
CLUSTER INFO:查看集群是否健康
CLUSTER MEET <ip> <port> 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
CLUSTER FORGET <node_id> 从集群中移除 node_id 指定的节点。
CLUSTER REPLICATE <node_id> 将当前节点设置为 node_id 指定的节点的从节点。
CLUSTER KEYSLOT <key> 计算键 key 应该被放置在哪个槽上。
CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的键值对数量。
$ redis-cli -h IP -p port
> CLUSTER NODES
4, FAQ
Error: /usr/bin/env: ruby: No such file or directory
Cause: redis-trib.rb 依赖 ruby
Fix: yum -y install ruby
Error: ./redis-trib.rb:24:in `require‘: no such file to load -- rubygems (LoadError)
from ./redis-trib.rb:24
Cause: redis-trib.rb 依赖 rubygems
Fix: yum -y install rubygems
Error: usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require‘: no such file to load -- redis (LoadError)
from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require‘
from ./redis-trib.rb:25
Cause: 缺少redis和ruby的接口
Fix: gem install redis --version 3.0.0
Error: Node IP:port is not empty. Either the nodealready knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
Cause:
Fix: 用redis-cli登录到每个节点执行flushdb。
Error: CLUSTERDOWN Hash slot not served
Cause:
Fix: 用redis-cli登录到每个节点执行flushall和cluster reset。
以上是关于Redis集群部署的主要内容,如果未能解决你的问题,请参考以下文章