继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Redis知识点梳理

慕村9548890
关注TA
已关注
手记 1260
粉丝 227
获赞 990
二、环境介绍

环境介绍:
[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数据导入集群

目前我使用的就是createfixinfocheck.具体使用详情可以参考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



打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP