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

1、安装

[root@node2 ~]# yum install redis

[root@node2 ~]# rpm -ql redis
/etc/logrotate.d/redis
/etc/redis-sentinel.conf
/etc/redis.conf
/etc/systemd/system/redis-sentinel.service.d
/etc/systemd/system/redis-sentinel.service.d/limit.conf
/etc/systemd/system/redis.service.d
/etc/systemd/system/redis.service.d/limit.conf
/usr/bin/redis-benchmark
/usr/bin/redis-check-aof
/usr/bin/redis-check-rdb
/usr/bin/redis-cli
/usr/bin/redis-sentinel
/usr/bin/redis-server
/var/lib/redis
/var/log/redis
/var/run/redis
.....

2、配置

################################## NETWORK #####################################
bind 127.0.0.1
protected-mode yes    保护模式  只能在本地访问,前提是在没有设置密码和绑定清空下生效
port 6379
# unixsocket /tmp/redis.sock
tcp-backlog 511       tcp 队列
timeout 0             不超时,建议超时  
tcp-keepalive 300      tcp握手

################################# GENERAL #####################################
daemonize no          #如果是systemd管理就不是守护进程
pidfile /var/run/redis_6379.pid

################################## SECURITY ###################################
requirepass 123456
# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52    #很危险的命令  在aof 跟 replocation中不推荐使用

################################### LIMITS ####################################
maxclients 10000   最大并发连接数
maxmemory    最大内存 建议设置
maxmemory-policy noeviction
        noeviction   不启动淘汰机制,告诉客户端内存已经满了
        volatile-lru -> 淘汰过期键
        allkeys-lru -> 淘汰任意键
        volatile-random -> 淘汰所有设置过过期时间的键
        allkeys-random -> 随机淘汰任意键
        volatile-ttl -> 淘汰设置过过期时间的,按照时间顺序淘汰
maxmemory-samples 5  上述策略每批样本5个

################################## SLOW LOG ###################################
slowlog-log-slower-than 10000        0.01s
slowlog-max-len 128                  记录语句最大字节

############################### ADVANCED CONFIG ###############################
client-output-buffer-limit normal 0 0 0      常规客户端输出缓冲大小  
client-output-buffer-limit slave 256mb 64mb 60                   硬限制最大     软限制(可超出)   超出部分60s清除
client-output-buffer-limit pubsub 32mb 8mb 60

3、启动

[root@node2 ~]# systemctl start redis
[root@node2 ~]# ss -lntup|grep redis
tcp    LISTEN     0      128    127.0.0.1:6379                  *:*                   users:(("redis-server",pid=101175,fd=4))

4、客户端连接程序

[root@node2 ~]# redis-cli -h
[root@node2 ~]# redis-cli -h 127.0.0.1 -p 6379  -a '123456'

数据持久化

RDB:snapshotting, 二进制格式;按事先定制的策略,周期性地将数据从内存同步至磁盘;数据文件默认为dump.rdb;
客户端显式使用SAVE或BGSAVE命令来手动启动快照保存机制;
SAVE:同步,即在主线程中保存快照,此时会阻塞所有客户端请求;
BGSAVE:异步;

同步,即在主线程中保存快照,此时会阻塞所有客户端请求;

192.168.1.201:6379> save
OK

异步,即在主线程中保存快照

192.168.1.201:6379> BGSAVE
Background saving started

数据完整恢复AOF

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

2种配置

################################ SNAPSHOTTING  ################################
save 900 1       900s发生一次改变    保存
save 300 10      300s发生10次改变    保存
save 60 10000    60s发生10000改变    保存
stop-writes-on-bgsave-error yes     快照发生错误,拒绝所有写操作
rdbcompression yes                  快照文件压缩  cpu资源跟磁盘io相关
rdbchecksum yes                     快照做校验
dbfilename "dump.rdb"                快照名称
dir "/var/lib/redis"                放到高性能磁盘

############################## APPEND ONLY MODE ###############################
工作方式,基于内存时时生产aof,追加到文件
appendonly no
appendfilename "appendonly.aof"   #存放位置同上
appendfsync everysec   #每秒写一次,降低io压力,会丢失1秒的数据变化   
            always     #内核同步到磁盘 性能严重低效
            no         #由内核决定什么时候写到磁盘
no-appendfsync-on-rewrite no   覆盖老的aof,优化aof,这个no是说在追加时候继续rewrite,  yes的话是追加时候不要rewirte
auto-aof-rewrite-percentage 100    键的变化超过原有键100%  和下面那项一起满足
auto-aof-rewrite-min-size 64mb     最小64mb   启动重写
aof-load-truncated yes             意外终止情况下清空清楚aof文件,重新构建
[root@node1 ~]# ls /var/lib/redis/
dump.rdb  appendonly.aof

appendonly.aof存的都是命令,类似mysql二进制日志,用来数据回放

[root@node2 redis]# cat appendonly.aof
*2
$6
SELECT
$1
0
*3
$3
set
$1
b
$2
pp

主从配置

从节点配置主节点,配置主节点认证密码

127.0.0.1:6379> SLAVEOF 192.168.1.201 6379
OK
127.0.0.1:6379> CONFIG SET masterauth 123456
OK
127.0.0.1:6379> CONFIG REWRITE

从节点配置文件参数说明

################################# REPLICATION #################################
# Generated by CONFIG REWRITE
slaveof 192.168.1.201 6379
masterauth "123456"

slave-serve-stale-data yes   #主节点挂了,从节点数据是有否有效
slave-read-only yes          #只读
repl-diskless-sync no        #主节点快照,从节点复制快照进行数据同步  这里是no 用的是下面磁盘内容复制
      Disk-backed            #主节点把保存下来的文件传送给从即诶单

repl-diskless-sync-delay 5   延迟几秒同步,无磁盘复制才有效
#repl-ping-slave-period 10    每隔10秒探测主节点
#repl-timeout 60              探测一分钟超时
repl-disable-tcp-nodelay no  数据同步不延迟,网络io增加
#repl-backlog-size 1mb
#repl-backlog-ttl 3600         0表示不超时
slave-priority 100            从节点优先级(多个从节点优先级比较) 0没有优先级,数字越小优先级越高

#min-slaves-to-write 3       
#min-slaves-max-lag 10        至少3个从节点在线并且从节点不落后主节点10s,主节点才能写入
# slave-announce-ip 5.5.5.5   自己的ip
# slave-announce-port 1234    自己的端口

主节点查看从节点信息

192.168.1.201:6379> INFO REPLICATION
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.1.200,port=6379,state=online,offset=781,lag=0
master_repl_offset:781
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:780

主从故障转移简单说明

实现过程:所有节点配置初始化一样,只要配置主节点信息,同步时候,从节点会从主节点拉去信息,同步配置文件,在同步redis。初次配置,最好手动实现主从,让其生产配置文件。

vim  /etc/redis-sentinel.conf

bind 0.0.0.0   #生产写私有ip
sentinel monitor mymaster 192.168.1.201 6379 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1   一次只给一个从节点同步数据,避免压垮主节点
sentinel failover-timeout mymaster 180000   故障转移超时时间  这个可以长点
logfile /var/log/redis/sentinel.log

以下这段要么自动生产,要么sentinel运行时修改

sentinel leader-epoch mymaster 3
sentinel known-slave mymaster 192.168.1.202 6379
sentinel known-slave mymaster 192.168.1.200 6379
sentinel current-epoch 3

集群简单介绍

redis官方集群,无中心节点,实现对key用hash slot(0-16383)算法进行存储,还实现sentinel的故障转移功能。