1. 节点(服务器)数量说明

按照redis官方建议:salve和master的数量按照2n+1台服务器(1台master节点,2n台slave节点)
有兴趣的可以了解下redis的master选举机制
但是本文是1台master节点,1台slave节点做测试,测试结果也没问题
如果你要添加第2台salve节点的话,两台slave节点的配置几乎是一样的,我会在下文中提及不一样的地方

2. 本文测试redis主从要达到的目的

1. master节点上的redis服务down掉之后,slave节点升级为master节点
2. 当老的master节点上的redis服务起来后,视新master节点为master,自己降为slave节点
3. 如果你想让老的master还当master,你可以循环以上1、2两步,测过才知道

3. 主机列表

角色 IP
master 192.168.1.9
slave 192.168.1.10

4. 配置前提

假设你已经在master主机上配置好了redis服务(即单机版)

假设你已经在slave主机上配置好了redis服务(即单机版)

如果你还没有配置好单机版的redis服务,请点击这里,先把2个单机版的搞起来

再回来搞这个主从

5. 主从配置过程

配置主从时,把2台机器的redis服务先停掉

5.1 redis主配置文件需要改动的地方如下,其余保持默认即可

[root@master ~]# vim /etc/redis.conf
bind 192.168.1.9
daemonize yes
logfile "/var/log/redis.log"
masterauth "123456" # 其它redis视我为master时的验证密码
requirepass "123456" # 本机redis的登录密码
maxmemory 100mb

5.2 redis主的哨兵配置文件需要改动的地方如下,其余保持默认即可

[root@master ~]# cp /usr/local/redis-4.0.6/sentinel.conf /etc/sentinel.conf
[root@master ~]# vim /etc/sentinel.conf
bind 192.168.1.9
sentinel monitor mymaster 192.168.1.9 6379 2
sentinel auth-pass mymaster 123456
logfile "/var/log/sentinel.log"
daemonize yes

如果你在windows server上搭建主从,你需要手动创建sentinel.conf,除了添加一些内容,完整的配置内容如下:

bind 192.168.1.9
port 26379
dir "/tmp"
sentinel myid 6a23c773b7e139e2ebdd64e5c5fb6de3df3f7b77
sentinel monitor mymaster 192.168.1.9 6379 2
sentinel auth-pass mymaster 123456
sentinel config-epoch mymaster 5
sentinel leader-epoch mymaster 5
logfile "/var/log/sentinel.log"
daemonize yes

5.3 redis从配置文件需要改动的地方如下,其余保持默认即可

[root@slave ~]# vim /etc/redis.conf
bind 192.168.1.10
daemonize yes
logfile "/var/log/redis.log"
masterauth "123456" # 其它redis视我为master时的验证密码
requirepass "123456" # 本机redis的登录密码
maxmemory 100mb
slaveof 192.168.1.9 6379 # master的ip和redis端口

5.4 redis从的哨兵配置文件需要改动的地方如下,其余保持默认即可

[root@slave ~]# cp /usr/local/redis-4.0.6/sentinel.conf /etc/sentinel.conf
[root@slave ~]# vim /etc/sentinel.conf
bind 192.168.1.10
sentinel monitor mymaster 192.168.1.9 6379 2 # master的ip和redis端口
sentinel auth-pass mymaster 123456
logfile "/var/log/sentinel.log"
daemonize yes

如果你在windows server上搭建主从,你需要手动创建sentinel.conf,除了添加一些内容,完整的配置内容如下:

bind 192.168.1.10
port 26379
dir "/tmp"
sentinel myid 7f24d4d935d7e97c8267910535e0c1f0f26b8d6d
sentinel monitor mymaster 192.168.1.9 6379 2
sentinel auth-pass mymaster 123456
sentinel config-epoch mymaster 5
sentinel leader-epoch mymaster 5
logfile "/var/log/sentinel.log"
daemonize yes

6. 哨兵是什么?

1. 哨兵是redis用于主从或集群的不可缺少的故障切换机制。
2. 单台redis的话,程序连接的是redis服务的6379端口;主从或集群的话,程序不再直接连接redis服务了,
而要连接的是多个哨兵,哨兵会告诉程序端找哪个redis服务。

7. 在2台机器上都允许端口通过防火墙

在2台机器上允许对方访问对方的redis端口(6379)和哨兵端口(26379)

iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 6379 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 26379 -j ACCEPT
service iptables save

8. 在2台机器上起redis服务,并测试主从是否同步

8.1 起redis服务

[root@master ~]# redis-server /etc/redis.conf >> /var/log/redis-init.log 2>&1

8.2 测试主从是否可以同步数据

在master服务器终端上登录redis服务

[root@master ~]# redis-cli -h 192.168.1.9 -p 6379 -a 123456
192.168.1.9:6379> info replication # 查看主从状态
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.1.10,port=6379,state=online,offset=30290,lag=1
master_replid:426acab1b0c50873b516b7f0bf265c98c927a4f2
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:30290
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:30290
192.168.1.9:6379>
192.168.1.9:6379> quit
not connected>
[root@master ~]#

在slave服务器终端上登录redis服务

[root@slave ~]# redis-cli -h 192.168.1.10 -p 6379 -a 123456
192.168.1.10:6379> info replication # 查看主从状态
# Replication
role:slave
master_host:192.168.1.9
master_port:6379
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_repl_offset:350
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:37472d667df3859cd37371453be2d0197ffbb07b
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:350
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:350
192.168.1.10:6379>
192.168.1.10:6379>
192.168.1.10:6379>

在master服务器终端上登录redis服务,创建数据

192.168.1.9:6379> set name zhangsan
OK
192.168.1.9:6379> set age 20
OK
192.168.1.9:6379> get name
"zhangsan"
192.168.1.9:6379> get age
"20"

在slave服务器终端上登录redis服务,如果可以查询到数据,说明数据同步到从了

192.168.1.10:6379> get name
"zhangsan"
192.168.1.10:6379> get age
"20"

8.3 在2台机器上起哨兵服务,测试故障转移功能

[root@master ~]# redis-sentinel /etc/sentinel.conf
[root@slave ~]# redis-sentinel /etc/sentinel.conf

把master的redis服务停掉

192.168.1.9:6379> shutdown
not connected> quit
[root@master ~]#

等待5秒后,查看从上的redis服务是否升级为了master

192.168.1.10:6379> info replication
# Replication
role:master
connected_slaves:0
master_replid:33b4f309f906ecf6105b9822661236ad7689af27
master_replid2:426acab1b0c50873b516b7f0bf265c98c927a4f2
master_repl_offset:59193
second_repl_offset:53354
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:59193
192.168.1.10:6379> get name
"zhangsan"
192.168.1.10:6379> get age
"20"
192.168.1.10:6379> quit
[root@slave ~]#

把192.168.1.9上的redis服务起来,命令参照上文8.1

再查看192.168.1.10上的redis主从状态,5秒后,应该会有slave信息

192.168.1.10:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.1.9,port=6379,state=online,offset=112,lag=1
master_replid:431fb03e1644a50620dd150c2527ca5acaa5648b
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:112
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:112
192.168.1.10:6379>

注意1: master角色是非抢占模式

即:一旦集群中存在master,则其余节点视其为master,除非master挂掉

注意2: 从库是只读的

9. 查看redis日志和哨兵日志

在/etc/redis.conf和/etc/sentinel.conf里查找日志文件记录在哪个位置了,去看吧

10. 你可以再增加1台slave主机,来测试一下2n+1台的主从

Centos7上搭建redis主从的更多相关文章

  1. 在cnetos7上搭建mysql主从服务

    本文主要是介绍在centos上搭建mysql的主从服务器.如果没有搭建过的,可以查看我以前的博客,里面有详细的安装centos和在centos上安装mysql的说明. 一.安装从虚拟机: 1.右键—& ...

  2. docker搭建redis主从集群和sentinel哨兵集群,springboot客户端连接

    花了两天搭建redis主从集群和sentinel哨兵集群,讲一下springboot客户端连接测试情况 redis主从集群 从网上查看说是有两种方式:一种是指定配置文件,一种是不指定配置文件 引用地址 ...

  3. 一、全新安装搭建redis主从集群

    前言· 这里分为三篇文章来写我是如何重新搭建redis主从集群和哨兵集群的及原本服务器上有单redis如何通过升级脚本来实现redis集群.(redis结构:主-从(备)-从(备)) 至于为什么要搭建 ...

  4. 在 CentOS7 上部署 MySQL 主从

    在 CentOS7 上部署 MySQL 主从 通过 SecureCRT 连接至 MySQL 主服务器: 找到 my.cnf 文件所在的目录: mysql --help | grep my.cnf 一般 ...

  5. 在windows上搭建redis集群

    一 所需软件 Redis.Ruby语言运行环境.Redis的Ruby驱动redis-xxxx.gem.创建Redis集群的工具redis-trib.rb 二 安装配置redis redis下载地址   ...

  6. centos7上搭建开源系统jforum

    centos7上搭建好tomcat,mysql; 将 jforum-2.6.2.war放到tomcat目录的webapps下: 启动tomcat,./startup.sh ,查看webapp下jfor ...

  7. linux上搭建redis

    环境centos7及redis-4.0.2.tar.gz 第一步首先在/usr/local/mypackage下mkdir redis 通过工具上传redis安装包 解压安装包 tar -zxvf r ...

  8. Linux系统:Centos7环境搭建Redis单台和哨兵集群环境

    本文源码:GitHub·点这里 || GitEE·点这里 一.环境和版本 Linux:centos7 三台 三台Linux服务 192.168.72.129 192.168.72.130 192.16 ...

  9. linux系统centOS7下搭建redis集群中ruby版本过低问题的解决方法

    问题描述: 在Centos7中,通过yum安装ruby的版本是2.0.0,但是如果有些应用需要高版本的ruby环境,比如2.2,2.3,2.4... 那就有点麻烦了,譬如:我准备使用redis官方给的 ...

随机推荐

  1. postgresql 添加uuid扩展

    去年用EF Core做数据迁移到psql数据库的时候遇到了缺失uuid的错误,当时帅气的脸蛋突然懵逼了.现记录一下 以备参考. 环境:Centos7.2  psql  Xshell Xshell连接C ...

  2. MYSQL 主从复制,读写分离(8)

    Mysql 数据库的主从复制方案,是其自带的功能,并且主从复制并不是复制磁盘上的数据文件,而是通过binlog日志复制到需要同步的服务器上. 一 主从复制的原理实现 原理图解说: 数据库更改 生成数据 ...

  3. 使用BeanUtils类实现DTO之间的同名属性复制

    开发中经常碰到这样的场景,从数据库查询出来全部的字段,但是有些字段是不想给 客户端看到,这时就需要将属性从DAO复制到传给客户端的DTO对象,如果采用get/set, 那显得很麻烦.可使用反射实现. ...

  4. String、StringBuffer和StringBuilder类的区别

    Java提供了String.StringBuffer和StringBuilder类来封装字符串,并提供了一系列操作字符串对象的方法. 它们的相同点是都用来封装字符串:都实现了CharSequence接 ...

  5. Visual Studio高效实用的扩展工具、插件

    说明: 对一个有想法的程序员来说,善于使用一款高效的开发工具是很重要的,今天给大家介绍的是宇宙第一IDE vs用起来很不错的开发工具,假如大家觉得不错也可以尝试的用用,毕竟对于我们这些一天一大半的时间 ...

  6. [Nodejs] node实现静态文件服务器

    node 静态文件处理 一般后端进行静态文件处理都是使用 Apache nginx 等静态 web 服务器,但是既然使用 node 了,就用 node 实现以下静态服务器吧. 之前弄了不少充满艺术的数 ...

  7. SpringBoot学习笔记(一)入门

    1.重新认识Spring 假如临危受命需要开发一个简单的基于Spring的web程序,你该做什么?可能想到一些基本的需要: 项目结构,其中可选择使用Maven或Gradle构建.其中包含例如Sprin ...

  8. Openresty的同步输出与流式响应

    Openresty的同步输出与流式响应 默认情况下, ngx.say和ngx.print都是异步输出的,先来看一个例子: location /test { content_by_lua_block { ...

  9. JavaScript 是如何工作的:JavaScript 的共享传递和按值传递

    摘要: 原始数据类型和引用数据类型的副本作为参数传递给函数. 原文:JavaScript 是如何工作的:JavaScript 的共享传递和按值传递 作者:前端小智 Fundebug经授权转载,版权归原 ...

  10. html meta标签使用及属性介绍

    自学前端开始,我对meta标签接触不多,主要把精力都集中在能显示出来的标签上,比如span.button.h1等等.有时候去查看一些知名网站的源码,发现head标签里有一大摞的meta. 今天就来学习 ...