Redis集群搭建-主从模式

(1)文中例子使用一台服务器搭建Redis集群,有条件的同学可以将Redis服务部署在不同的服务器上。

(2)文中例子为一主三从模式,即一个主服务,三个从服务。

一、搭建步骤:

(1)分别搭建四个Redis单机版服务(Redis单机版搭建请戳《Redis单机版安装》)

①分别在/usr下新建四个文件夹,用于存放四个Redis服务

②进入redis01,参考《Redis单机版安装》步骤搭建单机版服务

【下载】

Redis集群搭建-主从模式_第1张图片

【解压】

【编译】

编译之前需要安装gcc:yum install gcc-c++ -y

Redis集群搭建-主从模式_第2张图片

Redis集群搭建-主从模式_第3张图片

Redis集群搭建-主从模式_第4张图片

Redis集群搭建-主从模式_第5张图片

【编译结果】

Redis集群搭建-主从模式_第6张图片

(2)将编译好的redis-6.2.1整个目录复制到redis02、redis03、redis04目录下

Redis集群搭建-主从模式_第7张图片

(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与端口号。(此配置默认为注释掉的,使用时要去掉注释)

Redis集群搭建-主从模式_第8张图片

因为我的主从在同一台机器上,所以IP地址配置127.0.0.1,端口号为6371:

③分别启动redis01、redis02、redis03、redis04目录下的服务,启动时指定对应目录下的redis.conf配置。(例子中以非守护进程的方式启动)

Redis集群搭建-主从模式_第9张图片

启动从服务器的时候,会看到下面所示的日志:

Redis集群搭建-主从模式_第10张图片

当从服务连接上来的时候,主服务显示如下日志:

Redis集群搭建-主从模式_第11张图片

至此Redis集群的主从模式搭建完成。

(4)使用客户端连接

①客户端连接主服务

连接主服务,可以执行写操作,也可以执行读操作。

②客户端连接从服务

连接从服务,无法执行写操作,可以执行读操作,可以读到在主服务写的数据。

③从服务断开与主服务的主从关系

使用客户端连接从服务,执行:salveof no one,可以让当前从服务与主服务断开主从关系,恢复其为单机版,后续可以执行读操作。

Redis集群搭建-主从模式_第12张图片

④将服务设置成某主服务的从服务

可以通过slaveof ip port,将当前服务设置成指定服务的从服务。

Redis集群搭建-主从模式_第13张图片

⑤可以将自己设置成自己的从服务,即主服务是自己,从服务也是自己。

Redis集群搭建-主从模式_第14张图片

⑥可以互相设置对方为自己的主服务,即A服务的主服务是B,B服务的主服务是A。

连接redis01主服务,使用INFO命令查看信息:

连接redis02从服务,使用INFO命令查看信息:

二、弊端

主从模式的弊端是服务无法自动排除故障,当服务挂掉之后,需要我们手动排除故障,重启服务。

当主服务挂掉之后,无法对外提供服务。此时从服务会打印错误日志:

Redis集群搭建-主从模式_第15张图片

无法连接主服务,从服务仍然可以对外提供服务,但是仍然只能执行读操作,无法执行写操作。这样就会导致整个集群只能读,而无法写数据。

Redis集群搭建-主从模式_第16张图片

三、Java客户端Jedis连接

(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();

 

你可能感兴趣的:(博客,redis)