Redis 基于内存运行并支持持久化,采用key-value(键值对)的存储形式,是目前分布式架构中不可或缺的一环。
Redis服务器程序是单进程模型,也就是在一台服务器上可以同时启动多个Redis进程,Redis的实际处理速度则是完全依靠于主进程的执行效率。若在服务器上只运行一个Redis进程,当多个客户端同时访问时,服务器的处理能力是会有一定程度的下降
1.速度快
2.支持丰富数据类型 (list set hash string)
3.支持事务(原子性)
4.丰富的特性
RDB持久化是指在指定的时间间隔内将内存中当前进程中的数据生成快照保存到硬盘(因此也称作快照持久化),用二进制压缩存储,保存的文件后缀是rdb;当Redis重新启动时,可以读取快照文件恢复数据。
(1)手动触发
save命令和bgsave命令都可以生成RDB文件。
save命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在Redis服务器阻塞期间,服务器不能处理任何命令请求。
而bgsave命令会创建一个子进程,由子进程来负责创建RDB文件,父进程(即Redis主进程)则继续处理请求。
bgsave命令执行过程中,只有fork子进程时会阻塞服务器,而对于save命令,整个过程都会阻塞服务器,因此save已基本被废弃,线上环境要杜绝save的使用。
(2)自动触发
在自动触发RDB持久化时,Redis也会选择bgsave而不是save来进行持久化。
RDB持久化是将进程数据写入文件,而AOF持久化,则是将Redis执行的每次写、删除命令记录到单独的日志文件中,查询操作不会记录; 当Redis重启时再次执行AOF文件中的命令来恢复数据。
与RDB相比,AOF的实时性更好,因此已成为主流的持久化方案。
执行流程
由于需要记录Redis的每条写命令,因此AOF不需要触发,下面介绍AOF的执行流程。
AOF的执行流程包括:
●命令追加(append):将Redis的写命令追加到缓冲区aof_buf;
●文件写入(write)和文件同步(sync):根据不同的同步策略将aof_buf中的内容同步到硬盘;
●文件重写(rewrite):定期重写AOF文件,达到压缩的目的。
slave服务器向master服务器发送请求连接命令
master节点进行rdb持久化,同时aof将新的修改命令缓存到数据文件中
master给slave服务器发送数据文件,slave将数据保存到磁盘,加载到内存执行
注:slave节点故障后,只需要重新连接即可
数据冗余:实现数据热备份、提供数据冗余功能
故障切换:主节点故障,从节点变为主节点提供服务(缺点需要手动切换,哨兵/集群可解决该缺点)
哨兵模式:实现故障自动切换
集群高可用:实现读写分离,分摊服务器压力,且故障自动切换
systemctl stop firewalld.service
setenforce 0
yum install gcc gcc-c++ make -y
tar zxvf redis-5.0.7.tar.gz
cd redis-5.0.7/
make -j 2 && make PREFIX=/usr/local/redis install
cd utils/
./install_server.sh
四次回车后。输入:/usr/local/redis/bin/redis-server回车
ln -s /usr/local/redis/bin/* /usr/local/bin/
vim /etc/redis/6379.conf
70行:bind 192.168.110.10
137行:daemonize yes
172行:logfile /var/log/redis_6379.log
264行:dir /var/lib/redis/6379
700行:appendonly yes
/etc/init.d/redis_6379 restart
systemctl stop firewalld.service
setenforce 0
yum install gcc gcc-c++ make -y
tar zxvf redis-5.0.7.tar.gz
cd redis-5.0.7/
make -j 2 && make PREFIX=/usr/local/redis install
cd utils/
./install_server.sh
四次回车后。输入:/usr/local/redis/bin/redis-server回车
ln -s /usr/local/redis/bin/* /usr/local/bin/
vim /etc/redis/6379.conf
70行:bind 192.168.13.10
137行:daemonize yes
172行:logfile /var/log/redis_6379.log
264行:dir /var/lib/redis/6379
700行:appendonly yes
287行:replicaof 192.168.13.10 6379
/etc/init.d/redis_6379 restart
#另外一台从服务器重复此操作即可
哨兵节点:端口号:26379;作用:监控、故障转移、通知用户故障转移
数据节点:端口号:6379;为客户端提供服务
优势:主故障时会自动进行故障切换
劣势:①写操作无法进行负载均衡;②存储能力受单机性能影响;③从节点故障无法自动故障切换
哨兵节点定期监控主/从/其他哨兵节点(每秒发送心跳ping命令向其他主/从/哨兵进行心跳检查)
根据心跳命令的返回码进行主观判断(宕机:主观下线),超过指定数量或者半数认为主服务器主观下线时,则判定主节点为客观下线
哨兵节点通过raft算法,选出一个leader哨兵,用于负责故障转移
缺陷:从/哨兵节点故障,无法自动进行故障切换
首先过滤掉不健康的从节点
选择配置文件中,故障转移优先级高的从节点
其次选择数据复制最全的从节点
判定条件:优先级、数据完整性
vim /opt/redis-5.0.7/sentinel.conf
17行:protected-mode no
21行:port 26379
26行:daemonize yes
31行:pidfile /var/run/redis-sentinel.pid
36行:logfile "/var/log/sentinel.log"
65行:dir "/var/lib/redis/6379"
84行:sentinel monitor mymaster 192.168.110.10 6379 2
113行:sentinel down-after-milliseconds mymaster 30000
146行:sentinel failover-timeout mymaster 180000
scp sentinel.conf 192.168.110.20:`pwd`
scp sentinel.conf 192.168.110.30:`pwd`
cd /opt/redis-5.0.7
redis-sentinel sentinel.conf &
#在另外两台从服务器启动哨兵服务,完成哨兵模式
redis-cli -p 26379 info sentinel
#查看哨兵模式是否搭建成功,如下为成功
master0:name=mymaster,status=ok,address=192.168.110.10:6379,slaves=2,sentinels=3
核心功能:将数据进行分片存储
其余功能:突破redis单机内存限制,故障自动切换,横向扩展服务器能力
引用哈希槽概念,每组节点负责一部分哈希槽
对每组数据的key键通过crc16算法得出一个数字,决定对应的哈希槽
哈希槽总数:16384
systemctl stop firewalld.service
setenforce 0
yum install gcc gcc-c++ make -y
tar zxvf redis-5.0.7.tar.gz
cd redis-5.0.7/
make -j 2 && make PREFIX=/usr/local/redis install
cd utils/
./install_server.sh
四次回车后。输入:/usr/local/redis/bin/redis-server回车
ln -s /usr/local/redis/bin/* /usr/local/bin/
/etc/init.d/redis_6379 restart
mkdir -p /etc/redis/redis-cluster/redis600{1..6}
for i in {1..6};do
cp /opt/redis-5.0.7/redis.conf /etc/redis/redis-cluster/redis600$i/
cp /opt/redis-5.0.7/src/redis-cli /opt/redis-5.0.7/src/redis-server /etc/redis/redis-cluster/redis600$i
done
vim /etc/redis/redis-cluster/redis6001/redis.conf
69行:#bind 127.0.0.1
88行:protected-mode no
92行:port 6001
832行:cluster-enabled yes
840行:cluster-config-file nodes-6001.conf
846行:cluster-node-timeout 15000
699行:appendonly yes
for i in {2..6};do
\cp -f /etc/redis/redis-cluster/redis6001/redis.conf /etc/redis/redis-cluster/redis600$i/
done
for i in {2..6};do
sed -i "92c port 600$i" /etc/redis/redis-cluster/redis600$i/redis.conf
sed -i "840c cluster-config-file nodes-600${i}.conf" /etc/redis/redis-cluster/redis600$i/redis.conf
done
for i in {1..6};do
cd /etc/redis/redis-cluster/redis600$i
./redis-server redis.conf
done
redis-cli --cluster create 127.0.0.1:6001 127.0.0.1:6002 127.0.0.1:6003 127.0.0.1:6004 127.0.0.1:6005 127.0.0.1:6006 --cluster-replicas 1
yes
#集群搭建完毕
主从复制+哨兵是一个方案,群集也是一个方案,但是群集需要的资源更多,在生产环境中视情况而定,都需要掌握,redis的持久化也是一个重点。