1、单个redis服务搭建请参考:redis服务搭建

2、在/usr/local下创建目录redis-cluster,并在redis-cluster下创建 6379、6380、6381目录以及data、temp目录

# cd /usr/local
# mkdir redis-cluster
--其他文件创建类似,此处不一一写出

3、复制安装后的redis的配置文件(我的在/etc/目录下)的redis.conf 和 sentinel.conf文件到 6379、6380、6381目录中.

# cp /etc/redis.conf /usr/local/redis-cluster/
# cp /etc/redis-sentinel.conf /usr/local/redis-cluster/
--6380和6379类似,此处不一一写出

4、主从配置,修改 redis.conf文件

主redis 6379目录:

protected-mode yes
port
daemonize yes
pidfile /var/run/redis_6379.pid
logfile /var/log/redis/redis_6379.log
dir /usr/local/redis-cluster//data
slave-read-only yes
requirepass foo(设置访问登录密码)
#从服务设置了密码需要加上 
masterauth foo

从slave1 6380:

protected-mode yes
port
daemonize yes
pidfile /var/run/redis_6380.pid
logfile /var/log/redis/redis_6380.log
dir /usr/local/redis-cluster//data
slaveof 127.0.0.1
#若主服务设置了密码需要加上
masterauth foo
#从服务密码设置
requirepass foo

从slave2 6381:

protected-mode yes
port
daemonize yes
pidfile /var/run/redis_6381.pid
logfile /var/log/redis/redis_6381.log
dir /usr/local/redis-cluster//data
slaveof 127.0.0.1
#若主服务设置了密码需要加上,在设置哨兵时主从之间连接需要
masterauth foo
#从服务密码设置
requirepass foo

master既可以读,也可以写,而 从服务器是只可以读,不可写的.

5、哨兵配置.

主redis 6379 sentinel.conf

protected-mode no
port
dir "/usr/local/redis-cluster/6379/temp"
sentinel monitor redis1 127.0.0.1
sentinel down-after-milliseconds redis1
sentinel failover-timeout redis1

其中redis1可自定义

从slave1 6380 centinel.conf

protected-mode no
port
dir "/usr/local/redis-cluster/6380/temp"
sentinel monitor redis1 127.0.0.1 6379
sentinel down-after-milliseconds redis1
sentinel failover-timeout redis1

从slave2 7003 sentinel.conf

protected-mode no
port
dir "/home/redis/redis-cluster/6381/temp"
sentinel monitor redis1 127.0.0.1
sentinel down-after-milliseconds redis1
sentinel failover-timeout redis1

哨兵配置完成.

6、启动

启动redis
分别到6379、6380、6381的目录下执行启动命令:

redis-server ./redis.conf 

启动哨兵

redis-server ./sentinel.conf 

7、查看主从信息:

127.0.0.1:> info replication
# Replication
role:master
connected_slaves:
slave0:ip=127.0.0.1,port=,state=online,offset=,lag=
slave1:ip=127.0.0.1,port=,state=online,offset=,lag=
master_repl_offset:
repl_backlog_active:
repl_backlog_size:
repl_backlog_first_byte_offset:
repl_backlog_histlen:
127.0.0.1:> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:
master_link_status:up
master_last_io_seconds_ago:
master_sync_in_progress:
slave_repl_offset:
slave_priority:
slave_read_only:
connected_slaves:
master_repl_offset:
repl_backlog_active:
repl_backlog_size:
repl_backlog_first_byte_offset:
repl_backlog_histlen:
127.0.0.1:> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:
master_link_status:up
master_last_io_seconds_ago:
master_sync_in_progress:
slave_repl_offset:
slave_priority:
slave_read_only:
connected_slaves:
master_repl_offset:
repl_backlog_active:
repl_backlog_size:
repl_backlog_first_byte_offset:
repl_backlog_histlen:

8、验证

127.0.0.1:> set test
OK
127.0.0.1:> get test
""
127.0.0.1:> set hh
(error) READONLY You can't write against a read only slave.
127.0.0.1:> get test
""
127.0.0.1:> set xx
(error) READONLY You can't write against a read only slave.

此时,我们可以把主服务或者从服务停掉进行测试来看看效果

停掉主服务6379:

[root@VM_0_15_centos ]# ps -ef |grep redis
root : pts/ :: tailf -n /var/log/redis/sentinel.log
root : ? :: redis-sentinel *: [sentinel]
root : ? :: redis-sentinel *: [sentinel]
root : ? :: redis-sentinel *: [sentinel]
root : pts/ :: grep --color=auto redis
root : ? :: redis-server *:
root : ? :: redis-server *:
root : pts/ :: redis-cli -c -p -a foo
root : ? :: redis-server *:
root : pts/ :: redis-cli -c -p -a foo
[root@VM_0_15_centos ]# kill
sentinel日志:
:X  Dec ::44.834 # +sdown master mymaster 127.0.0.1
:X Dec ::44.852 # +sdown master mymaster 127.0.0.1
:X Dec ::44.861 # +sdown master mymaster 127.0.0.1
:X Dec ::44.920 # +odown master mymaster 127.0.0.1 #quorum /
:X Dec ::44.920 # +new-epoch
:X Dec ::44.920 # +try-failover master mymaster 127.0.0.1
:X Dec ::44.927 # +vote-for-leader 6d5a34396cd5912cbfe1134a70cd3e14338ebf24
:X Dec ::44.934 # +new-epoch
:X Dec ::44.934 # +new-epoch
:X Dec ::44.940 # +vote-for-leader 6d5a34396cd5912cbfe1134a70cd3e14338ebf24
:X Dec ::44.940 # +vote-for-leader 6d5a34396cd5912cbfe1134a70cd3e14338ebf24
:X Dec ::44.940 # 69c00be66f0461192b2db901ece6282e00b6462c voted for 6d5a34396cd5912cbfe1134a70cd3e14338ebf24
:X Dec ::44.940 # f51e8307952eba4264cc9089adf3c716e658609f voted for 6d5a34396cd5912cbfe1134a70cd3e14338ebf24
:X Dec ::44.942 # +odown master mymaster 127.0.0.1 #quorum /
:X Dec ::44.942 # Next failover delay: I will not start a failover before Tue Dec ::
:X Dec ::45.003 # +elected-leader master mymaster 127.0.0.1
:X Dec ::45.003 # +failover-state-select-slave master mymaster 127.0.0.1
:X Dec ::45.075 # +selected-slave slave 127.0.0.1: 127.0.0.1 @ mymaster 127.0.0.1
:X Dec ::45.075 * +failover-state-send-slaveof-noone slave 127.0.0.1: 127.0.0.1 @ mymaster 127.0.0.1
:X Dec ::45.166 * +failover-state-wait-promotion slave 127.0.0.1: 127.0.0.1 @ mymaster 127.0.0.1
:X Dec ::45.900 # +odown master mymaster 127.0.0.1 #quorum /
:X Dec ::45.900 # Next failover delay: I will not start a failover before Tue Dec ::
:X Dec ::45.960 # +promoted-slave slave 127.0.0.1: 127.0.0.1 @ mymaster 127.0.0.1
:X Dec ::45.960 # +failover-state-reconf-slaves master mymaster 127.0.0.1
:X Dec ::46.011 * +slave-reconf-sent slave 127.0.0.1: 127.0.0.1 @ mymaster 127.0.0.1
:X Dec ::46.012 # +config-update-from sentinel 6d5a34396cd5912cbfe1134a70cd3e14338ebf24 127.0.0.1 @ mymaster 127.0.0.1
:X Dec ::46.012 # +switch-master mymaster 127.0.0.1 127.0.0.1
:X Dec ::46.012 * +slave slave 127.0.0.1: 127.0.0.1 @ mymaster 127.0.0.1
:X Dec ::46.012 * +slave slave 127.0.0.1: 127.0.0.1 @ mymaster 127.0.0.1
:X Dec ::46.013 # +config-update-from sentinel 6d5a34396cd5912cbfe1134a70cd3e14338ebf24 127.0.0.1 @ mymaster 127.0.0.1
:X Dec ::46.013 # +switch-master mymaster 127.0.0.1 127.0.0.1
:X Dec ::46.013 * +slave slave 127.0.0.1: 127.0.0.1 @ mymaster 127.0.0.1
:X Dec ::46.013 * +slave slave 127.0.0.1: 127.0.0.1 @ mymaster 127.0.0.1
:X Dec ::47.002 * +slave-reconf-inprog slave 127.0.0.1: 127.0.0.1 @ mymaster 127.0.0.1
:X Dec ::47.002 * +slave-reconf-done slave 127.0.0.1: 127.0.0.1 @ mymaster 127.0.0.1
:X Dec ::47.067 # -odown master mymaster 127.0.0.1
:X Dec ::47.067 # +failover-end master mymaster 127.0.0.1
:X Dec ::47.067 # +switch-master mymaster 127.0.0.1 127.0.0.1
:X Dec ::47.067 * +slave slave 127.0.0.1: 127.0.0.1 @ mymaster 127.0.0.1
:X Dec ::47.067 * +slave slave 127.0.0.1: 127.0.0.1 @ mymaster 127.0.0.1
:X Dec ::16.015 # +sdown slave 127.0.0.1: 127.0.0.1 @ mymaster 127.0.0.1
:X Dec ::16.017 # +sdown slave 127.0.0.1: 127.0.0.1 @ mymaster 127.0.0.1
:X Dec ::17.154 # +sdown slave 127.0.0.1: 127.0.0.1 @ mymaster 127.0.0.1

查看replication:

127.0.0.1:> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:
master_link_status:up
master_last_io_seconds_ago:
master_sync_in_progress:
slave_repl_offset:
slave_priority:
slave_read_only:
connected_slaves:
master_repl_offset:
repl_backlog_active:
repl_backlog_size:
repl_backlog_first_byte_offset:
repl_backlog_histlen:
127.0.0.1:> info replication
# Replication
role:master
connected_slaves:
slave0:ip=127.0.0.1,port=,state=online,offset=,lag=
master_repl_offset:
repl_backlog_active:
repl_backlog_size:
repl_backlog_first_byte_offset:
repl_backlog_histlen:

此时从服务6381成为主服务

重启6379服务:

[root@VM_0_15_centos ]# redis-server ./redis.conf 

sentinel日志:

:X  Dec ::33.181 * +convert-to-slave slave 127.0.0.1: 127.0.0.1  @ mymaster 127.0.0.1 

查看replication:

127.0.0.1:> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:
master_link_status:up
master_last_io_seconds_ago:-
master_sync_in_progress:
slave_repl_offset:
master_link_down_since_seconds:
slave_priority:
slave_read_only:
connected_slaves:
master_repl_offset:
repl_backlog_active:
repl_backlog_size:
repl_backlog_first_byte_offset:
repl_backlog_histlen:

再次停掉从服务器6379可以测试从服务器宕机时的效果

9、java集成

引入依赖:

 <!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>

具体测试见:java集成测试参考

10、注意事项

  1. 只有Sentinel 集群中大多数服务器认定master主观下线时master才会被认定为客观下线,才可以进行故障迁移,也就是说,即使不管我们在sentinel monitor中设置的数是多少,就算是满足了该值,只要达不到大多数,就不会发生故障迁移。
  2. 官方建议sentinel至少部署三台,且分布在不同机器。这里主要考虑到sentinel的可用性,假如我们只部署了两台sentinel,且quorum设置为1,也可以实现自动故障迁移,但假如其中一台sentinel挂了,就永远不会触发自动故障迁移,因为永远达不到大多数sentinel认定master主观下线了。
  3. sentinel monitor配置中的master IP尽量不要写127.0.0.1或localhost,因为客户端,如jedis获取master是根据这个获取的,若这样配置,jedis获取的ip则是127.0.0.1,这样就可能导致程序连接不上master
  4. 当sentinel 启动后会自动的修改sentinel.conf文件,如已发现的master的slave信息,和集群中其它sentinel 的信息等,这样即使重启sentinel也能保持原来的状态。注意,当集群服务器调整时,如更换sentinel的机器,或者新配置一个sentinel,请不要直接复制原来运行过得sentinel配置文件,因为其里面自动生成了以上说的那些信息,应该复制一个新的配置文件或者把自动生成的信息给删掉。
  5. 当发生故障迁移的时候,master的变更记录与slave更换master的修改会自动同步到redis的配置文件,这样即使重启redis也能保持变更后的状态。

Redis 搭建一主二从三哨兵高可用集群的更多相关文章

  1. Docker Compose搭建Redis一主二从三哨兵高可用集群

    一.Docker Compose介绍 https://docs.docker.com/compose/ Docker官方的网站是这样介绍Docker Compose的: Compose是用于定义和运行 ...

  2. Redis安装、主从配置及两种高可用集群搭建

    Redis安装.主从配置及两种高可用集群搭建 一.            准备 Kali Linux虚拟机 三台:192.168.154.129.192.168.154.130.192.168.154 ...

  3. redis 的一主二从三哨兵模式

    概述 在部署redis 的时候,如果redis宕机,缓存将不可用,redis提供了哨兵模式保证redis实现高可用. 即一台主机两台从机,三台哨兵主机,如果主实例宕机,哨兵将将一台从机升级为主机.实现 ...

  4. Oracle的三种高可用集群方案

    浏览了一下Oracle官方的网页以及非官方的ppt,简单了解了一下Oracle提供的高可用方案. 主要有三种: 1. RAC RAC,  Real Application Clusters 多个Ora ...

  5. redis环境搭建及一主二从三哨兵模式配置

    一.单机redis环境搭建 1.安装: OS:linux redhat6.5 下载redis 官网下载链接:https://redis.io/download 把安装包上传到服务器,进行解压 [roo ...

  6. spark高可用集群搭建及运行测试

    文中的所有操作都是在之前的文章spark集群的搭建基础上建立的,重复操作已经简写: 之前的配置中使用了master01.slave01.slave02.slave03: 本篇文章还要添加master0 ...

  7. Hadoop入门学习笔记-第三天(Yarn高可用集群配置及计算案例)

    什么是mapreduce 首先让我们来重温一下 hadoop 的四大组件:HDFS:分布式存储系统MapReduce:分布式计算系统YARN: hadoop 的资源调度系统Common: 以上三大组件 ...

  8. SpringCloud(四):服务注册中心Eureka Eureka高可用集群搭建 Eureka自我保护机制

    第四章:服务注册中心 Eureka 4-1. Eureka 注册中心高可用集群概述在微服务架构的这种分布式系统中,我们要充分考虑各个微服务组件的高可用性 问题,不能有单点故障,由于注册中心 eurek ...

  9. springboot 集成Redis一主二从三哨兵

    1.Centos7 Redis一主二从三哨兵配置 Redis一主二从三哨兵环境搭建 2.接入过程 与集成redis单机不同的是jedis相关的配置做了修改,JedisPool换成了JedisSenti ...

随机推荐

  1. Mysql系列 - 第3天:管理员必备技能(必须掌握)

    这是mysql系列第3篇文章. 环境:mysql5.7.25,cmd命令中进行演示. 在玩mysql的过程中,经常遇到有很多朋友在云上面玩mysql的时候,说我创建了一个用户为什么不能登录?为什么没有 ...

  2. C#开发BIMFACE系列9 服务端API之获取应用支持的文件类型

    系列目录     [已更新最新开发文章,点击查看详细] BIMFACE最核心能力之一是工程文件格式转换.无需安装插件,支持数十种工程文件格式在云端转换,完整保留原始文件信息.开发者将告别原始文件解析烦 ...

  3. [SNOI2019]字符串

    名称:字符串 来源:2019年陕西省选 题目内容 传送门 洛谷(P5392) 题目描述 给出一个长度为$n$的由小写字母组成的字符串$a$,设其中第$i$个字符为$a_i(1≤i≤n)$. 设删掉第$ ...

  4. P2157 [SDOI2009]学校食堂 状压DP

    题意: 排队买饭,时间为前一个人和后一个人的异或和,每个人允许其后面B[i] 个人先买到饭,问最少的总用时. 思路: 用dp[i][j][k] 表示1-i-1已经买好饭了,第i个人后面买饭情况为j,最 ...

  5. gym/102021/K GCPC18 背包dp算不同数和的可能

    gym/102021/K 题意: 给定n(n<=60)个直线 ,长度<=1000; 可以转化为取 计算 ans = (sum  + 10 - g) / ( n + 1)  在小于5的条件下 ...

  6. CF - 1131 D Gourmet choice

    题目传送门 先把 = 的人用并查集合并在一起. 然后 < > 的建边, 跑一遍 toposort 之后就好了. 入度为0点的值肯定为1, 然后就是因为这个是按照时间线走过来的,所以一个点的 ...

  7. hdu 3709 Balanced Number(数位dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3709 题意:给定区间[a,b],求区间内平衡数的个数.所谓平衡数即有一位做平衡点,左右两边数字的力矩相 ...

  8. POJ2084 Game of Connections 卡特兰数 关于卡特兰数经典的几个问题

    Game of Connections Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 9128   Accepted: 44 ...

  9. 【Redis】缓存穿透与缓存雪崩

    一.缓存雪崩 1.1 缓存雪崩产生的原因 1.2 解决方案 1.3 锁的方式 1.4 消息中间件 1.5 一级和二级缓存 1.6 均摊分配redis key 失效时间 二.缓存穿透 一.缓存雪崩 1. ...

  10. 在Word指定位置插入富文本域值(html文本)

    遇到此问题,首先想到的就是各种百度.结果度娘了一会并没有发现有用的有效的解决方法,哎,看来还得靠自己啊. 首先整理了下手头上的资源,一是HtmlAgilityPack,专门解析Html文本用的:二是我 ...