有没有学习redis的同学啊,交流下心得

数据库(19)
&&学习过mysql主从机搭建的都知道,slave机器搭建需要进行初始化步骤,同步部分数据然后再启动同步,而redis相对更简洁,只需要配置配好,启动即可完成同步,我们一起来见证下:
& & & &在前一节我们已经实践启动了一个redis服务,我们将其作为主机,现为其创建一个从机作备份使用
& & & &1.复制一份配置出来为从机所用
& & & & ~$ cp & & & redis/etc/redis.conf & & & &redis/etc/redis_slave.conf
& & & & ~$ vi & & & & redis/etc/redis_slave.conf
& & & & 主机配置无需修改,从机配置如下(主机配置请对应redis安装)
& & & & 我只列出修改的地方:
& & & & pidfile & &/home/demon/redis/var/redis_slave.pid
& & & & port & & & 6401 & & &&
& & & & logfile & &/home/demon/redis/var/redis_slave.log
& & & & dbfilename &dump_slave.rdb
& & & &&slaveof 127.0.0.1 6400 & & &#新增配置,代表是who的从机
& & & &2.启动从机
& & & & ~$ ./redis/bin/redis-server & &./redis/etc/redis_slave.conf
& & & & 连接不同端口号的redis
& & & & ~$ ./redis/bin/redis-cli & -p & &6401
& & & &&redis 127.0.0.1:6400& get name
& & & & 输出“demon”
& & & & 说明该从机已经与主机同步,成功!
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:174620次
积分:1755
积分:1755
排名:第18237名
转载:95篇
(1)(2)(4)(2)(1)(2)(7)(13)(6)(3)(8)(3)(2)(4)(7)(4)(4)(8)(3)(5)(8)有没有学习redis的同学啊,交流下心得_java吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:560,716贴子:
有没有学习redis的同学啊,交流下心得收藏
学习redis最方便的方式还是使用可视化工具先熟悉其数据结构,及再其上的可用操作方法,而后在对其进行进一步研究,
千锋java,Java+大数据全项目实训,两周免费试听,0基础小班授课!千锋java零学费学习,Java+大数据培训,先入学后付款
再次呢推荐大家一个redis web客户端工具,开源中国已经收录啦
先收藏,回去看看
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或上传时间:
本视频课程紧扣实际应用,不讲废话空话,全面细致的讲解了如何正确的使用Redis到实际项目中,韩老师将多年的实际开发经验都毫无保留的传授给大家,尤其注重实际操作,并且把需要注意的细节都一一做了说明.同学们从本视频课程中不仅可以学习到Redis本身方面的知识,还能学到了许多编程思想和实际操作手法,找到使用Redis对项目如何优化提速的窍门,而不是死记硬背Redis的各个操作.
56官方微信
扫一扫发现精彩redis学习小结2 - 编程当前位置:& &&&redis学习小结2redis学习小结2&&网友分享于:&&浏览:4次redis学习总结2
redis主从复制机器
1. 一个master支持多个slave
2. slave可以接受其他slave的连接,作为其他slave的master,从而形成一个master-slave的多级结构
3. 复制在master端是非阻塞的,也就是master在向client复制时可处理其他client的命令,而slave在第一次同步时是阻塞的
4. 复制被利用来提供可扩展性,比如可以将slave端用作数据冗余,也可以将耗时的命令(比如sort)发往某些slave从而避免master的阻塞,另外也可以用slave做持久化,这只需要将master的配置文件中的save指令注释掉。
client可以在一开始时作为slave连接master,也可以在运行后发布sync命令,从而跟master建立主从关系。
接下来我们分别从slave和master的视角概述下redis的主从复制的运行机制。
如果redis作为slave运行,则全局变量server.replstate的状态有REDIS_REPL_NONE(不处于复制状态)、 REDIS_REPL_CONNECT(需要跟master建立连接)、REDIS_REPL_CONNECTED(已跟master建立连接)三种。在读入slaveof配置或者发布slaveof命令后,server.replstate取值为REDIS_REPL_CONNECT,然后在syncWithMaster跟master执行第一次同步后,取值变为REDIS_REPL_CONNECTED。
如果redis作为master运行,则对应某个客户端连接的变量slave.replstate的状态有REDIS_REPL_WAIT_BGSAVE_START(等待bgsave运行)、REDIS_REPL_WAIT_BGSAVE_END(bgsave已dump db,该bulk传输了)、REDIS_REPL_SEND_BULK(正在bulk传输)、REDIS_REPL_ONLINE(已完成开始的bulk传输,以后只需发送更新了)。对于slave客户端(发布sync命令),一开始slave.replstate都处于REDIS_REPL_WAIT_BGSAVE_START状态(后面详解syncCommand函数),然后在后台dump db后(backgroundSaveDoneHandler函数),处于REDIS_REPL_WAIT_BGSAVE_END 状态,然后updateSlavesWaitingBgsave会将状态置为REDIS_REPL_SEND_BULK,并设置write事件的函数 sendBulkToSlave,在sendBulkToSlave运行后,状态就变为REDIS_REPL_ONLINE了,此后master会一直调用replicationFeedSlaves给处于REDIS_REPL_ONLINE状态的slave发送新命令。
1.在master机器上执行 info命令
这里链接的slaves是0个,
2.然后再slave机器上执行 slaveof masterid masterport ,这是master上只有12个kv值
3.然后再master再用info查看结果
已经链接了一个slave机器
4. 在master上写入一个新的值,然后查看slave机器,几乎同时在slave机器出现
在slave机器同时查看
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有redis学习笔记
发表于 日 10:28 | Hits: 4247
Table of Contents
官方网站: redis.io
文档中文翻译(不错的翻译):
这篇学习笔记, 主要都是根据的顺序来的, 其实就是对官方文档的一个浏览.
作者: antirez(VMware)huangz1990:
Redis 设计与实现 一个90年的同学, 很不错, 对实现的分析和源码注释:
<也是他翻译的.
redis-server redis.conf
保留 基本的配置就可以run了:
ning@ning-laptop ~/idning-github/redis$ redis-server redis.conf
ning@ning-laptop ~/idning-github/twemproxy/src$ redis-cli -h 127.0.0.1 -p 6378 get 3
ubuntu 默认的redis 是2.1, 新版的redis才可以这样:
ning@ning-laptop ~/idning-github/redis$ ./src/redis-cli
127.0.0.1:6379& get 3
127.0.0.1:6379&
每行一个配置项
daemonize no
pidfile /var/run/redis.pid
# bind 127.0.0.1
# unixsocket /tmp/redis.sock
# Close the connection after a client is idle for N seconds (0 to disable) 如果是客户端直连, 这很有必要设置, 如果用了proxy, 就不用设置.
tcp-keepalive 0
# 注释说这个最好配成60, 原理不懂.
loglevel notice
logfile &&
# syslog-enabled no
# syslog-ident redis
# syslog-facility local0
databases 16
# 指定允许多少个db. 这个需要考虑.
save 900 1
save 300 10
save 60 10000
#这三个条件任何一个发生, 就做一次RDB
stop-writes-on-bgsave-error yes
#这是必须关掉的 !!!!!!!!!!!!
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
appendonly no
# appendfilename appendonly.aof
appendfsync everysec/on/always
#配everysec即可.
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# slaveof &masterip& &masterport&
# masterauth &master-password&
slave-serve-stale-data yes
#(同步出问题的时候, 依然服务, 一般不需要, 只有主在服务即可)
slave-read-only yes
# repl-ping-slave-period 10
# repl-timeout 60
#同步延迟, 这个值需要仔细配置,
repl-disable-tcp-nodelay no
#应该关系不大.
# repl-backlog-size 1mb
#这应该配大一点!!!!!!
# repl-backlog-ttl 3600
#如果没有从, backlog还是保存(应该保存, 默认就是3600, ok)
slave-priority 100
#给Sentinel用的.
# min-slaves-to-write 3
#下面三个选项的特性, 一般用不着.
# min-slaves-max-lag 10
# min-slaves-max-lag is set to 10.
# requirepass foobared
#设置密码(只能设一个密码, 没有用户的概念)
# rename-command CONFIG &&
#可以把一个命令改掉, 不让人执行
# maxclients 10000
# maxmemory &bytes&
#内存慢, 首先尝试根据'maxmemory-policy'删除一些key, 如果还是不行, 就会禁止一切会导致内存增加的操作(SET, LPUSH 等)
# maxmemory-policy volatile-lru #
# maxmemory-samples 3
(lru和min-ttl算法是 非精确 的, 所以...)
lua-time-limit 5000
redis-cluster (忽略)
slowlog-log-slower-than 10000
slowlog-max-len 128
Pub/Sub: 可以考虑关掉.
# volatile-lru -& remove the key with an expire set using an LRU algorithm
# allkeys-lru -& remove any key accordingly to the LRU algorithm
# volatile-random -& remove a random key with an expire set
# allkeys-random -& remove a random key, any key
# volatile-ttl -& remove the key with the nearest expire time (minor TTL)
# noeviction -& don't expire at all, just return an error on write operations
文档的一个问题是, 不按照使用频率排序, 我浏览的时候基本按照使用频率排序了一下
基本EXISTS
DELDEL key [key ...]
SCAN取代KEYS 命令, SMEMBERS
SCAN 命令用于迭代当前数据库中的数据库键。
SSCAN 命令用于迭代集合键中的元素。
HSCAN 命令用于迭代哈希键中的键值对。
ZSCAN 命令用于迭代有序集合中的元素(包括元素成员和元素分值)。
SCAN 它们每次执行都只会返回少量元素, 所以这些命令可以用于生产环境, 而不会出现像 KEYS 命令、 SMEMBERS 命令带来的问题:
127.0.0.1:6378& scan 0
2) &bits-1&
3) &bits-2&
none (key不存在)
string (字符串)
list (列表)
set (集合)
zset (有序集)
hash (哈希表)
MOVE将当前数据库的 key 移动到给定的数据库 db 当中。
RENAME改名
SORT对list,set, sortedset 操作.SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC | DESC] [ALPHA] [STORE destination]
Expire相关EXPIREEXPIRE key seconds
EXPIREAT在指定时间过期
TTL以秒为单位,返回给定 key 的剩余生存时间
PTTL以豪秒为单位
PERSIST移除给定 key 的生存时间,将这个 key 从『易失的』(带生存时间 key )转换成『持久的』
内部DUMP序列化一个key
MIGRATE原子性从当前实例传送到目标实例的指定数据库上 (集群功能会用到)
OBJECT调试用.
基本GET! GET 只能用于处理字符串值
SETSET key-with-expire-time &hello& EX 10086
(10086是过期时间)
命令 SET resource-name anystring NX EX max-lock-time 是一种在 Redis 中实现锁的简单方法。
客户端执行以上的命令:
如果服务器返回 OK ,那么这个客户端获得锁。
如果服务器返回 NIL ,那么客户端获取锁失败,可以在稍后再重试。
GETSET将给定 key 的值设为 value ,并返回 key 的旧值(old value)。
APPEND字符串append
计数器INCR:INCR rank#数字值在 Redis 中以字符串的形式保存
INCRBY:INCRBY rank 20
INCRBYFLOAT
位操作SETBIT
redis& SETBIT bit 10086 1
(integer) 0
redis& GETBIT bit 10086
(integer) 1
redis& BITCOUNT bits
(integer) 1
SETBIT key offset value offset 参数必须大于或等于 0 ,小于 2^32 (bit 映射被限制在 512 MB 之内)。
BITOP AND destkey key [key ...] : 对一个或多个 key 求逻辑并,并将结果保存到 destkey
(这个twemproxy应该不支持)
SETRANGE(类似memset)
批量/特殊MSET同时设置或读取多少个值
SETEXSETEX key seconds value
(最新的set格式已经支持了)
PSETEXPSETEX key milliseconds value
SETNX(SET if Not eXists)
MSETNX同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
HSETHSET key field value
HSETNX字段不存在 Not Exist
HGET获得某个字段
HEXISTSHEXISTS key field 字段是否存在
HDEL删除字段
HMGET返回多个字段
HMSET设置多个字段.
HGETALL所有字段/值
HINCRBY对字段加
HINCRBYFLOAT
HLEN有多少个字段
HKEYS所有字段名
redis& HSET people jack &Jack Sparrow&
(integer) 1
redis& HSET people gump &Forrest Gump&
(integer) 1
redis& HGETALL people
2) &Jack Sparrow&
4) &Forrest Gump
127.0.0.1:6378& hkeys people
127.0.0.1:6378& HVALS people
1) &Jack Sparrow&
2) &Forrest Gump&
127.0.0.1:6378& hscan people 0
2) 1) &jack&
2) &Jack Sparrow&
4) &Forrest Gump&
LPUSH插到list头, 1个或多个
LPUSHX当且仅当 key 存在并且是一个列表
LPOP移除并返回列表 key 的头元素。
RPOPLPUSH将列表 source 中的最后一个元素(尾元素)弹出,并返回给客户端。
将 source 弹出的元素插入到列表 destination ,作为 destination 列表的的头元素。
insert/getLLEN列表长
LRANGEkey 中指定区间内的元素
LSETLSET key index value
将列表 key 下标为 index 的元素的值设置为 value
LINDEXLINDEX key index 返回列表 key 中,下标为 index 的元素。
LINSERT key BEFORE|AFTER pivot value
将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。
LREMLREM key count value根据参数 count 的值,移除列表中与参数 value 相等的元素。
LTRIMLTRIM key start stop让列表只保留指定区间内的元素
BRPOPLPUSH阻塞式操作:
对应命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BLPOP 命令阻塞,直到等待超时或发现可弹出元素为止。
单集合操作SADD将一个或多个 member 元素加入到集合 key 当中
SPOP移除并返回集合中的一个随机元素。
SREM删掉元素
SRANDMEMBER随机元素
SMEMBERS所有元素
SCARD集合中元素的数量 (基数)
SISMEMBER判断是否是集合成员
交并差SINTER交集
SUNION并集
xxxStoreSINTERSTORE
SDIFFSTORE
SUNIONSTORESUNIONSTORE destination key [key ...]
这个命令类似于 SUNION 命令,但它将结果保存到 destination 集合,而不是简单地返回结果集。
其它SMOVE: SMOVE source destination member
将 member 元素从 source 集合移动到 destination 集合。
ZADD::ZADD key score member [[score member] [score member] ...]
ZADD page_rank
ZADD page_rank
和set 类似:ZCARD元素个数, 同set
ZUNIONSTORE:Z union Store
ZINTERSTORE
ZINCRBY:ZINCRBY key increment member增加score
ZSCORE:ZSCORE key member返回有序集 key 中,成员 member 的 score 值。
ZCOUNT:ZCOUNT key min max返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。
ZRANK key member
成员 member 的排名 (从小到大排序时)
ZREVRANK成员 member 的排名 (从大到小排序时)
ZRANGE返回下标区间
范围内的成员. 按score 值递增时
ZREVRANGE返回下标区间
范围内的成员. 按score 值递减时:
ZRANGE key start stop [WITHSCORES]
ZRANGEBYSCORE返回score区间
范围内的成员. 按score 值递增时--这名字真是太长了..
ZREVRANGEBYSCORE返回score区间
范围内的成员. 按score 值递减时:
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
ZREMRANGEBYRANK: remove range by rank
ZREMRANGEBYSCORE: remove range by score
PUBSUB: 获得有多少个channel, 多少个订阅者 之类信息
SUBSCRIBE订阅一个或多个频道的信息
PSUBSCRIBE按模式(支持*等)
PUBLISH发布消息
UNSUBSCRIBE
PUNSUBSCRIBE
#列出有哪些channel
127.0.0.5:20001& PUBSUB CHANNELS
1) &__sentinel__:hello&
$ redis-cli -h 127.0.0.5 -p 20001
127.0.0.5:20001& PUBLISH __sentinel__:hello 1
(integer) 3
(返回是这个channel的订阅者数量)
$ redis-cli -h 127.0.0.5 -p 20001
127.0.0.5:20001& psubscribe *
Reading messages... (press Ctrl-C to quit)
1) &psubscribe&
3) (integer) 1
1) &pmessage&
3) &__sentinel__:hello&
4) &127.0.0.5,225e14bb77ca4dfffc612a12b9e629f243,1,cluster0-.0.5,20001,0&
1) &pmessage&
3) &__sentinel__:hello&
4) &127.0.0.5,2d697ade35fdcfc,1,cluster0-.0.5,20001,0&
1) &pmessage&
3) &__sentinel__:hello&
4) &127.0.0.5,29002,bafaa4f080e77da1b8ca90c,cluster0-.0.5,20001,0&
SCRIPT EXISTS
SCRIPT FLUSH
SCRIPT KILL
SCRIPT LOAD
默认cache时间是永久(重启就没了), 因为redis把定义一个脚本看作是定义一个命令:
& set foo bar
& eval &return redis.call('get','foo')& 0
& evalsha 6b1bf486c81ceb7edf3c093f4ce791 0
& evalsha ffffffffffffffffffffffffffffffffffffffff 0
(error) `NOSCRIPT` No matching script. Please use [EVAL](/commands/eval).
说明两个问题:
不要用eval &returnredis.call('get','foo')&0因为这样随着key不同, 脚本是不同的.
情况script cache:
SCRIPT FLUSH
这些命令 twemproxy 应该都不支持, twemproxy 只会支持带key命令
这些命令 twemproxy 应该都不支持, twemproxy 只会支持带key命令
persistenceBGREWRITEAOFbg rewrite aof
BGSAVEbg rdb
clientCLIENT KILLCLIENT KILL ip:port关闭地址为 ip:port 的客户端。
CLIENT LIST(可以排查有没有异常连接)
CLIENT GETNAME获得当前连接名字
CLIENT SETNAME为当前连接分配一个名字, 用于识别当前正在与服务器进行连接的客户端
redis& CLIENT LIST
addr=127.0.0.1:43143 fd=6 age=183 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client
addr=127.0.0.1:43163 fd=5 age=35 idle=15 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping
configCONFIG GET在最新的 Redis 2.6 版本中,所有配置参数都已经可以用 CONFIG GET 访问
CONFIG SET:
redis& CONFIG GET s*
# 参数名:save
2) &900 1 300 10 60 10000&
# save 参数的值
3) &slave-serve-stale-data&
# 参数名: slave-serve-stale-data
# slave-serve-stale-data 参数的值
CONFIG REWRITE对redis.conf 文件进行改写(厉害, 希望的特性)原有 redis.conf 文件的整体结构和注释会被尽可能地保留。
如果一个选项已经存在于原有 redis.conf 文件中 , 那么对该选项的重写会在选项原本所在的位置(行号)上进行。
重写是原子性的.
CONFIG RESETSTAT重置 INFO 命令中的某些统计数据
清空数据FLUSHALL删除所有数据库的所有 key
FLUSHDB清空当前数据库中的所有 key。
SHUTDOWN停机
调试TIME当前服务器时间.
DEBUG OBJECT调试命令
DEBUG SEGFAULT
监控LASTSAVE最近一次 Redis 成功将数据保存到磁盘上的时间
DBSIZE返回当前数据库的 key 的数量。
MONITOR实时打印出 Redis 服务器接收到的命令,调试用
SLOWLOGSLOWLOG GET
Replication用:SYNC
PSYNC用于复制功能(replication)
SLAVEOF将当前服务器转变为指定服务器的从属服务器, 如果改变,会丢弃旧数据集,转而开始对新主服务器进行同步。对一个从属服务器执行命令 SLAVEOF NO ONE 将使得这个从属服务器关闭复制功能,并从从属服务器转变回主服务器,原来同步所得的数据集不会被丢弃。
一个主服务器可以有多个从服务器。
不仅主服务器可以有从服务器, 从服务器也可以有自己的从服务器, 多个从服务器之间可以构成一个图状结构
可以通过复制功能来让主服务器免于执行持久化操作: 只要关闭主服务器的持久化功能, 然后由从服务器去执行持久化操作即可。
2.8开始支持部分同布, (之前的版本,每次连接断开都会执行完整的同步)
无论是初次连接还是重新连接, 当建立一个从服务器时, 从服务器都将向主服务器发送一个 SYNC 命令。
接到 SYNC 命令的主服务器将开始执行 BGSAVE , 并在保存操作执行期间, 将所有新执行的写入命令都保存到一个缓冲区里面。
当BGSAVE 执行完毕后, 主服务器将执行保存操作所得的 .rdb 文件发送给从服务器, 从服务器接收这个 .rdb 文件, 并将文件中的数据载入到内存中。
之后主服务器会以 Redis 命令协议的格式, 将写命令缓冲区中积累的所有内容都发送给从服务器。
你可以通过 telnet 命令来亲自验证这个同步过程
部分同步是使用PSYNC命令
如果未设置slaveof, info结果如下:
# Replication
role:master
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
设置后, slave:
# Replication
role:slave
master_host:127.0.0.5
master_port:20000
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:6660
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
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.5,port=30000,state=online,offset=11868,lag=0
master_repl_offset:11868
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:11867
RDB特性是一个dump文件, 压缩,
适合做备份(一天一次)
因为fork实现, 对redis主进程的效率没有影响
RDB 在恢复大数据集时的速度比 AOF 快
缺点不如AOF实时
在数据集比较庞大时, fork() 可能会非常耗时,造成服务器在某某毫秒内停止处理客户端
AOF特性可以设置不同的 fsync 策略,比如无 fsync ,每秒钟一次 fsync ,或者每次执行写入命令时 fsync 。 AOF 的默认策略为每秒钟 fsync 一次
需要定期rewrite(也需要fork出一个进程)
修复工具 redis-check-aof
AOF 文件有序地保存了对数据库执行的所有写入操作, 这些写入操作以 Redis 协议的格式保存, 因此 AOF 文件的内容非常容易被人读懂, 对文件进行分析(parse)也很轻松
举个例子, 如果你不小心执行了 FLUSHALL 命令, 但只要 AOF 文件未被重写, 那么只要停止服务器, 移除 AOF 文件末尾的 FLUSHALL 命令, 并重启 Redis , 就可以将数据集恢复到 FLUSHALL 执行之前的状态。 (这个好)
缺点文件体积较大
如果fsync频繁, 影响性能
过去有一些bug
因为以上提到的种种原因, 未来我们可能会将 AOF 和 RDB 整合成单个持久化模型。 (这是一个长期计划。)
自动: N 秒内数据集至少有 M 个改动”这一条件被满足时, 自动保存一次数据集。
手动: 通过SAVE/BGSAVE 命令执行dump (SAVE是阻塞客户端的)
自动: auto-aof-rewrite-percentage 100
手动: BGREWRITEAOF
日常AOF, 每天RDB
非常理想化
是一个分布式系统, 有投票
管理多个 Redis 服务器(instance)
监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器;
当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。 (重定向
Redis Sentinel 是一个分布式系统
, 你可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip protocols)来接收关于主服务器是否下线的信息, 并使用投票协议(agreement protocols)来决定是否执行自动故障迁移, 以及选择哪个从服务器作为新的主服务器。
redis-sentinel /path/to/sentinel.conf
配置文件会更新:配置文件来保存 Sentinel 的当前状态
sentinel monitor mymaster 127.0.0.1 6379 2
2表示将这个主服务器判断为失效至少需要 2 个 Sentinel 同意
sentinel down-after-milliseconds mymaster 60000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
sentinel monitor resque 192.168.1.3 6380 4
sentinel down-after-milliseconds resque 10000
sentinel failover-timeout resque 180000
sentinel parallel-syncs resque 5
无论你设置要多少个 Sentinel 同意才能判断一个服务器失效, 一个 Sentinel 都需要获得系统中多数(majority) Sentinel 的支持, 才能发起一次自动故障迁移
在只有少数(minority) Sentinel 进程正常运作的情况下, Sentinel 是不能执行自动故障迁移的。
这个美好!!
你无须为运行的每个 Sentinel 分别设置其他 Sentinel 的地址, 因为 Sentinel 可以通过发布与订阅功能来自动发现正在监视相同主服务器的其他 Sentinel , 这一功能是通过向频道 __sentinel__:hello 发送信息来实现的。
与此类似, 你也不必手动列出主服务器属下的所有从服务器, 因为 Sentinel 可以通过询问主服务器来获得所有从服务器的信息。
SENTINEL masters :列出所有被监视的主服务器,以及这些主服务器的当前状态。
SENTINEL slaves &master name& :列出给定主服务器的所有从服务器,以及这些从服务器的当前状态。
SENTINEL failover &master name& : 当主服务器失效时, 在不询问其他 Sentinel 意见的情况下, 强制开始一次自动故障迁移
如何重新配置? 去掉一个master, 加入一个新的master?
一个redis cluster 里面有3个sentinel是比较合适的
sentinel系统略显复杂, 自己实现一个类似功能会比较简单,但是肯定没有这么健壮.
Alpha 版本:
Redis 集群不支持那些需要同时处理多个键的 Redis 命令,
Redis 集群使用数据分片(sharding)而非一致性哈希(consistency hashing)来实现: 一个 Redis 集群包含 16384 个哈希槽(hash slot), 数据库中的每个键都属于这 16384 个哈希槽的其中一个, 集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和 。
16384 = 2**14
CRC16. 应该已经不错了
client hash
Client side partitioning:
means that the clients directly select the right node where to write or read a given key. Many Redis clients implement client side partitioning.
Proxy assisted partitioning:
means that our clients send requests to a proxy that is able to speak the Redis protocol, instead of sending requests directly to the right Redis instance. The proxy will make sure to forward our request to the right Redis instance accordingly to the configured partitioning schema, and will send the replies back to the client. The Redis and Memcached proxy Twemproxy implements proxy assisted partitioning.
Query routing:
means that you can send your query to a random instance, and the instance will make sure to forward your query to the right node.Redis Clusterimplements an hybrid form of query routing, with the help of the client (the request is not directly forwarded from a Redis instance to another, but the client gets redirected to the right node).
Redis Cluster is a mix between query routing and client side partitioning.
Redis Cluster is a mix between query routing and client side partitioning.
memcache 单一数据结构(kv), 无持久化, 多线程模型.
评价列表(0)}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信