脚本宝典收集整理的这篇文章主要介绍了三千字介绍Redis主从+哨兵+集群,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
1.RDB
每隔几分钟或者一段时间会将redis内存中的数据全量的写入到一个文件中去。
优点:
缺点:
2.AOF
会将每条写入指令都写入到linux os缓存中去,然后每秒钟会将linux os中的指令作为日志追加到AOF的文件里面。
当redis内存大小达到一定的量,会通过LRU(最近最少使用)淘汰机制淘汰掉数据,然后再重写一个新的AOF文件出来。这样也保证了AOF文件不会无限制的增大。
优点:
缺点:
3.混合持久化(Redis 4.0)
开启混合持久化
综合来说:
我们可以采用两种都用的的方案,RDB做冷备,为了保证数据不丢失,AOF做数据恢复的第一选择。
如何配置持久化?
找到/usr/local/package/redis-4.0.9/redis.conf
RDB的配置
//每隔60秒,如果有10000个key发生改变就持久化一次
save 60 10000
# redis默认关闭AOF机制,可以将no改成yes实现AOF持久化
appendonly no
# AOF文件
appenDFilename "appendonly.aof"
# AOF持久化同步频率,always表示每个RediS写命令都要同步fsync写入到磁盘中,但是这种方式会严重降低redis的速度;everysec表示每秒执行一次同步fsync,显示的将多个写命令同步到磁盘中;no表示让操作系统来决定应该何时进行同步fsync,linux系统往往可能30秒才会执行一次
# appendfsync always
appendfsync everysec
# appendfsync no
# 在日志进行BGREWRITEAOF时,如果设置为yes表示新写操作不进行同步fsync,只是暂存在缓冲区里,避免造成磁盘IO操作冲突,等重写完成后在写入。redis中默认为no
no-appendfsync-on-rewrite no
# 当前AOF文件大小是上次日志重写时的AOF文件大小两倍时,发生BGREWRITEAOF操作。
auto-aof-rewrite-percentage 100
#当前AOF文件执行BGREWRITEAOF命令的最小值,避免刚开始启动Reids时由于文件尺寸较小导致频繁的BGREWRITEAOF。
auto-aof-rewrite-min-size 64mb
# Redis再恢复时,忽略最后一条可能存在问题的指令(因为最后一条指令可能存在问题,比如写一半时突然断电了)
aof-load-truncated yes
#Redis4.0新增RDB-AOF混合持久化格式,在开启了这个功能之后,AOF重写产生的文件将同时包含RDB格式的内容和AOF格式的内容,其中RDB格式的内容用于记录已有的数据,而AOF格式的内存则用于记录最近发生了变化的数据,这样Redis就可以同时兼有RDB持久化和AOF持久化的优点(既能够快速地生成重写文件,也能够在出现问题时,快速地载入数据)。
aof-use-rdb-preamble no
AOF rewrite过程
注意:当使用shutdown命令关闭redis服务时,会自动备份一个快照 。 当RDB生成快照时,AOF不会rewrite。反之亦然。
redis如果遇到断电或机器故障问题时怎么办?
答:一般使用持久化加服务器文件(将文件备份到阿里云)备份的方案
LRU:(least recently used)最近最少使用
使用HashMap+双向链表
核心步骤:
redis里面没有使用双向链表的实现方式,而是使用了一个pool池.
常用策略:allkeys-lru
Redis使用的是近似LRU算法
Redis 3.0 开始, 增加了淘汰池进一步提升了近似 LRU 的效果:
1.主从特性
2.主从复制步骤
3.断点续传 从redis2.8开始,就支持主从复制的断点续传 master中存了backLOG,master和slave都会保存一个replica offset,还有一个master id。如果中途网络断了,slave会让master从上次的replica offset开始继续复制。
4.过期key处理 slave不会过期key,只会等master过期key之后或者根据,模LRU淘汰了key之后拟一个del命令发给slave
5.配置主从服务器
- daemonize yes //让redis以daemon进程运行
- dir /var/redis/6379
- slaveof CentOS01 6379
- slave 服务器的配置文件上配 masterauth 123456
- master服务器的配置文件上配 requirepass 123456
- 每个6379.conf里都要将bind 127.0.0.1改成bind 自己本机的ip
在redis_6379脚本中,最上面,加入两行注释
#chkconfig: 2345 90 10
#description: Redis is a persistent key-value database
然后执行 chkconfig redis_6379 on 8. 压测性能 ./redis-benchmark -c 50 -n 10000
复制原理图:
注意:主从架构建议必须开启master节点的持久化。
1.概念介绍
介绍:
2.故障转移
哨兵至少要3个实例
master宕机,s1和s2中只要有1个哨兵认为master宕机就可以还行切换,同时s1和s2中会选举出一个哨兵来执行故障转移
同时这个时候,需要majority,也就是大多数哨兵都是运行的,2个哨兵的majority就是2(2的majority=2,3的majority=2,5的majority=3,4的majority=2),2个哨兵都运行着,就可以允许执行故障转移
但是如果整个M1和S1运行的机器宕机了,那么哨兵只有1个了,此时就没有majority来允许执行故障转移,虽然另外一台机器还有一个R1,但是故障转移不会执行
3.解决异步复制和脑裂导致的数据丢失
min-slaves-to-write 1 min-slaves-max-lag 10 要求至少有1个slave,数据复制和同步的延迟不能超过10秒
4.sdown和odown转换机制 sdown:主观宕机,即一个哨兵觉得master宕机了 odown:客观宕机,即quorum数量的哨兵觉得master宕机了
5.哨兵集群的自动发现机制
哨兵互相之间的发现,是通过redis的pub/sub系统实现的,每个哨兵都会往__sentinel__:hello这个channel里发送一个消息,这时候所有其他哨兵都可以消费到这个消息,并感知到其他的哨兵的存在
每隔两秒钟,每个哨兵都会往自己监控的某个master+slaves对应的__sentinel__:hello channel里发送一个消息,内容是自己的host、ip和runid还有对这个master的监控配置
每个哨兵也会去监听自己监控的每个master+slaves对应的__sentinel__:hello channel,然后去感知到同样在监听这个master+slaves的其他哨兵的存在
每个哨兵还会跟其他哨兵交换对master的监控配置,互相进行监控配置的同步
6.选举算法
如果一个master被认为odown了,而且majority哨兵都允许了主备切换,那么某个哨兵就会执行主备切换操作,此时首先要选举一个slave来
会考虑slave的一些信息
(1)跟master断开连接的时长 (2)slave优先级 (3)复制offset (4)run id
7.部署哨兵
mkdir -p /var/sentinel/5000
mkdir /etc/sentinel
mkdir -p /var/log/sentinal/5000
mv /usr/local/package/redis-4.0.9/sentinel.conf /etc/sentinel/5000.conf
port 5000
bind 192.168.1.14
sentinel monitor mymaster 192.168.1.12 6379 2
dir /var/sentinel/5000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 60000
sentinel down-after-milliseconds mymaster 30000
sentinel auth-pass mymaster 123456
daemonize yes
logfile /var/log/sentinal/5000/sentinel.log
注意:sentinel monitor mymaster 192.168.1.12 6379 2 这行要放在使用Mymaster的那些其他配置之前
./redis-sentinel /etc/sentinel/5000.conf
1.概念介绍
2.部署选型 redis cluster VS replication + sentinel
当数据量少,主要承载的是高并发时,单机就足够了。一个master多个slave,在搭建一个sentinel集群来保证高可用性
redis cluster主要还是用来做海量数据的缓存。
3.分布式Hash算法
当需要把数据分到不同的几个机器存储时,就需要一个算法了。
缺点:如果有一台机器挂掉了,那么数据会对2取模,那么得到的机器号就错乱了,导致大量数据不能从正确的机器上去取
将3台机器放在一个圆环上,然后要缓存的数据经过计算也落在圆环的某一个点,然后顺时针去环上找离他最近的那个机器。
优点:当一台机器挂掉,不影响其他的机器上存的数据
缺点:具有热点问题,可能某一个机器会有大量数据,这就需要将每个机器都多设置几个虚拟节点,均匀分布在圆环上。
redis cluster有固定的16384个slot,对每个key计算CRC16值,然后对16384取模,获取对应的slot,每个master都有部分的slot。这样的话如果增加一个master,就将其他master上的slot分点给她就行了。
4.部署redis集群
mkdir -p /etc/redis-cluster
mkdir -p /var/log/redis
mkdir /var/redis/7001
mkdir /var/redis/7002
port 7001
cluster-enabled yes
cluster-config-file /etc/redis-cluster/node-7001.conf
cluster-node-timeout 15000
pidfile "/var/run/redis_7001.pid"
dir "/var/redis/7001"
logfile "/var/log/redis/7001.log"
vi /usr/local/share/gems/gems/redis-3.2.1/lib/redis/client.rb
password=123456
echo never > /Sys/kernel/mm/transparent_hugepage/enabled
cd /etc/init.d/
cp redis_6379 redis_7001
修改redis_7001配置
REDISPORT=7001
yum install -y ruby
下载一个redis-3.2.1.gem,然后执行
gem install redis
cp /usr/local/package/redis-4.0.9/src/redis-trib.rb /usr/local/bin
/usr/local/bin/redis-trib.rb create --replicas 1 192.168.1.12:7001 192.168.1.12:7002 192.168.1.13:7003 192.168.1.13:7004 192.168.1.14:7005 192.168.1.14:7006
./redis-trib.rb check 192.168.1.12 7001
以上是脚本宝典为你收集整理的三千字介绍Redis主从+哨兵+集群全部内容,希望文章能够帮你解决三千字介绍Redis主从+哨兵+集群所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。