Redis进阶(2)——Redis数据的持久化 & CAP分布式理论(高可用性

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

运行容器

自定义docker的静态网段,关机重启,不会改变redis的ip

docker network create --driver bridge --subnet=172.18.12.0/16 --gateway=172.18.1.1 pet_docker_net

conf位置

[root@localhost conf]# ls
redis.conf
[root@localhost conf]# pwd
/usr/local/software/6380/conf

/usr/local/software/6380/conf/redis.conf

data的位置

[root@localhost data]# pwd
/usr/local/software/6380/data

log的位置

[root@localhost log]# ls
redis.log
[root@localhost log]# pwd
/usr/local/software/6380/log
    
/usr/local/software/6380/log/redis.log

docker run
-i:以交互模式运行容器
-t:为容器重新分配一个伪输入终端
–name :容器名称
–privileged: 设置容器公开权限(默认为true)
-p :映射端口 linux端口: 容器内置端口(mysql默认端口为3306)
-v : linux挂载文件夹/文件和容器内路径的映射
-e: 容器的环境变量(设置mysql默认用户名&密码)
-d: 后台运行容器,并返回容器ID

docker run -it \
--name redis_6379_main \
--privileged \
-p 6379:6379 \
--network pet_docker_net \
--ip 172.18.12.15 \
-v /usr/local/software/6380/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v /usr/local/software/6380/data/:/data \
-v /usr/local/software/6380/log/redis.log:/var/log/redis.log \
-d redis \
/usr/local/etc/redis/redis.conf

docker run -it \
--name redis_6380 \
--privileged \
-p 6380:6379 \
--network pet_docker_net \
--ip 172.18.12.10 \
-v /usr/local/software/redis/6379/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v /usr/local/software/redis/6379/data/:/data \
-v /usr/local/software/redis/6379/log/redis.log:/var/log/redis.log \
-d redis \
/usr/local/etc/redis/redis.conf

检查日志log

检查进程是否启动

docker ps

在这里插入图片描述

检查日志

docker logs redis_6379

由于是挂载启动,此时查看日志采用

cat /usr/local/software/6380/log/redis.log

在这里插入图片描述

[root@localhost log]# docker run -it \
> --name redis_6380 \
> --privileged \
> -p 6380:6379 \
> --network pet_docker_net \
> --ip 172.18.12.10 \
> -v /usr/local/software/6380/conf/redis.conf:/usr/local/etc/redis/redis.conf \
> -v /usr/local/software/6380/data/:/data \
> -v /usr/local/software/6380/log/redis.log:/var/log/redis.log \
> -d redis \
> /usr/local/etc/redis/redis.conf
1e9bdea8560e9e1c4977978be15d8b1954ebf843e49f504acc797b49c430a668
[root@localhost log]# docker ps 
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                                                      NAMES
1e9bdea8560e        redis                "docker-entrypoint..."   7 seconds ago       Up 6 seconds        0.0.0.0:6380->6379/tcp                                     redis_6380
[root@localhost log]# docker logs redis_6380
[root@localhost log]# ls
redis.log
[root@localhost log]# cat redis.log 
Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
1:M 19 Jul 2023 09:42:11.650 \* Ready to accept connections
[root@localhost log]# 

测试redis
[root@localhost conf]# docker exec -it redis_6379_main bash
root@71dd1af12898:/data# redis-cli
127.0.0.1:6379> ping
PONG

放开ipv4端口

在这里插入图片描述

从slave的redis

从slave的文件夹

在/usr/local下创建software目录

在software目录下创建3个redis服务器以端口号命名: 6379,6380,63801

在每个文件夹下都创建data, conf, 和logs文件夹。

  • data、conf和logs文件夹
  • conf:存储redis配置文件
  • logs: 存储redis日志文件
[root@localhost software]# mkdir -p 6380/conf 6380/data 6380/log
[root@localhost software]# ls
6380  canal
[root@localhost software]# cd 6380/log/
[root@localhost log]# pwd
/usr/local/software/6380/log
[root@localhost log]# touch redis.log
[root@localhost log]# ll
总用量 0
-rw-r--r--. 1 root root 0 7月  19 11:32 redis.log
[root@localhost log]# chmod 777 redis.log 
[root@localhost log]# ll
总用量 0
-rwxrwxrwx. 1 root root 0 7月  19 11:32 redis.log
[root@localhost log]# 

配置文件拷贝
[root@localhost log]# docker image inspect redis 

在这里插入图片描述

https://redis.io/docs/management/config/

在这里插入图片描述

[root@localhost 6380]# cd conf/
[root@localhost conf]# touch redis.conf
[root@localhost conf]# vim redis.conf 
[root@localhost conf]# cat redis.conf 
# Redis configuration file example.
#
# Note that in order to read the configuration file, Redis must be
# started with the file path as first argument:
#
# ./redis-server /path/to/redis.conf

# Note on units: when memory size is needed, it is possible to specify
# it in the usual form of 1k 5GB 4M and so forth:

配置文件结构

[root@localhost 6380]# yum -y install tree
[root@localhost 6380]# tree
.
├── conf
│   └── redis.conf
├── data
└── log
    └── redis.log

3 directories, 2 files


主从的文件夹

在这里插入图片描述

[root@localhost software]# ls
6380  6381  canal
[root@localhost software]# tree
.
├── 6380
│   ├── conf
│   │   └── redis.conf
│   ├── data
│   └── log
│       └── redis.log
├── 6381
│   ├── conf
│   │   └── redis.conf
│   ├── data
│   └── log
│       └── redis.log
└── canal
    └── conf
        ├── canal.properties
        └── instance.properties

10 directories, 6 files

修改从配置文件
[root@localhost ~]# docker inspect redis_6379_main | grep IPA
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAMConfig": {
                    "IPAddress": "172.18.12.15",
[root@localhost ~]# 

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

 479 # replicaof <masterip> <masterport>
 480 replicaof 172.18.12.15 6379
 481 slave-read-only no
     
 1256 appendonly yes

运行从的redis

docker run
-i:以交互模式运行容器
-t:为容器重新分配一个伪输入终端
–name :容器名称
–privileged: 设置容器公开权限(默认为true)
-p :映射端口 linux端口: 容器内置端口(mysql默认端口为3306)
-v : linux挂载文件夹/文件和容器内路径的映射
-e: 容器的环境变量(设置mysql默认用户名&密码)
-d: 后台运行容器,并返回容器ID

docker run -it \
--name redis_6381_slave \
--privileged \
-p 6381:6379 \
--network pet_docker_net \
--ip 172.18.12.16 \
-v /usr/local/software/6381/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v /usr/local/software/6381/data/:/data \
-v /usr/local/software/6381/log/redis.log:/var/log/redis.log \
-d redis \
/usr/local/etc/redis/redis.conf

检查日志
[root@localhost conf]# cat /usr/local/software/6381/log/redis.log

在这里插入图片描述

查看从redis的状态
[root@localhost conf]# docker exec -it redis_6381_slave bash
root@80b796f922eb:/data# redis-cli
127.0.0.1:6379> info replication

在这里插入图片描述

查看主master的状态
[root@localhost conf]# docker exec -it redis_6379_main bash
root@71dd1af12898:/data# redis-cli
127.0.0.1:6379> info replication

在这里插入图片描述

主从同步

在这里插入图片描述

哨兵机制(sentinel)

主从工作

架构

在这里插入图片描述

问题

如果主服务器(master)出现宕机,那么向从库写数据就会出现问题。

解决方案

智能化节点监测-哨兵模式: Redis 在 2.8 版本以后提供的哨兵(Sentinel)机制,它的作用是实现主从节点故障转移。它会监测主节点是否存活,如果发现主节点挂了,它就会选举一个从节点切换为主节点,并且把新主节点的相关信息通知给从节点和客户端。

什么是哨兵机制

Sentinel(哨岗、哨兵)是Redis的**高可用性(high availability)**解决方案:由一个或多个Sentinel实例(instance)组成的Sentinel系统(system)可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。

在这里插入图片描述

在这里插入图片描述

哨兵模式架构(三哨兵方式)

在这里插入图片描述

搭建哨兵模式(三哨兵)

redis服务的IP地址
序号服务器名称ip地址
1redis_6379 (主)172.18.12.10
2redis_6380 (从)172.18.12.10
3redis_6381(从)172.18.12.10
哨兵配置文件
每一个redis创建哨兵配置文件

文件名命名:sentinel.conf

编辑redis-sentinel.conf文件

sentinel monitor

  • master-name: redis 主服务器名称
  • ip: redis 主服务器的ip地址
  • redis-port : redis主服务器的端口号
  • quorum: 设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了,例如如果设置为2,则表示有两个哨兵联合判断是否失效。
  • 哨兵1:跟踪redis(主)
# 所以无需担心端口重复使用
# 如果需要在单机
port 26379

# 设定密码认证
# requirepass 123456

# 配置哨兵的监控参数
# 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum>
# master-name是为这个被监控的master起的名字
# ip是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名
# redis-port是被监控节点所监听的端口号
# quorom设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了
sentinel monitor redis_6379 172.18.12.10 6379 2

# 连接主节点的密码
# 格式:sentinel auth-pass <master-name> <password>
# sentinel auth-pass local-master 123456

# master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒
# 格式:sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds redis_6379 30000

  • 哨兵2:跟踪redis(从1)
# 所以无需担心端口重复使用
# 如果需要在单机
port 26380

# 设定密码认证
# requirepass 123456

# 配置哨兵的监控参数
# 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum>
# master-name是为这个被监控的master起的名字
# ip是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名
# redis-port是被监控节点所监听的端口号
# quorom设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了
sentinel monitor redis_6379 172.18.12.10 6379 2

# 连接主节点的密码
# 格式:sentinel auth-pass <master-name> <password>
# sentinel auth-pass local-master 123456

# master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒
# 格式:sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds redis_6379 30000


  • 哨兵3: 跟踪redis(从2)
# 所以无需担心端口重复使用
# 如果需要在单机
port 26381

# 设定密码认证
# requirepass 123456

# 配置哨兵的监控参数
# 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum>
# master-name是为这个被监控的master起的名字
# ip是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名
# redis-port是被监控节点所监听的端口号
# quorom设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了
sentinel monitor redis_6379 172.18.12.10 6379 2

# 连接主节点的密码
# 格式:sentinel auth-pass <master-name> <password>
# sentinel auth-pass local-master 123456

# master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒
# 格式:sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds redis_6379 30000


创建运行哨兵容器

创建第一个哨兵(26379)
docker run -it \
--name sentinel_26379 \
--privileged \
--network my_docker_net \
--ip 172.18.12.20 \
-p 26379:26379 \
-v /usr/local/software/redis/6379/sentinel/sentinel.conf:/data/redis-sentinel.conf \
-d redis \
redis-sentinel redis-sentinel.conf

创建第二个哨兵(26380)
docker run -it \
--name sentinel_26380 \
--privileged \
--network my_docker_net \
--ip 172.18.12.21 \
-p 26380:26380 \
-v /usr/local/software/redis/6380/sentinel/sentinel.conf:/data/redis-sentinel.conf \
-d redis \
redis-sentinel redis-sentinel.conf

创建第三个哨兵(26381)
docker run -it \
--name sentinel_26381 \
--privileged \
--network my_docker_net \
--ip 172.18.12.22 \
-p 26381:26381 \
-v /usr/local/software/redis/6381/sentinel/sentinel.conf:/data/redis-sentinel.conf \
-d redis \
redis-sentinel redis-sentinel.conf

测试哨兵

关闭master服务器(redis_6379)

模拟主服务器宕机

  • 关闭主服务器(redis_6379)之前
  • 关闭主服务器(redis_6379)
  • 进入 容器(redis_6380)检查状态

在这里插入图片描述

  • 在新的master中添加数据
  • 重新让之前的master(redis_6379)上线

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

sentinel.conf
-d redis
redis-sentinel redis-sentinel.conf


### 测试哨兵


#### 关闭master服务器(redis\_6379)



> 
> 模拟主服务器宕机
> 
> 
> 


* 关闭主服务器(redis\_6379)之前
* 关闭主服务器(redis\_6379)
* 进入 容器(redis\_6380)检查状态


![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/2199c263995455b332f5664603ae022d.png)


* 在新的master中添加数据
* 重新让之前的master(redis\_6379)上线




---


[外链图片转存中...(img-7ozsszXt-1715282776702)]
[外链图片转存中...(img-Dz1rQtHW-1715282776702)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值