建议了解一下缓解高并发的 redis 集群方案

公司现在 redis 用的还是单实例,只用来做读写缓存,实际的数据是落地到 mongo 和 es 中的。但是单实例的 redis 扛不住,业务并发数比较高,所以我给出了一套 redis 集群方案。整个方案从 redis 介绍,集群的搭建,灾难故障方面来展开的。


Redis是Remote Dictionary Server的缩写。本质上一个Key/Value数据库,与Memcached类似的NoSQL型数据库,但是数据可以持久化的保存在磁盘上,解决了服务重启后数据不丢失的问题,值可以是string(字符串)、list(列表)、sets(集合)或者是ordered sets(被排序的集合),所有的数据类型都具有push/pop、add/remove、执行服务端的并集、交集、两个sets集中的差别等等操作,这些操作都是具有原子性的,Redis还支持各种不同的排序能力特意设计为从核心支持硬件,几乎没有对硬件的要求或限制。核心在小端格式的硬件上运行,主要是x86/x86_64处理器。客户端库(例如驱动)可以在大端或小端格式的系统中运行。
 
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。

Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可再次加载进行使用。Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。Redis支持数据的备份,即master-slave模式的数据备份。性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets数据类型操作。原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。丰富的特性– Redis还支持 publish/subscribe, 通知, key 过期等等特性。Redis将数据存储于内存中,或被配置为使用虚拟内存。

实现数据持久化的两种方式:
 
(1)使用快照的方式,将内存中的数据不断写入磁盘(性能高,但可能会引起一定程度数据丢失)
(2)使用类似mysql的方式,记录每次更新的日志
 
应用场景:
会话缓存(Session Cache) :最常用的一种使用Redis的情景是会话缓存(session cache)。用Redis缓存会话比其他存储(如Memcached)的优势在于:Redis提供持久化。
 
全页缓存(FPC):除基本的会话token之外,Redis还提供很简便的FPC平台。回到一致性问题,即使重启了Redis实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降。
 
队列:Reids在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消息队列平台来使用。
 
排行榜/计数器:Redis在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合(Sorted Set)也使得在执行这些操作的时候变的非常简单,Redis只是正好提供了这两种数据结构。
 
当然,这是假定根据用户的分数做递增的排序。如果想返回用户及用户的分数,需要这样执行:ZRANGE user_scores 0 10 WITHSCORES
 
发布/订阅 :是Redis的发布/订阅功能。发布/订阅的使用场景确实非常多。已在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用Redis的发布/订阅功能来建立聊天系统。


Redis官网地址:https://redis.io/


Redis 高可用架构
 
Redis方案一般分为主从,哨兵和集群。主从主要实现备份和读写分离,从库自动备份主库数据,主为写,从为读。主库一挂,则整个集群挂掉了。哨兵一般为一主两从,主库写,从库读,实现了读写分离。当主库挂掉后,通过选举投票将提升一个从库为主库,当挂掉的主库重新启动后提升为新的从库,但是无法保证数据分片。集群至少为六个节点,三主三从,主库负责读写,从库负责备份。当主库挂掉后可以保持高可用,会自动提升从库为主库,当挂掉的主库重新启动后,提升为新的从库并且同时将数据均匀分布在六个节点上(类似于mongodb的分片集群)。如果要实现集群的读写分离则需要设置从库为readonly,应用写数据的时候通过三个主库去写,读数据的时候去从库上读。应上所述,综合考虑,选型为cluster方案。下面主要介绍一下redis 集群的搭建和原理。
 
什么时候集群不可用?1、当master挂掉时,这个master没有slave节点时,该集群则进入fail状态。2、当集群超过半数以上master挂掉,则不论有没有slave节点,则该集群都会挂掉。


建议了解一下缓解高并发的 redis 集群方案
redis集群搭建:


redis依赖gcc make tcl

debian和ubuntu上:apt-get -y install gcc make tcl
redhat 和 cetnos上:yum -y install gcc make tcl
依赖装完后便可以从官网上下载安装包了,最新的版本为5.0.5,下载后放到服务器上。
建议了解一下缓解高并发的 redis 集群方案
解压后并重命名为redis目录。
建议了解一下缓解高并发的 redis 集群方案
创建集群配置文件,并分别将目录下的配置文件拷贝到目录中同时创建data目录。
建议了解一下缓解高并发的 redis 集群方案
官方建议配置:
建议了解一下缓解高并发的 redis 集群方案

protected-mode no
port 8000
cluster-enabled yes
cluster-config-file nodes-8000.conf
cluster-node-timeout 5000
pidfile /opt/redis/redis_8000.pid
logfile "8000.log"
dir /opt/redis/data
bind 192.168.43.43
daemonize no
tcp-backlog 511
timeout 0
tcp-keepalive 0
loglevel notice
databases 64
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
slave-serve-stale-data yes
slave-read-only yes
repl-disable-tcp-nodelay no
slave-priority 100
maxmemory 32G
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
notify-keyspace-events ""
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
hll-sparse-max-bytes 3000
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
aof-rewrite-incremental-fsync yes
分别将几个不同的目录中的配置文件配置如上,并修改端口。

进入到redis目录中,执行make进行编译:
建议了解一下缓解高并发的 redis 集群方案
编译后会在src目录中生成redis相关的文件,在redis目录下创建bin目录。将src中的文件移至bin目录下。
建议了解一下缓解高并发的 redis 集群方案

mv mkreleasehdr.sh  redis-benchmark  redis-check-aof  redis-check-rdb redis-cli  redis-server redis-trib.rb  -t /opt/redis/bin
一般安装都建议最小权限化,所以创建redis用户和用户组并赋权。
建议了解一下缓解高并发的 redis 集群方案
建议了解一下缓解高并发的 redis 集群方案

Redis建议关闭系统透明大页:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
设置redis的句柄数和进程数:/etc/security/limits.conf中加入如下参数:
建议了解一下缓解高并发的 redis 集群方案

redis soft nofile 65535
redis hard nofile 65535
reids soft noproc 65535
redis hard noproc 65535
设置redis 用户环境变量,家目录下的.bash_profile。之后进行source生效。
建议了解一下缓解高并发的 redis 集群方案
接下来切换到redis用户并分别启动redis。
建议了解一下缓解高并发的 redis 集群方案
查看redis进程,可以看到是cluster集群模式。
建议了解一下缓解高并发的 redis 集群方案

接下来创建集群:
./redis-cli --cluster create   192.168.43.43:8000 192.168.43.43:8001 192.168.43.43:8002 192.168.43.43:8003 192.168.43.43:8004 192.168.43.43:8005  --cluster-replicas 1
建议了解一下缓解高并发的 redis 集群方案
看到如上的两个ok信息则代表集群创建成功了。
打印集群node信息:cluster nodes
建议了解一下缓解高并发的 redis 集群方案
建议了解一下缓解高并发的 redis 集群方案
所以应用在写数据时建议在三个master上写,读数据时,建议去三个slave上去读。这样就可以达到读写分离了。但是由于灾难故障时,master和slave会进行角色切换,所以应用在读写时,去链接集群的任意一个节点即可。写入的数据被平均分块。




灾难故障模拟比如一个master挂掉了,我们先将8000的这个master kill 掉。


建议了解一下缓解高并发的 redis 集群方案
查看8000的日志:发生了故障转移。
建议了解一下缓解高并发的 redis 集群方案
建议了解一下缓解高并发的 redis 集群方案


综上所述,redis 集群自带主备和高可用功能,能够缓解高并发。更多的详细原理和相关命令, 建议去看官网。