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.gz1.2, 解压安装包
$ tar xzf redis-3.2.9.tar.gz1.3, 进入安装包目录
$ cd redis-3.2.91.4, 编译安装
$ make PREFIX=/usr/local/redis install1.5, 配置集群
1.5.1 在redis 目录下创建 cluster-etc 目录,然后将 redis.conf 拷贝到这个目录中$ mkdir cluster-etc$ cp redis.conf cluster-etc/redis.conf1.5.2, 修改配置文件redis.conf 中的如下配置项
# 真实的IP和portbind 127.0.0.1port portpidfile /var/run/redis_port.piddaemonize yes
# 开启日志记录
appendonly yesappendonly yesappendfilename "appendonly.aof"appendfsync everysec# 开启集群
cluster-enabled yescluster-config-file nodes_port.confcluster-node-timeout 150001.5.3 拷贝6份配置文件redis.conf,并替换关键字port
$ cp redis.conf redis-2001.conf$ vi redis-2001.conf$ :.,$s/port/2001/g$ :wq1.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.conf1.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:20061.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.conf2.2, 启动命令$ ./redis-cli -h ip -p port shutdown2.3, 查看Redis版本$ redis-server --version3, 集群管理
3.1 查看集群中机器ID,主从,及hash槽情况,可以查看集群中机器的情况/usr/local/redis/bin/redis-trib.rb check IP:port3.2 对数据重新分片:
/usr/local/redis/bin/redis-trib.rb reshard IP:port3.3 列出集群中的所有主节点
/usr/local/redis/bin/redis-cli -h IP -p port cluster nodes | grep master3.4 让某个主节点崩溃,测试故障转移
/usr/local/redis/bin/redis-cli -h IP -p port debug segfault3.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 56cfd4a0d4631fdf046c20acac7e5f1a0fce3b392).主节点删除,此时应该确保主节点数据为空,如果不为空,需要将该节点的数据重新分片到其他节点上
# 被删除的主节点,先进行数据迁移,到其他主节点上/usr/local/redis/bin/redis-trib.rb reshard IP:port /usr/local/redis/bin/redis-trib.rb del-node IP:port 791b834b1a5292bba236656c076849bb45a0ff173.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 NODES4, FAQ
ERROR:
zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory zmalloc.h:55:2: error: #error "Newer version of jemalloc required" make[1]: *** [adlist.o] Error 1 make[1]: Leaving directory `/data0/src/redis-3.2.9/src' make: *** [all] Error 2 FIX:make PREFIX=.. install前先执行:make MALLOC=libcERROR:
zmalloc.o: In function `zmalloc_used_memory': /usr/local/redis-3.2.9/src/zmalloc.c:223: undefined reference to `__sync_add_and_fetch_4' collect2: ld returned 1 exit status make[1]: *** [redis-server] Error 1 make[1]: Leaving directory `/usr/local/redis-3.2.9/src' make: *** [all] Error 2 wget http://download.redis.io/releases/redis-3.2.9.tar.gz FIX:make CFLAGS='-march=i686'ERROR: You need tcl 8.5 or newer in order to run the Redis testmake: *** [test] Error 1
FIX:安装tcl,yum可用的话yum install tclERROR:
make: cc: Command not found make: *** [adlist.o] Error 127 FIX:安装gcc库。yum可用的话 yum install gccError: /usr/bin/env: ruby: No such file or directory
Cause: redis-trib.rb 依赖 rubyFix: yum -y install ruby Error: ./redis-trib.rb:24:in `require': no such file to load -- rubygems (LoadError) from ./redis-trib.rb:24Cause: redis-trib.rb 依赖 rubygemsFix: 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:25Cause: 缺少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。