二、环境介绍
环境介绍:
[redis版本]:3.2.12
[集群模式]: redis3.0以后的cluster模式,基于hash分槽的方式.默认是16384个槽,理论上节点越稀疏,单个节点承受的压力就越小,出现问题的概率就越小。
[节点个数]: 3主3从.通过./redis-trib.rb create --replicas 1命令创建的集群,每个IP一主一从,交叉主备。
三、重要配置
#redis绑定ip,注意:如果要对外访问的话,不能配置成127.0.0.1bind 10.xx.xx.xx#绑定端口port 6379#客户端连接的超时时间timeout 5#是否为守护进程daemonize yes#pid文件pidfile "/var/run/redis_6379.pid"#日志级别(redis有四种日志级别,分别为debug,verbose,notice,warning).loglevel notice#日志文件名logfile "redis_6379.log"#rdb,aof持久化文件,日志文件存放目录dir "/data/redis-3.2.12"#如果是redis cluster,且配置了requirepass,那么masterauth必须要设置。否则master会拒绝掉slave的请求,报权限未认证的错误。masterauth "cftadmin"#密码requirepass "cftadmin"#每秒追加一次(总共有三个配置选项-always、no、everysec)appendfsync everysec#是否开启集群cluster-enabled yes#集群配置文件(当节点重启时,redis会读取这个文件)cluster-config-file "nodes_6379.conf"#节点间通信的超时时间,毫秒。当超过这个毫秒值,集群会任务这个集群不可用,将节点状态标记成failed.cluster-node-timeout 10000#配置no时,当主库下线后,即使没有从库顶上,也不影响集群的使用.#这个很重要,如果不配置该参数,当其中一个主节点挂了以后,客户端会报#redis.clients.jedis.exceptions.JedisClusterException: CLUSTERDOWN The cluster is downcluster-require-full-coverage no#执行时间高于这个微秒值的,就会记录到慢查询日志中slowlog-log-slower-than 10000#慢查询日志条数,如果大于这个值,就会把原来的剔除slowlog-max-len 1000#开启事件通知,默认是关闭状态。当要订阅过期事件的时候需要依赖这个参数。notify-keyspace-events "xE"
四、集群常用命令
//集群(cluster) CLUSTER INFO 打印集群的信息 CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息。 //节点(node) CLUSTER MEET <ip> <port> 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。 CLUSTER FORGET <node_id> 从集群中移除 node_id 指定的节点。 CLUSTER REPLICATE <node_id> 将当前节点设置为 node_id 指定的节点的从节点。 CLUSTER SAVECONFIG 将节点的配置文件保存到硬盘里面。 //槽(slot) CLUSTER ADDSLOTS <slot> [slot ...] 将一个或多个槽(slot)指派(assign)给当前节点。 CLUSTER DELSLOTS <slot> [slot ...] 移除一个或多个槽对当前节点的指派。 CLUSTER FLUSHSLOTS 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。 CLUSTER SETSLOT <slot> NODE <node_id> 将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。 CLUSTER SETSLOT <slot> MIGRATING <node_id> 将本节点的槽 slot 迁移到 node_id 指定的节点中。 CLUSTER SETSLOT <slot> IMPORTING <node_id> 从 node_id 指定的节点中导入槽 slot 到本节点。 CLUSTER SETSLOT <slot> STABLE 取消对槽 slot 的导入(import)或者迁移(migrate)。 //键 (key) CLUSTER KEYSLOT <key> 计算键 key 应该被放置在哪个槽上。 CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的键值对数量。 CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 个 slot 槽中的键。
五、cluster管理工具redis-trib.rb介绍
redis-trib.rb是redis官方推出的管理redis集群的工具,集成在redis的源码src目录下,是基于redis提供的集群命令封装成简单、便捷、实用的操作工具。redis-trib.rb是redis作者用ruby完成的。
注意: 使用redis-trib.rb安装集群的时候,如果redis指定了密码,会报can't connect to node xxx
,此时要么将requirepass和masterauth去掉,要么修改redis-trib.rb中的代码,将Redis.new(:host => @info[:host], :port => @info[:port], :timeout => 60)
改成Redis.new(:host => @info[:host], :port => @info[:port], :timeout => 60, :password => "密码")
$ruby redis-trib.rb help Usage: redis-trib <command> <options> <arguments ...> create host1:port1 ... hostN:portN --replicas <arg> check host:port info host:port fix host:port --timeout <arg> reshard host:port --from <arg> --to <arg> --slots <arg> --yes --timeout <arg> --pipeline <arg> rebalance host:port --weight <arg> --auto-weights --threshold <arg> --use-empty-masters --timeout <arg> --simulate --pipeline <arg> add-node new_host:new_port existing_host:existing_port --slave --master-id <arg> del-node host:port node_id set-timeout host:port milliseconds call host:port command arg arg .. arg import host:port --from <arg> --copy --replace help (show this help) For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.
可以看到redis-trib.rb具有以下功能:
1、create
:创建集群
2、check
:检查集群
3、info
:查看集群信息
4、fix
:修复集群
5、reshard
:在线迁移slot
6、rebalance
:平衡集群节点slot数量
7、add-node
:将新节点加入集群
8、del-node
:从集群中删除节点
9、set-timeout
:设置集群节点间心跳连接的超时时间
10、call
:在集群全部节点上执行命令
11、import
:将外部redis数据导入集群
目前我使用的就是create
、fix
、info
、check
.具体使用详情可以参考redis cluster管理工具redis-trib.rb详解.
在这里我出现了不少问题,我觉得还是有必要总结一下:
1.Reading from client: Connection reset by peer [ERR] Nodes don't agree about configuration! 2.Exception:redis.clients.jedis.exceptions.JedisClusterException: CLUSTERDOWN The cluster is down 3.通过cluster nodes查看的时候,发现节点会变多,我实际上配置的是3主3从,其中主节点挂掉以后,再次重启,failed节点没有删除。 4.[ERR] Not all 16384 slots are covered by nodes. 5.>>> Creating cluster [ERR] Node 10.xx.xx.xx:6379 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
第一种情况是redis-trib.rb check
的时候报错,这种情况一般是当前节点感知不到集群的存在,利用cluster meet
一般可以解决。cluster meet 10.xx.xx.xx 6379
第二种是通过配置cluster-require-full-coverage no
解决。
后面的那几种情况不太好解决,所以最后把cluster-config-file "nodes_6379.conf"
配置清除,重新创建集群就好了。
如果遇到不能重新创建集群的情况,最后还是利用fix
来修复一下,如果16384个节点不能平摊到每个节点,可以尝试使用rebalance来重新分配一下。
六、其它命令
#1.查看redis最大key./redis-cli -h 10.xx.xx.xx -p 6379 -a xx --bigkeys#2.通过scan批量删除key(但是集群模式待删除的列表不是在同一个slot下会报错:(error) CROSSSLOT Keys in request don't hash to the same slot)#数据量太大,不要直接使用keys,可以改用scan.而且redis cluster不支持keys,因为key已经分散到不同的slot./redis-cli -h 10.xx.xx.xx -p 6379 -a xx keys "abc*" |xargs ./redis-cli -h 10.xx.xx.xx -p 6379 -a xx del#3.通过scan做清除(如果key不在同一个槽也会有问题)./redis-cli -h 10.xx.xx.xx -p 6380 -a xx --scan --pattern "hello*"|xargs ./redis-cli
作者:jerrik
链接:https://www.jianshu.com/p/6287c5979475