(1)文中例子使用一台服务器搭建Redis集群,有条件的同学可以将Redis服务部署在不同的服务器上。
(2)文中例子为一主三从模式,即一个主服务,三个从服务。
(1)分别搭建四个Redis单机版服务(Redis单机版搭建请戳《Redis单机版安装》)
①分别在/usr下新建四个文件夹,用于存放四个Redis服务
②进入redis01,参考《Redis单机版安装》步骤搭建单机版服务
【下载】
【解压】
【编译】
编译之前需要安装gcc:yum install gcc-c++ -y
【编译结果】
(2)将编译好的redis-6.2.1整个目录复制到redis02、redis03、redis04目录下
(3)启动Redis服务
将redis01下的服务作为主服务,redis02、redis03、redis04下的服务作为从服务。
①因为我的集群是在同一台服务器上搭建的,所以服务的端口号不能相同,否则会导致因服务端口号冲突启动失败。如果Redis服务都在不同的服务器上,端口号可以不改,使用默认即可。
分别修改redis-6.2.1目录下的配置文件redis.conf中port配置改成6371、6372、7373、7374。(或启动服务的时候使用-p指定端口号,比如:./redis-server --port 6371)
②修改redis02、redis03、redis04目录下服务的配置文件redis.conf,配置replicaof。replicaof配置主服务器的IP与端口号。(此配置默认为注释掉的,使用时要去掉注释)
因为我的主从在同一台机器上,所以IP地址配置127.0.0.1,端口号为6371:
③分别启动redis01、redis02、redis03、redis04目录下的服务,启动时指定对应目录下的redis.conf配置。(例子中以非守护进程的方式启动)
启动从服务器的时候,会看到下面所示的日志:
当从服务连接上来的时候,主服务显示如下日志:
至此Redis集群的主从模式搭建完成。
(4)使用客户端连接
①客户端连接主服务
连接主服务,可以执行写操作,也可以执行读操作。
②客户端连接从服务
连接从服务,无法执行写操作,可以执行读操作,可以读到在主服务写的数据。
③从服务断开与主服务的主从关系
使用客户端连接从服务,执行:salveof no one,可以让当前从服务与主服务断开主从关系,恢复其为单机版,后续可以执行读操作。
④将服务设置成某主服务的从服务
可以通过slaveof ip port,将当前服务设置成指定服务的从服务。
⑤可以将自己设置成自己的从服务,即主服务是自己,从服务也是自己。
⑥可以互相设置对方为自己的主服务,即A服务的主服务是B,B服务的主服务是A。
连接redis01主服务,使用INFO命令查看信息:
连接redis02从服务,使用INFO命令查看信息:
主从模式的弊端是服务无法自动排除故障,当服务挂掉之后,需要我们手动排除故障,重启服务。
当主服务挂掉之后,无法对外提供服务。此时从服务会打印错误日志:
无法连接主服务,从服务仍然可以对外提供服务,但是仍然只能执行读操作,无法执行写操作。这样就会导致整个集群只能读,而无法写数据。
(1)引入Jedis依赖
redis.clients
jedis
2.8.0
(2)使用Jedis连接
public class Main2 {
public static void main(String[] args) {
// Redis服务所在服务器地址
String host = "192.168.187.128";
Jedis jedisMaster = new Jedis(host, 6371);
Jedis jedisSlave1 = new Jedis(host, 6372);
Jedis jedisSlave2 = new Jedis(host, 6373);
Jedis jedisSlave3 = new Jedis(host, 6374);
// 主服务写数据
jedisMaster.set("hello", "world_master11");
// 从服务读数据
String result = jedisSlave1.get("hello");
System.out.println("从Redis主从服务获取到值:"+result);
}
}
(3)如果服务之间没有主从关系,可通过代码设置主从关系
jedisSlave1.slaveof("192.168.187.128", 6371);
// 解除主从关系
jedisSlave1.slaveofNoOne();