首页 > 代码库 > Redis 应用进阶

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如下:
[root@centos7 ~]# cp /etc/redis.conf{,.bak}
 
[root@centos7 ~]# 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 ###############################

[root@centos7 ~]# vim /etc/redis.conf
 bind 0.0.0.0  # 修改绑定的端口
 
# 启动 redis,查看坚挺的端口 6379
[root@centos7 ~]# systemctl start redis
[root@centos7 ~]# 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 命令触发事务, 一并执行事务中的所有命令:

[root@centos7 ~]# 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 服务器的相关命令:

序号命令及描述
1BGREWRITEAOF 
异步执行一个 AOF(AppendOnly File) 文件重写操作
2BGSAVE 
在后台异步保存当前数据库的数据到磁盘
3CLIENT KILL [ip:port] [ID client-id] 
关闭客户端连接
4CLIENT LIST 
获取连接到服务器的客户端连接列表
5CLIENT GETNAME 
获取连接的名称
6CLIENT PAUSE timeout 
在指定时间内终止运行来自客户端的命令
7CLIENT SETNAME connection-name 
设置当前连接的名称
8CLUSTER SLOTS 
获取集群节点的映射数组
9COMMAND 
获取 Redis 命令详情数组
10COMMAND COUNT 
获取 Redis 命令总数
11COMMAND GETKEYS 
获取给定命令的所有键
12TIME 
返回当前服务器时间
13COMMAND INFO command-name [command-name ...] 
获取指定 Redis 命令描述的数组
14CONFIG GET parameter 
获取指定配置参数的值
15CONFIG REWRITE 
对启动 Redis 服务器时所指定的 redis.conf 配置文件进行改写
16CONFIG SET parameter value 
修改 redis 配置参数,无需重启
17CONFIG RESETSTAT 
重置 INFO 命令中的某些统计数据
18DBSIZE 
返回当前数据库的 key 的数量
19DEBUG OBJECT key 
获取 key 的调试信息
20DEBUG SEGFAULT 
让 Redis 服务崩溃
21FLUSHALL 
删除所有数据库的所有key
22FLUSHDB 
删除当前数据库的所有key
23INFO [section] 
获取 Redis 服务器的各种信息和统计数值
24LASTSAVE 
返回最近一次 Redis 成功将数据保存到磁盘上的时间,以 UNIX 时间戳格式表示
25MONITOR 
实时打印出 Redis 服务器接收到的命令,调试用
26ROLE 
返回主从实例所属的角色
27SAVE 
异步保存数据到硬盘
28SHUTDOWN [NOSAVE] [SAVE] 
异步保存数据到硬盘,并关闭服务器
29SLAVEOF host port 
将当前服务器转变为指定服务器的从属服务器(slave server)
30SLOWLOG subcommand [argument] 
管理 redis 的慢日志
31SYNC 
用于复制功能(replication)的内部命令


 4.发布与订阅(publish/subscribe)

pub/sub

  • Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。

  • Redis 客户端可以订阅任意数量的频道。

下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:

技术分享

当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:

技术分享

注意:

  • 频道:消息队列

下表列出了 redis 发布订阅常用命令:

序号命令及描述
1PSUBSCRIBE pattern [pattern ...] 
订阅一个或多个符合给定模式的频道。
2PUBSUB subcommand [argument [argument ...]] 
查看订阅与发布系统状态。
3PUBLISH channel message 
将信息发送到指定的频道。
4PUNSUBSCRIBE [pattern [pattern ...]] 
退订所有给定模式的频道。
5SUBSCRIBE channel [channel ...] 
订阅给定的一个或多个频道的信息。
6UNSUBSCRIBE [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)的从库;

[root@centos7 ~]# 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

[root@centos7 ~]# 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

[root@centos7 ~]# 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 
[root@centos7 ~]# 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,并启动如下:

[root@centos7 ~]# cp /etc/redis-sentinel.conf{,.bak} 
[root@centos7 ~]# 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
[root@centos7 ~]# redis-sentinel /etc/redis-sentinel.conf
[root@centos7 ~]# 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 应用进阶