Redis 应用进阶
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis 应用进阶相关的知识,希望对你有一定的参考价值。
Redis 基础应用(二)
==============================================================================
概述:
安全相关的配置;
事务功能;
connection(连接)及Server 相关的命令
发布与订阅(publish/subscribe)
Redis的持久化
Redis的主从复制
Redis的sentinel机制
Redis的Clustering机制
==============================================================================
配置和使用Redis
1.配置和使用Redis
★配置段:
基本配置项;
网络配置项;
持久化相关的配置;
复制相关的配置
安全相关的配置;
Limit 相关的配置;
SlowLog 相关的配置;
INCLUDES
Advanced配置
☉通用配置项
deamonize,supervised,loglevel,logfile,pidfile
◆databases:
设定数据库数量,默认为16个,每个数据库的名字均为整数,从0开始编号,默认操作的数据库为0;
切换数据库的方法: SELECT <dbid>
☉网络配置项:
bind IP
port PORT
tcp-backlog:后援队列长度
unixsocket:监听的套接字文件
timeout:连接的超时时长
☉安全相关的配置
requirepass <PASSWORD>
在 redis-cli 接口中使用 AUTH 命令完成认证
或者在连接时使用 -a 指明密码
rename-command <COMMAND><NEW_CMND_NAME>
在 AOF和Replication环境中,不建议使用
☉清空数据库:
FLUSHDB:清空当前库
FLUSHALL:清空所有库
演示:
3.配置文件/etc/redis.conf如下: [[email protected] ~]# cp /etc/redis.conf{,.bak} [[email protected] ~]# grep "^##" /etc/redis.conf ################################## INCLUDES ################################### ################################## NETWORK ##################################### ################################# GENERAL ##################################### ################################ SNAPSHOTTING ################################ ################################# REPLICATION ################################# ################################## SECURITY ################################### ################################### LIMITS #################################### ############################## APPEND ONLY MODE ############################### ################################ LUA SCRIPTING ############################### ################################ REDIS CLUSTER ############################### ################################## SLOW LOG ################################### ################################ LATENCY MONITOR ############################## ############################# EVENT NOTIFICATION ############################## ############################### ADVANCED CONFIG ############################### [[email protected] ~]# vim /etc/redis.conf bind 0.0.0.0 # 修改绑定的端口 # 启动 redis,查看坚挺的端口 6379 [[email protected] ~]# systemctl start redis [[email protected] ~]# ss -tnlp |grep "redis" LISTEN 0 128 *:6379 *:* users:(("redis-server",pid=3840,fd=4))
2.编辑配置文件 /etc/redis.conf 启用认证功能,并添加密码:
重启服务,再次执行命令就需要添加认证密码,如下:
2.事务功能
★事务
通过 MULTI,EXEC,WATCH 等命令实现事务功能;
将一个或者到多个命令归并为一个操作提请服务器按顺序执行的机制,不支持回滚操作;
☉Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:
事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。
☉一个事务从开始到执行会经历以下三个阶段:
开始事务。
命令入队。
执行事务。
★事务命令:
☉MULTI:标记一个事务块的开始;
☉EXEC:
执行所有事务块中的命令;
一次性将事务中的所有操作执行完成后返回给客户端;
☉WHATCH key [key...]
乐观锁;在EXEC执行之前,用于监视指定数量键 key,如果监视中的某任意键数据被修改,则服务器拒绝执行事务(事务被打断);
☉DISCARD
取消事务,放弃执行事务块内的命令;
☉UNWATCH
取消 WATCH 命令对所有 key 的监控;
演示:
先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令:
[[email protected] ~]# redis-cli -h 192.168.1.112 -a taoxiu 192.168.1.112:6379> MULTI OK 192.168.1.112:6379> SET ip 192.168.1.118 QUEUED 192.168.1.112:6379> GET ip QUEUED 192.168.1.112:6379> SET port 8088 QUEUED 192.168.1.112:6379> GET port QUEUED 192.168.1.112:6379> EXEC 1) OK 2) "192.168.1.118" 3) OK 4) "8088" # 用 WATCH 命令监视一个或者多个 key,然后启动一个事务,在未执行EXEC之前,在另一个终端修改这个被监视的 key, 192.168.1.112:6379> WATCH ip OK 192.168.1.112:6379> MULTI OK 192.168.1.112:6379> SET ip 10.1.0.1 QUEUED 192.168.1.112:6379> GET ip QUEUED 192.168.1.112:6379> EXEC (nil) 192.168.1.112:6379> GET ip "10.1.252.116" 在未执行EXEC之前,在另一个终端修改这个被监视的 key, 192.168.1.112:6379> GET ip "192.168.1.118" 192.168.1.112:6379> SET ip 10.1.252.116 OK 192.168.1.112:6379> GET ip "10.1.252.116" # 然后在监视 指定 key 的终端 执行EXEC 执行事务,发现事务执行失败 192.168.1.112:6379> WATCH ip OK 192.168.1.112:6379> MULTI OK 192.168.1.112:6379> SET ip 10.1.0.1 QUEUED 192.168.1.112:6379> GET ip QUEUED 192.168.1.112:6379> EXEC (nil) # 执行失败 192.168.1.112:6379> GET ip "10.1.252.116"
3.connection(连接)及Server 相关的命令
★Connection命令
AUTH:认证相关的命令
ECHO:
PING:
QUIT:
SELECT:切换数据库
★Server命令
Redis 服务器命令主要是用于管理 redis 服务。
下表列出了 redis 服务器的相关命令:
序号 命令及描述 1 BGREWRITEAOF
异步执行一个 AOF(AppendOnly File) 文件重写操作2 BGSAVE
在后台异步保存当前数据库的数据到磁盘3 CLIENT KILL [ip:port] [ID client-id]
关闭客户端连接4 CLIENT LIST
获取连接到服务器的客户端连接列表5 CLIENT GETNAME
获取连接的名称6 CLIENT PAUSE timeout
在指定时间内终止运行来自客户端的命令7 CLIENT SETNAME connection-name
设置当前连接的名称8 CLUSTER SLOTS
获取集群节点的映射数组9 COMMAND
获取 Redis 命令详情数组10 COMMAND COUNT
获取 Redis 命令总数11 COMMAND GETKEYS
获取给定命令的所有键12 TIME
返回当前服务器时间13 COMMAND INFO command-name [command-name ...]
获取指定 Redis 命令描述的数组14 CONFIG GET parameter
获取指定配置参数的值15 CONFIG REWRITE
对启动 Redis 服务器时所指定的 redis.conf 配置文件进行改写16 CONFIG SET parameter value
修改 redis 配置参数,无需重启17 CONFIG RESETSTAT
重置 INFO 命令中的某些统计数据18 DBSIZE
返回当前数据库的 key 的数量19 DEBUG OBJECT key
获取 key 的调试信息20 DEBUG SEGFAULT
让 Redis 服务崩溃21 FLUSHALL
删除所有数据库的所有key22 FLUSHDB
删除当前数据库的所有key23 INFO [section]
获取 Redis 服务器的各种信息和统计数值24 LASTSAVE
返回最近一次 Redis 成功将数据保存到磁盘上的时间,以 UNIX 时间戳格式表示25 MONITOR
实时打印出 Redis 服务器接收到的命令,调试用26 ROLE
返回主从实例所属的角色27 SAVE
异步保存数据到硬盘28 SHUTDOWN [NOSAVE] [SAVE]
异步保存数据到硬盘,并关闭服务器29 SLAVEOF host port
将当前服务器转变为指定服务器的从属服务器(slave server)30 SLOWLOG subcommand [argument]
管理 redis 的慢日志31 SYNC
用于复制功能(replication)的内部命令
4.发布与订阅(publish/subscribe)
★pub/sub
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
Redis 客户端可以订阅任意数量的频道。
下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:
当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:
注意:
频道:消息队列
下表列出了 redis 发布订阅常用命令:
序号 命令及描述 1 PSUBSCRIBE pattern [pattern ...]
订阅一个或多个符合给定模式的频道。2 PUBSUB subcommand [argument [argument ...]]
查看订阅与发布系统状态。3 PUBLISH channel message
将信息发送到指定的频道。4 PUNSUBSCRIBE [pattern [pattern ...]]
退订所有给定模式的频道。5 SUBSCRIBE channel [channel ...]
订阅给定的一个或多个频道的信息。6 UNSUBSCRIBE [channel [channel ...]]
指退订给定的频道。
演示:
以下实例演示了发布订阅是如何工作的。在我们实例中我们创建了订阅频道名为 redisChat:
192.168.1.112:6379> SUBSCRIBE redisChat Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "redisChat" 3) (integer) 1
现在,我们先重新开启个 redis 客户端,然后在同一个频道 redisChat 发布两次消息,订阅者就能接收到消息。
192.168.1.112:6379> PUBLISH redisChat "Redis is a great caching technique" (integer) 1 192.168.1.112:6379> PUBLISH redisChat "Learn redis by runoob.com" (integer) 1 #订阅者的客户端会显示如下消息 1) "message" 2) "redisChat" 3) "Redis is a great caching technique" 1) "message" 2) "redisChat" 3) "Learn redis by runoob.com"
5.Redis的持久化
★RDB和AOF
☉RDB:
snapshot(快照),二进制格式;按事先定制的策略,周期性的将数据保存至磁盘;数据文件默认为dump.rdb
◆定义方法:
▲客户端也可显示使用 SAVE 和 BGSAVE 命令启动快照保存机制
※SAVE:
执行一个同步保存操作,将当前 Redis 实例的所有数据快照(snapshot)以 RDB 文件的形式保存到硬盘。
在主进程中保存快照,此会阻塞所有客户端的请求;
※BGSAVE:
在后台异步保存当前数据库的数据到磁盘。
BGSAVE 命令执行之后立即返回 OK ,然后 Redis fork 出一个新子进程,原来的 Redis 进程(父进程)继续处理客户端请求,而子进程则负责将数据保存到磁盘,然后退出。
▲在配置文件中定义周期性的工作机制参数:
1.指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
save <seconds> <changes>
Redis默认配置文件中提供了三个条件:
save 900 1
save 300 10
save 60 10000
分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。
2.指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
rdbcompression yes
3.指定本地数据库文件名,默认值为dump.rdb
dbfilename dump.rdb
4.指定本地数据库存放目录
dir /vat/lib/redis
5.rdnchecksum yes
6.stop-writes-on-bgsave-error yes
☉AOF:
Append Only File ;
记录每一次写操作至指定的文件尾部实现持久化(类似mysql的binlog);当redis重启时,可通过重新执行文件中的命令在内存中重建数据库;
◆BGREWRITEAOF:
用于异步执行一个 AOF(AppendOnly File) 文件重写操作。重写会创建一个当前 AOF 文件的体积优化版本。
即使 Bgrewriteaof 执行失败,也不会有任何数据丢失,因为旧的 AOF 文件在 Bgrewriteaof 成功之前不会被修改。
不会读取正在使用的AOF文件,而通过将内存中的数据以命令的方式保存到临时文件中,完成之后替换原来的AOF文件;
注意:
从 Redis 2.4 开始, AOF 重写由 Redis 自行触发, BGREWRITEAOF 仅仅用于手动触发重写操作。
◆AOF重写过程
1)redis 主进程通过 fock 创建子进程;
2)子进程根据redis内存中的数据创建数据库重建命令序列于临时文件中;
3)父进程继承Client 的请求,并会把这些请求中的写操作继续追加至原来的AOF文件;额外的,这些新的请求还会被放置于一个缓冲队列中;
4)子进程重写完成会通知父进程;父进程会把缓冲中的命令写到临时文件中;
5)父进程用临时文件替换掉老的AOF文件;
◆相关参数:
1. 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
appendonly no
2. 指定更新日志文件名,默认为appendonly.aof
appendfilename appendonly.aof
3. 指定更新日志条件,共有3个可选值:
appendfsync everysec
no:表示等操作系统进行数据缓存同步到磁盘(快)
always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
everysec:表示每秒同步一次(折衷,默认值)
4. no-appendfsync-on-rewrite no
5.auto-aof-rewrite-percentage 100
//表示现有的aof文件是上次文件大小的2倍,即改变已达到100%,就再次重写
6.auto-aof-rewrite-min-size 64mb
//表示重写的大小要至少达到64M之后才开始重写
注意:
持久本身不能取代备份;还应该指定备份策略,对redis数据库定期进行备份;
☉BDF与AOF同时启用:
1)BGSAVE和BGREWRITEAOF不会同时执行;
2)在Redis服务器启动用于数据恢复时,会优先选用AOF;
6.Redis的主从复制
★特点:
一个Master可以有多个Slave;
支持链式复制
Master以非阻塞方式同步数据至Slave
☉配置文件参数:
◆slaveof <masterip> <masterport>
设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
◆masterauth <master-password>
当master服务设置了密码保护时,slav服务连接master的密码
☉SLAVEOF 命令:
◆语法:
>SLAVEOF host port
注意:
Redis Slaveof 命令可以将当前服务器转变为指定服务器的从属服务器(slave server)。
如果当前服务器已经是某个主服务器(master server)的从属服务器,那么执行 SLAVEOF host port 将使当前服务器停止对旧主服务器的同步,丢弃旧数据集,转而开始对新主服务器进行同步。
另外,对一个从属服务器执行命令 SLAVEOF NO ONE 将使得这个从属服务器关闭复制功能,并从从属服务器转变回主服务器,原来同步所得的数据集不会被丢弃。
利用『 SLAVEOF NO ONE 不会丢弃同步所得数据集』这个特性,可以在主服务器失败的时候,将从属服务器用作新的主服务器,从而实现无间断运行。
演示:
1.准备一个新的节点 node2 (192.168.1.113),同样安装redis,并配置作为node1(192.168.1.112)的从库;
[[email protected] ~]# redis-cli -h 192.168.1.113 192.168.1.113:6379> SLAVEOF 192.168.1.112 6379 OK 192.168.1.113:6379> GET port "8088" 192.168.1.113:6379> GET ip "192.168.1.118" 192.168.1.113:6379> key * (error) ERR unknown command ‘key‘ 192.168.1.113:6379> KEYS * 1) "ip" 2) "port" # 从节点查看INFO 信息及 日志如下: 192.168.1.113:6379> INFO replication # Replication role:slave master_host:192.168.1.112 master_port:6379 master_link_status:up master_last_io_seconds_ago:7 master_sync_in_progress:0 slave_repl_offset:1247 slave_priority:100 slave_read_only:1 connected_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 [[email protected] ~]# tail /var/log/redis/redis.log 2550:S 25 Mar 16:53:14.973 * Connecting to MASTER 192.168.1.112:6379 2550:S 25 Mar 16:53:14.973 * MASTER <-> SLAVE sync started 2550:S 25 Mar 16:53:14.973 * Non blocking connect for SYNC fired the event. 2550:S 25 Mar 16:53:14.974 * Master replied to PING, replication can continue... 2550:S 25 Mar 16:53:14.975 * Partial resynchronization not possible (no cached master) 2550:S 25 Mar 16:53:14.977 * Full resync from master: e83d8db2749c0174c2f60c46c6ad0566272876aa:1 2550:S 25 Mar 16:53:15.008 * MASTER <-> SLAVE sync: receiving 108 bytes from master 2550:S 25 Mar 16:53:15.008 * MASTER <-> SLAVE sync: Flushing old data 2550:S 25 Mar 16:53:15.008 * MASTER <-> SLAVE sync: Loading DB in memory 2550:S 25 Mar 16:53:15.009 * MASTER <-> SLAVE sync: Finished with success # 主节点查看INFO 信息及 日志如下: 192.168.1.112:6379> INFO replication # Replication role:master connected_slaves:1 slave0:ip=192.168.1.113,port=6379,state=online,offset=1233,lag=1 master_repl_offset:1233 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:1232 [[email protected] ~]# tail /var/log/redis/redis.log 3426:M 25 Mar 16:53:14.958 * Slave 192.168.1.113:6379 asks for synchronization 3426:M 25 Mar 16:53:14.958 * Full resync requested by slave 192.168.1.113:6379 3426:M 25 Mar 16:53:14.958 * Starting BGSAVE for SYNC with target: disk 3426:M 25 Mar 16:53:14.959 * Background saving started by pid 3429 3429:C 25 Mar 16:53:14.977 * DB saved on disk 3429:C 25 Mar 16:53:14.978 * RDB: 2 MB of memory used by copy-on-write 3426:M 25 Mar 16:53:14.990 * Background saving terminated with success 3426:M 25 Mar 16:53:14.990 * Synchronization with slave 192.168.1.113:6379 succeeded
7.Redis的sentinel机制
★sentinel
☉作用:
用于管理多个Redis服务实现HA
监控主服务器Master;
通知;
自动故障转移;
☉使用协议:
流言协议;投票协议
☉程序(启用sentinel 必须要指明配置文件)
redis-sentinel /path/to/file
redis-server /path/to/file --sentinel
◆工作过程
1)服务器自身初始化,运行于redis-server中专用于sentinel功能的代码;
2)初始化sentinel状态,根据给定的配置文件,初始化监控的master服务器列表;
3)创建连向master的连接;
☉专用配置文件
/etc/redis-sentinel.conf
◆配置项
sentinel monitor <master-name> <ip> <redis-port> <quorum>
//连接的主节点,可以有多行,quorum表示法定票数,建议sentinel节点为奇数个
//只需要指明主节点即可,从节点会通过主节点自动获取
示例:sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds <master-name> <milliseconds>
//判断某主节点不在线的超时时长
示例:sentinel down-after-milliseconds mymaster 30000 (单位:毫秒)
sentinel parallel-syncs <master-name> <numslaves>
//执行故障转移时(即刚刚设定为新主服务器时),允许最多有多少个从服务器可以向主服务器发起连接请求
示例: sentinel parallel-syncs mymaster 1
sentinel failover-timeout <master-name> <milliseconds>
//故障转移的超时时间,即当主服务器出现故障时,提升新的从服务器为主服务器的超时时间;
示例: sentinel failover-timeout mymaster 180000
sentinel auth-pass <master-name> <password>
// 连接主节点的认证密码
示例:sentinel auth-pass mymaster taoxiu
☉主观下线和客观下线
主管下线:单个sentinel实例判断出某节点下线
客观下线:多个sentinel节点协商后判断出某节点下线;
☉专用命令
SENTINEL master
SENTINEL slaves <master name>
SENTINEL get-master-addr-by-name <master name>
SENTINEL reset
SENTINEL failover <master name>
演示:
操作环境
node1 节点几位master节点,又为 sentinel 节点
node2 和 node3 节点为 从节点
1.准备操作环境,如下:
主节点 node1 如下:
192.168.1.112:6379> INFO replication # Replication role:master connected_slaves:2 slave0:ip=192.168.1.113,port=6379,state=online,offset=11593,lag=0 slave1:ip=192.168.1.114,port=6379,state=online,offset=11593,lag=1 master_repl_offset:11593 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:11592 192.168.1.112:6379> KEYS * 1) "ip" 2) "port"
从节点 node2和node3 如下:
# node 2 192.168.1.113:6379> SLAVEOF 192.168.1.112 6379 OK 192.168.1.113:6379> INFO replication # Replication role:slave master_host:192.168.1.112 master_port:6379 master_link_status:up master_last_io_seconds_ago:6 master_sync_in_progress:0 slave_repl_offset:11579 slave_priority:100 slave_read_only:1 connected_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 192.168.1.113:6379> KEYS * 1) "ip" 2) "port" # node3 [[email protected] ~]# redis-cli -h 192.168.1.114 192.168.1.114:6379> SLAVEOF 192.168.1.112 6379 OK 192.168.1.114:6379> INFO replication # Replication role:slave master_host:192.168.1.112 master_port:6379 master_link_status:up master_last_io_seconds_ago:6 master_sync_in_progress:0 slave_repl_offset:11565 slave_priority:100 slave_read_only:1 connected_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 192.168.1.114:6379> KEYS * 1) "ip" 2) "port"
2.在主节点node1 配置启用 sentinel 机制,编辑配置文件 /etc/redis-sentinel.conf,并启动如下:
[[email protected] ~]# cp /etc/redis-sentinel.conf{,.bak} [[email protected] ~]# vim /etc/redis-sentinel.conf sentinel monitor mymaster 192.168.1.112 6379 1 # 要连接的主服务器ip和端口,如果要监控多组主从的话 主节点名称要不相同 sentinel down-after-milliseconds mymaster 5000 # 判断主节点不在线的超时时长 sentinel failover-timeout mymaster 60000 # 故障转移的超时时长 # 启动 sentinel 服务,并查看端口 26379 [[email protected] ~]# redis-sentinel /etc/redis-sentinel.conf [[email protected] ~]# ss -tnlp |grep "sentinel" LISTEN 0 128 *:26379 *:* users:(("redis-sentinel",pid=4146,fd=5)) LISTEN 0 128 :::26379 :::* users:(("redis-sentinel",pid=4146,fd=4))
3.连接sentinel 执行命令如下:
192.168.1.112:26379> info sentinel # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=mymaster,status=ok,address=192.168.1.112:6379,slaves=2,sentinels=1 192.168.1.112:26379> SENTINEL masters # 获取所有主节点的详细信息 1) 1) "name" 2) "mymaster" 3) "ip" 4) "192.168.1.112" 5) "port" 6) "6379" 7) "runid" 8) "64b7b580bb66b3bf757682cff46c2fdab8f8274f" 9) "flags" 10) "master" 11) "link-pending-commands" 12) "0" 13) "link-refcount" 14) "1" 15) "last-ping-sent" 16) "0" 17) "last-ok-ping-reply" 18) "377" 19) "last-ping-reply" 20) "377" 21) "down-after-milliseconds" 22) "5000" 23) "info-refresh" 24) "5155" 25) "role-reported" 26) "master" 27) "role-reported-time" 28) "1581867" 29) "config-epoch" 30) "0" 31) "num-slaves" 32) "2" 33) "num-other-sentinels" 34) "0" 35) "quorum" 36) "1" 37) "failover-timeout" 38) "60000" 39) "parallel-syncs" 40) "1" 192.168.1.112:26379> SENTINEL slaves mymaster # 获取从服务器信息 1) 1) "name" 2) "192.168.1.114:6379" 3) "ip" 4) "192.168.1.114" 5) "port" 6) "6379" 7) "runid" 8) "f62c27d585c3ac4c8730c8b578838ca6434e27bf" 9) "flags" 10) "slave" 11) "link-pending-commands" 12) "0" 13) "link-refcount" 14) "1" 15) "last-ping-sent" 16) "0" 17) "last-ok-ping-reply" 18) "809" 19) "last-ping-reply" 20) "809" 21) "down-after-milliseconds" 22) "5000" 23) "info-refresh" 24) "5225" 25) "role-reported" 26) "slave" 27) "role-reported-time" 28) "1742587" 29) "master-link-down-time" 30) "0" 31) "master-link-status" 32) "ok" 33) "master-host" 34) "192.168.1.112" 35) "master-port" 36) "6379" 37) "slave-priority" 38) "100" 39) "slave-repl-offset" 40) "173202" 2) 1) "name" 2) "192.168.1.113:6379" 3) "ip" 4) "192.168.1.113" 5) "port" 6) "6379" 7) "runid" 8) "489d228990a895ff207aec9f3dda2474cbd1d096" 9) "flags" 10) "slave" 11) "link-pending-commands" 12) "0" 13) "link-refcount" 14) "1" 15) "last-ping-sent" 16) "0" 17) "last-ok-ping-reply" 18) "808" 19) "last-ping-reply" 20) "808" 21) "down-after-milliseconds" 22) "5000" 23) "info-refresh" 24) "5225" 25) "role-reported" 26) "slave" 27) "role-reported-time" 28) "1742587" 29) "master-link-down-time" 30) "0" 31) "master-link-status" 32) "ok" 33) "master-host" 34) "192.168.1.112" 35) "master-port" 36) "6379" 37) "slave-priority" 38) "100" 39) "slave-repl-offset" 40) "173202"
4.测试,让主节点下线,然后再次查看 sentinel 节点信息,发现主节点已经变为 node2(192.168.1.113)
192.168.1.112:26379> info sentinel # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=mymaster,status=ok,address=192.168.1.113:6379,slaves=2,sentinels=1 192.168.1.112:26379> SENTINEL masters 1) 1) "name" 2) "mymaster" 3) "ip" 4) "192.168.1.113" 5) "port" 6) "6379" 7) "runid" 8) "489d228990a895ff207aec9f3dda2474cbd1d096" 9) "flags" 10) "master" 11) "link-pending-commands" 12) "0" 13) "link-refcount" 14) "1" 15) "last-ping-sent" 16) "0" 17) "last-ok-ping-reply" 18) "422" 19) "last-ping-reply" 20) "422" 21) "down-after-milliseconds" 22) "5000" 23) "info-refresh" 24) "3757" 25) "role-reported" 26) "master" 27) "role-reported-time" 28) "64236" 29) "config-epoch" 30) "1" 31) "num-slaves" 32) "2" 33) "num-other-sentinels" 34) "0" 35) "quorum" 36) "1" 37) "failover-timeout" 38) "60000" 39) "parallel-syncs" 40) "1"
在配置过程中遇到的问题:
配置完成 sentinel.conf 后使用redis-cli -h 127.0.0.1 -p 26379连接sentinel可以执行命令,而使用redis-cli -h 192.168.1.112 -p 26379连接sentinel执行命令则会报错误,如下:
DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients. In this mode connections are only accepted from the loopback interface. If you want to connect from external computers to Redis you may adopt one of the following solutions: 1) Just disable protected mode sending the command ‘CONFIG SET protected-mode no‘ from the loopback interface by connecting to Redis from the same host the server is running, however MAKE SURE Redis is not publicly accessible from internet if you do so. Use CONFIG REWRITE to make this change permanent. 2) Alternatively you can just disable the protected mode by editing the Redis configuration file, and setting the protected mode option to ‘no‘, and then restarting the server. 3) If you started the server manually just for testing, restart it with the ‘--protected-mode no‘ option. 4) Setup a bind address or an authentication password. NOTE: You only need to do one of the above things in order for the server to start accepting connections from the outside
由于此错误和 redis server 的 protect-mode为yes的访问错误颇为相似,官方在redis.conf的注释说明中有protected-mode这一配置项,但sentinel.conf 的注释中完全没有提到过该配置项,我很疑惑,但还是尝试在通过查询得知 需要添加 protectd-mode no ,之后保存并重启sentinel 再次连接,没有报错
8.Redis的Clustering机制
★Clistering:
分布式数据库,通过分片机制进行数据分布,clustering内的内的每个节点仅持有数据库的一部分数据;
每个节点持有全局元数据,但仅持有一部分数据
★Redis 分布式的解决方案
Twemproxy (Twitter)
Codis(豌豆荚)
Redis Cluster(Redis 官方)
Cerberus (芒果TV)
☉Twemproxy (Twitter)
代理分片机制
◆优点:
非常稳定,企业级方案;
◆缺点:
单点故障;
需要依赖第三方软件:keepalived
无法平滑的横向扩展;
没有后台界面;
代理分片引入更多的来回次数,并提高延迟;
单核模式,无法充分利用多核,除非多实例
Twitter内部不再继续使用 Twemproxy
☉Codis(豌豆荚)
代理分片机制
2014年11月开源
◆基于Go以及C语言开发
◆优点
非常稳定,企业级方案
数据自动平衡
高性能
简单的测试显示较Twemproxy快一倍
善用多核CPU
简单
没有Paxos类的协调机制
没有主从复制
有后台界面
◆缺点
代理分片机制引入更多的来回次数并提高延迟
需要第三方软件支持协调机制
目前支持Zookeeper及Etcd
不支持主从复制,需要另外实现
Codis采用了Proxy的方案,所以必然会带来单机性能的损失
经测试,在不开pipeline的情况下,大概会损失40%的性能
☉Redis Cluster(官方)
官方实现
需要Redis 3.0
◆优点:
无中心的P2P Gossip 分散式模式;
更少的来回次数并降低延迟;
自动于多个Redis进行分片;
不需要第三方软件支持协调机制
◆缺点:
依赖于 Rdeis 3.0 或更高版本;
需要时间验证其稳定性;
没有后台界面;
需要智能客户端;
Redis 客户端必须支持Redis Cluster 架构;
较Codis有更多的维护升级成本;
☉Cerberus (芒果TV)
◆优点:
数据自动平衡;
本身实现了Redis的Smart Client
支持读写分离
◆缺点:
依赖 Redis 3.0 或更高版本;
代理分片机制引入更多的来回次数并增大延迟;
需要时间验证其稳定性;
没有后台界面
本文出自 “逐梦小涛” 博客,请务必保留此出处http://1992tao.blog.51cto.com/11606804/1910365
以上是关于Redis 应用进阶的主要内容,如果未能解决你的问题,请参考以下文章
我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情