Redis入门

  Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步

Redis

开源、内存存储、数据结构存储;可用作:数据库、缓存、消息队列;
k/v 存储,分布式存储系统
数据结构:字符串、列表(数组)、hashes(关联数组)、集合、有序集合、bitmaps、hyperloglogs、空间索引;
内建的复制、Lua scripting、LRU、事务、持久存储、高可用(Sentinel,Redis Cluster)

REmote DIctionary Server:数据结构服务器,k/v,数据结构;
    内存存储:in-memroy
    持久化
    主从(sentinel)
    Cluster(shard)

数据结构服务器:
    Strings, Lists, Hashs, Sets, Sorted Sets, Bitmaps, Hyperloglogs
    PUB/SUB

Redis是单进程:
    但CPU并非瓶颈;

持久化:
    snapshotting  快照持久
    AOF       仅追加文件

Replication:
    主/从
        主:rw
        从:read-only

程序环境:

配置文件:  /etc/redis.conf
主程序 :  /usr/bin/redis-server
端口  :  6379/tcp
客户端 :  /usr/bin/redis-cli
Unit File: /usr/lib/systemd/system/redis.service
数据目录    :/var/lib/redis #建议修改,在/etc/redis.conf文件中修改。
aof检查工具:/usr/bin/redis-check-aof
rdb快照检查工具:/usr/bin/redis-check-rdb
redis哨兵的配置:/etc/redis-sentinel.conf
redis哨兵(类似MHA):/usr/bin/redis-sentinel
检查redis性能:/usr/bin/redis-benchmark
关闭redis:/usr/bin/redis-shutdown 
Unit File:/usr/lib/systemd/system/redis-sentinel.service

配置文件/etc/redis.conf

INCLUDES        包含其他文件
GENERAL         通用配置项
NETWORK         网络配置项
SNAPSHOTTING        持久化相关配置
REPLICATION     主从同步复制相关的配置
SECURITY        安全相关配置
LIMITS          Limit相关的配置
APPEND ONLY MODE    持久化配置端,AOF
LUA SCRIPTING       lua脚本配置项
REDIS CLUSTER       redis集群配置端
SLOW LOG        SlowLog慢日志相关的配置
LATENCY MONITOR     延迟监控配置选项
EVENT NOTIFICATION  事件通知
ADVANCED CONFIG     高级配置

通用配置项:

daemonize   是否守护进程运行
supervised  是否与upstart或systemd进行交互,默认为no
loglevel    日志级别,可选:debug较详细、verbose信息很少、notice比较详细、warning只记录非常重要/关键信息,默认notice
pidfile     pid文件
logfile     日志文件的位置 
databases:设定数据库数量,默认为16个,每个数据库的名字均为整数,从0开始编号,默认操作的数据库为0;
    切换数据库的方法:
             SELECT <dbid>

网络配置项:

bind IP     #建议绑定本机,默认127.0.0.1
port PORT   #监听端口
protected-mode  #是否工作于保护模式,用于避免redis实例暴露于互联网,有两个判断条件,没有指定监听地址,没有设置认证密码,它将会把redis监听到127.0.0.1的地址上。
tcp-backlog #tcp协议连接的等待队列,默认为511。
unixsocket  #监听的socket文件,可选项
timeout     #连接的空闲超时时长;
tcp-keepalive   #tcp连接的保持时间。

安全配置:

requirepass <PASSWORD>      #设置连接认证密码
rename-command <COMMAND> <NEW_CMND_NAME>#修改config命令的名字,在AOF或Replication环境中,不推荐使用;

Limits相关的配置:

maxclients      #最大并发连接数,默认为10000
maxmemory <bytes>   #redis可以使用的最大内存,建议设置。
maxmemory-policy    #内存淘汰策略,策略如下。
            volatile-lru    #把设置了过期时间的key按照LRU算法进行淘汰。
            allkeys-lru #把设置了所有的key按照LRU算法进行淘汰。
            volatile-random #把设置了过期时间的key进行随机淘汰。
            allkeys-random  #把设置了所有的key进行随机淘汰。
            volatile-ttl    #按照Key的ttl时间进行淘汰。
            noeviction  #不启用    
maxmemory-samples 5 #采用淘汰算法的选取的样本数,每次淘汰选取这里设置的值,在这个值中进行运算。

SlowLog相关的配置:

slowlog-log-slower-than 10000   #单位是微秒;默认0.01秒
slowlog-max-len 128     #SlowLog记录的日志最大条目,单位为字节;
latency-monitor-threshold 0 #设置什么时间启用延迟监视器。0表示一直监听。

ADVANCED配置:

hash-max-ziplist-entries 512    #一个关联数组的最大可以有多少个元素
hash-max-ziplist-value 64   #一个元素的最大值。默认为64字节。
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
client-output-buffer-limit normal 0 0 0     #常规客户端的缓存区大小
client-output-buffer-limit slave 256mb 64mb 60  #从服务器缓存区大小
client-output-buffer-limit pubsub 32mb 8mb 60   #订阅队列缓存区大小
                    #3个数字表示:硬限制、软限制、软限制的可超时时长。
aof-rewrite-incremental-fsync yes   #AOF文件是否同步写入磁盘。默认开启,建议开启

redis-cli 客户端工具

用法:redis-cli [OPTIONS] [cmd [arg [arg ...]]]

选项

-h <hostname>   服务器主机名(默认值:127.0.0.1)。
-p <port>       服务器端口(默认值:6379)。
-s <socket>     服务器套接字(覆盖主机名和端口)。
-a <password>   连接到服务器时要使用的密码。
-r <repeat>     执行指定的命令N次。
-i <interval>   使用-r时,每个命令等待<interval> seconds。
                可以指定次级次,如-i 0.1。
-n <db>         数据库号。
-x              从STDIN读取最后一个参数。
-d <delimiter>  用于原始格式的多批量分隔符(默认值:\ n)。
-c              启用群集模式(遵循-ASK和-MOVED重定向)。
--raw           使用原始格式进行回复(默认为STDOUT不是tty)。
--no-raw        强制格式化输出,即使STDOUT不是tty
--csv           CSV格式输出。
--stat          打印关于服务器的统计信息
--slave         模拟显示从主机接收的命令的从站。
--rdb filename  将RDB转储从远程服务器传输到本地文件。
--pipe          将原始Redis协议从stdin传输到服务器。
--pipe-timeout n在管道模式下,如果在发送所有数据后发生错误,则在n秒内收到回复。默认30
--scan          使用SCAN命令列出所有键。
--pattern <pat> 用于--scan来指定扫描模式。
--intrinsic-latency <sec> 运行测试来测量内部系统延迟
--eval <file>   使用Lua脚本在<file>发送EVAL命令。
--ldb           与--eval配合使用Redis Lua调试器。
--ldb-sync-mode 像--ldb一样,但是使用同步Lua调试器,在这种模式下,服务器被阻止,脚本更改不会从服务器内存中回滚。

切换数据库 select 切换数据库,数据库的名字是数字格式,不指定默认0库,默认是系统创建了16个库

redis:k/v

key:直接ASCII字符串;
value:strings, lists, hashes, sets, sorted sets, bitmaps, hyperloglogs

帮助

"help @<group>" to get a list of commands in <group>
"help <command>" for help on <command>
"help <tab>" to get a list of possible help topics
"quit" to exit

内键命令

@generic通用

Redis DEL       该命令用于在key存在是删除 key。
Redis Dump      序列化给定key,并返回被序列化的值。
Redis EXISTS        检查给定key是否存在。
Redis Expire        seconds为给定key设置过期时间。
Redis Expireat      EXPIREAT的作用和EXPIRE类似,都用于为key设置过期时间。不同在于EXPIREAT命令接受的时间参数是UNIX时间戳(unix timestamp)。
Redis PEXPIREAT     设置key的过期时间亿以毫秒计。
Redis PEXPIREAT     设置key过期时间的时间戳(unix timestamp) 以毫秒计
Redis Keys      查找所有符合给定模式(pattern)的key 。
Redis Move      将当前数据库的key移动到给定的数据库 db 当中。
Redis PERSIST       移除key的过期时间,key将持久保持。
Redis Pttl      以毫秒为单位返回key的剩余的过期时间。
Redis TTL       以秒为单位,返回给定key的剩余生存时间(TTL, time to live)。
Redis RANDOMKEY     从当前数据库中随机返回一个 key 。
Redis Rename        修改key的名称
Redis Renamenx      仅当newkey不存在时,将key改名为newkey 。
Redis Type      返回key所储存的值的类型。

字符串 @String

Redis set(key, value)           给数据库中名称为key的string赋予值value 
                                      参数:ex过期时间,nx如果这个键不存在才新建
Redis Get               获取指定 key 的值。
Redis Getrange              返回 key 中字符串值的子字符
Redis Getset                将给定 key 的值设为 value ,并返回 key 的旧值(old value)。
Redis Getbit                对 key 所储存的字符串值,获取指定偏移量上的位(bit)。
Redis Mget              获取所有(一个或多个)给定 key 的值。
Redis Setbit                对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。
Redis Setex                 将值 value 关联到 key ,并将 key 的过期时间设为 seconds 以秒为单位)。
Redis Setnx                 只有在 key 不存在时设置 key 的值。
Redis Setrange              用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。
Redis Strlen                返回 key 所储存的字符串值的长度。
Redis Mset              同时设置一个或多个 key-value 对。
Redis Msetnx                同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
Redis Psetex                这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。
Redis Incr              将 key 中储存的数字值增一。
Redis Incrby                将 key 所储存的值加上给定的增量值(increment) 。
Redis Incrbyfloat           将 key 所储存的值加上给定的浮点增量值(increment) 。
Redis Decr              将 key 中储存的数字值减一。
Redis Decrby                key 所储存的值减去给定的减量值(decrement) 。
Redis Append                如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。
Redis INCRBYFLOAT       基于浮点型
Redis incrby(key, integer)  名称为key的string增加integer
Redis decrby(key, integer)  名称为key的string减少integer
Redis append(key, value)    名称为key的string的值附加value
Redis substr(key, start, end)   返回名称为key的string的value的子串

Redis 哈希(Hash)

Redis Hdel      删除一个或多个哈希表字段
Redis hexists(key, field)名称为key的hash中是否存在键为field的域
Redis Hget      获取存储在哈希表中指定字段的值/td>
Redis hgetall(key)  返回名称为key的hash中所有的键(field)及其对应的value
Redis hincrby(key,field,integer)将名称为key的hash中field的value增加integer
Redis Hincrbyfloat  为哈希表 key 中的指定字段的浮点数值加上增量 increment 。
Redis hkeys(key)    返回名称为key的hash中所有键
Redis Hlen      获取哈希表中字段的数量
Redis Hmget         获取所有给定字段的值
Redis Hmset         同时将多个 field-value (域-值)对设置到哈希表 key 中。
Redis Hset      将哈希表 key 中的字段 field 的值设为 value 。
Redis Hsetnx        只有在字段 field 不存在时,设置哈希表字段的值。
Redis hvals(key)    返回名称为key的hash中所有键对应的value

Redis 列表 @list

Redis Blpop             移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
Redis Brpop             移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
Redis Brpoplpush            从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
Redis Lindex                通过索引获取列表中的元素
Redis Linsert               在列表的元素前或者后插入元素
Redis Llen              获取列表长度
Redis lpop(key)         返回并删除名称为key的list中的首元素
Redis lpush(key, value)     在名称为key的list头添加一个值为value的 元素
Redis Lpushx                将一个或多个值插入到已存在的列表头部
Redis lrange(key,start,end) 返回名称为key的list中start至end之间的元素
Redis lrem(key,count,value) 删除count个key的list中值为value的元素
Redis Lset              通过索引设置列表元素的值
Redis Ltrim                 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
Redis rpop(key)             返回并删除名称为key的list中的尾元素
Redis rpoplpush(srckey,dstkey)  返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部
Redis rpush(key, value)     在名称为key的list尾添加一个值为value的元素
Redis Rpushx                为已存在的列表添加值

无序集合@set

Redis Sadd      向集合添加一个或多个成员
Redis Scard     获取集合的成员数
Redis Sdiff         返回给定所有集合的差集
Redis Sdiffstore    返回给定所有集合的差集并存储在 destination 中
Redis Sinter        返回给定所有集合的交集
Redis Sinterstore   返回给定所有集合的交集并存储在 destination 中
Redis Sismember     判断 member 元素是否是集合 key 的成员
Redis Smembers      返回集合中的所有成员
Redis Smove         将 member 元素从 source 集合移动到 destination 集合
Redis spop(key)     随机返回并删除名称为key的set中一个元素
Redis Srandmember   返回集合中一个或多个随机数
Redis srem(key,member)  删除名称为key的set中的元素member
Redis Sunion        返回所有给定集合的并集
Redis Sunionstore   所有给定集合的并集存储在 destination 集合中
Redis Sscan     迭代集合中的元素

Redis 有序集合(sorted set)

Redis Zadd      向有序集合添加一个或多个成员,或者更新已存在成员的分数
Redis Zcard     获取有序集合的成员数
Redis Zcount        计算在有序集合中指定区间分数的成员数
Redis Zincrby       有序集合中对指定成员的分数加上增量 increment
Redis Zinterstore   计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中
Redis Zlexcount     在有序集合中计算指定字典区间内成员数量
Redis Zrange        显示指定索引范围内的数据,索引自动分配,索引从0开始,但是显示时从1开始。
Redis Zrangebylex   通过字典区间返回有序集合的成员
Redis Zrangebyscore     通过分数返回有序集合指定区间内的成员
Redis Zrank         返回有序集合中指定成员的索引
Redis Zrem      移除有序集合中的一个或多个成员
Redis Zremrangebylex    移除有序集合中给定的字典区间的所有成员
Redis Zremrangebyrank   移除有序集合中给定的排名区间的所有成员
Redis Zremrangebyscore  移除有序集合中给定的分数区间的所有成员
Redis Zrevrange     返回有序集中指定区间内的成员,通过索引,分数从高到底
Redis Zrevrangebyscore  返回有序集中指定分数区间内的成员,分数从高到低排序
Redis Zrevrank      返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
Redis Zscore        返回有序集中,成员的分数值
Redis Zunionstore   计算给定的一个或多个有序集的并集,并存储在新的 key 中
Redis Zscan         迭代有序集合中的元素(包括元素成员和元素分值)

Redis HyperLogLog

Redis Pfadd         添加指定元素到 HyperLogLog 中。
Redis Pfcount       返回给定 HyperLogLog 的基数估算值。
Redis Pgmerge       将多个 HyperLogLog 合并为一个 HyperLogLog

Redis 发布订阅 @pubsub

Redis Psubscribe    订阅一个或多个符合给定模式的频道。
Redis Pubsub        查看订阅与发布系统状态。
Redis Publish       将信息发送到指定的频道。
Redis Punsubscribe  指示客户端退订所有给定模式。
Redis Subscribe     订阅给定的一个或多个频道的信息。例如 subscribe msg chat_room
Redis Unsubscribe   指示客户端退订给定的频道。
Redis pubsub channels   列出当前的活跃频道 例如PUBSUB CHANNELS news.i*
Redis pubsub numsub 返回给定频道的订阅者数量 例如PUBSUB NUMSUB news.it news.internet news.sport news.music
Redis pubsub numpat 返回客户端订阅的所有模式的数量总和       

Redis 事务 @transactions

Redis Discard       取消事务,放弃执行事务块内的所有命令。
Redis Exec      执行所有事务块内的命令。
Redis Multi         标记一个事务块的开始。
Redis Unwatch       取消 WATCH 命令对所有 key 的监视。
Redis Watch         监视一个(或多个)key ,如果在事务执行之前这个(或这些)key被其他命令所改动,那么事务将被打断。

Redis 脚本

Redis Eval      执行 Lua 脚本。
Redis Evalsha       执行 Lua 脚本。
Redis Script Exists     查看指定的脚本是否已经被保存在缓存当中。
Redis Script Flush  从脚本缓存中移除所有脚本。
Redis Script kill   杀死当前正在运行的 Lua 脚本。
Redis Script Load   将脚本 script 添加到脚本缓存中,但并不立即执行这个脚本。

Redis 连接

Redis Auth      验证密码是否正确
Redis Echo      打印字符串
Redis Ping      查看服务是否运行
Redis Quit      关闭当前连接
Redis Select        切换到指定的数据库

Redis 服务器 @server

Redis Bgrewriteaof  异步执行一个 AOF(AppendOnly File) 文件重写操作
Redis Bgsave        在后台异步保存当前数据库的数据到磁盘
Redis Client Kill   关闭客户端连接
Redis Client List   获取连接到服务器的客户端连接列表
Redis Client Getname    获取连接的名称
Redis Client Pause  在指定时间内终止运行来自客户端的命令
Redis Client Setname    设置当前连接的名称
Redis Cluster Slots     获取集群节点的映射数组
Redis Command       获取 Redis 命令详情数组
Redis Command Count     获取 Redis 命令总数
Redis Command Getkeys   获取给定命令的所有键
Redis Time      返回当前服务器时间
Redis Command Info  获取指定 Redis 命令描述的数组
Redis Config Get    获取指定配置参数的值
Redis Config Resetstat  重置 INFO 命令中的某些统计数据
Redis Dbsize        返回当前数据库的 key 的数量
Redis Debug Object  获取 key 的调试信息
Redis Debug Segfault    让 Redis 服务崩溃
Redis Flushall      删除所有数据库的所有key
Redis Flushdb       删除当前数据库的所有key
Redis Info      获取Redis服务器的各种信息和统计数值
Redis Lastsave      返回最近一次 Redis 成功将数据保存到磁盘上的时间,以 UNIX 时间戳格式表示
Redis Monitor       实时打印出 Redis 服务器接收到的命令
Redis Role      返回主从实例所属的角色
Redis save      将数据同步保存到磁盘
Redis bgsave        将数据异步保存到磁盘
Redis Shutdown      将数据集同步保存到磁盘,然后关闭服务器
Redis Slaveof       将当前服务器转变为指定服务器的从属服务器(slave server)
Redis Showlog       管理 redis 的慢日志
Redis Sync      用于复制功能(replication)的内部命令
Redis lastsave      返回上次成功将数据保存到磁盘的Unix时戳
Redis config resetstat重置info命令中的某些统计数据
Redis config get    获取配置文件信息
Redis config set    动态地调整Redis服务器的配置(configuration)而无须重启,可以修改的配置参数可以使用命令 CONFIG GET * 来列出
Redis config rewrite    Redis服务器时所指定的 redis.conf 文件进行改写

清空数据库:

FLUSHDB:Remove all keys from the current database      清空当前数据库;
         FLUSHALL:Remove all keys from all databases   清空所有数据库;

配置参数可运行是修改,redis可以把内存中的设置覆盖到配置文件。

Redis的持久化:Redis是工作在内存中的。

RDB:snapshotting(快照),

二进制格式;按事先定制的策略,周期性地将数据从内存同步至磁盘;数据文件默认为dump.rdb;Redis默认使用。

客户端也可以显式使用SAVE或BGSAVE命令来手动启动快照保存机制;
    SAVE  :同步,即在主线程中保存快照,此时会阻塞所有客户端请求;
    GSAVE:异步,Redis启动一个子进程在后台中创建快照保存数据;

配置RDB:

[root@centos7.3 ~]#vim /etc/redis.conf        #编辑配置文件,找到 SNAPSHOTTING 配置段

save 900 1      #在900秒内有1个key发生变化,就进行快照。
save 300 10     #在300秒内有10个key发生变化,就进行快照。
save 60 10000       #在60秒内有10000个key发生变化,就进行快照。

三个策略满足其中任意一个均会触发SNAPSHOTTING操作;900s内至少有一个key有变化,300s内至少有10个key有变化,60s内至少有1W个key发生变化;

stop-writes-on-bgsave-error yes     #dump操作出现错误时,是否禁止新的写入操作请求;
rdbcompression yes              #快照文件是否进行压缩,默认开启
rdbchecksum yes                 #是否对快照文件进行校验,默认开启
dbfilename dump.rdb             #指定rdb文件名
dir /var/lib/redis              #rdb文件的存储路径

注:上述配置参数也可以在命令行工具中进行修改

AOF:Append Only File, fsync 可以实现时间点恢复。

记录每次写操作至指定的文件尾部实现的持久化;
当redis重启时,可通过重新执行文件中的命令在内存中重建出数据库;
BGREWRITEAOF:AOF文件重写;将同一个Key的多个可合并的指令进行合并重写。
不会读取正在使用AOF文件,而是通过将内存中的数据以命令的方式保存至临时文件中,完成之后替换原来的AOF文件;

AOF相关的配置

[root@centos7.3 ~]#vim /etc/redis.conf      #编辑配置文件的APPEND ONLY MODE配置段

appendonly no                       #是否启用AOF功能
appendfilename "appendonly.aof"         #AOF文件路径,默认在相对路径下,redis的工作目录
appendfsync                     #从内存同步到磁盘的规则,可选参数如下
                    no      #redis不执行主动同步操作,而内核决定何时进行同步;
                    everysec    #每秒一次;
                    always      #每语句一次;
no-appendfsync-on-rewrite no            #是否在后台执行aof文件重写期间不调用fsync进行同步,默认为no,表示调用;
auto-aof-rewrite-percentage 100         #触发AOF文件的规则
auto-aof-rewrite-min-size 64mb
    #上述两个条件同时满足时,方会触发重写AOF;与上次aof文件大小相比,其增长量超过100%,且大小不少于64MB; 

aof-load-truncated yes              #是否允许在服务崩溃再启动后清除AOF文件。

注意:AOF文件在Redis重启后会清理原来的AOF文件。持久机制本身不能取代备份,应该制订备份策略,对redis库定期备份。

RDB与AOF同时启用:

        (1) BGSAVE和BGREWRITEAOF不会同时进行;
        (2) Redis服务器启动时用持久化的数据文件恢复数据,会优先使用AOF;

主从复制:

特点:

一个Master可以有多个slave主机,支持链式复制;
Master以非阻塞方式同步数据至slave主机;

配置环境

主服务器:192.168.166.130
从服务器1:192.168.166.132
从服务器2:192.168.166.133
[root@CentOS7.3 ~]#vim /etc/redis.conf 
bind 192.168.166.130          #改为可对外提供服务的IP地址
# requirepass admin123  #设置一个连接密码
[root@CentOS7.3 ~]#systemctl start redis
[root@CentOS7.3 ~]#ss -ntl
State       Recv-Q Send-Q      Local Address:Port                     Peer Address:Port              
LISTEN      0      128       192.168.166.130:6379                                *:*                  
LISTEN      0      128                     *:111                                 *:*                  
LISTEN      0      128                     *:22                                  *:*                 
LISTEN      0      128                    :::22                                 :::*                  
LISTEN      0      128                   ::1:631                                :::*    

把另外的两台从服务器也做同样的修改,这里就不予演示了。

配置从服务器

第一台

[root@centos7.3-1 ~]#redis-cli -h 192.168.166.132 -a test1
192.168.166.132:6379> SLAVEOF 192.168.166.130 6379           #指定主服务器地址IP和端口
OK
192.168.166.132:6379> CONFIG SET masterauth admin123         #指定主服务器的认证密码
OK

主服务器

[root@CentOS7.3 ~]#redis-cli -h 192.168.166.130 -a admin123
192.168.166.130:6379> info replication          #查看从服务器的状态
# Replication
role:master
connected_slaves:1                              #slave节点的数量
slave0:ip=192.168.166.132,port=6379,state=online,offset=997,lag=1   #slave节点的信息
master_repl_offset:997
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:996
192.168.166.130:6379> SET name master       #创建一个key,键名name,值为master
OK

第二台

192.168.166.132:6379> get name          #查看name
"master"                                #值为master

通过修改配置文件进行配置

[root@centos7.3-2 ~]#vim /etc/redis.conf      #修改配置文件,找到 REPLICATION配置段 

slaveof 192.168.166.130 6379            #添加maste的IP地址和端口
masterauth admin123                     #添加认证密码

再次查看主服务器

192.168.166.130:6379> info replication
# Replication
role:master
connected_slaves:2                  #slave节点数变成了2台
slave0:ip=192.168.166.132,port=6379,state=online,offset=2523,lag=1
slave1:ip=192.168.166.133,port=6379,state=online,offset=2523,lag=1  #第二台slave节点的信息
master_repl_offset:2523
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:2522

主从服务其他配置

slave-serve-stale-data yes      #是否使用不新鲜的内容给用户提供服务
slave-read-only yes             #从节点是否为只读
repl-diskless-sync no           #复制策略,参数:no, Disk-backed, Diskless,参数信息如下
        #新的从节点或某较长时间未能与主节点进行同步的从节点重新与主节点通信,需要做“full synchronization",此时其同步方式有两种style:
            Disk-backend:主节点新创建快照文件于磁盘中,而后将其发送给从节点;
            Diskless:主节点新创建快照后直接通过网络套接字文件发送给从节点;为了实现并行复制,通常需要在复制启动前延迟一个时间段;

repl-diskless-sync-delay 5  #复制启动前延迟一个时间段
repl-ping-slave-period 10   #探测的间隔时间
repl-timeout 60                 #从节点的超时时间
repl-disable-tcp-nodelay no #是否禁止tcp-nodelay,tcp-nodelay表示等数据累计到一定大小再传输。
repl-backlog-size 1mb       #复制的后援队列的长度
repl-backlog-ttl 3600       
slave-priority 100              #复制集群中,主节点故障时,sentinel应用场景中的主节点选举时使用的优先级;数字越小优先级越高
                                #但0表示不参与选举,但是可以投票; 
min-slaves-to-write 3           #主节点仅允许其能够通信的从节点数量大于等于此处的值时接受写操作;
min-slaves-max-lag 10           #从节点延迟时长超出此处指定的时长时,主节点会拒绝写入操作;
slave-announce-ip 5.5.5.5   #从服务器宣告自己的ip地址
slave-announce-port 1234    #端口

sentinel:

主要完成三个功能:监控、通知、自动故障转移

当主节点故障后使用流言协议、投票协议来选举新的master节点,sentinel最少需要3个节点。

配置文件:/etc/redis-sentinel.conf

程序文件:/usr/bin/redis-sentinel

默认端口:26379

配置环境:使用4台主机,一台主3台从,在4台主机上面都配置sentinel,4台服务器的redis连接密码需要配置为相同的。

配置项:

bind                    #sentinel绑定的地址
port 26379              #sentinel服务的端口
dir /tmp                #sentinel存放临时文件的目录
sentinel monitor <master-name> <ip> <redis-port> <quorum>       #指定主节点
sentinel auth-pass <master-name> <password>                     #指定认证密码
        #<quorum>表示sentinel集群的quorum机制,即至少有quorum个sentinel节点同时判定主节点故障时,才认为其真的故障;

sentinel down-after-milliseconds <master-name> <milliseconds>       #监控到指定的集群的主节点异常状态持续多久方才将标记为“故障”;
sentinel parallel-syncs <master-name> <numslaves>                   #指在failover过程中,能够被sentinel并行配置的从节点的数量;
sentinel failover-timeout <master-name> <milliseconds>  #默认为3分钟,单位为毫秒
        #sentinel必须在此指定的时长内完成故障转移操作,否则,将视为故障转移操作失败
sentinel notification-script <master-name> <script-path>            #通知脚本,此脚本被自动传递多个参数;
logfile /var/log/redis/sentinel.log             #日志

配置示例

[root@centos7.3 ~]#vim /etc/redis-sentinel.conf 
bind 192.168.166.130
port 26379

dir /tmp
sentinel monitor mymaster 192.168.166.130 6379 3
sentinel auth-pass  mymaster admin123
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 3
sentinel failover-timeout mymaster 60000



[root@CentOS7.3 ~]#systemctl start redis-sentinel.service 
[root@CentOS7.3 ~]#ss -ntl
State       Recv-Q Send-Q      Local Address:Port                     Peer Address:Port              
LISTEN      0      128             127.0.0.1:26379                               *:*                  
LISTEN      0      128       192.168.166.130:6379                                *:*                  
LISTEN      0      128                     *:22                                  *:*                  
LISTEN      0      128                    :::22                                 :::*
其他的几台服务器配置同样的内容
注:在sentinel中要配置bind指定地址或认证密码,防止触发安全机制。

设置从服务器

[root@centos7.3-1 ~]#redis-cli -a admin123          
127.0.0.1:6379> SLAVEOF 192.168.166.130 6379            #设置主服务器的地址和端口
OK
127.0.0.1:6379> CONFIG SET masterauth admin123          #设置主服务器的认证密码
OK

其他两台做同样的设置
[root@CentOS7.3 ~]#tail -f /var/log/redis/sentinel.log      #查看主服务器的sentinel日志
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

3157:X 20 Sep 21:02:29.987 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
3157:X 20 Sep 21:02:29.988 # Sentinel ID is b3fa8d852c0bfdd699ebb4b33e56ed4f2d17bf7e
3157:X 20 Sep 21:02:29.988 # +monitor master mymaster 192.168.166.130 6379 quorum 3
3157:X 20 Sep 21:05:40.725 * +slave slave 192.168.166.132:6379 192.168.166.132 6379 @ mymaster 192.168.166.130 6379
3157:X 20 Sep 21:05:45.763 # +sdown slave 192.168.166.132:6379 192.168.166.132 6379 @ mymaster 192.168.166.130 6379
3157:X 20 Sep 21:06:00.833 * +slave slave 192.168.166.136:6379 192.168.166.136 6379 @ mymaster 192.168.166.130 6379
3157:X 20 Sep 21:06:00.835 * +slave slave 192.168.166.133:6379 192.168.166.133 6379 @ mymaster 192.168.166.130 6379
3157:X 20 Sep 21:06:05.841 # +sdown slave 192.168.166.136:6379 192.168.166.136 6379 @ mymaster 192.168.166.130 6379
3157:X 20 Sep 21:06:05.841 # +sdown slave 192.168.166.133:6379 192.168.166.133 6379 @ mymaster 192.168.166.130 6379
# 三台从服务器全部被识别上线
[root@CentOS7.3 ~]#redis-cli -p 26379           #登陆主服务器的sentinel
127.0.0.1:26379> sentinel masters               #查看主节点的信息
1)  1) "name"
    2) "mymaster"
    3) "ip"
    4) "192.168.166.130"                        #主节点的IP
    5) "port"
    6) "6379"                                   #主节点的服务端口
    7) "runid"
    8) "29c83931b3c6c71cc7dc084878b4beef5f9dd308"
    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) "1000"
   19) "last-ping-reply"
   20) "1000"
   21) "down-after-milliseconds"
   22) "5000"
   23) "info-refresh"
   24) "3141"
   25) "role-reported"
   26) "master"
   27) "role-reported-time"
   28) "746198"
   29) "config-epoch"
   30) "0"
   31) "num-slaves"
   32) "3"
   33) "num-other-sentinels"
   34) "0"
   35) "quorum"
   36) "3"
   37) "failover-timeout"
   38) "60000"
   39) "parallel-syncs"
   40) "3"
127.0.0.1:26379> sentinel slaves mymaster           #查看从节点的信息
1)  1) "name"
    2) "192.168.166.136:6379"                       #第一台节点
    3) "ip"
    4) "192.168.166.136"
    5) "port"
    6) "6379"
    7) "runid"
    8) ""
    9) "flags"
   10) "s_down,slave,disconnected"
   11) "link-pending-commands"
   12) "0"
   13) "link-refcount"
   14) "1"
   15) "last-ping-sent"
   16) "568371"
   17) "last-ok-ping-reply"
   18) "568371"
   19) "last-ping-reply"
   20) "568371"
   21) "s-down-time"
   22) "563363"
   23) "down-after-milliseconds"
   24) "5000"
   25) "info-refresh"
   26) "1505913329204"
   27) "role-reported"
   28) "slave"
   29) "role-reported-time"
   30) "568371"
   31) "master-link-down-time"
   32) "0"
   33) "master-link-status"
   34) "err"
   35) "master-host"
   36) "?"
   37) "master-port"
   38) "0"
   39) "slave-priority"
   40) "100"
   41) "slave-repl-offset"
   42) "0"
2)  1) "name"
    2) "192.168.166.133:6379"                       #第二台节点
    3) "ip"
    4) "192.168.166.133"
    5) "port"
    6) "6379"
    7) "runid"
    8) ""
    9) "flags"
   10) "s_down,slave,disconnected"
   11) "link-pending-commands"
   12) "0"
   13) "link-refcount"
   14) "1"
   15) "last-ping-sent"
   16) "568369"
   17) "last-ok-ping-reply"
   18) "568369"
   19) "last-ping-reply"
   20) "568369"
   21) "s-down-time"
   22) "563363"
   23) "down-after-milliseconds"
   24) "5000"
   25) "info-refresh"
   26) "1505913329204"
   27) "role-reported"
   28) "slave"
   29) "role-reported-time"
   30) "568369"
   31) "master-link-down-time"
   32) "0"
   33) "master-link-status"
   34) "err"
   35) "master-host"
   36) "?"
   37) "master-port"
   38) "0"
   39) "slave-priority"
   40) "100"
   41) "slave-repl-offset"
   42) "0"
3)  1) "name"
    2) "192.168.166.132:6379"                   #第三台节点
    3) "ip"
    4) "192.168.166.132"
    5) "port"
    6) "6379"
    7) "runid"
    8) ""
    9) "flags"
   10) "s_down,slave,disconnected"
   11) "link-pending-commands"
   12) "0"
   13) "link-refcount"
   14) "1"
   15) "last-ping-sent"
   16) "588479"
   17) "last-ok-ping-reply"
   18) "588479"
   19) "last-ping-reply"
   20) "588479"
   21) "s-down-time"
   22) "583441"
   23) "down-after-milliseconds"
   24) "5000"
   25) "info-refresh"
   26) "1505913329204"
   27) "role-reported"
   28) "slave"
   29) "role-reported-time"
   30) "588479"
   31) "master-link-down-time"
   32) "0"
   33) "master-link-status"
   34) "err"
   35) "master-host"
   36) "?"
   37) "master-port"
   38) "0"
   39) "slave-priority"
   40) "100"
   41) "slave-repl-offset"
   42) "0"
127.0.0.1:26379> sentinel get-master-addr-by-name  mymaster     #这条命令可以查看当前谁是主节点
1) "192.168.166.130"
2) "6379"

在主节点上面创建要一个键,然后在从节点上面查看有没有同步

[root@CentOS7.3 ~]#redis-cli -h 192.168.166.130 -a admin123
192.168.166.130:6379> set test1 master
OK
[root@centos7.3-1 ~]#redis-cli -h 192.168.166.132 -a admin123
192.168.166.132:6379> get test1
"master"
[root@centos7.3-2 ~]#redis-cli  -h 192.168.166.133 -a admin123
192.168.166.133:6379> get  test1
"master
[root@centos7.3-2 etc]#redis-cli  -h 192.168.166.136 -a admin123
192.168.166.136:6379> get test1
"master"

切换主节点

192.168.166.130:26379> sentinel failover mymaster             #使failover命令并指定主节点的名称  
OK
192.168.166.130:26379> sentinel get-master-addr-by-name mymaster
1) "192.168.166.136"                    #主节点已经切换为192.168.166.136
2) "6379"

模拟故障

[root@centos7.3-2 etc]#systemctl stop redis             #关闭192.168.166.136的redis服务
[root@centos7.3-2 etc]#redis-cli -h 192.168.166.136 -p 26379
192.168.166.136:26379> sentinel get-master-addr-by-name mymaster        #查看当前主节点
1) "192.168.166.133"                #主节点已经切换
2) "6379"

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容

  • 1.1 资料 ,最好的入门小册子,可以先于一切文档之前看,免费。 作者Antirez的博客,Antirez维护的R...
    JefferyLcm阅读 16,967评论 1 51
  • Redis杂谈 Redis是近年来发展迅速的内存数据库,网上也已经有多Redis的文章。但不管是英文还是中文,多数...
    迷失于重逢阅读 1,484评论 0 14
  • 本文将从Redis的基本特性入手,通过讲述Redis的数据结构和主要命令对Redis的基本能力进行直观介绍。之后概...
    kelgon阅读 60,957评论 24 626
  • 你可记得那些日子的艳阳?你可记得教官英武的脸庞?你可记得当初的抱怨?你可记得万事大吉的瞬间? 我只说我,像经历了一...
    逸黎阅读 210评论 0 5
  • 这是选择23:30睡,07:30起的第18/100,上图: 照常12:31睡,23点开始看《风雨哈佛路》,主要因为...
    泽阳9阅读 240评论 1 1