单机redis(可以跳过)

1.安装环境

yum -y install gcc-c++

2.获取压缩包

wget http://download.redis.io/releases/redis-5.0.6.tar.gz

3.解压

tar -zxvf redis-5.0.6.tar.gz

4.切换到对应的目录,然后编译

cd redis-5.0.6
make

自此,redis已经安装成功

5.启动redis,指定配置文件

./src/redis-server redis.conf

界面如下(我6379端口已经被占用,所以我修改为7000了)

redis主从模式搭建(一主二从三哨兵)_服务器

6.Ctrl+c

退出当前服务,由于不是以守护线程的方式去启动,所以需要Ctrl+c停止服务

7.修改redis.conf配置文件

daemonize no 修改为 daemonize yes ,以守护线程启动

修改密码为 requirepass root

8.再次启动redis,和上面命令一样

9.查看redis服务

ps -ef |grep redis

10.连接客户端

./src/redis-cli

进入指定端口redis

./src/redis-cli -p 7000

键入info,查看当前redis信息

键入shutdown 停止redis服务

单机redis就安装和调试完了。

redis 主从模式配置

主从模式: redis的主从模式,使用异步复制,slave节点异步从master节点复制数据,master节点提供读写服务,slave节点只提供读服务(这个是默认配置,可以通过修改配置文件 slave-read-only 控制)。master节点可以有多个从节点。配置一个slave节点只需要在redis.conf文件中指定 slaveof master-ip master-port 即可。

1.进入到redis目录

cd /home/tool/redis/redis-5.0.6

2.新建一个文件夹,存放redis的配置文件

mkdir config

3.在config下,新建三个配置文件,如下:

cd config

vi master-7000.conf

bind 0.0.0.0
port 7000
logfile "7000.log"
dbfilename "dump-7000.rdb"
daemonize yes
rdbcompression yes

vi slave-7001.conf

bind 0.0.0.0
port 7001
logfile "7001.log"
dbfilename "dump-7001.rdb"
daemonize yes
rdbcompression yes
slaveof 127.0.0.1 7000

vi slave-7002.conf

bind 0.0.0.0
port 7002
logfile "7002.log"
dbfilename "dump-7002.rdb"
daemonize yes
rdbcompression yes
slaveof 127.0.0.1 7000

master-7000.conf,为主节点配置文件,slave-7001.conf,slave-7002.conf为从节点配置文件,在从节点的配置文件中使用:slaveof 指定master节点

4.启动三台reids服务

./src/redis-server config/master-7000.conf
./src/redis-server config/slave-7001.conf
./src/redis-server config/slave-7002.conf

查看一下redis服务

ps -ef |grep redis
info replication

5.先分别连上三台Redis服务,获取key为name的值,通过-p 指定连接那个端口的redis服务

./src/redis-cli -p 7000
./src/redis-cli -p 7001
./src/redis-cli -p 7002

测试get name 都为nil(没有)

6.测试主从

给master节点set一个key为name的值,获取从节点name值,结果如下:

127.0.0.1:7000> set name master
OK


从节点

127.0.0.1:7001> get name
"master"
127.0.0.1:7002> get name
"master"
 

现在我们对从节点进行写入操作,结果如下:

redis主从模式搭建(一主二从三哨兵)_持久化_02

slave节点只提供读服务,不能进行写入操作

注意
使用主从模式时应注意matser节点的持久化操作,matser节点在未使用持久化的情况详情下如果宕机,并自动重新拉起服务,从服务器会出现丢失数据的情况。以下测试:

首先,禁止matser服务持久化

127.0.0.1:7000> CONFIG SET save ""
OK

在master节点set一个值

127.0.0.1:7000> set age 23
OK

slave节点可以get到age的值

127.0.0.1:7001> get age
"23"

关掉master节点服务

127.0.0.1:7000> shutdown
not connected> 

slave节点此时仍可以get到age的值

127.0.0.1:7001> get age
"23"

重启master服务,此时获取不到age的值

./src/redis-server config/master-7000.conf 
./src/redis-cli -p 7000
127.0.0.1:7000> get age
(nil)

slave节点此时在获取age的值为空,数据丢失

./src/redis-cli -p 7001
127.0.0.1:7001> get age
(nil)

数据丢失的原因:因为master服务挂了之后,重启服务后,slave节点会与master节点进行一次完整的重同步操作,所以由于master节点没有持久化,就导致slave节点上的数据也会丢失掉。所以在配置了Redis的主从模式的时候,应该打开主服务器的持久化功能。

到这,redis的主从模式就已经完成了

哨兵

sentinel是哨兵,用于监视主从服务器的运行状况,如果主服务器挂掉,会在从服务器中选举一个作为主服务器。

新建三个哨兵配置文件(分别监视上面一主二从)

sentinel-7000.conf

port 27000
daemonize yes
logfile "27000.log"
sentinel monitor mymaster 127.0.0.1 7000 2

sentinel-7001.conf

port 27001
daemonize yes
logfile "27001.log"
sentinel monitor mymaster 127.0.0.1 7000 2

sentinel-7002.conf

port 27002
daemonize yes
logfile "27002.log"
sentinel monitor mymaster 127.0.0.1 7000 2

然后分别启动

./src/redis-server config/sentinel-7000.conf --sentinel
./src/redis-server config/sentinel-7001.conf --sentinel
./src/redis-server config/sentinel-7002.conf --sentinel

启动之后配置会变成

port 27000
sentinel myid 7f4d877479793a2e16e34b541c1f01055d85276c
daemonize yes
logfile "27000.log"
# Generated by CONFIG REWRITE
dir "/home/tool/redis/redis-5.0.6"
protected-mode no
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 127.0.0.1 7000 2
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
sentinel known-replica mymaster 127.0.0.1 7002
sentinel known-replica mymaster 127.0.0.1 7001
sentinel known-sentinel mymaster 127.0.0.1 27002 de9744aa912c76c3c0db08c6dd371b545cdca83a
sentinel known-sentinel mymaster 127.0.0.1 27001 4b63d1decceb108fd968998c84db7dfa96e083d3
sentinel current-epoch 0

测试:

分别进入三台redis

./src/redis-cli -p 7000
./src/redis-cli -p 7001
./src/redis-cli -p 7002

查看对应的角色

info replication

7000:

redis主从模式搭建(一主二从三哨兵)_配置文件_03

7001:

redis主从模式搭建(一主二从三哨兵)_配置文件_04

7002:

redis主从模式搭建(一主二从三哨兵)_服务器_05

将master服务杀死

redis主从模式搭建(一主二从三哨兵)_服务器_06

接着查看redis7000:

redis主从模式搭建(一主二从三哨兵)_redis_07

7001:

redis主从模式搭建(一主二从三哨兵)_数据_08

7002:

redis主从模式搭建(一主二从三哨兵)_配置文件_09

发现7002已经变成主节点master了 

 

springboot集成

application.properties文件

// 主从配置
// name of Redis server  哨兵监听的Redis server的名称
spring.redis.sentinel.master=mymaster
// comma-separated list of host:port pairs  哨兵的配置列表
spring.redis.sentinel.nodes=127.0.0.1:27000,127.0.0.1:27001,127.0.0.1:27002

新增RedisSentinelConfiguration代码

    /**
     * redis哨兵配置
     * @return
     */
    @Bean
    public RedisSentinelConfiguration redisSentinelConfiguration(){
        RedisSentinelConfiguration configuration = new RedisSentinelConfiguration();
        String[] host = redisNodes.split(",");
        for(String redisHost : host){
            String[] item = redisHost.split(":");
            String ip = item[0];
            String port = item[1];
            configuration.addSentinel(new RedisNode(ip, Integer.parseInt(port)));
        }
        configuration.setMaster(master);
        return configuration;
    }
 
    /**
     * 连接redis的工厂类
     *
     * @return
     */
    @Bean
    public JedisConnectionFactory jedisConnectionFactory() {
    //构造方法中注入RedisSentinelConfiguration对象
        JedisConnectionFactory factory = new JedisConnectionFactory(redisSentinelConfiguration());
        factory.setHostName(host);
        factory.setPort(port);
        factory.setTimeout(timeout);
        factory.setPassword(password);
        factory.setDatabase(database);
        return factory;
    }

验证思路
* 写一个controller方法,用来往redis中新增数据
* 此时关闭redis主服务器,再次调用contoller方法、
* 如果接口依旧可以写入信息,说明配置成功。此时查看redis的其他从服务器,会发现有一个从服务器变成了主服务器。