阿里云上搭建redis高可用集群
*文件下载
——redis压缩包: 链接: https://redis.io/download
——redis-3.0.0.gem: 链接:https://pan.baidu.com/s/1IiKDQGxP4XU7wDEKxNoVkw
提取码:ignv
为什么要搭建Redis集群?
Redis是在内存中保存数据的,而我们的电脑一般内存都不大,这也就意味着Redis不适合存储大数据,适合存储大数据的是Hadoop生态系统的Hbase或者是MogoDB。Redis更适合处理高并发,一台设备的存储能力是很有限的,但是多台设备协同合作,就可以让内存增大很多倍,这就需要用到集群。
Redis集群容错机制-投票
(1)选举过程是集群中所有master参与,如果半数以上master节点与故障节点通信超过(cluster-node-timeout),认为该节点故障,自动触发故障转移操作. 故障节点对应的从节点自动升级为主节点
(2)什么时候整个集群不可用(cluster_state:fail)?
如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完成时进入fail状态.
Redis-Cluster的搭建结构图
Redis-Cluster的搭建
1.首先在我们搭建Redis-Cluster时需要安装插件
yum install gcc-c++
yum install ruby
yum install rubygems
2.将redis源码包上传到 linux 系统 ,解压redis源码包
tar -zxvf redis
3.编译redis源码 ,进入redis源码文件夹
make
看到以下输出结果,表示编译成功
4.创建目录/usr/local/redis-cluster目录,安装6个redis实例
make install PREFIX=/usr/local/redis-cluster/redis1
/usr/local/redis-cluster/redis1
/usr/local/redis-cluster/redis2
/usr/local/redis-cluster/redis3
/usr/local/redis-cluster/redis4
/usr/local/redis-cluster/redis5
/usr/local/redis-cluster/redis6
注:如果提示下图说明没有进入redis的源码目录
成功则显示
5.复制配置文件 将 /redis/redis.conf 复制到每个redis下的bin目录下
cp -r redis.conf /usr/local/redis-cluster/redis n
6.修改每个redis节点的配置文件redis.conf
69行注释此IP
// 进行端口修改7001-7006
将88行的yes改为no
// 将第814行注释解开,并把yes
7.分别进入每个实例的bin目录下启动实例
./redis-server redis.conf
8.确保我们每个实例都启动起来
ps -ef | grep redis
成功后如图
9.上传redis-3.0.0.gem ,安装 ruby用于搭建redis集群的脚本,放在redis源码文件执行就行
gem install redis-3.0.0.gem
10.进入redis源码目录中的src目录
./redis-trib.rb create --replicas 1 虚拟机ip:7001 虚拟机ip:7002 虚拟机ip:7003 虚拟机ip:7004 虚拟机ip:7005 虚拟机ip:7006
成功如图
注:如果你的端口没有放开会出现两种情况,一种是ERROR,一种是join连接不上需要放开+1端口 //17001-17006
SpringDataRedis连接Redis集群
pom依赖
//引入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example.rediscluster</groupId>
<artifactId>redisclusterdemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>redisclusterdemo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
boot配置文件
spring:
redis:
cluster:
nodes: 公网IP:7001,公网IP:7002,公网IP:7003,公网IP:7004,公网IP:7005,公网IP:7006
max-redirects: 6
Test测试
// 测试
package com.example.rediscluster.redisclusterdemo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest
public class RedisTest {
@Autowired
private RedisTemplate redisTemplate;
@Test
public void test1(){
System.out.println(redisTemplate.hasKey("name"));
redisTemplate.opsForValue().set("name", "123214");
String name = (String) redisTemplate.opsForValue().get("name");
System.out.println(name);
redisTemplate.opsForValue().set("name2", "123214");
String name2 = (String) redisTemplate.opsForValue().get("name");
System.out.println(name2);
redisTemplate.opsForValue().set("name3", "123214");
String name3 = (String) redisTemplate.opsForValue().get("name");
System.out.println(name3);
redisTemplate.opsForValue().set("name4", "123214");
String name4 = (String) redisTemplate.opsForValue().get("name");
System.out.println(name4);
HashOperations<String, String, String> hashOperations = redisTemplate.opsForHash();
hashOperations.put("user", "test", "测试");
System.out.println(hashOperations.get("user", "test"));
}
}