精华内容
下载资源
问答
  • 其中含有redis安装包,主从+哨兵配置,部署和启停脚本,需修改后再使用,修改的地方用中文标注
  • 这是本人在工作中搭建集群的实践经验,当时遇到很多问题,困扰了我好久,最后查看了好多文章成功解决所有问题,主从集群,哨兵监听都成功。现在分享出来,我就以台服务器模拟搭建三台服务器的集群。请务必阅读每...
  • timeout mymaster 20000 #每轮的投票间隔是这个时间的2倍,这里设置的20秒,那么每轮投票间隔就是40秒 sentinel announce-ip "服务器外网ip" #云服务器需要设置这个,不然会导致识别错误的ip(内网ip) 、分别启动...

    最少需要2个哨兵才能正常切换,一般情况下当一个服务器宕机哨兵也少了一个,所以这里用3个哨兵,3个服务器之间要相互放开端口

    一、redis.conf 配置

    1.主机配置

    bind 0.0.0.0 #对外网开放
    protected-mode no #关闭安全模式
    

    一些基本配置 

    2.从机配置

    bind 0.0.0.0 #对外网开放
    protected-mode no #关闭安全模式
    slaveof	主机ip 主机redis端口(默认6379)   #声明它是谁的从服务器

    二、哨兵配置(主机从机配置一样)

    port 26379	     #默认端口
    daemonize yes	     #允许后台启动
    bind 0.0.0.0         #对从机开放端口		
    protected-mode no    #关闭保护模式(此配置很重要,不配置将无法实现主从切换)
    logfile "/usr/local/redis/sentinel.log"
    sentinel monitor mymaster 192.168.3.110(主机ip) 6379 2  #配置选举机制,哨兵时刻监控主服务器的6379端口,后面的“2”是当有2票认为它宕机以后就开始主从切换
    sentinel auth-pass mymaster		"123123"     #配置redis交互密码(redis无密码时不需要此配置)
    sentinel down-after-milliseconds mymaster 10000 #配置多少毫秒没回应就判断down
    sentinel failover-timeout mymaster 20000 #每一轮的投票间隔是这个时间的2倍,这里设置的20秒,那么每轮投票间隔就是40秒
    sentinel announce-ip "服务器外网ip" #云服务器需要设置这个,不然会导致识别错误的ip(内网ip)
    

    三、分别启动主机和从机上的哨兵

    /usr/local/redis/src/redis-sentinel /usr/local/redis/sentinel.conf

    四、测试哨兵

        public static void main(String[] args) {
    		Jedis jedis = getJedis();
    		jedis.set("test2", "value22");
    		System.out.println("主机成功设置test2:"+jedis.get("test2"));
    		jedis.close();
    		System.out.println("ps -ef|grep redis|grep -v grep|awk '{print $2}'|xargs kill -9");
    		System.out.println("强制关闭redis主机,关闭后请输入1");
    		Scanner sc=new Scanner(new InputStreamReader(System.in));
    		if(sc.hasNext()){
    			if(sc.next().equals("1")){
    				jedis = getJedis();
    				System.out.println("从机读取test2: " +jedis.get("test2"));
    				jedis.set("test3", "value33");
    				System.out.println("从机成功设置test3:"+jedis.get("test3"));
    				jedis.close();
    				
    				System.out.println("ps -ef|grep redis|grep -v grep|awk '{print $2}'|xargs kill -9");
    				System.out.println("启动主机redis,并强制关闭redis从机,关闭后请输入1");
    				sc=new Scanner(new InputStreamReader(System.in));
    				if(sc.hasNext()){
    					if(sc.next().equals("1")){
    						jedis = getJedis();
    						System.out.println("主机读取test3: " +jedis.get("test3"));
    					}
    				}
    			}
    		}
    		System.out.println("请重新启动从机");
    		System.out.println("测试完成!");
    	}

    测试输出如下:

    主机成功设置test2:value22
    强制关闭redis主机,关闭后请输入1
    1
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 0
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 1
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 2
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 3
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 4
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 5
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 6
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 7
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 8
    从机读取test2: value22
    从机成功设置test3:value33
    启动主机redis,并强制关闭redis从机,关闭后请输入1
    1
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 0
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 1
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 2
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 3
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 4
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 5
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 6
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 7
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 8
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 9
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 10
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 11
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 12
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 13
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 14
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 15
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 16
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 17
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 18
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 19
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 20
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 21
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 22
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 23
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 24
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 25
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 26
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 27
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 28
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 29
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 30
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 31
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 32
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 33
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 34
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 35
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 36
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 37
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 38
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 39
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 40
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 41
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 42
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 43
    获取jedis失败: Could not get a resource from the pool 休息1秒等待redis哨兵切换: 44
    主机读取test3: value33
    请重新启动从机
    测试完成!

    展开全文
  • redis一主从三哨兵加集群。
  • redis 一主一从三哨兵

    千次阅读 2019-04-07 23:17:04
    1.服务器规划(示例) 服务器: (要求redis主从能使用的内存容量一致,并且均... 192.168.127.8 redis-7003 节点 redis-sentinel-7013 redis哨兵1 192.168.127.7redis-7002 节点 redis-sentinel-7012 redi...

    1.服务器规划(示例)

      服务器: (要求redis主从能使用的内存容量一致,并且均配置maxmemory)

                 192.168.127.8  redis-7003 主节点  redis-sentinel-7013 redis哨兵1

                 192.168.127.7  redis-7002 主节点  redis-sentinel-7012 redis哨兵2

                 192.168.127.6  redis-sentinel-7011 redis哨兵3

      说明:当主节点下线后,三个哨兵并投票决定谁是leader,2个以上的哨兵认为主节点下线了(主观下线),leader会去做故障转移的工作

      问题:1.当进行了一次主从切换后,只有一个reids节点还在运行,如果需要再次切换主从,需要把原来宕机的redis节点启动起来

                 2.主从节点切换后,客户端需要切换请求的IP地址,jedis客户端无法实现IP地址的转换,使用原来的jedis客户端就无法正常访问,需要使用 sharded-jedis-sentinel-pool 

    2.在一台机器上安装redis

                

    3.复制redis安装后的文件夹到其它机器,并重命名为redis-${port}

     

    4.在各台机器上复制一个redis安装文件夹 , 并重命名为redis-sentinel-${port} 

     

    5.配置redis主节点

    port 7003

    dir "/usr/local/redis4/data"

    logfile "7003.log"

    daemonize yes

    pidfile "/var/run/redis_7003.pid"

    #关闭redis保护模式,保护模式关闭后,能访问到服务器的客户端都能够连接到此redis

    protected-mode no

    #主节点密码

    requirepass "2329257"

    #最大内存使用量

    maxmemory 1gb

     

    6.配置redis从节点

    port 7002

    dir "/usr/local/redis4/data"

    logfile "7002.log"

    daemonize yes

    pidfile "/var/run/redis_7002.pid"

     

    #关闭redis保护模式,保护模式关闭后,能访问到服务器的客户端都能够连接到此redis

    protected-mode no

    #从节点连接主节点的密码

    masterauth "2329257"

    #最大内存使用量

    maxmemory 1gb

     

    7.配置redis哨兵节点(有三个哨兵,配置仅仅是端口不同,这里只配置一个作为示例)

    port 7012

    dir "/usr/local/redis4-sentinel/data"

    logfile "7012.log"

    daemonize yes

    pidfile "/var/run/redis_7012.pid"

     

    #关闭redis保护模式,保护模式关闭后,能访问到服务器的客户端都能够连接到此redis

    protected-mode no

     

    sentinel deny-scripts-reconfig yes

    #配置主节点的IP和端口 并设置需要2个以上的哨兵认为主节点宕机才会切换主从

    sentinel monitor mymaster 192.168.127.8 7003 2

    #sentinel 定期通过ping访问主节点,如果超过150s未响应,就认为主节点宕机了

    sentinel down-after-milliseconds mymaster 150000

    #主节点的访问密码

    sentinel auth-pass mymaster 2329257

    #故障转移时最多可以有2从节点同时对新主节点进行数据同步

    sentinel config-epoch mymaster 2

    sentinel leader-epoch mymaster 2

    #故障转移时间,当决定故障转移后到转移完成的最大时间

    sentinel failover-timeout mymaster 180000

     

    8.启动redis主节点

    bin/redis-server conf/redis-7003.conf

    9.启动redis从节点

    bin/redis-server conf/redis-7002.conf

    10.启动redis哨兵节点

    bin/redis-sentinel conf/redis-7013.conf

    bin/redis-sentinel conf/redis-7012.conf

    bin/redis-sentinel conf/redis-7011.conf

    11.在主节点和从节点观察主从状态(当前主节点有一个从节点 192.128.127.7:7002)

        在主节点查看

    # Replication

    role:master

    connected_slaves:1

    slave0:ip=192.168.127.7,port=7002,state=online,offset=444947,lag=0

    master_replid:f526d934f5f315888731e918f97f0d14ad2724e2

    master_replid2:4c6db5630cb19eeebea9796fde82f80188bf1926

    master_repl_offset:445101

    second_repl_offset:25084

    repl_backlog_active:1

    repl_backlog_size:1048576

    repl_backlog_first_byte_offset:1

    repl_backlog_histlen:445101

     

      在从节点查看(当前从节点有一个主节点 192.128.127.8:7003)

    # Replication

    role:slave

    master_host:192.168.127.8

    master_port:7003

    master_link_status:up

    master_last_io_seconds_ago:1

    master_sync_in_progress:0

    slave_repl_offset:435231

    slave_priority:100

    slave_read_only:1

    connected_slaves:0

    master_replid:f526d934f5f315888731e918f97f0d14ad2724e2

    master_replid2:0000000000000000000000000000000000000000

    master_repl_offset:435231

    second_repl_offset:-1

    repl_backlog_active:1

    repl_backlog_size:1048576

    repl_backlog_first_byte_offset:429707

    repl_backlog_histlen:5525

    12.将主节点下线,观察自动故障转移的过程

       查看sentinel的日志会发现有一句日志,显示主从节点切换的情况

    +switch-master mymaster 192.168.127.8 7003 192.168.127.7 7002

       在从节点查询info replication,发现原来的从节点变成了主节点,没有从节点

    # Replication

    role:master

    connected_slaves:0

    master_replid:f526d934f5f315888731e918f97f0d14ad2724e2

    master_replid2:4c6db5630cb19eeebea9796fde82f80188bf1926

    master_repl_offset:399326

    second_repl_offset:25084

    repl_backlog_active:1

    repl_backlog_size:1048576

    repl_backlog_first_byte_offset:1

    repl_backlog_histlen:399326

    展开全文
  • 主要介绍了基于Docker搭建Redis一主从三哨兵的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 前言 Redis是我们目前在开发中最常用的种存储系统,在日常的...开发中常用的Redis集群有种模式:主从集群模式、哨兵集群模式、基于Hash环的集群模式,种模式各有特点,这里就不详细的讲他们的各自的特点了,今天

    前言

    Redis是我们目前在开发中最常用的一种存储系统,在日常的开发中,对于一些缓存数据,及时性要求比较高的数据经常会采用Redis来进行保存,高效快速的存取性能得到了广大开发者的一直认可。开发中为了防止Redis出现问题造成数据的丢失和服务的异常,我们通常会采用集群的模式来进行Redis的部署,保证在部分节点异常时不会影响整个服务,并且可以快速切换异常节点;开发中常用的Redis集群有三种模式:主从集群模式、哨兵集群模式、基于Hash环的集群模式,三种模式各有特点,这里就不详细的讲他们的各自的特点了,今天我们主要是在一台单机上面搭建一个有一主两从三哨兵的Redis集群,这个集群主要是用来进行搭建验证,在实际的生产中不同的节点一定会放在不同的机器上面来防止一台机器故障造成Redis的大规模的故障,话不多说,接下来我们就正式开始我们的集群的搭建

    准备环境

    系统环境:centos 7
    Redis版本:6.0.9
    下载工具:wget

    部署步骤

    下载并解压安装包,拷贝六份解压后的Redis备用

    #1、创建并进入今天的实验目录
    mkdir /home/redis
    
    cd /home/redis
    
    #2、在实验目录下载Redis 6、0.9 版本安装包
    wget https://download.redis.io/releases/redis-6.0.9.tar.gz
    
    #3、解压当前下载好的安装包
    tar xzf redis-6.0.9.tar.gz
    
    #4、进入redis-6.0.9的目录
    cd redis-6.0.9
    
    #5、 对redis进行构建,此处构建相信很多人会失败,我也同样失败,如果报错的很大的可能性是由于gcc的版本问题导致,文章末尾给出了解决方案
    make
    
    #6、创建6个不同的文件夹,分别命名为redis-master、redis-slave-1、redis-slave-2、redis-sentinel-1、redis-sentinel-2、redis-sentinel-3
    mkdir redis-master edis-slave-1 edis-slave-2 edis-sentinel-1 edis-sentinel-2 edis-sentinel-3
    
    #5、每个文件夹下拷贝一份刚才构建好的Redis文件备用
    cp -r redis-6.0.9/* /home/redis/redis-master/
    
    cp -r redis-6.0.9/* /home/redis/redis-slave-1
    
    cp -r redis-6.0.9/* /home/redis/redis-slave-2/
    
    cp -r redis-6.0.9/* /home/redis/redis-sentinel-1/
    
    cp -r redis-6.0.9/* /home/redis/redis-sentinel-2/
    
    cp -r redis-6.0.9/* /home/redis/redis-sentinel-3/
    
    
    

    开始启动主节点的服务

    #进入主节点的文件夹
    cd /home/redis/redis-master/
    
    
    #进入src文件夹
    cd src
    
    #启动主节点,主节点使用Redis默认配置,端口使用默认端口6379
    ./redis-server /home/redis/redis-master/redis.conf
    
    
    

    通过终端中输出的日志我们看一看到,我们当前的主节点已经启动完成,启动的端口为配置文件中默认的6379

    接下来开始启动两个从节点的服务

    启动第一个从节点
    #进入第一个从节点对应的文件夹
    cd /home/redis/redis-slave-1/
    
    #通过vi或vim工具打开当前文件夹下面的redis.conf文件:将默认的端口6379改成6380,在注释的命令:replicaof <masterip>:<masterport>下面新增一行配置: replicaof 127.0.0.1 6379,保存刚才的修改
    
    # 进入当前的src文件夹下并执行如下启动命令
    ./redis-server /home/redis/redis-slave-1/redis.conf
    
    

    通过终端中输出的日志我们看到,我们的第一个从节点已经启动完成,该从节点启动的端口是6380,该从节点连接了我们的主节点 127.0.0.1:6379并从主节点同步主节点的数据

    启动第二个从节点
    #进入第二个从节点对应的文件夹
    cd /home/redis/redis-slave-2/
    
    #通过vi或vim工具打开当前文件夹下面的redis.conf文件:将默认的端口6379改成6381,在注释的命令:replicaof <masterip>:<masterport>下面新增一行配置: replicaof 127.0.0.1 6379,保存刚才的修改
    
    # 进入当前的src文件夹下并执行如下启动命令
    ./redis-server /home/redis/redis-slave-1/redis.conf
    
    

    通过终端中输出的日志我们可以看到,我们的第二个从节点已经启动完成,该从节点启动的端口是6381,该从节点连接了我们的主节点 127.0.0.1:6379并从主节点同步主节点的数据

    接下来开始启动三个哨兵节点的服务

    启动第一个哨兵节点
    #进入第一个哨兵节点对应的文件夹
    cd /home/redis/redis-sentinel-1/
    
    #此处需要注意的是,现在要修改的不再是redis.conf这个配置文件,要修改的当前目录下的sentinel.conf这个配置文件。通过vi或vim工具打开当前文件夹下面的sentinel.conf文件:可以看到哨兵节点默认的端口使用的是26379,在配置文件中有这样一个配置: sentinel monitor mymaster 127.0.0.1 6379 2 ,表示哨兵节点默认监控的是 127.0.0.1 6379 主节点,所以我们这块刚好不需要修改,mymaster是我们给这个哨兵监控的主节点进行的命名,因为一个哨兵节点可以同时监控多个主节点,所以我们要通过不同的命名来区分不同的主节点,此处我们不需要修改,直接退出即可
    vim sentinel.conf
    
    #进入src目录
    cd src
    
    # 进入当前的src文件夹下并执行如下启动命令,有两种启动方式,先介绍第一种启动方式
    ./redis-sentinel /home/redis/redis-sentinel-1/sentinel.conf
    
    

    从启动日志可以看到,该哨兵节点启动的是26379端口,该哨兵节点当前监控的是名字为mymaster的主节点,ip为127.0.0.1,端口为6379,同时它的两个从节点也加入到了哨兵节点中

    启动第二个哨兵节点
    #进入第二个哨兵节点对应的文件夹
    cd /home/redis/redis-sentinel-2/
    
    #由于我们是在同一台服务器上面,所以我们这个需要将sentinel.conf里面的端口修改为26380,其它配置不变,防止端口冲突
    vim sentinel.conf
    
    #进入src文件夹
    cd src
    
    # 进入当前的src文件夹下并执行如下启动命令,这次我们采用第二种启动 方式如下
    ./redis-server /home/redis/redis-sentinel-2/sentinel.conf --sentinel
    
    

    从启动日志可以看到,该哨兵节点启动的是26380端口,该哨兵节点当前监控的是名字为mymaster的主节点,ip为127.0.0.1,端口为6379,同时它的两个从节点也加入到了哨兵节点中,同时它也察觉了第一个哨兵的存在

    启动第三个哨兵节点
    #进入第三个哨兵节点对应的文件夹
    cd /home/redis/redis-sentinel-3/
    
    #由于我们是在同一台服务器上面,所以我们这个需要将sentinel.conf里面的端口修改为26381,其它配置不变,防止端口冲突
    vim sentinel.conf
    
    #进入src目录
    cd src
    
    # 进入当前的src文件夹下并执行如下启动命令
    ./redis-sentinel /home/redis/redis-sentinel-3/sentinel.conf 
    
    

    从启动日志可以看到,该哨兵节点启动的是26381端口,该哨兵节点当前监控的是名字为mymaster的主节点,ip为127.0.0.1,端口为6379,同时它的两个从节点也加入到了哨兵节点中,同时它也察觉了第一个和第二个哨兵的存在,通过查看第一个哨兵的日志可以发现,第一个哨兵也监听到了另外的两个哨兵的存在

    部署总结

    到目前为止,我们的这个一主两从三哨兵的redis集群就正式搭建完成啦,接下来就到了我们来对整个集群的功能进行验证的环节啦

    功能验证

    首先我们看一下我们的第一个哨兵节点里面的相关信息是否正常

    #进入到第一个哨兵节点的文件夹下
    cd /home/redis/redis-sentinel-1/src
    
    #链接第一个哨兵服务
    ./redis-cli -h 127.0.0.1 -p 26379
    
    #在第一个哨兵节点中的client中通过info命令来查看集群的信息如下:master0:name=mymaster,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=3,整体状态正常
    info
    
    

    查看主节点的写入和查询是否正常

    #进入到主节点的文件夹下,其实在其他的节点的src文件夹下也都是可以的
    cd /home/redis/redis-master/src
    
    #通过client连接主节点服务
    ./redis-cli -h 127.0.0.1 -p 6379
    
    #通过最简单的set 和 get命令来查看主节点是否正常,通过执行可以看到完全正常
    set
    
    

    查看主节点对两个从节点的数据同步是否正常

    #进入到第一个从节点的文件夹下,其实在其他的节点的src文件夹下也都是可以的
    cd /home/redis/redis-slave-1/src
    
    #通过client连接主节点服务
    ./redis-cli -h 127.0.0.1 -p 6380
    
    #通过最简单的get刚才set进去的key,通过执行可以看到完全正常
    get
    
    

    总结

    到此为止,我们的这样的一个一主两从三哨兵的redis集群就部署完成啦,功能验证也一起都正常,当然,这个集群只是我们用来进行简单的了解redis的这两种集群模式的部署方式的一个小实验,在生成环境中,我们需要将主节点和从节点和哨兵节点放在不同的机器上,防止一台机器宕机造成很严重的影响,同时从节点也要放在不同的机器上面,不同机器之间的连接和通信也需要在配置文件中做一个很好的配置,防止无法进行正常的通信和监听,这一次的搭建就到这里,希望对搭建有所帮助

    异常解决方案

    redis源码构建异常情况与解决方案

    由于我们下载的是6.0.9的这个版本,是我写这篇文章的时候Redis官方的最新的文档版本,所以我在对源码进行构建的时候,出现了异常,截取部分异常信息如下:
    `
    In file included from server.c:30:0:
    server.h:1072:5: error: expected specifier-qualifier-list before ‘_Atomic’
    _Atomic unsigned int lruclock; /* Clock for LRU eviction */
    ^
    server.c: In function ‘serverLogRaw’:
    server.c:1031:31: error: ‘struct redisServer’ has no member named ‘logfile’
    int log_to_stdout = server.logfile[0] == ‘\0’;
    ^
    server.c:1034:23: error: ‘struct redisServer’ has no member named ‘verbosity’
    if (level < server.verbosity) return;
    ^
    server.c:1036:47: error: ‘struct redisServer’ has no member named ‘logfile’
    fp = log_to_stdout ? stdout : fopen(server.logfile,“a”);
    ^
    server.c:1049:47: error: ‘struct redisServer’ has no member named ‘timezone’
    nolocks_localtime(&tm,tv.tv_sec,server.timezone,server.daylight_active);
    ^
    server.c:1049:63: error: ‘struct redisServer’ has no member named ‘daylight_active’
    nolocks_localtime(&tm,tv.tv_sec,server.timezone,server.daylight_active);
    ^
    server.c:1052:19: error: ‘struct redisServer’ has no member named ‘sentinel_mode’
    if (server.sentinel_mode) {

    `
    通过查询发现该问题的原因是由于最新的Redis实现中C++11的语法,但是centos 7 中默认使用gcc 版本是4.8.5,无法编译C++11中语法,需要将gcc的版本升级到5.4以上即可正常编译,接下来我们通过yum安装的方式安装一个scl软件集,通过scl软件集来更新一下gcc的版本

    # 安装scl软件集
    yum -y install centos-release-scl
    
    # 安装gcc 9 这个班的gcc编译工具
    yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
    
    # 使用scl创建一个scl包的bash会话环境
    scl enable devtoolset-9 bash
    
    # 设置默认的工具集
    echo "source /opt/rh/devtoolset-9/enable" >> /etc/profile
    
    # 查看默认的gcc版本是否为新安装的版本
    gcc -v
    
    

    如果这个时候gcc的版本已经变成了我们刚才安装的9.x.x的版本的话,现在就可以在返回到redis的文件夹下进行顺利的构建啦!

    哨兵模式启动命令使用异常

    第一次启动哨兵节点的时候比较粗心,以为哨兵节点的启动只是配置文件不同,采用了和主从节点同样的启动命令来进行启动:./redis-server /home/redis/redis-sentinel-3/sentinel.conf ,然后出现了如下的异常:

    `
    *** FATAL CONFIG FILE ERROR (Redis 6.0.9) ***
    Reading the configuration file, at line 84

    ‘sentinel myid d9e05c7dba4298b8bfd4efd2db6d52aff2582c31’
    sentinel directive while not in sentinel mode

    `
    通过详细的查看启动命令,才发现是启动命令使用异常导致,启动哨兵节点正确的启动方式是这样的: ./redis-server /home/redis/redis-sentinel-3/sentinel.conf --sentinel 或者这样 ./redis-sentinel /home/redis/redis-sentinel-3/sentinel.conf; 使用正确的启动命令,哨兵节点非常顺利的启动啦!

    展开全文
  • redis 2.8 以后提供了 Redis Sentinel 哨兵机制,如果实例宕机,哨兵机升级为主机,实现高可用 模式类型 主从模式(redis2.8版本之前的模式)、哨兵sentinel模式(redis2.8及之后的模式)、redis ...

    redis 2.8 以后提供了 Redis Sentinel 哨兵机制,如果主实例宕机,哨兵将一台从机升级为主机,实现高可用。上一篇记录了redis哨兵集群搭建,这里验证高可用

    • 模式类型
      主从模式(redis2.8版本之前的模式)、哨兵sentinel模式(redis2.8及之后的模式)、redis cluster模式(redis3.0版本之后),我们这里说的是第二种 哨兵sentinel模式

    • 主从复制特点
      1、一个master可以有多个slave
      2、一个slave只能有一个master
      3、数据流向是单向的,master到slave

    • redis sentinel(哨兵)
      哨兵负责监控redis节点,当主实例宕机,则通过选举机制,把一个从节点升级为主节点,原来的主节点降级为从节点

    • 图解
      在这里插入图片描述

    • 故障转移
      我们先用info replication查看一下三个节点的状态
      在这里插入图片描述
      很明显看出6379是master主节点,6380、6381是slave从节点
      这时候我们关掉端口6379的主节点,再info replication看看,很明显6380的从节点升级为了主节点
      在这里插入图片描述
      我们再次启动6379的redis,原来6379的主节点降级为了slave的从节点
      在这里插入图片描述

    • 代码验证一下

    pom.xml

           <dependency>
    		  <groupId>redis.clients</groupId>
    		  <artifactId>jedis</artifactId>
    		  <version>2.9.0</version>
    		</dependency>
    
    public class JedisClusterClient {
        public static void main(String[] args) {
            Set<String> sentinels = new HashSet<>(Arrays.asList("192.168.33.76:26379","192.168.33.76:26380","192.168.33.76:26381"));
            GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
    
            JedisSentinelPool pool = new JedisSentinelPool("mymaster",sentinels,poolConfig);
            Jedis jedis = pool.getResource();
            jedis.set("test_msg","test_value");
            String test_value = jedis.get("test_msg");
            System.out.println("redis获取的值:"+test_value);
            jedis.close();
        }
    }
    

    run完main方法,看到已经写进redis的一个值了
    在这里插入图片描述
    然后我们在主节点和从节点都看到有这个key的值了
    在这里插入图片描述
    当6379的节点挂了之后我们再run一下,结果也是正常的,因为6380的从节点升级为主节点,redis哨兵模式实现了高可用

    展开全文
  • 文章目录基于Docker搭建Redis一主从三哨兵获取Redis镜像docker命令拉取镜像查看镜像获取并修改redis配置文件启动容器以交互模式进入容器redis-master创建日志文件目录,与配置文件相同启动redis服务器,如果没有...
  • redis一主从三哨兵

    2018-12-27 10:03:52
    服务器master配置 centos6.9 最小化安装 1.先安装以来环境和网络yum源 yum install -y epel-release yum install -y gcc gcc-c++ lrzsz make openssh-clients 2.tar fx redis-4.0.8.tar.gz -C /usr/s...
  • 我这边是Windows平台演示,Linux平台启动哨兵命令略有不同 配置redis.conf 创建conf文件夹,专门放置redis.conf文件 复制原来的redis.windows.conf,新增两个配置文件,个为redis.windows6380.conf,个为...
  • 我目前的问题就是多个项目使用同个单例redis,偶尔会redis发生宕机,导致项目或多或少出点问题,所以认真的研究了下,当然有人会说我的项目对于缓存的依赖性太高了,那么请考虑下在分析报表存在大量统计数据的话还...
  • redis一主从三哨兵: yum -y install gcc gcc-c++ tar -zxvf redis-5.0.5.tar.gz 3.cd redis make MALLOC=libc make make install 4.修改master redis.conf: daemonize yes port 6379 tcp-backlog 511 time...
  • 上一篇博客,介绍完了linux环境下安装redis和搭建了一主主从复制架构 这里我们来介绍如何搭建sentinel模式集群。 还是在主从复制架构基础上,启动多个哨兵完成架构。 在安装的redis文件夹下有默认的sentinel....
  • Redis搭建一主从三哨兵总结文档,常见问题,配置文件
  • 但是当redis宕机,服务无法主动切换为master接替master的工作 需要人工干预,手动切换服务 无法达到高可用; 所以一般主从架构都是搭配哨兵哨兵的作用就是监视master slave 的运行状态,当服务器宕机哨兵们...
  • 部署redis1主23哨兵请移步 jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis<...启动项目 一主 出现红.
  • 因为在搭建完成一主后,出现了一个问题,当master down了之后,sentinel会选举新的master,那么问题就出现了,新的mster地址与旧的master地址不一样。虽然redis自带的方法通过先请求sentinel获取masterIP+port,...
  • 下载redis-4.0.6.tar.gz(当前最新稳定版) ...安装目录:usr/local/redis 安装包下载目录:/opt/redis 安装命令如下 ...masterauth "123456" 防止主库挂掉切换库为主库,原主库再启动时连接不到现主库
  • 一定不要忘记填写 ,否则哨兵之间无法通信,默认使用了内网ip (当时找了天的问题,最后个翻译了一下) 其他的可以不用修改就可以用 redis-sentinel sentinel.conf 启动哨兵 三台依次启动 启动完成之后可以看...
  • Sentinel(哨岗、哨兵)是Redis的高可用性(high availability)解决方案:由个或多个Sentinel实例(instance)组成的Sentinel系统(system)可以监视任意多个服务器,以及这些服务器属下的所有服务器,并在...
  • Redis主从模式和哨兵模式(一主从三哨兵) 一、主从模式: 1、安装3台redis 192.168.130.1 主机 192.168.130.2 机 192.168.130.3 机 2、主从搭建: 进入redis安装目录下编辑redis.conf文件 主机配置: # ...
  • 一主从三哨兵模式: 1.新建文件夹6379、6380、6381、6382、26380、26381、26382 2.分别在6379、6380、6381、6382、26380、26381、26382文件夹下创建6379.conf、6380.conf、6381.conf、6382.conf、26380.conf、...
  • SpringBoot Redis 哨兵配置(一主从三哨兵 )配置 背景 Redis 哨兵模式作为Redis 的一种高可用方案,实现了主从复制、监控,故障转移等工作,在一定程度上保证了Redis的高可用,避免了因Redis服务宕机导致缓存服务不...
  • redis集群搭建,一主从三哨兵的简单搭建过程, 首先准备redis,版本都可以,下载地址:http://redis.io/download 这次所用到的区别在于3.0版本不支持 :protected-mode no。的属性配置,会报错,Invalid ...
  • Windows Redis x64 v3.2.100 单机一主(master)一(slave)二哨兵(entinel)
  • REDIS三主三从典型案例部署需求环境准备官网获取安装包规划路径编译安装步骤1、安装gcc2、解压redis包并编译安装3、配置环境变量其他207和208两台机器,安装redis跟上面206机器完全一样,重复执行上述步骤集群配置...
  • redis的一主从三哨兵(Windows)

    千次阅读 2018-12-29 10:18:17
    redis的一主从三哨兵(Windows) 一、一主配置 redis官网下载最新版,然后复制三份,slave redis与master redis是一样的,只是配置不一样而已。如下,为了更好区分,可以将文件夹的命名加上master和slave标识...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,680
精华内容 7,072
关键字:

一主一从三哨兵