Redis的一些事一些情
一、安装、配置
*** 这些官网都有说的啊,所以一定要学会看官网,但是也要记笔记,因为官网很简略,坑很多
*** 基于 redis-6.0.6
1)到官网下载最新stable版,或者直接:wget
2)解压
tar xzf redis-6.0.6.tar.gz -C ./redis-src/ ## 解压到指定目录
tar xzf redis-6.0.6.tar.gz ## 未验证
3)make -- 在解压后的目录里面进行编译
*** 如果报错提示缺少gcc(报错gcc: Command not found),则安装gcc : yum install -y gcc
*** 如果报错提示:Newer version of jemalloc required 则在make时加参数:make MALLOC=libc (实践中,我换了一个相对旧的redis版本:从5版换到了2版)
make distclean
*** redis-6.0.6 的安装 服务器默认的linux版本过低,需要升级gcc
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
yum -y install centos-release-scl yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils scl enable devtoolset-9 bash echo "source /opt/rh/devtoolset-9/enable" >> /etc/profile ##修改环境变量 gcc -v 参考文档:https://blog.csdn.net/u014539465/article/details/106650955?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param
4)安装redis(实际上是安装可执行文件,即是那个bin客户端服务器启动目录啦)
make install PREFIX=/usr/local/software/redis 指定目录安装(所以你就可以在/usr/local/redis 这个目录看到redis 的bin目录了)
make install 不指定目录安装(千万千万不要不要用这种,看不到bin目录的)
5) /etc/profile 设置全局变量(在哪里启动,很重要哦,好像慢慢理解了):
##set redis environment
export REDIS_HOME=/home/richmail/redis/redis-conf
export PATH=$PATH:$REDIS_HOME/bin
事后记得:source /etc/profile
6) 进入目录 utils : /home/richmail/redis/redis-6.0.8/utils
然后:./install_server.sh
一开始会提示你用哪个端口的:然后一路下去
例如:(当然后面的话就不是 6379 了)
[root@www utils]# ./install_server.sh
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
Welcome to the redis service installer This script will help you easily set up a running redis server Please select the redis port for this instance: [6379] Selecting default: 6379 Please select the redis config file name [/etc/redis/6379.conf] Selected default - /etc/redis/6379.conf Please select the redis log file name [/var/log/redis_6379.log] Selected default - /var/log/redis_6379.log Please select the data directory for this instance [/var/lib/redis/6379] Selected default - /var/lib/redis/6379 Please select the redis executable path [/usr/local/bin/redis-server] Selected config: Port : 6379 Config file : /etc/redis/6379.conf Log file : /var/log/redis_6379.log Data dir : /var/lib/redis/6379 Executable : /usr/local/bin/redis-server Cli Executable : /usr/local/bin/redis-cli Is this ok? Then press ENTER to go on or Ctrl-C to abort. Copied /tmp/6379.conf => /etc/init.d/redis_6379 Installing service... Successfully added to chkconfig! Successfully added to runlevels 345! Starting Redis server... Installation successful!
一个物理机中可以有多个redis实例(进程),通过port区分
可执行程序就在一份目录里,但是内存中有多个实例需要各自的配置文件,持久化目录等资源
6)启动关闭、查看服务进程:
service redis_6379 status/stop/start
ps -ef | grep redis
redis-cli shutdown ## 服务器安全关闭,没有密码
redis-cli -a yourPassword shutdown ## 服务器安全关闭,带密码
kill -9 pid ## 强制关闭,可能会造成Redis内存数据丢失。
redis-server /home/xiaofeng01/redis-4.0.11/redis.conf ## 启动服务器,一般都指定配置文件启动的啦
redis-cli -h 10.203.238.198 -p 8080 ## 启动客户端,指定ip端口号启动,h表示host,p表示ip
redis-cli -h 127.0.0.1 -a "1q2w3e" ## 带密码启动客户端
/home/xiaofeng01/redis-4.0.11/src/redis-sentinel sentinel.conf ## 启动哨兵模式服务
7)redis-conf配置:
* 通用配置:
daemonize yes ## 守护线程
protected-mode no ## 保护模式,一般关闭,以保持同信
bind:0.0.0.0 ## 0.0.0.0表示对外所有ip都开放
port:6380 ## 修改端口号,默认6379启动
requirepass yourPassword ## 设置密码验证
* 主从模式(redis6不是这个了,待修正)
slaveof masterip masterport
* 集群模式
cluster-enabled yes ## 开启集群 把注释#去掉
cluster-config-file nodes.conf ## 集群的配置 配置文件首次启动自动生成
cluster-node-timeout 5000 ## 请求超时 设置5秒够了
appendonly yes
bind 127.0.0.1 192.168.34.63 ## 这个东西,官网没有,实际验证是需要的,待深入理解
** sentinel.conf(待验证)
sentinel monitor mymaster 127.0.0.1 6379 1 ## 主节点名 主节点ip 主节点port 判断主服务器客观失效至少多少个哨兵(一般情况下主要改这个就可以了,其它很多时候都是默认配置)
sentinel down-after-milliseconds mymaster 10000 ## Sentinel 认为服务器已经断线所需的毫秒数
sentinel failover-timeout mymaster 60000 ## 当failover开始后,在此时间内仍然没有触发任何failover操作,当前sentinel 将会认为此次failover失败
sentinel parallel-syncs mymaster 1 ## 指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长。
9)集群
## 开启集群,各个配置好后,各个服务器开启后:
redis-cli --cluster create 192.168.34.63:6380 192.168.34.63:6381 192.168.34.63:6382 192.168.34.63:6383 192.168.34.63:6384 192.168.34.63:6385 --cluster-replicas 1
## 关闭集群,一个个关闭
redis-cli -p 7000 shutdown
## 查看集群
redis-cli -c -p 7000 开启客户端,测试集群是否正常,一定要-c才能同信
redis-cli -p 6380 cluster nodes[| grep master/slave] 查看集群信息
## 模拟宕机
redis-cli -p 7000 debug segfault
10)客户端模式下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
## 帮助 cluster help ## 查看集群状态信息 cluster info 查看集群节点信息: cluster nodes
11)脚本:
启动
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#!/bin/bash ## redis start echo "redis is starting......" cd /etc/redis for port in {6380..6385} do redis-server ./$port.conf done ## 首次启动才需要这句 #redis-cli --cluster create 192.168.34.63:6380 192.168.34.63:6381 192.168.34.63:6382 192.168.34.63:6383 192.168.34.63:6384 192.168.34.63:6385 --cluster-replicas 1 echo "redis started......"
关闭
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#!/bin/bash ** redis cluster stop echo "redis cluster is stopping......" for port in {6380..6385} do redis-cli -p $port shutdown done echo "redis cluster stopped......"
二、概念
1)持久化方式:RDB、AOF
3)分布式高可用经典架构环节分析
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
* 【客户端层】到【反向代理层】的高可用,是通过反向代理层的冗余来实现的。以nginx为例:有两台nginx,一台对线上提供服务,另一台冗余以保证高可用, 常见的实践是keepalived存活探测 * 【反向代理层】到【web应用】的高可用,是通过站点层的冗余来实现的。假设反向代理层是nginx,nginx.conf里能够配置多个web后端,并且nginx能够探测到多个后端的存活性。 * 自动故障转移:当web-server挂了的时候,nginx能够探测到,会自动的进行故障转移,将流量自动迁移到其他的web-server,整个过程由nginx自动完成,对调用方是透明的。 * 【服务层】到【缓存层】的高可用,是通过缓存数据的冗余来实现的。 redis天然支持主从同步,redis官方也有sentinel哨兵机制,来做redis的存活性检测。 * 【服务层】到【数据库层】的高可用,数据库层用“主从同步,读写分离”架构,所以数据库层的高可用,又分为“读库高可用”与“写库高可用”两类。 * 读库采用冗余的方式实现高可用,写库采用keepalived存活探测 binlog进行同步
4)Sentinel三大工作任务,以及主客观下线:SDOWN、ODOWN
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
** 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。 ** 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。 ** 自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。
5)sentinel 整合 springboot
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
引入yml配置文件: redis: sentinel: master: mymaster #主节点名字 nodes: 172.16.244.133:26379 pom文件: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
6)Redis 集群的数据分片:CRC16(key) % 16384(个哈希槽)
*** 通过这篇文章:三张图秒懂Redis集群设计原理 终于看懂了redis集群,感谢!!!
至少要记得记得,数据是要经过CRC16算法,然后分发到16385个哈希槽,这然后这16385个哈希槽平均分配到N个节点(如果是主从模式的话,就分配到N个主节点(就是读了嘛))
知道了节点之后,就要考虑在增加节点、减少节点的情况是这么处理的。注意注意注意:这个是面试的时候问过的哦
客户端命令:
REPLICAOF 127.0.0.1 6379
REPLICAOF no one
参考:
1)Redis学习笔记之五:redis高级应用(集群搭建、集群分区原理、集群操作)