当数据量变得庞大的时候,读写分离还是很有必要的。同时避免一个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
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是主节点 不要蒙了
连接后 输入命令 info 然后回车
查看Replication参数 如果打印出这些参数 则说明主从配置成功
role:是否主节点 master主节点 slave从节点
connected_slaves:从节点的个数
slave...从节点的ip 端口
三、java通过哨兵模式动态链接redis
3.1:需要spring-data-redis.jar
<!-- 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><!-- 主节点的名字 注意:主从的名字要一致 -->
</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进行操作的