常用选项redis-cli -h <hostname> -p <port> -a <passwd> -u <uri>
redis-cli -u redis://passwd@hostname:port/0
常见集群操作命令:
multi 开始记录
ping
ping
...
set a b
get a
exec 开始执行
redis-cli -p 5555 --stat -i <interval>
查看当前数据情况,负载情况, 默认15秒一次redis配置生效方式
ReplicationID, offset
, 每当有master将自己的replicationstream发送给slvae时,这个offset就会增加相应的字节数masterauth <master-password>
, requirepass <your passwd>
[TODO]当master restart之后,可能其他replica已经成为master了, 那么之前没传完的数据该如何部分重传?
<font color=‘red‘>当redis实例启动的时候,如果appendonly no, 则无论是否打开rdb,都会默认加载指定目录下的dbfilename,如果appendonly yes, 则优先加载appendfilename, 如果appendfilename不存在,则不会加载dbfilename</font>
save <sec> <num of keyschange>
save 60 10 每六十秒统计一次,如果有超过10个key发生变更,则触发一次快照redis-cli config set save ‘‘
aof和RDB
BGSAVE和BGREWRITEAOF命令不能同时执行
aof过大时,支持aof文件的重写,用于达到复制相同复制集的情况下的,减小aof文件大小
为redis instance的一种HA方案,同时提供monitor,notification(API触发接口),auto failover 和 configration provider
sentinel monitor <master-group-name> <ip> <port> <quorum>
quorum解释:
<quorum>
个sentinel认为master不可用,failover才会被授权执行。sentinel <option_name> <master_name> <option_value>
optionname如下:
<ms>
//超过这个时间,sentinel将认为实例不可达<nums>
//出现故障,failover完成后,最多有多少个replica去从master同步<ms>
// failover进程最长执行时间,超过时间将认定failover失败<font color=‘red‘>【TODO】这时集群的状态是ERROR吗?</font>样例
bind <my_ip> 127.0.0.1
protected-mode no
syslog-enabled no
syslog-ident "redis-sentinel"
syslog-facility local0
port 26379
dir /home/redis/data/conf
maxclients 50000
sentinel monitor redis_sentinel_zhk022702 <my_ip> 6379 2
sentinel down-after-milliseconds redis_sentinel_zhk022702 20000
sentinel parallel-syncs redis_sentinel_zhk022702 2
redis实例本身的认证,
masterauth <master-password>
, requirepass <yourRequirePasswd>
sentinel auth-pass <master-group-name> <pass>
如sentinel auth-pass mymaster <yourRequirePasswd>
requirepass <yourSentinelPasswd>
, 这个指令将直接限制client --> sentinel的访问和sentinels集群间的认证# redis-server
# redis-server --port 6380
# redis-server --port 6381
# cat conf/sentinel*.conf
port 26379
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 3000
sentinel failover-timeout mymaster 40000
sentinel parallel-syncs mymaster 2
port 26380
...同上
port 26381
...同上
# redis-sentinel conf/sentinel1.conf
# redis-sentinel conf/sentinel2.conf
# redis-sentinel conf/sentinel3.conf
# cat conf/sentinel*.conf
port 26379
sentinel monitor mymaster 127.0.0.1 6379 2 #如果发生failover,本配置文件会被更改
sentinel down-after-milliseconds mymaster 3000
sentinel failover-timeout mymaster 40000
sentinel parallel-syncs mymaster 2
# Generated by CONFIG REWRITE
dir "/data"
sentinel config-epoch mymaster 0 ## 表示这两个自动添加的内容不知道意思
sentinel leader-epoch mymaster 0
sentinel known-sentinel mymaster 127.0.0.1 26380 119690834a6925435edeeccf6a98df1152d342a5
sentinel known-sentinel mymaster 127.0.0.1 26381 c75d2e225a353d23881d63e5a383cc620f0c1d44
sentinel current-epoch 0
port 26380
...与上类似
port 26381
...与上类似
redis-cli -p 26379
localhost:26379> sentinel master mymaster # 用于显示 本sentinel所监控的master信息
SENTINEL slave mymaster # 查master的slaves
SENTINEL sentinels mymaster #查sentinel的其他sentinels
SENTINEL get-master-addr-by-name mymaster #获取master的<ip:port>
SENTINEL failover <master name>
SENTINEL reset <pattern>
SENTINEL ckquorum <master name>
SENTINEL flushconfig
# 实时重配置sentinel
SENTINEL MONITOR <name> <ip> <port> <quorum>
SENTINEL REMOVE <name>
SENTINEL SET <name> <option> <value>
# 测试failover
redis-cli -p 6379 DEBUG sleep 30
# 安全相关
在这个例子中, ForClient: 三个 < sentinelIP: sentinelPORT >
https://redis.io/topics/sentinel-clients
cluster-enabled <yes/no>
cluster-config-file <filename>
# 这个配置不是由用户编辑,而是有集群生成,当启动时,cluster节点信息,状态,变量信息等就会记录在内cluster-node-timeout <ms>
# 类似于sentinel的down-after-, master超过多少毫秒不可达, 将触发改节点的主从切换cluster-slave-validity-factor <factor>
[TODO 待学习]cluster-require-full-coverage <yes/no>
默认是yes,当一个key计算出的hash slot未被cluster集群覆盖时,该redis节点将不再提供查询服务,这时候异常的节点将会导致集群不可用,但是你又希望集群的其他正常的节点能够正常提供接受请求,这时候设置此项目为no# redis.conf // 启动redis cluster实例 * 6
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
port 7001-7005
或者这样: ../../src/redis-server --port 30009 --cluster-enabled yes --cluster-config-file nodes-30009.conf --cluster-node-timeout 2000 --appendonly yes --appendfilename appendonly-30009.aof --dbfilename dump-30009.rdb --logfile 30009.log --daemonize yes
…
# redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1
// 6个redis instance, 按照master:slave = 1:1 ==> 组成nodes * 3,并且三个nodes参与sharding,并分配好三个nodes的hash slot
# 执行完成后,redis会自动将master-slave划分好,并提供对应关系
# > cluster nodes查看当前集群状态
# > cluster info查看集群信息
# > cluster failover做主从切换
create-cluster start
create-cluster create
create-cluster stop
# 集群reshard
交互式:redis-cli --cluster reshard 127.0.0.1:30001 //如果不满意redis划分的shard落点,可以自行划分
脚本: redis-cli reshard <host>:<port> --cluster-from <node-id> --cluster-to <node-id> --cluster-slots <number of slots> --cluster-yes
状态查看: redis-cli --cluster check 127.0.0.1:30001 // 用于查看reshard之后集群的状态是否正常
# 手动主从切换(failover)
在slave上执行 cluster failover
# 添加节点
redis-cli --cluster add-node <new_to_add> <existed_node>
redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000
//这样添加的节点默认都是master节点,第一: 虽然是master节点,但是却没有对应的hashslots,二来,当其他slave想failover为master时,这些无slots的master不参与选举过程
# 添加replica
方法:1 这种类似上面,添加一个slave,但是默认将这个slave分配到master上对应slave较少的master上, 即便配置了master-slave1:1, 当有新的slave加入时,可能会变成1:2
redis-cli --cluster add-node <new_to_add> <existed_node> --cluster-slave
方法:2 直接指定对应的master
redis-cli --cluster add-node <new_to_add> <existed_node> --cluster-slave --cluster-master-id 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
方法:3 链接到对应的节点,手动通过CLUSTER REPLICA
redis <new_to_add>> cluster replicate 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
# 删除replica
主机:端口这个是集群随意一个即可,后面是要删除的node_id
redis-cli --cluster del-node 127.0.0.1:7000 `<node-id>`
注意:replica可以直接删除,但是如果要删除master,必须要保证master节点上无数据(使用reshard,将该节点的数据全都迁移到其他节点)
# replica迁移(暂未具体学习)
# nodes升级(暂未具体学习)
# cluster集群迁移(暂时未学习)
[
{"host": "localhost", "port": "30001"},
{"host": "localhost", "port": "30002"},
{"host": "localhost", "port": "30003"},
{"host": "localhost", "port": "30004"},
{"host": "localhost", "port": "30005"},
{"host": "localhost", "port": "30006"},
]
redis+shard
redis-cli --cluster add-node <new_to_add> <existed_node> // 加master
redis-cli --cluster add-node <new_to_add> <existed_node> --cluster-slave --cluster-master-id 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e // 加对应replica
redis-cli reshard <host>:<port> //后面参数可选[--cluster-from <node-id> --cluster-to <node-id> --cluster-slots <number of slots> --cluster-yes], host:port为扩容前已存在的节点(existed_node)
redis-cli --cluster check 127.0.0.1:30001 // 检查reshard的结果是否有异常
#common配置:
bind <my_ip> 127.0.0.1 // 绑定地址
daemonize no // 非daemon模式运行(也是默认)
pidfile /home/redis/var/run/redis.pid //当redis被启动为一个daemon的时候,需要一个pid文件
protected-mode no //保护模式:默认(yes),如果yes, 且没有指定bind,而且没有配置密码,那么本实例仅支持本地client接入,不支持remote client access
port 6379
tcp-backlog 511 // 在高QPS(requests-per-sec)环境中这个值会影响当前服务器能够处理的tcp链接请求的速率(rate), 参考http://dwz.date/Rsd和官方配置文档
timeout 0 // 客户端闲置N秒后,自动关闭,(0 to disable)
tcp-keepalive 300 // tcp长链接相关
loglevel notice // 日志通告级别
logfile "/home/redis/var/log/redis.log" // log path
databases 16 // 实例最大db数, default DB0, select # 进行切换
save 900000000 1 // RDB trigger on disk save <secs> <changes>, 表示 sec秒内(也就是过了sec秒后),如果有超过changes个keys发生改变,就主动落地一次, 本例表示9xxxx秒后,如果有1个key发生变更,就刷一次rdb,当然这里永远不可能触发,一般用bgsave执行, 他不会阻塞进程
stop-writes-on-bgsave-error yes // 如果rdb snapshots失败了,或者最近一次bgsave也失败了,redis默认会拒绝本实例的写操作,本设置为了警告用户当前实例的persistent已经失败了
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /home/redis/data/db // workdir
slave-serve-stale-data yes // 用于处理slave和master链接丢失,或者replication还是正常服务,如果yes(default) --> 那slave仍然会响应client的请求,但是数据可能是过期的,或者是空的(第一次sync from master), 如果no,client在给slave发命令时,会直接给client反馈“SYNC with master in progress”,
slave-read-only yes
repl-diskless-sync no // replication的同步策略,无盘 or socket, 目前disk是实验性能,建议no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no // 有关同步之后套接字的TCP_NODELAY的禁用, TODO, 暂时不了解
repl-backlog-size 64mb // 当slave与master断开连接时的一个sync缓冲,积压缓冲区的大小,体积越大,能够容忍的disconnection时间越长
repl-timeout 600 // replication 超时定义,如果1. 站在repl角度,如果sync时bulk传输i/o超时,如果给masterping超过600s则认为超时,站在master角度,如果repl响应超时600s,则认定为超时 【TODO】这里可以了解了解bulk transfer
slave-priority 100 // 5.0中叫 replica-priority, 整型数值,用于sentinel模式中,当master异常时,replica需要晋升时的优先度,值越小,优先级越高,0默认不被选择,default 100
maxmemory 36gb // 内存管理: 当实例使用的内存数量超过时,将根据maxmemory-policy策略进行key的删除
maxmemory-policy noeviction // 有很多策略,根据使用场景,sa自行设定,这里默认不进行key的eviction,而是反馈writes error
maxclients 50000
## 备份相关
appendonly no //fsync是否开启,内存flush --> disk的性能 vs persistent
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no //暂未了解[TODO]
auto-aof-rewrite-percentage 100 //暂未了解[TODO]
auto-aof-rewrite-min-size 4gb //暂未了解[TODO]
aof-load-truncated yes
lua-time-limit 5000
## reids-cluster
cluster-enabled yes
cluster-config-file /home/redis/data/conf/nodes.conf
cluster-node-timeout 15000 ## 类似于sentinel的down-after- 每个nodes的master-slave探测时间为多长时,会触发主从切换
cluster-require-full-coverage no ## 默认是yes,当一个key计算出的hash slot未被cluster集群覆盖时,该redis节点将不再提供查询服务,这时候异常的节点将会导致集群不可用,但是你又希望集群的其他正常的节点能够正常提供接受请求,这时候设置此项目为no
slowlog-log-slower-than 100000
slowlog-max-len 128
latency-monitor-threshold 1000
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 0 0 0
client-output-buffer-limit pubsub 512mb 256mb 60
hz 10
aof-rewrite-incremental-fsync yes
原文:https://blog.51cto.com/gumpping/2491349