8. redis的主从复制和sentinal

一. redis主从复制(读写分离)

  1. redis的主从复制分为两类节点:1个master和多个slave,master进行读写操作,slav进行只读操作
  2. 启动步骤:

    主节点照常启动,slave节点启动后,进入redis-cli执行slaveof ip port来告知slave节点master的ip和端口
  3. 原理:
  1. 当一个从数据库启动时,会向主数据库发送sync命令,
  2. 主数据库接收到sync命令后会开始在后台保存快照(执行rdb操作),并将保存期间接收到的命令缓存起来
  3. 当快照完成后,redis会将快照文件和所有缓存的命令发送给从数据库。
  4. 从数据库收到后,会载入快照文件并执行收到的缓存的命令。

    注意:redis2.8之前的版本:当主从数据库同步的时候从数据库因为网络原因断开重连后会重新执行上述操作,不支持断点续传。

    redis2.8之后支持断点续传。

二. 主从复制注意事项

  1. master要激活持久化:

    slave是master的完整备份,因此如果master通过一个空数据集重启,slave也会被清掉。
  2. 若master设置了密码,slave节点要配置masterauth参数设置主数据库的密码,来实现免密码登录

三. redis的Sentinel

  1. Sentinel是独立于redis的一个监控系统,监控master-slave架构下的redis。

  2. 功能

    (1)监控(Monitoring): Redis Sentinel实时监控主服务器和从服务器运行状态。

    (2)提醒(Notification):当被监控的某个 Redis 服务器出现问题时, Redis Sentinel 可以向系统管理员发送通知, 也可以通过 API 向其他程序发送通知。

    比如说, 名为 +sdown 的频道就可以接收所有实例进入主观下线(SDOWN)状态的事件。

    (3)自动故障转移(Automatic failover): 当一个主服务器不能正常工作时,Redis Sentinel 可以将一个从服务器升级为主服务器, 并对其他从服务器进行配置,让它们使用新的主服务器。当应用程序连接Redis 服务器时, Redis Sentinel会告之新的主服务器地址和端口。

  3. 步骤

    (1)修改sentinel.conf文件

    sentinel monitor mymaster(主节点名称) 192.168.1.170(主节点ip) 6379(主节点端口) 2(2个sentinal认定主观下线后进行自动转移)

    (2)启动 : redis-sentinal sentinal.conf

  4. 命令

  1. INFO : sentinel的基本状态信息
  2. SENTINEL masters : 列出所有被监视的主服务器,以及这些主服务器的当前状态
  3. SENTINEL slaves : 列出给定主服务器的所有从服务器,以及这些从服务器的当前状态
  4. SENTINEL get-master-addr-by-name : 返回给定名字的主服务器的 IP 地址和端口号
  5. SENTINEL reset : 重置所有名字和给定模式 pattern 相匹配的主服务器。重置操作清除主服务器目前的所有状态, 包括正在执行中的故障转移, 并移除目前已经发现和关联的, 主服务器的所有从服务器和 Sentinel 。
  6. SENTINEL failover : 当主服务器失效时, 在不询问其他 Sentinel 意见的情况下, 强制开始一次自动故障迁移,但是它会给其他sentinel发送一个最新的配置,其他sentinel会根据这个配置进行更新

四. java操作sentinal

public class SentinelTest {

	@Test
public void test1() throws Exception { String masterName = "mymaster";
Set<String> sentinels = new HashSet<String>();
sentinels.add("192.168.1.172:26379"); // sentinal的主机
sentinels.add("192.168.1.173:26379"); JedisPoolConfig poolConfig = new JedisPoolConfig();
//最大空闲连接数
poolConfig.setMaxIdle(10);
//连接池中最大连接数
poolConfig.setMaxTotal(100);
//在获取链接的时候设置的超市时间
poolConfig.setMaxWaitMillis(1000);
//表示在向连接池中创建连接的时候会对链接进行测试,保证连接池中的链接都是可用的。
poolConfig.setTestOnBorrow(true);
JedisSentinelPool jedisSentinelPool = new JedisSentinelPool(masterName, sentinels, poolConfig);
HostAndPort currentHostMaster = jedisSentinelPool.getCurrentHostMaster();
System.out.println("当前主节点,ip:"+currentHostMaster.getHost());
Jedis jedis = jedisSentinelPool.getResource();
jedis.set("a", "1");
jedisSentinelPool.returnResourceObject(jedis);
}
}
上一篇:如何在dede栏目设置中添加自定义字段(dede二次开发-纯抄贴)


下一篇:Java入门到精通——基础篇之static关键字