主从复制介绍
搭建主从复制的两种方式
命令行方式
要注意先把主redis服务的ip绑定放开,然后在从redis里面输入slave <ip> <port>
配置文件方式
在从redis.conf里面加上slaveof <ip> <port>
(在新版本主从复制配置文件的方式改为replicaof <ip> <port>
),还有slave-read-only yes
(默认)
检查主从复制是否配置成功
主从复制流程
- 主服务器会判断该从服务器是否是以前就跟过自己的,是则增量同步,否则全量同步。
主从复制的应用场景
主从复制的注意事项
- 第5点中,master无持久化,slave有持久化,master不要配置自动重启,否则master数据会丢失,在slave中也会获取不到(因为从服务器数据来自于主服务器)
- master挂掉以后,可以做主从切换,把slave设置为主服务器,原来的master改为从服务器
- 也可以将从服务器上的备份文件复制到主服务器上一份,重启主服务器。
redis读写分离
应用场景:当redis写操作量比较大,可以将读写分别转移到master和slave上,master复制写,slave负责读。需要依赖业务代码来实现。
代码实现
使用redis客户端操作工具的是spring-data-redis提供的Lettuce。
@Service
public class ReplicationExampleService {
@Autowired
private StringRedisTemplate template;
public void setByCache(String userId, String userInfo) {
template.opsForValue().set(userId, userInfo);
}
public String getByCache(String userId) {
return template.opsForValue().get(userId);
}
}
@Configuration
@Profile("replication-rw") // 主从 - 读写分离模式
class ReplicationRWRedisAppConfig {
@Bean
public LettuceConnectionFactory redisConnectionFactory() {
System.out.println("使用读写分离版本");
LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder()
.readFrom(ReadFrom.SLAVE_PREFERRED)
.build();
// 这里连主服务器
RedisStandaloneConfiguration serverConfig = new RedisStandaloneConfiguration("192.168.100.242", 6379);
return new LettuceConnectionFactory(serverConfig, clientConfig);
}
}
测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
@ActiveProfiles("replication-rw") // 激活主从集群-读写分离的配置
public class ReplicationRWTests {
@Autowired
ReplicationExampleService replicationExampleService;
@Test
public void setTest() {
replicationExampleService.setByCache("tony", "xxxx");
String result = replicationExampleService.getByCache("tony");
System.out.println("从缓存中读取到数据:" + result);
}
}
- 通过monitor可以看到数据从master写(右边),从slave读(左边)。至于从slave也看到set命令那是因为这是主从复制同步的脚本命令。