Redis 应用进阶

Redis 基础应用(二)html

==============================================================================node

概述:redis

  • 安全相关的配置;数据库

  • 事务功能;vim

  • connection(链接)及Server 相关的命令centos

  • 发布与订阅(publish/subscribe)数组

  • Redis的持久化缓存

  • Redis的主从复制安全

  • Redis的sentinel机制bash

  • 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 启用认证功能,并添加密码:

wKioL1jVMrDjV86EAABdjVT6CAY588.jpg


重启服务,再次执行命令就须要添加认证密码,以下:

wKiom1jVNBjzuZCxAABhz0BnNXU787.jpg

 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 服务器的相关命令:

序号 命令及描述
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 
删除全部数据库的全部key
22 FLUSHDB 
删除当前数据库的全部key
23 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 之间的关系:

wKioL1jV9YWh3_1wAAAcIF_oyrc280.png

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

wKiom1jV9ZPiFA1vAAApj9y8jXs261.png

注意:

  • 频道:消息队列

下表列出了 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)的从库;

[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 或更高版本;

  • 代理分片机制引入更多的来回次数并增大延迟;

  • 须要时间验证其稳定性;

  • 没有后台界面 

相关文章
相关标签/搜索