Redis是什么?
- Redis是一个开源的(BSD许可的)内存数据结构存储,可以用作数据库、缓存和消息队列
- 它支持字符串、哈希、列表、集合、带范围查询的排序集、位图、超语言和带半径查询的地理空间索引
- Redis有内置的复制、Lua脚本、LRU回收、事务和不同级别的磁盘持久化,并通过Redis Sentinel和使用Redis集群自动分区提供高可用性
Redis的工作模式
- 缓存模式,类似memcache,不需要启用持久化AOF和RDB
- 持久缓存模式,可启用持久化AOF或RDB,或者都启用,根据业务来决定
- 高可用模式,master/slave模式,保证业务的连续性,使用高可用软件配合;
- 数据存储模式,当作数据库来用,必须启用持久化AOF和RDB,可在允许数据丢失的情况下使用;不允许数据丢失的情况,建议使用mongodb替代
Redis Sentinel的安装配置
1.系统安装环境
- 三台独立的linux host centos 7.4
- 使用稳定的Redis3.2.12版本
- Redis仅作缓存使用,这也是Redis最常用的地方
- 在三个节点上先启动三个独立的Redis进程,再在三个节点上启动三个独立的Sentinel进程
2.Redis单实例安装步骤
yum install ntpdate lsof dos2unix nmap nc gcc-c++ lrzsz openssl-devel openssl tree expect man rsync sysstat -y
cat >>/etc/sysctl.conf <<EOF
vm.overcommit_memory = 1
net.core.somaxconn = 16384
EOF
sysctl -p
chmod +x /etc/rc.d/rc.local
cat >> /etc/rc.local << 'EOF'
echo never > /sys/kernel/mm/transparent_hugepage/enabled
EOF
echo never > /sys/kernel/mm/transparent_hugepage/enabled
mkdir /soft
cd /soft
wget http://download.redis.io/releases/redis-3.2.12.tar.gz
tar zxf redis-3.2.12.tar.gz
/bin/mv redis-3.2.12 redis
cd redis
make distclean
make
mkdir -p /srv/redis/bin
cd /srv/redis/
mkdir -p {db,logs,conf}
cd /soft/redis/src/
for i in {redis-sentinel,redis-server,redis-cli};do /bin/cp -ap $i /srv/redis/bin/;done
mkdir -p /srv/redis/db/6379/
cat > /srv/redis/conf/6379.conf << 'EOF'
protected-mode no
daemonize yes
pidfile /var/run/redis_6379.pid
port 6379
tcp-backlog 16384
timeout 0
tcp-keepalive 0
loglevel notice
logfile /srv/redis/logs/redis_6379.log
requirepass "Abcd1234!"
masterauth "Abcd1234!"
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /srv/redis/db/6379/
maxclients 20000
maxmemory 8GB
maxmemory-policy allkeys-lru
slave-read-only yes
appendonly no
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 1000
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
EOF
/srv/redis/bin/redis-server /srv/redis/conf/6379.conf
#启动Redis进程
需要在三个节点上都启动如上所示的Redis进程
配置Redis的主从同步需要将其中两个Redis节点的配置文件中使用"SLAVEOF Redis主节点IP 6379"指向Redis主节点IP的方法进行配置
3.Redis Sentinel安装步骤
mkdir -p /srv/redis/redis_sentinel/
cat > /srv/redis/conf/sentinel.conf << 'EOF'
daemonize yes
protected-mode no
port 26389
dir "/srv/redis/redis_sentinel/"
logfile "/srv/redis/logs/redis_sentinel.log"
sentinel monitor redismaster 192.168.1.60 6379 2
sentinel auth-pass redismaster Abcd1234!
sentinel down-after-milliseconds redismaster 30000
sentinel parallel-syncs redismaster 1
sentinel failover-timeout redismaster 180000
EOF
/srv/redis/bin/redis-sentinel /srv/redis/conf/sentinel.conf
#启动Sentinel进程
在Redis的主从同步配置完毕之后,在三个节点上都启动如上所示的Redis Sentinel进程
Redis Sentinel的配置文件中应该指明Redis的主从集群的master服务器的IP和auth-pass
Redis配置文件说明
cat redis.conf
daemonize yes
##启动daemonize模式,注意如果用daemon工具启动redis-server时设回false。
pidfile /var/run/redis.pid
port 6379
timeout 0
##客户端和Redis服务端的连接超时时间,默认是0,表示永不超时
tcp-keepalive 0
##检测tcp链接的超时时间,超时释放链接以接收新的链接
tcp-backlog 16384
##此参数确定了TCP全开连接的数量,此值必须不大于Linux系统定义的/proc/sys/net/core/somaxconn值
requirepass 123456
##设置密码认证
masterauth 123456
##设置slave访问master服务器的密码
loglevel notice
logfile /var/log/redis/redis.log
##指定日志文件
databases 16
save 900 1
save 300 10
save 60 10000
##如注释掉RDB的所有触发规则,在Master不保存RDB文件,即禁用RDB持久化
##RDB只作为slave时,只保留15分钟的规则,设置为15分钟保存一次就够了save 900 1
slaveof 192.168.1.11 6379
#slave服务器专用,后面配置master服务器地址
stop-writes-on-bgsave-error yes
##当RDB持久化出现错误之后,是否继续提供写服务,默认是yes,禁止继续写入
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /var/data/redis
##指定持久化文件及临时文件目录
repl-timeout 120
##slave服务器专用,适当加大比如120,避免master实际还没倒掉就认为master倒了
repl-backlog-size 1024M
##设置主从复制容量大小,这个 backlog 是一个用来在 slaves 被断开连接时
##存放 slave 数据的 buffer,所以当一个 slave 想要重新连接,通常不希望全部重新同步
##只是部分同步就够了,仅仅传递 slave 在断开连接时丢失的这部分数据
##这个值越大,salve 可以断开连接的时间就越长
##redis2.8版本才可用
repl-backlog-ttl 86400
##在某些时候,master 不再连接 slaves,backlog 将被释放
##redis2.8版本才可用
repl-disable-tcp-nodelay no
##指定向slave同步数据时,是否禁用socket的NO_DELAY选项
##若配置为"yes",则禁用NO_DELAY,则TCP协议栈会合并小包统一发送,这样可以减少主从节点间的包数量并节省带宽
##但会增加数据同步到slave的时间
##若配置为"no",表明启用NO_DELAY,则TCP协议栈不会延迟小包的发送时机,这样数据同步的延时会减少
##但需要更大的带宽
##通常情况下,应该配置为no以降低同步延时,但在主从节点间网络负载已经很高的情况下,可以配置为yes。
slave-priority 100
##指定slave的优先级
slave-serve-stale-data yes
##当slave服务器和master服务器失去连接后,或者当数据正在复制传输的时候
##如果此参数值设置"yes",slave服务器可以继续接受客户端的请求
##否则,会返回给请求的客户端如下信息"SYNC with master in progress"
slave-read-only yes
##是否允许slave服务器节点只提供读服务
##在不只1个slave存在的部署环境下,当master宕机时,Redis Sentinel会将priority值最小的slave提升为master
maxmemory 16GB
##设置为可用内存的1/2
vm-enabled no
#禁用虚拟内存
maxmemory-policy allkeys-lru
##启用自动过期算法 ,仅在做缓存时使用
##redis做数据存储时,使用这个策略,maxmemory-policy noeviction
##不让任何 key 过期,只是给写入操作返回一个错
appendonly yes
##是否启用 AOF日志文件
appendfilename appendonly.aof
##默认为appendonly.aof
appendfsync everysec
##设置aof的同步频率,有三种选择always,everysec,no,默认是everysec表示每秒同步一次
auto-aof-rewrite-percentage 100
##指定Redis重写aof文件的条件,默认是超过上次rewrite aof一倍(100%)时会启用rewrite aof
##综合考虑硬盘大小,可接受重启加载延时等,尽量的往大设置,减少AOF rewrite频率.
auto-aof-rewrite-min-size 10GB
##指定触发第一次rewrite时的aof文件的最小大小,最少5G起跳
no-appendfsync-on-rewrite no
##指定是否在后台aof文件rewrite期间调用fsync,默认为no,表示要调用fsync(无论后台是否有子进程在刷盘)
##Redis在后台写RDB文件或重写afo文件期间会存在大量磁盘IO,此时,在某些linux系统中,调用fsync可能会阻塞
lua-time-limit 5000
##一个Lua脚本最长的执行时间,单位为毫秒,如果为0或负数表示无限执行时间,默认为5000
slowlog-log-slower-than 10000
slowlog-max-len 128
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
##考虑Traffic及Slave同步时RDB加载所需时间,正确设置避免buffer撑爆client被关掉后又要重新进行全同步
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
##aof rewrite过程中,是否采取增量文件同步策略,默认为"yes"
##rewrite过程中,每32M数据进行一次文件同步,这样可以减少aof大文件写入对磁盘的操作次数
##这个不跟appendfsync everysec 冲突,写缓冲原理,buffer