当数据量变得庞大的时候,读写分离还是很有必要的。同时避免一个redis服务宕机,导致应用宕机的情况,我们启用sentinel(哨兵)服务,实现主从切换的功能。redis提供了一个master,多个slave的服务。

一、Master&Slave是什么?

         也就是我们所说的主从复制,主机数据更新后根据配置和策略,自动同步到备机

的master/slaver机制,Master以写为主,Slave以读为主。

二、它能干嘛?

       1、读写分离;

       2、容灾恢复

我们在用java连接redis要关闭linux的防火墙

1、关闭防火墙:service iptables stop

2、配置主节点redis.conf

#masterRedis端口(主节点)
port 6379
# 守护进程模式
daemonize yes
#关闭保护模式
protected-mode no
#不注释掉只能本机连接,注释掉后并且没有设置密码会启用保护模式
bind 192.168.0.123
#日志文件
logfile var/redis/logs/redis-6379.log
#以RDB格式持久化的文件名称
bfilename dump6379.rdb
#redis的密码
requirepass admin123
#Pid文件名字
pidfile var/redis/pids/redis-6379.pid
#从节点是否是只读节点
slave-read-only yes

3、#slaveRedis端口(从节点)

从节点的配置基本和主节点的配置一致,只不过从节点需要配置主节点的IP和密码,主节点和从节点的密码最好保持一致,在从节点的redis.config的配置文件中加入,

slaveof 192.168.0.123 6379(主节点的IP 端口)

masterauth admin123   (主节点的密码)

上面就是redis的主从配置,下面我们启动redis的服务,进行下验证

如果我们需要三台redis服务,只需要将redis.cofng复制三份,命名为:redis-6379.conf ,redis-7000.conf ,redis-7001.conf ,修改下文件中的端口和其它配置,在启动redis服务的时候指定下redis.conf 的文件路径,下面这两句命令就启动了三台redis

启动redis服务:./redis-server   ../redis/config-6379.conf 主

                         ./redis-server   ../redis/config-7000.conf 从

                        ./redis-server   ../redis/config-7001.conf 从

连接redis客户端:./redis-cli  -h 192.168.0.187 -a Ninestar123 -p 6379

          客户端参数说明:-h 连接redis的IP     -a   redis的密码     -p   redis的端口

 

至此我们已经启动里三台redis,(一主两从)连接主节点   我这里7000是主节点  不要晕了

redis 主从 主服务器配置了密码 redis配置主从节点_redis 主从 主服务器配置了密码

连接后  输入命令  info  然后回车

redis 主从 主服务器配置了密码 redis配置主从节点_IP_02

查看Replication参数  如果打印出这些参数   则说明主从配置成功

redis 主从 主服务器配置了密码 redis配置主从节点_redis_03


role:是否主节点   master主节点    slave从节点

connected_slaves:从节点的个数

slave0...从节点的ip   端口 

slave1...从节点的ip   端口 

 

三、搭建哨兵集群

     3.1、port    哨兵端口

redis 主从 主服务器配置了密码 redis配置主从节点_spring_04

    3.2、配置监听主redis   (mymaster只是给这个redis起个名字  可以自定义)1表示为一个哨兵认为这个主redis死了  则会从 从redis中重新选举个主redis

redis 主从 主服务器配置了密码 redis配置主从节点_redis_05

    3.3、配置主redis的密码 (mymaster 要和3.2中的名字保持一致)

redis 主从 主服务器配置了密码 redis配置主从节点_IP_06

    3.4、已守护进程启动,日志文件输入路径(注意:这两个参数在sentinel.config可能会没有,我们只需要手动加进去)

redis 主从 主服务器配置了密码 redis配置主从节点_redis 主从 主服务器配置了密码_07

遇到的问题:这个是搭建哨兵集群遇到的问题   并不是配置哨兵的步骤

redis 主从 主服务器配置了密码 redis配置主从节点_IP_08

四、java通过哨兵模式动态链接redis

4.1:需要spring-data-redis.jar

4.2:下面配置通过sentinel连接主redis(要看配置的注释

<!-- Jedis线程 -->
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxIdle" value="${redis.maxIdle}" />
        <property name="minIdle" value="${redis.minIdle}" />
        <property name="maxTotal" value="${redis.maxTotal}" />
        <property name="testOnBorrow" value="${redis.testOnBorrow}" />
    </bean>

<!--     哨兵 -->
    <bean id="sentinelConfig"
        class="org.springframework.data.redis.connection.RedisSentinelConfiguration">
        <property name="master">
            <bean class="org.springframework.data.redis.connection.RedisNode">
                <property name="name" value="mymaster"></property><!--    主节点的名字 同3.2的名字 注意:主从的名字要一致 -->
            </bean>
        </property>

<!--     哨兵的ip和端口 -->
        <property name="sentinels">
            <set>
                <bean class="org.springframework.data.redis.connection.RedisNode">
                    <constructor-arg name="host"
                        value="${redis.sentinel1.ip}"></constructor-arg>
                    <constructor-arg name="port"
                        value="${redis.sentinel1.port}"></constructor-arg>
                </bean>
                <bean class="org.springframework.data.redis.connection.RedisNode" >
                    <constructor-arg name="host"
                        value="${redis.sentinel2.ip}"></constructor-arg>
                    <constructor-arg name="port"
                        value="${redis.sentinel2.port}"></constructor-arg>
                </bean>
                <bean class="org.springframework.data.redis.connection.RedisNode" >
                    <constructor-arg name="host"
                        value="${redis.sentinel3.ip}"></constructor-arg>
                    <constructor-arg name="port"
                        value="${redis.sentinel3.port}"></constructor-arg>
                </bean>
            </set>
        </property>
    </bean>

 <bean id="jedisConnectionFactory"
        class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <constructor-arg ref="sentinelConfig" />
        <constructor-arg ref="jedisPoolConfig" />
        <property name="password" value="${redis.password}"></property><!--     redis的密码  主从要一致 -->
    </bean>

  <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="jedisConnectionFactory" />
         <property name="keySerializer" ref="stringRedisSerializer"></property>
    </bean>

<bean id="stringRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
        <property name="connectionFactory" ref="jedisConnectionFactory" />
    </bean>

我是通过redisTemplate对redis进行操作的

notify-keyspace-events(键空间通知)