注释:docker自行安装,主从使用一主两从,然后使用sentinel进行高可用配置,当主服务器挂掉,从服务器自动升为主服务器。

主从模式介绍

主从模式是三种模式中最简单的,在主从复制中,数据库分为两类:主数据库(master)和从数据库(slave)。

其中主从复制有如下特点:
* 主数据库可以进行读写操作,当读写操作导致数据变化时会自动将数据同步给从数据库
* 从数据库一般都是只读的,并且接收主数据库同步过来的数据
* 一个master可以拥有多个slave,但是一个slave只能对应一个master
* slave挂了不影响其他slave的读和master的读和写,重新启动后会将数据从master同步过来
* master挂了以后,不影响slave的读,但redis不再提供写服务,master重启后redis将重新对外提供写服务
* master挂了以后,不会在slave节点中重新选一个master

工作机制:

当slave启动后,主动向master发送SYNC命令。master接收到SYNC命令后在后台保存快照(RDB持久化)和缓存保存快照这段时间的命令,然后将保存的快照文件和缓存的命令发送给slave。slave接收到快照文件和命令后加载快照文件和缓存的执行命令。复制初始化后,master每次接收到的写命令都会同步发送给slave,保证主从数据一致性。

环境准备:拉取redis

[root@localhost ~]#docker pull redis
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 84c5f6e03bf0 11 days ago 104MB
[root@localhost ~]#

1、进行放置配置文件目录,不存在则创建【只要你开心,随意在哪个目录都可以】

2、下载redis.conf文件:

[root@localhost ~]# mkdir -p /home/lx/redis
[root@localhost ~]# cd /home/lx/redis/
[root@localhost redis]# pwd
/home/lx/redis
[root@localhost redis]# wget http://download.redis.io/redis-stable/redis.conf

3、查看是否下载成功

[root@localhost redis]# ls
redis.conf
[root@localhost redis]# 

4、复制3份redis.conf

[root@localhost redis]# cp redis.conf redis-6379.conf
[root@localhost redis]# cp redis.conf redis-6380.conf
[root@localhost redis]# cp redis.conf redis-6381.conf
[root@localhost redis]# ls
redis-6379.conf  redis-6380.conf  redis-6381.conf  redis.conf
[root@localhost redis]# 

5、配置这3个文件【redis-6379.conf为主服务器配置文件,redis-6380.conf , redis-6381.conf为从服务器配置文件】

1)修改配置文件redis-6379.conf如下参数,然后保存退出

#sudo vim redis-6379.conf

#允许远程连接
bind 0.0.0.0
#关闭保护模式
protected-mode no
#开启后,Redis会把每次写入的数据在接收后都写入 appendonly.aof 文件,每次启动时Redis都会先把这个文件的数据读入内存里
appendonly yes
#日志文件
logfile "/var/log/redis/redis-6379.log"

2)修改配置文件redis-6380.conf,修改如下,然后保存退出

#sudo vim redis-6380.conf

bind 0.0.0.0
protected-mode no
appendonly yes
replicaof 172.17.0.4 6379
logfile "/var/log/redis/redis-6380.log"

3)修改配置文件redis-6381.conf,修改如下,然后保存退出

#sudo vim redis-6381.conf

bind 0.0.0.0
protected-mode no
appendonly yes
replicaof 172.17.0.4 6379
logfile "/var/log/redis/redis-6381.log"

6、启动三个容器如下:

-d:后台运行容器,默认不进入容器
--name:容器别名
-p:指定映射的端口号
-v:绑定挂载目录

主服务器:redis-6379

[root@localhost redis]#docker run -d --name redis-6379 -p 6379:6379 -v /home/lx/redis/redis.conf:/usr/local/etc/redis/redis.conf redis redis-server /usr/local/etc/redis/redis.conf

第二个从服务器redis-6380

[root@localhost redis]#docker run -d --name redis-6380 -p 6380:6379 -v /home/lx/redis/redis-6380.conf:/usr/local/etc/redis/redis-6380.conf redis 

第三个从服务器redis-6381

[root@localhost redis]#docker run -d --name redis-6381 -p 6381:6379 -v /home/lx/redis/redis-6382.conf:/usr/local/etc/redis/redis-6382.conf redis

#docker ps

[root@localhost redis]#  docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
d3b0c49aac92        redis               "docker-entrypoint.s…"   42 minutes ago      Up 11 minutes       0.0.0.0:6381->6379/tcp   redis-6381
87611597b78b        redis               "docker-entrypoint.s…"   42 minutes ago      Up 13 minutes       0.0.0.0:6380->6379/tcp   redis-6380
c35bc9444bd8        redis               "docker-entrypoint.s…"   43 minutes ago      Up 16 minutes       0.0.0.0:6379->6379/tcp   redis-6379

7、测试3个容器是否安装成功,出现有名称为,redis-6379,redis-6380,redis-6381表示启动成功,启动不成功,排查路径及配置文件,是否配置正确

[root@localhost redis]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
d3b0c49aac92        redis               "docker-entrypoint.s…"   5 minutes ago       Up 5 minutes        0.0.0.0:6381->6379/tcp   redis-6381
87611597b78b        redis               "docker-entrypoint.s…"   6 minutes ago       Up 6 minutes        0.0.0.0:6380->6379/tcp   redis-6380
c35bc9444bd8        redis               "docker-entrypoint.s…"   6 minutes ago       Up 6 minutes        0.0.0.0:6379->6379/tcp   redis-6379

注意:此时这三台容器都是主服务器,例如进入redis-cli查看:

查看redis-6379
[root@localhost redis]# docker exec -it redis-6379 redis-cli
127.0.0.1:6379> info Replication
# Replication
role:master
connected_slaves:0
master_replid:0bf0414364343ee97efa450a9227a40f2951909f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:196
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:196
127.0.0.1:6379> 查看redis-6380
[root@localhost redis]# docker exec -it redis-6380 redis-cli
127.0.0.1:6379> info Replication
# Replication
role:master
connected_slaves:0
master_replid:6d2f3af0760f89c9f3bcc0d06b24b2b25b18647f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6379> 查看redis-6381
[root@localhost redis]#  docker exec -it redis-6381 redis-cli
127.0.0.1:6379> info Replication
# Replication
role:master
connected_slaves:0
master_replid:28a80c14928ca6ffdaaa94b38d30d5d0b3760c2a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6379> 

8、把【redis-6380,redis-6381配置成从服务器】

注释:配置从服务器,指向的是主服务器ip地址和端口号即可
[root@localhost redis]# docker exec -it redis-6380 redis-cli
127.0.0.1:6379> SLAVEOF 172.17.0.4 6379
OK
127.0.0.1:6379>
#如下info Replication查看配置是否成功
127.0.0.1:6379> info Replication
# Replication
role:slave
master_host:172.17.0.4
master_port:6379
master_link_status:up
... ...
127.0.0.1:6379> [root@localhost redis]#  docker exec -it redis-6381 redis-cli
127.0.0.1:6379> SLAVEOF 172.17.0.4 6379
OK
127.0.0.1:6379>#如下使用info Replication查看配置是否成功
127.0.0.1:6379> info Replication
# Replication
role:slave
master_host:172.17.0.4
master_port:6379
master_link_status:up
... ...
127.0.0.1:6379> 

9、测试主从是否成功,打开3个控制窗口,在主服务器设置键值,在从服务器获取键有值表示测试成功。

1)窗口1为redis-6379客户端
[root@localhost redis]# docker exec -it redis-6379 redis-cli
127.0.0.1:6379> set test 123
OK
127.0.0.1:6379> get test
"123"
127.0.0.1:6379> 

2)窗口2为redis-6380客户端

[root@localhost redis]# docker exec -it redis-6380 redis-cli
127.0.0.1:6379> get test
"123"
127.0.0.1:6379>

3)窗口3为redis-6380客户端

[root@localhost redis]# docker exec -it redis-6381 redis-cli
127.0.0.1:6379> get test
"123"
127.0.0.1:6379>

10、本次测试从服务器没有写的权限

解决方案:因为连接的是从节点,从节点只有读的权限,没有写的权限
进入redis.conf配置文件,修改配置文件的slave-read-only为no,没有则添加此条记录,保存退出,重启容器再进行测试【一定要重启,3台都重启】

sentinel 配置[redis哨兵]

sentinel中文含义为哨兵,顾名思义,它的作用就是监控redis集群的运行状况,特点如下:

* sentinel模式是建立在主从模式的基础上,如果只有一个Redis节点,sentinel就没有任何意义
* 当master挂了以后,sentinel会在slave中选择一个做为master,并修改它们的配置文件,其他slave的配置文件也会被修改,比如slaveof属性会指向新的master
* 当master重新启动后,它将不再是master而是做为slave接收新的master的同步数据
* sentinel因为也是一个进程有挂掉的可能所以sentinel也会启动多个形成一个sentinel集群
* 多sentinel配置的时候,sentinel之间也会自动监控
* 当主从模式配置密码时,sentinel也会同步将配置信息修改到配置文件中,不需要担心
* 一个sentinel或sentinel集群可以管理多个主从Redis,多个sentinel也可以监控同一个redis
* sentinel最好不要和Redis部署在同一台机器,不然Redis的服务器挂了以后,sentinel也挂了

工作机制:

*每个sentinel以每秒钟一次的频率向它所知的master,slave以及其他sentinel实例发送一个 PING 命令
* 如果一个实例距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被sentinel标记为主观下线。
* 如果一个master被标记为主观下线,则正在监视这个master的所有sentinel要以每秒一次的频率确认master的确进入了主观下线状态
* 当有足够数量的sentinel(大于等于配置文件指定的值)在指定的时间范围内确认master的确进入了主观下线状态, 则master会被标记为客观下线
* 在一般情况下, 每个sentinel会以每 10 秒一次的频率向它已知的所有master,slave发送 INFO 命令
* 当master被sentinel标记为客观下线时,sentinel向下线的master的所有slave发送 INFO 命令的频率会从 10 秒一次改为 1 秒一次
* 若没有足够数量的sentinel同意master已经下线,master的客观下线状态就会被移除;
*若master重新向sentinel的 PING 命令返回有效回复,master的主观下线状态就会被移除

redis哨兵模式说明

使用docker启动3个redis服务器,一个master(主), 两个slave (从),进行主从配置。
3台redis服务器分别启动一个哨兵sentinel。

第一步:【master容器配置哨兵】:docker exec -it  redis-6379 /bin/bash
#cd / (进入根目录)
#apt-get update (更新依赖)
#apt-get install -y vim (安装vim)
#vim sentinel.conf  (建立sentinel(哨兵模式)的配置文件,保存退出,内容如下:)
port 26379 (指定哨兵监听端口)
dir "/data"  #sentinel工作目录
logfile "26379.log"  #日志文件
sentinel monitor name 172.17.0.4 6379 2 #启动哨兵(名称:name) 监听master
daemonize yes #后台运行
#启动哨兵:
#redis-sentinel sentinel.conf第二步:【slave01容器配置哨兵:docker exec -it  redis-6380 /bin/bash】
#cd / (进入根目录)
#apt-get update (更新依赖)
#apt-get install -y vim (安装vim)
#vim sentinel.conf  (建立sentinel配置文件保存退出,内容如下)
port 26380
dir "/data"
logfile "26380.log"
sentinel monitor name 172.17.0.4 6379 2
daemonize yes 启动哨兵:
redis-sentinel sentinel.conf第三步:【slave02容器配置哨兵:docker exec -it  redis-6381 /bin/bash】
#cd / (进入根目录)
#apt-get update (更新依赖)
#apt-get install -y vim (安装vim)
#vim sentinel.conf  (建立sentinel的配置文件保存退出,内容如下)
port 26381
dir "/data"
logfile "26381.log"
sentinel monitor name 172.17.0.4 6379 2
daemonize yes  启动哨兵:
redis-sentinel sentinel.conf

测试:本来redis-6379是主服务器,redis-6380, redis-6381是从服务器,

1、进入到容器,查看哨兵允许状态,26381.log为哨兵日志文件,上面有说道,此为实时显示最后20条日志
#docker exec -it redis-6381 /bin/bash
#tail -f 20 26381.log
==> 26381.log <==
12:X 20 Sep 2020 13:57:47.439 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
12:X 20 Sep 2020 13:57:47.439 # Redis version=5.0.9, bits=64, commit=00000000, modified=0, pid=12, just started
12:X 20 Sep 2020 13:57:47.439 # Configuration loaded
13:X 20 Sep 2020 13:57:47.443 * Running mode=sentinel, port=26381.
... ...

1、现在把主服务器redis-6379容器停止,

查看redis-6379容器id

root@lixiong:/home/lx# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                NAMES
7f8fd1c59f55        redis               "docker-entrypoint.s…"   2 hours ago         Up 2 hours          6379/tcp, 0.0.0.0:26381->26379/tcp   sentinel3
ee5093e6f3a9        redis               "docker-entrypoint.s…"   2 hours ago         Up 2 hours          6379/tcp, 0.0.0.0:26380->26379/tcp   sentinel2
8ed84c9b5621        redis               "docker-entrypoint.s…"   2 hours ago         Up 2 hours          6379/tcp, 0.0.0.0:26379->26379/tcp   sentinel
d3b0c49aac92        redis               "docker-entrypoint.s…"   3 hours ago         Up 2 hours          0.0.0.0:6381->6379/tcp               redis-6381
87611597b78b        redis               "docker-entrypoint.s…"   3 hours ago         Up 2 hours          0.0.0.0:6380->6379/tcp               redis-6380
128117e48e01        nginx               "nginx -g 'daemon of…"   4 months ago        Up 4 months         0.0.0.0:8083->80/tcp#docker stop 87611597b78b
87611597b78b 

2、打开redis-6380客户端,:info replication查看,原先主服务器为redis-6379,此时从服务器会上升到主服务器[30秒后自动转换主服务器节点]

#docker exec -it redis-6380 redis-cli

127.0.0.1:6379>info replication

127.0.0.1:6379> info replication
# Replication
role:slave
master_host:172.17.0.6
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:32521
slave_priority:100

redis logfile 只读_docker 配置redis主从,哨兵sentinel相关推荐

  1. 面试官:Redis如何实现持久化的、主从哨兵又是什么?

    哈喽!大家好,我是小奇,一位不靠谱的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新,可以微信搜索[小奇JAVA面试]第一时间阅 ...

  2. docker部署redis集群_Docker部署Redis集群----第九节(docker-redis哨兵集群“轮询分流”篇实例一)...

    到此,我们的 Redis 哨兵集群就结束了,本篇章是第九篇章,也是使用集群方式的实例一来实现php的轮询分流. 1.准备工作: 在我们上一篇章实现redis 哨兵集群的基础上开始,在服务器上部署php ...

  3. docker部署redis集群_Docker部署Redis集群----第六节(docker-redis-sentinel集群的机制)...

    通过前面的三个篇章的认知学习与实践,相信大家搭建自己的docker redis主从应该是没有任何问题了.普通的主从复制到此就结束了,下面我们要来分析讲解,普通主从复制的升级版"哨兵集群&qu ...

  4. 【redis】使用 URI 配置 redis

    前言 ruoyi 4.6.0 Spring Boot Version: 2.2.13.RELEASE jedis 2.7.3 使用 URI 配置 redis 配置: redis.address=red ...

  5. 宝塔需在php设置中安装redis扩展,宝塔安装配置redis说明

    [TOC] #### 安装Redis服务 * 首先进入宝塔管理后台,点击"`软件管理`",在"全部"或者"运行环境"中找到Redis,点击右 ...

  6. Redis之CentOS7安装配置Redis

    centos:https://www.cnblogs.com/zuidongfeng/p/8032505.html 分为三部分:安装redis 设置守护进程 设置开机启动 安装redis 下载 [ro ...

  7. Redis 主从配置密码以及哨兵

    目录: Redis 主从介绍 哨兵机制 Redis 主从配置 环境 安装 启动服务 检查主从状态 测试数据同步 默认是读写分离的 Redis Sentinel 配置 主Redis宕机测试 配置多个哨兵 ...

  8. docker+网桥+redis主从+哨兵模式

    docker+网桥+redis主从+哨兵模式 我是在两台服务器上实验的,一台服务器的ip是192.168.213.144,另一台服务器的ip是192.168.213.145 1. 搭建网桥 关于第一部 ...

  9. redis+主从复制+集群配置

    redis+主从复制+集群配置 redis是一个key-value存储系统.和memcached类似,不过redis支持的value类型更多,主要有:string(字符串).list(链表).set( ...

最新文章

  1. Mysql统计分组区间的人数和
  2. 熟练Linux ,先从这 26 个命令开始吧
  3. HBuilder离线打包启用Chrome Inspect调试
  4. 线性代数 第一章 行列式
  5. 【LeetCode】LeetCode之删除并获得点数——动态规划、排序+动态规划
  6. Java 403 forbidden错误解决
  7. jedis操作redis(二)
  8. 功能Java示例 第1部分–从命令式到声明式
  9. 程序崩溃 分析工具_程序分析工具| 软件工程
  10. python下载图片的命令_网上的图片不知道怎么批量下载?python教你怎么把网站上面的图片都爬下来...
  11. Replace Type Code with Class(以类取代类型码)
  12. python安装anaconda ubuntu_Ubuntu 16.4 安装anaconda 详细教程
  13. matlab时频分析工具箱安装_科研小班 | 加州大学伯克利分校 | 物理、电子工程:MATLAB信号和数据处理课题...
  14. java释放对象_在Java中释放Semaphore对象的正确方法是什么...
  15. 区块链优秀gitbook资料
  16. 淘淘商城:显示查询页面
  17. 【遥感影像处理与分析】遥感影像校正详解-辐射校正、几何校正流程与方法比较
  18. 项目配置管理工具研究
  19. 冰点还原无法修改计算机时间,安装冰点还原后无法更改系统时间怎么办
  20. SIM900A 开发板连线图

热门文章

  1. 怎样安装ubuntu系统
  2. 如何 sizing 一台物理机上可以承载多少 VMware 虚拟机? 分享 Vsphere HA 几个实用知识点
  3. 算法学习总结(3)——二叉树数据结构重点知识总结
  4. Java基础学习总结(101)——Junit5抢鲜看
  5. 来自百度的71款开源项目
  6. 鸿蒙系统怎么还不能用,【图片】华为鸿蒙系统的厉害之处在于 你可能非用不可 !【手机吧】_百度贴吧...
  7. url上传参 用requestmapping接受_14 个 Spring MVC 顶级技巧,随时用随时爽,一直用一直爽...
  8. pcb天线和纯铜天线_蓝牙模块采用陶瓷天线和PCB天线的区别
  9. BIO、NIO、AIO入门认识
  10. iframe的2个问题