下载linux的安装包,下载地址https://redis.io/download/
,6.2.4版本百度云下载地址https://pan.baidu.com/s/1K-L2vuNRrJXqPcwZkXLQCw?pwd=a9kb
,将安装包上传至服务器,解压缩tar -zxvf redis-6.2.4.tar.gz
得到源码包,进入解压文件目录cd redis-6.2.4/
,对源码包进行编译make
,编译完成后,可以看到src文件夹和redis.conf配置文件,如下所示
编译完成后,将redis安装到指定目录,输入命令make PREFIX=/home/ysgs/tools/redis install
,可以看到,在redis目录下创建了bin文件夹,将配置文件也拷贝到安装目录下cp redis.conf /home/ysgs/tools/redis/bin
上面图中,分别对应为redis-benchmark redis -->性能测试工具、redis-check-aof AOF -->文件修复工具、redis-check-rdb RDB -->文件修复工具、redis-cli -->redis命令行客户端、redis-sentinal -->redis集群管理工具、redis-server -->redis服务进程。
然后我们在redis.conf配置文件的基础上进行配置,如下所示
1、默认只允许本机链接,我们将其注释掉
2、redis3.0之后添加了保护模式,若不想使用密码,改为no
3、设置密码,找到requirepass配置,默认是注释掉的,配置上密码
4、将默认的daemonize改为yes,让redis以守护进程的方式启动
进入bin目录,./redis-server ./redis.conf
使用对应配置文件启动,上文中我们已经将redis设置为守护进程,因此这是后端启动方式,无论我们是否关闭ssh窗口,redis都会保持运行。然后我们启动命令行./redis-cli
,由于我们设置了密码,因此要先用密码登录,如下图,可以看到redis运行链接成功
同时,我们用可视化工具也链接成功
在上文的基础上,我们将redis.conf配置文件重命名为6379.conf作为主配置文件,同时,复制两份配置文件分别命名为6380.conf和6381.conf,并将其中的端口改为6380和6381
同时添加如下配置replicaof 你的主机ip 6379
,因为我们的主节点设置了密码,所以从节点添加masterauth 密码
,或者我们把主节点的密码去掉
先启动主节点./redis-server ./6379.conf
,再启动从节点./redis-server ./6380.conf;./redis-server ./6381.conf
,然后用redis-cli链接主节点查看./redis-cli -h 127.0.0.1 -p 6379
,info replication
我们看到,当前的角色是master,有两个从节点连接,分别是6380和6381,同理我们查看从节点的信息
上图,节点角色是从节点,主节点是6379,从节点只读,我们在主节点添加一条数据,然后从节点读取
至此,一主二从已经搭建完成。有了主从,就相当于主节点有了备份,一旦主节点宕机,我们可以选择一个从节点作为新的主节点使用,但是,这个操作还是要人工干预的,我们至少把其他从节点订阅的主节点改为我们选择的新的主节点,那么,有没有更好的方式呢?
上文提到,我们想要一个自动选择主节点的主从模式,它就是哨兵模式,我们搭建一下哨兵模式,看看它是如何运行的。
在主节点下新增配置文件sentine.conf,添加如下内容
#哨兵实例端口
port 26379
#守护进程,默认不作为守护进程运行
daemonize yes
#开启守护进程后,pid文件存储路径
pidfile /home/ysgs/tools/redis/sentinel/sentinel-6379.pid
# sentinel monitor ,告诉Sentinel监听指定主节点,并且只有在至少哨兵达成一致的情况下才会判断它 O_DOWN 状态
sentinel monitor mymaster 127.0.0.1 6379 1
#redis的密码
sentinel auth-pass mymaster root
#多长时间没响应视为宕机,默认30秒
sentinel down-after-milliseconds mymaster 30000
# 在故障转移期间,多少个副本节点进行数据同步
sentinel parallel-syncs mymaster 1
#所有slaves指向新的master所需的最大时间
sentinel failover-timeout mymaster 180000
然后启动这个哨兵./redis-sentinel ./sentinel.conf
我们手动将6379主节点停掉,然后观察6380和6381两个从节点的信息
可以看到,主节点已经停掉了
选出了新的master是6381,然后6380自动挂在了6381上,我们再把6379启动,看一下它的信息
这个节点的角色成为了从节点,但是却没连接到主节点,这是因为我们的每个节点都设置了连接密码,之前的两个从节点设置了主节点密码,而原先的主节点没有设置密码,因此,如果我们的集群的网络环境是安全的,可以考虑不设置密码,否则,我们每个密码最好设置成一样的,并都配置上主节点密码
,修改配置后,连接成功
上文我们只设置了一个哨兵,那么万一这个哨兵也宕机了怎么办呢?我们可以设置一个哨兵集群,让哨兵之间也互相监听,复制两份哨兵配置文件,修改端口和投票数量,然后重启服务
在上图中,哨兵会监听每个redis节点,并和哨兵集群同步节点信息(监听redis的节点不一定是同一个),假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行failover过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象成为主观下线。当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover操作。切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线。
org.springframework.boot
spring-boot-starter-data-redis
如果出现Unsatisfied dependency expressed through field ‘redisTemplate‘
这个报错,那么需要再添加如下依赖
org.apache.commons
commons-pool2
#redis哨兵模式
#redis的密码,没设置可去掉
spring.redis.password=root
#哨兵主节点名称
spring.redis.sentinel.master=mymaster
#哨兵节点
spring.redis.sentinel.nodes=192.168.136.128:26379,192.168.136.128:26380,192.168.136.128:26381
#哨兵密码
spring.redis.sentinel.password=root
#jedis连接池
spring.redis.jedis.pool.enabled=true
spring.redis.jedis.pool.max-active=8
spring.redis.jedis.pool.max-wait=-1
spring.redis.jedis.pool.max-idle=8
spring.redis.jedis.pool.min-idle=0
@Controller
public class Test {
@Autowired
StringRedisTemplate stringRedisTemplate;
@RequestMapping("/test")
@ResponseBody
public String redis(String text) {
stringRedisTemplate.opsForValue().set("test",text);
return stringRedisTemplate.opsForValue().get("test");
}
}