本章节阅读索引:
一:redis简介
二:安装及主要配置文件简介
三:Redis常用命令及数据库操作命令简介
四:Redis文件配置段相关简介
五:Redis的持久化存储
六:Redis主从复制的实现
七:Redis之sentinel高可用集群的实现
八:分布式扩展 CLuster:集群相关配置及实现
一:Redis简介
REmote DIctionary Server:远程数据结构服务器。
Redis是一个开源的使用C语言编写、开源、支持网络、以内存作为存储的,可以作为数据库,缓存,消息(掮客)队列服务器,并提供多种语言的API。
支持的数据结构:字符串,列表(数组),hashe(关联数组),集合,有序集合(支持范围查询),bitmaps(位图),hyperloglogs,空间索引(支持辐射查询);
相关特性:内键的复制(主从复制),Lua scripting(Lua脚本引擎),支持LRU的内存淘汰机制,支持事务,基于磁盘的不同级别的持久机制,基于Sentinel实现的高可用,redis3.0支持内键集群机制。
单进程:不会因为CPU出现瓶颈。
持久化机制:
snapshotting(默认)
AOF:(Append only file)类似于mysql的二进制日志
二:安装及主要配置文件简介
安装使用 yum install redis -y 存在于epel仓库
1): 程序及环境:
主配置文件:/etc/redis.conf
主程序:/usr/bin/redis-server
命令行工具:/usr/bin/redis-cli
数据目录:/var/lib/redis
2):主配置文件注释内容简介:
[root@node01 ~]#grep "^###" /etc/redis.conf
################################## INCLUDES ###################################
################################## NETWORK ##################################### 网络属性
################################# GENERAL ##################################### 通用配置
################################ SNAPSHOTTING ################################ 快照持久配置
################################# REPLICATION ################################# 主从复制
################################## SECURITY ################################### 安全认证
################################### LIMITS #################################### 资源限制
############################## APPEND ONLY MODE ############################### AOF持久性
################################ LUA SCRIPTING ############################### LUA脚本
################################ REDIS CLUSTER ############################### 集群配置
################################## SLOW LOG ################################### 慢日志
################################ LATENCY MONITOR ############################## 延时监控器
############################# EVENT NOTIFICATION ############################## 事件通知
############################### ADVANCED CONFIG ############################### 高级配置
3):简单配置的实现:
[root@node01 ~]#vim /etc/redis.conf
bind 0.0.0.0 #更改为监听本机所有端口
port 6379
[root@node01 ~]#systemctl start redis
[root@node01 ~]#redis-cli -h 192.168.38.27 #连接交互式界面
三:Redis常用命令及数据库操作命令简介
1):redis-cli命令:
-h:指定主机
-p:指定端口
-a:指定密码
-n:指定数据库,0-15,(数据库格式都是按照数字编号进行定义的)
-s:指定监听在socket文件上
2):连接数据库获取内键命令的使用帮助
[root@node01 ~]#redis-cli -h 192.168.38.27
192.168.38.27:6379> help 获取内键命令的使用帮助
redis-cli 3.2.10
To get help about Redis commands type:
"help @" to get a list of commands in
"help " for help on
"help " to get a list of possible help topics
"quit" to exit
To set redis-cli perferences:
":set hints" enable online hints
":set nohints" disable online hints
Set your preferences in ~/.redisclirc
3):Redis数据库操作命令:
支持的数据结构:字符串,列表(数组),字典(关联数组),集合,有序集合,发布/订阅
@string (字符串)
SET #设定指定键的值
GET #获取键的值
EXISTS #判定指定键是否存在
INCR #增加相关键的值
DECR #降值
SETNX #已存在就不会改变键的值
SETEX #设定键的过期时间
INCRBYELOAT #以浮点的方式自增
MGET #获取多个键的值
MSET #设定多个键的值
STRLEN #获取键中的字符
APPEND #在一个键后追加新内容
@list(列表)
LPUSH #左进入栈
RPUSH #右进入栈
LPOP #左出
RPOP #右出
LPUSHX #仅当列表存在时入栈
RPUSHX #仅当前列表存在才从右侧新增元素
LRANGE #取指定范围内的键
LINDEX #取指定范围内的值
LSET #修改其中一个元素的值
LTRIM #删除指定范围内的键
LREM #移除指定范围内的元素
@hash(字典)
HSET #设定单个键值
HMSET #一次设定多个键值
HGET #获取键的值
HMGET #一次获取多个键的值
HKEYS #获取指定键的所有字段
HVALS #获取指定键的所有值
HDEL #删除字段
HGETALL #获取键的所有字段和值
HSTRLEN #获取指定键的值的长度
@set(集合)
SADD #添加值
SPOP #弹出值
SCARD #列出集合中的所有元素个数
SMEMBERS #列出所有集合中的元素
SMOVE #移动指定元素
SREN #删除指定的元素
SINTER #求交集
SUNION #求并集
SDIFF #求插集
SRANDMEMBER
@sorted_set 有序集合
ZADD #ZADD z1 100 tom 90 jerry 80 obama 70 trump 创建有序集合
ZCARD
ZCOUNT
ZSCORE #获取成员得分
ZREMRANGEBYRANK #以索引范围删除指定的成员
ZRANGEBYSCORE
ZRANGE #根据索引来获取指定范围内的成员信息
ZRANK #获取指定成员的索引信息
........
@pubsub 发布/订阅
PUBLISH #向一个频道中发布消息
SUBSCRIBE #订阅某个队列
UNSUBSCRIBE #取消订阅
PSUBSCRIBE #基于正则表达式去订阅某些队列
PUNSUBSCRIBE #基于正则表达式取消订阅
@connection 连接相关
PING #探测服务器是否为健康状态
AUTH password #认证
SELECT index #切换数据库
QUIT #退出当前客户端
KEYS pattern #列出数据库中的键
FLUSHDB #清空当前数据库
FLUSHALL #清空所有数据库
@server 相关的所有命令
CLIENT GETNAME #获取客户端连接的相关连接信息
CLIENT KILL #关闭客户端
CLIENT LIST #列出所有客户端连接的信息
CLIENT PAUSE #暂停某个连接
SHUTDOWN #关闭服务器
CLIENT SETNAME #设置当前连接名称
配置参数可运行时修改:
CONFIG GET #获取配置
CONFIG RESETSTAT
CONFIG REWRITE #将内存中的配置覆盖文件中的配置
CONFIG SET #修改配置
INFO #获取状态信息及统计信息
四:Redis文件配置段相关简介
通用配置项:
daemonize no #是否运行为守护进程
supervised no
pidfile /var/run/redis_6379.pid #守护进程的PID文件
loglevel notice #日志级别
logfile /var/log/redis/redis.log #日志文件存放位置
databases 16 #定义最大16个数据库,-1不做限制。
网络配置项:
bind 0.0.0.0 #监听的地址
protected-mode yes #保护模式,没有定义bind指令,而且又没有配置密码时将激活保护模式
port 6379 #监听的端口
tcp-backlog 511 #TCP的后援队列
timeout 0 #0为永不超时,设定客户端的连接空闲超时时长
tcp-keepalive 300 #TCP连接的超时时长
安全配置项:
requirepass #设置密码
rename-command #在AOF或Replication环境中,不推荐使用
资源限制相关的配置:
maxclients 10000 #最大并发连接数
maxmemory #存储内存设置,单位字节,如果不设定则使用所有的可用内存,如果内存耗尽将会被OOM(out of Memory),内核将自动杀死最”吃“内存资源的进程
maxmemory-policy noeviction #一旦内存达到了maxmemory的淘汰机制
volatile-lru #只对有过期时间的键基于LRU淘汰
allkeys-lru #对所有的的键基于LRU进行淘汰
volatile-random #只对所有设置了过期时间的键进行随机淘汰
allkeys-random #对所有的键都基于随机淘汰机制
volatile-ttl #对所有设置了过期时间的键基于幂序进行淘汰
noeviction #不淘汰任何键,如果没有空间了则返回错误
maxmemory-samples 5 #淘汰范围(采样范围),5个接近真实,10个无限接近真实,3个非常快但不是太精准。
SlowLog(m慢查询日志)相关的配置:
Slowlog-log-slower-than 1000 #单位是微秒
Slowlog-max-len 128 #SlowLog记录的日志最大条目;
ADVANCED(高级)配置:
hash-max-ziplist-entries 512 #字典的每个键中得字段最大512个
hash-max-ziplist-value 64 #单个字段的值最大为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 #订阅队列客户端
#硬限制
#软限制
#软限超出多少时间清空
五:Redis的持久化存储
RDB:snapshotting,二进制格式,按事先定制的策略,周期性地将数据从内存同步至磁盘,数据文件默认为dump.rdb
客户端显示使用SAVE或BGSAVE命令来手动启动快照保存机制。
SAVE:同步,即在主线程中保存快照,此时会阻塞所有客户端请求;
BGSAVE:异步;backgroud
BGREWRITEAOF:AOF文件重写;
RDB相关的配置:
dbfilename dump.rdb #二进制文件名称
dir /var/lib/redis #文件存放路径,如需更改路径,属主数组必须为redis
stop-writes-on-bgsave-error yes #如果出现错误执行停止写入操作
rdbcompression yes #压缩存放,主要节约磁盘IO
rdbchecksum yes #每一次保存完是否需校验
save 900 1 #在900秒的时间内,数据发生了一次修改,则立即触发快照
save 300 10 #在300秒的时间内,数据发生了十次修改操作,则立即触发快照
save 60 10000 #在60秒的时间内,数据发生了一万次修改操作,则立即触发快照
AOF:
记录每次写操作至指定的文件尾部实现的持久化,当reedis重启时,可通过重新执行文件中的命令在内存中重建出数据库;
BGREWRITEAOF:手动触发AOF文件重写,不会读取正在使用AOF文件,而是通过将内存中得数据以命令的方式保存至临时文件中,完成之后替换原来的AOF文件
AOF相关的配置:
appendonly no
appendfilename "appendonly.aof" #文件名称
auto-aof-rewrite-percentage 100 #发生变化的内容占原来数据得100%,则自动触发重写
auto-aof-rewrite-min-size 64mb #当数据大于64M时才执行上述自动重写操作
appendfsync everysec #多少次执行同步写磁盘,一秒一次。
aof-load-truncated yes #是否自动修剪残缺数据
注:持久机制本身不能取代备份,应该制定备份策略,对redis库定期备份;
RDB与AOF同时启用
1):BGSAVE和BGREWRITEAOF不会同时进行
2):Redis服务器启动时用持久化的数据文件恢复数据,会优先使用AOF;
六:Redis主从复制的实现
1):配置主从相关选项简介
################################# REPLICATION #################################
slave-serve-stale-data yes #如果主节点宕机,从节点是否可以将不新鲜的数据给客户端
slave-read-only yes #将从节点设置为只读
repl-diskless-sync no #向多个从节点同时发送
repl-diskless-sync-delay 5 #发送延时时长 5s
repl-ping-slave-period 10 #主节点每隔多久探测一次从节点的从活性
repl-timeout 60 #主节点的超时时长
repl-disable-tcp-nodelay no #是否需要禁用tcp-nodelay选项
slave-priority 100 #从节点的优先级
min-slaves-to-write 3
min-slaves-max-lag 10 #如果集群中有10个从节点,有3个存活才可以正常工作
2):主节点配置
[root@node01 ~]#vim /etc/redis.conf
bind 0.0.0.0
requirepass ilinux #设置密码
Disk-backed:将数据写到磁盘上,适合互联网
Diskless:直接发送到内存缓存区,适合内网
3):从节点配置
[root@node02 ~]#vim /etc/redis.conf
bind 0.0.0.0
slaveof 192.168.38.27 6379
masterauth ilinux
requirepass ilinux
4):主节点查看当前状态
[root@node01 ~]#redis-cli -a ilinux127.0.0.1:6379>INFO replication# Replicationrole:masterconnected_slaves:1slave0:ip=192.168.38.17,port=6379,state=online,offset=183,lag=1master_repl_offset:183repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:2repl_backlog_histlen:182
5):使用命令行配置从节点二
[root@node03 ~]#vim /etc/redis.confbind 0.0.0.0requirepass ilinux[root@node03 ~]#systemctl start redis[root@node03 ~]#redis-cli -a ilinux[root@node03 ~]#redis-cli -a ilinux127.0.0.1:6379>SLAVEOF 192.168.38.27 6379127.0.0.1:6379>CONFIG SET masterauth ilinux127.0.0.1:6379>CONFIG GET masterauth1) "masterauth"2) "ilinux"127.0.0.1:6379>CONFIG REWRITE#使其配置永久有效。[root@node03 ~]#tail -3 /etc/redis.conf# Generated by CONFIG REWRITEslaveof 192.168.38.27 6379masterauth "ilinux"
注:使用命令行配置从节点为即时生效
七:Redis之sentinel高可用集群的实现
主要功能:监控,通知,故障转移。
[root@node01 ~]#vim /etc/redis-sentinel.confbind 0.0.0.0sentinel monitor mymaster 192.168.38.27 6379 2 #指定监听的地址及quorum(机制)sentinel auth-pass mymaster ilinux #主节点的认证sentinel down-after-milliseconds mymaster 30000 #指定多长时间联系不到主节点认为宕机,单位毫秒。sentinel parallel-syncs mymaster 5 #指定并行复制节点sentinel failover-timeout mymaster 180000 #提升为新主复制数据时间,超过3分钟为故障转移超时logfile /var/log/redis/sentinel.log #日志文件路径[root@node01 ~]#scp /etc/redis-sentinel.conf 192.168.38.17:/etc/[root@node01 ~]#scp /etc/redis-sentinel.conf 192.168.38.37:/etc/[root@node01 ~]#systemctl start redis-sentinel.service[root@node01 ~]#redis-cli -p 26379127.0.0.1:26379>SENTINEL masters1) 1) "name"2) "mymaster" #集群名称3) "ip"4) "192.168.38.27" #被监控IP地址127.0.0.1:26379>SENTINEL slaves mymaster#查看有几个从节点信息1) 1) "name"2) "192.168.38.37:6379"2) 1) "name"2) "192.168.38.17:6379"[root@node03 ~]#vim /etc/redis-sentinel.confsentinel myid xxx #删除此行,由于配置文件是复制的,会造成myid一致。[root@node03 ~]#systemctl start redis-sentinel
SENTINEL failover #当主节点并未发生故障时,手动强行转移
SENTINEL get-master-addr-by-name
八:分布式扩展 CLuster:集群相关配置及实现
1):CLuster:集群相关的配置
cluster-enabled 是否开启集群配置
cluster-config-file 集群节点集群信息配置文件,每个节点都有一个,由redis生成和更新,配置时避免名称冲突
cluster-node-timeout 集群节点互连超时的阈值,单位毫秒
cluster-slave-validity-factor 进行故障转移时,salve会申请成为master。有时slave会和master失联很久导致数据较 旧,这样的slave不应该成为master。这个配置用来判断slave是否和master失联时间过长。
2):配置过程
1):设置配置文件,启用集群功能
2):启动redis后为每个节点分配slots;
注:每个slot要独立创建,可以范围是0-16383,共16384个;
3):设定群成员关系:CLUSTE MEET
4):获取集群状态:GLUSTER INFO CLUSTER NODES
3):实现过程
[root@node01 ~]# vim /etc/redis.conf
bind 0.0.0.0
requirepass ilinux
################################ REDIS CLUSTER ############################### cluster-enabled yes cluster-config-file /etc/redis-cluster.conf cluster-node-timeout 15000 cluster-slave-validity-factor 10 [root@node01 ~]# scp /etc/redis.conf 192.168.38.17:/etc/ [root@node01 ~]# scp /etc/redis.conf 192.168.38.37:/etc/ [root@node01 ~]# systemctl start redis [root@node02 ~]# systemctl start redis [root@node03 ~]# systemctl start redis [root@node01 ~]# redis-cli -a ilinux -h 192.168.38.17 -c cluster addslots {0..5499} [root@node01 ~]# redis-cli -a ilinux -h 192.168.38.27 -c cluster addslots {5500..10999} [root@node01 ~]# redis-cli -a ilinux -h 192.168.38.37 -c cluster addslots {11000..16383} [root@node01 ~]# redis-cli -a ilinux 127.0.0.1:6379>CLUSTER MEET 192.168.38.17 6379127.0.0.1:6379>CLUSTER MEET 192.168.38.37 6379127.0.0.1:6379>CLUSTER NODES2e2905d38d25706f3f78b70aa8763e4faf5d592e 192.168.38.17:6379 master - 0 1532428013117 1 connected 5500-10999 e512ceda75fecd864fa101a4be23789828d4aaac 192.168.38.37:6379 master - 0 1532428014119 0 connected 11000-16383 ce6a7525e403171d1ff02443820bda71812d10ac 192.168.38.27:6379 myself,master - 0 0 2 connected 0-5499
个人学习笔记,仅供参考。