【redis】了解redis的主从和集群搭建

目录

一、redis的非docker安装

[1. 在root目录下创建一个software目录,把redis压缩文件拷贝到该目录下](#1. 在root目录下创建一个software目录,把redis压缩文件拷贝到该目录下)

[2. 安装gcc环境](#2. 安装gcc环境)

[3. 在software目录中,进行解压缩操作](#3. 在software目录中,进行解压缩操作)

[4. 把压缩的文件copy到/usr/local/src/redis里面](#4. 把压缩的文件copy到/usr/local/src/redis里面)

[5. 进入到/usr/local/src/redis/redis-5.0.10/目录进行编译](#5. 进入到/usr/local/src/redis/redis-5.0.10/目录进行编译)

[6. 将redis安装到/usr/local/redis目录中](#6. 将redis安装到/usr/local/redis目录中)

[7. 把配置文件copy到/usr/local/redis/conf目录](#7. 把配置文件copy到/usr/local/redis/conf目录)

[8. 启动redis](#8. 启动redis)

二、了解redis.conf配置文件

[1. 基础配置](#1. 基础配置)

[2. 解读持久化配置](#2. 解读持久化配置)

①、RDB持久化

②、AOF持久化

③、混合持久化

三、淘汰策略和删除策略

[1. 淘汰策略和删除策略的区别和共同点](#1. 淘汰策略和删除策略的区别和共同点)

[2. 淘汰策略(内存相关)](#2. 淘汰策略(内存相关))

①、触发时机

②、redis.conf配置文件

③、淘汰策略

[3. 删除策略](#3. 删除策略)

①、触发时机

②、实现方式(redis采用1+2组合)

四、主从搭建(一主二从)

[1. 在/usr/local/redis目录中创建msconf目录,将redis.conf文件拷贝到该目录下。](#1. 在/usr/local/redis目录中创建msconf目录,将redis.conf文件拷贝到该目录下。)

[2. 修改配置文件](#2. 修改配置文件)

[3. 启动redis](#3. 启动redis)

[① 进入到/usr/local/redis目录,执行下面的命令](#① 进入到/usr/local/redis目录,执行下面的命令)

②由于配置redis是在后台运行,所以他之前的启动日志是看不到的,执行下面的命令查看redis是否启动成功

③复制多个ssh连接,开启redis客户端

④进入redis客户端之后,查看当前redis的主从关系

[⑤ 配置主从关系(遵循配从不配主)](#⑤ 配置主从关系(遵循配从不配主))

[4. 问题思考](#4. 问题思考)

①、从机slave1和slave2同步主机的数据的时候,是从切入点同步还是从头同步,比如在主机未配置从机的时候,主机就存在数据k1,k2,k3,从k4的时候主机配置了两个从机,数据从哪里同步。

②、从机是否可以写?

③、主机shutdown后情况如何?从机是上位还是原地待命?

④、主机又回来了后,主机新增记录,从机还能顺利复制吗?

⑤、其中一台从机shutdown之后情况如何?依照原有他能跟上大部队吗?

五、哨兵模式(主从)

①、在之前的/usr/local/redis/msconf目录中创建一个sentinel.conf文件(文件名字不能错)

②、填写配置

③、启动redis哨兵模式

④、将主机shutdown之后,哨兵会进行投票选举出一个新的主机

⑤、6379也就是原主机上线之后,就会变成当前主机的从机

六、集群搭建

1、搭建过程

①、首先进入到/usr/local/redis目录中创建一个clusterconf目录

②、复制redis.conf配置文件。

③、修改文件名称

④、修改配置文件内容

⑤、复制五份修改后的配置文件,前三个作为主机的配置文件,后三个作为主机的从机配置文件

⑥、在/usr/local/redis/目录当中编写一个启动redis的脚本run.sh

⑦、执行run.sh脚本,启动redis集群,并查看redis状态

⑧、使用docker下载redis-trib的镜像运行(设置主从)

2、客户端连接测试

①、客户端连接

②、连接三个主机完成之后,随便挑选一个客户端写入数据

③、随机选取一个客户端,获取数据


一、redis的非docker安装

准备一个redis压缩文件,可以直接在官网上下载https://redis.io/download.本篇文章使用的redis版本是5.0.10,使用ssh连接工具连接上linux服务器。

1. 在root目录下创建一个software目录,把redis压缩文件拷贝到该目录下

使用FinalShell工具,可以直接将下载好的压缩包,拖到当前目录中。

2. 安装gcc环境

因为redis是用C语言编写的,需要让redis运行起来,需要给linux中安装编译环境

bash 复制代码
yum install gcc-c++

3. 在software目录中,进行解压缩操作

bash 复制代码
tar -zxvf redis-5.0.10.tar.gz

4. 把压缩的文件copy到/usr/local/src/redis里面

bash 复制代码
cp -r /root/software/redis/redis-5.0.10 /usr/local/src/redis

这里的cp命令就是复制,-r表示多层级拷贝。第一个路径是要copy的文件目录,第二个路径是目标路径。

5. 进入到/usr/local/src/redis/redis-5.0.10/目录进行编译

进入到该目录之后,执行make命令等待编译完成。

6. 将redis安装到/usr/local/redis目录中

bash 复制代码
mkdir -p /usr/local/redis
make install PREFIX=/usr/local/redis

安装完成之后,可以进入到/usr/local/redis/bin目录中进行查看,使用命令ls.出现这些东西就表示安装成功了。

安装成功之后,在启动的时候还是存在问题的,我们启动的时候redis还是需要读取config文件的,所以在安装目录中我们还需要创建一个conf目录,将他的配置文件copy过来。

7. 把配置文件copy到/usr/local/redis/conf目录

bash 复制代码
进入到/usr/local/redis目录中
mkdir conf
cp -r /usr/local/src/redis/redis-5.0.10/redis.conf  /usr/local/redis/conf

8. 启动redis

bash 复制代码
进入到/usr/local/redis目录
//启动服务器
./bin/redis-server ./conf/redis.conf
//启动客户端
./bin/redis-cli -h 127.0.0.1 -p 6379

服务器启动之后,想要查看redis服务是否启动成功可以通过下面的命令来查看

bash 复制代码
ps -ef | grep redis

二、了解redis.conf配置文件

1. 基础配置

bash 复制代码
bind:指定redis只接受来自该IP的请求,如果不设置,默认是处理所有请求,在生产环境中最好设置该项
port:监听端口,默认为6379
logfile:配置log文件地址,默认使用标准输出,即打印在命令行终端的端口上
database:设置数据库的个数,默认是共有16个库,默认使用的是0号数据库

2. 解读持久化配置

①、RDB持久化
  • save 这三行配置表示的意思是,60秒内发送10000次写,触发一次快照;300秒10次写,也触发一次快照;900秒1次写,同样也触发一些快照。把三行全部注释掉就关闭RDB。
  • stop-writes-on-bgsave-error yes表示的意思是,最后一次后台快照失败时,是否拒绝新的写入,强迫运维发现故障。
  • rdbcompression yes / rdbchecksum yes表示的意思是,快照文件是否做LZF压缩,是否在最后家CRC64校验,默认都开。
  • dbfilename dump.rdb / dir ./表示的意思是快照我呢见名和存放目录;dir也是AOF文件的目录。
②、AOF持久化
  • appendonly no 表示的意思是,默认关闭AOF,改成yes就是开启
  • appendfilename "appendonly.aof" 表示AOF文件名
  • appendfsync everysec 表示每秒中把内存缓冲区fsync到磁盘一次(折中方案),另外两个可选:always(每条写命令到刷盘,最安全最慢)、no(完全交给OS,最快最危险)
  • aof-load-truncated yes 表示的意思是,Redis 启动时发现 AOF 末尾被截断(例如断电),是否忽略截断部分继续启动;yes = 尽量加载,no = 直接报错退出。
  • aof-use-rdb-preamble yes 表示的意思是,开启「混合持久化」:重写后的 AOF 文件前半段是 RDB 格式、后半段是增量 AOF,加载更快。
③、混合持久化

想要开启混合持久化,在配置文件中修改两行即可

  1. 打开AOF把这一行改成yes: appendonly yes
  2. 让重写后的AOF文件前半截用RDB格式,把这一行保持yes即可aof-use-rdb-preamble yes 。

三、淘汰策略和删除策略

1. 淘汰策略和删除策略的区别和共同点

①、共同点

保证redis的内存空间不被占满,既能保存尽量多的热数据,又不会出现OOM(内存溢出)崩溃。

②、区别

  1. 淘汰策略:是内存满了之后触发,决定扔掉那些键给新数据让路。
  2. 删除策略:是键过期之后触发,决定怎么把过期键清理掉,与内存上限无关。虽然说我们在写入数据的时候,会添加过期时间,到时间之后就访问不到这个数据了,但是在redis当中这个过期键有可能并没有删除掉。

2. 淘汰策略(内存相关)

①、触发时机

只有当maxmemory上限被设置并且实例已用内存≥maxmemory时才会触发;目的是给新数据腾地方

②、redis.conf配置文件

配置项:maxmemmory-policy <策略>

③、淘汰策略
  1. noeviction:默认。不淘汰任何键,只返回OOM错误(写操作失败,读命令任然可以执行)
  2. allkey-lru:所有键里面淘汰最久未使用的键;缓存场景最常用
  3. volatile-lru:在设置了过期时间的键里面淘汰最久未使用的键,没过期时间的键永远不被淘汰。
  4. allkeys-lfu:淘汰所有键里面访问次数最少的键,谁最冷门谁出局。(热点缓存场景更稳)
  5. volatile-lfu:在设置了过期时间的键里,淘汰访问次数最少的扔掉,同样不懂永不过期的键。
  6. volatile-random / allkeys-random:要么从带过期时间的键里随机淘汰,要么从全部键里随机淘汰。(基本不用)
  7. volatile-ttl:在带过期时间的键里,挑离过期时间最近的扔掉,越快过期的越先被清理。

3. 删除策略

①、触发时机

键本身设置了过期时间,到达过期时间后redis会触发删除策略将过期键删除掉。

②、实现方式(redis采用1+2组合)

1、惰性删除:每次访问键时检查过期时间,过期就立即删除(用到才检查);优点:省CPU,缺点:内存占用过大。

2、定期删除:没100ms抽一小批带过期时间的键,发现过期就删。(优点:把过期键慢慢清理掉,内存压力小)

3、定时删除:到期瞬间用定时器删除,对内存最友好,但高并发下CPU扛不住,redis未采用(优点:内存最干净,缺点:给每个设置过期时间的键,往全局定时器里注册一个事件进行监控,消耗CPU性能)

四、主从搭建(一主二从)

为了演示效果,直接使用一个服务器演示。redis启动的时候更换不同的redis.conf文件即可。

1. 在/usr/local/redis目录中创建msconf目录,将redis.conf文件拷贝到该目录下。

bash 复制代码
//创建msconf目录,进入到/usr/local/redis目录中
mkdir msconf
//拷贝redis.conf文件
cp -r /usr/local/src/redis/redis-5.0.10/redis.conf ./msconf

2. 修改配置文件

  • part 6379
  • bind 0.0.0.0
  • daemonize yes
  • pidfile /var/run/redis_6379.pid
  • logfile "/usr/local/redis/log/6379.log"
  • save 30 5
  • dbfilename dump6379.rdb
  • dir /usr/local/redis/data/

剩下的两个配置文件,只需要将配置文件当中的6379统一替换成其他端口号即可。

3. 启动redis

① 进入到/usr/local/redis目录,执行下面的命令
bash 复制代码
./bin/redis-server ./msconf/redis6379.conf
./bin/redis-server ./msconf/redis6380.conf
./bin/redis-server ./msconf/redis6381.conf
②由于配置redis是在后台运行,所以他之前的启动日志是看不到的,执行下面的命令查看redis是否启动成功
bash 复制代码
ps -ef | grep redis
③复制多个ssh连接,开启redis客户端
bash 复制代码
//进入到/usr/local/redis目录中
./bin/redis-cli -p 127.0.0.1 -h 6379
./bin/redis-cli -p 127.0.0.1 -h 6380
./bin/redis-cli -p 127.0.0.1 -h 6381
④进入redis客户端之后,查看当前redis的主从关系
bash 复制代码
 info replication

圈出来的地方是配置过主从之后,显示的当前主机存在几个从机,以及从机的ip和端口号。

⑤ 配置主从关系(遵循配从不配主)

也就是说我们需要让那个redis作为主机,就不配那个redis,在剩余的redis客户端中执行下面的命令即可。表示这个redis的主机是ip为127.0.0.1,端口为6379的redis

bash 复制代码
slaveof 127.0.0.1 6379

配置完成之后我们可以查看一下从机的主从关系

4. 问题思考

①、从机slave1和slave2同步主机的数据的时候,是从切入点同步还是从头同步,比如在主机未配置从机的时候,主机就存在数据k1,k2,k3,从k4的时候主机配置了两个从机,数据从哪里同步。

主从关系配置完成之后,从机就会复制主机的全部数据。

②、从机是否可以写?

从机不能执行set命令,也就是不能进行写操作,redis客户端提示从机只允许读操作。

③、主机shutdown后情况如何?从机是上位还是原地待命?

shutdown之后,在没有配置哨兵模式的情况下,从机是不变的,等待主机恢复。

④、主机又回来了后,主机新增记录,从机还能顺利复制吗?

可以,主机恢复之后还是主机。

⑤、其中一台从机shutdown之后情况如何?依照原有他能跟上大部队吗?

可以跟上

❗❗当前主从模式存在问题就是主机宕机之后,系统就只能读取,不能写入了,必须等待主机恢复,所以下面我们了解一下哨兵模式。

五、哨兵模式(主从)

哨兵模式就是启动一个线程监视主机状态,如果主机挂了,那么就从从机当中通过投票选举的方式,选举一个从机升级为主机。

①、在之前的/usr/local/redis/msconf目录中创建一个sentinel.conf文件(文件名字不能错)
②、填写配置
bash 复制代码
sentinel monitor host6379 127.0.0.1 6379 1
  • 这里host6379表示的是自己起的哨兵名字
  • 127.0.0.1 6379表示主机的ip和端口号
  • 1表示投票的票数,这里设置成1的原因就是为了快速选举出主机,谁先获得一票谁就是主机。
③、启动redis哨兵模式

图片中圈出来的部分就是redis哨兵启动命令。

进入到/usr/local/redis目录执行下面的命令即可。执行这个命令之前需要确保之前的主从redis已经启动起来了,并且配置了主从关系。

bash 复制代码
./bin/redis-sentinel ./msconf/sentinel.conf
④、将主机shutdown之后,哨兵会进行投票选举出一个新的主机

图片中显示将6381选举为主机了,我们查看一下6381这个redis.

⑤、6379也就是原主机上线之后,就会变成当前主机的从机

❗❗❗ 主从和哨兵模式存在一个问题就是,写操作在主机上进行,但是如果并发量过高,主机的压力过大,这个时候就需要了解集群模式了。

六、集群搭建

搭建集群模式,就是去中心化,在主从模式中,只有主机可以进行写操作(相当于主机可以讲话),但是从机只可以进行读操作(相当于从机不能讲话,只能听),那么主从模式中主机就是这个中心。现在使用集群模式,就是让每台服务器都拥有读写能力,为每个服务器搭配一个从机,防止主机挂掉之后,从机上位。

集群模式中,内置了16384个哈希槽,在集群模式启动的时候,他会给每个主机分配一个区间的哈希槽值。当需要在redis中存放k-v数据时,redis先对key使用redis内置的算法,计算出这个key所属的哈希值区间,将这个key-value路由存放到对应的redis服务器中。当进行读取操作的时候,可以根据key来计算所属的哈希值区间,将读取请求路由到对应的redis服务上来获取数据。

1、搭建过程

这里还是在一台机器上模拟。

①、首先进入到/usr/local/redis目录中创建一个clusterconf目录
bash 复制代码
mkdir clusterconf
②、复制redis.conf配置文件。

进入到/usr/local/src/redis/redis-5.0.10目录中

bash 复制代码
cp ./redis.conf /usr/local/redis/clusterconf
③、修改文件名称
bash 复制代码
mv redis.conf redis7000.conf
④、修改配置文件内容
bash 复制代码
bind 0.0.0.0                  
port 7000                      
daemonize yes                 
# 打开aof 持久化
appendonly yes                 
# 开启集群
cluster-enabled yes            
# 集群的配置文件,该文件自动生成   
cluster-config-file nodes-7000.conf  
# 集群的超时时间
cluster-node-timeout 5000
⑤、复制五份修改后的配置文件,前三个作为主机的配置文件,后三个作为主机的从机配置文件

进入到clusterconf目录中,执行下面的命令,从7000-7005。并修改配置文件当中7000为对应的数字

bash 复制代码
cp redis7000.conf redis7001.conf
⑥、在/usr/local/redis/目录当中编写一个启动redis的脚本run.sh
bash 复制代码
./bin/redis-server ./clusterconf/redis7000.conf
./bin/redis-server ./clusterconf/redis7001.conf
./bin/redis-server ./clusterconf/redis7002.conf
./bin/redis-server ./clusterconf/redis7003.conf
./bin/redis-server ./clusterconf/redis7004.conf
./bin/redis-server ./clusterconf/redis7005.conf

可以看到这个启动脚本没有执行的权限。使用下面的命令给这个脚本文件升级权限

bash 复制代码
chmod 777 run.sh
⑦、执行run.sh脚本,启动redis集群,并查看redis状态

进入到/usr/local/redis目录

bash 复制代码
./run.sh
ps -ef | grep redis

但是现在没有主从的概念。

⑧、使用docker下载redis-trib的镜像运行(设置主从)
bash 复制代码
#拉取镜像
 docker pull inem0o/redis-trib
#运行
docker run -it --net host inem0o/redis-trib create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

第二个命令的作用是,用docker启动一个一次性容器,借助inem0o/redis-trib 镜像,在宿主机网络里给6个本地redis节点组件一个3主3从的redis-cluster

  • docker run -it 启动一个交互式容器,把当前终端挂到容器的 stdin/stdout,方便你看到交互提示和输入 yes。
  • --net host 让容器直接使用宿主机网络栈(Linux-only)。
  • create --replicas 1 create 子命令表示"新建集群"。--replicas 1 指定"每个主节点带 1 个从节点",6 个节点 → 3 主 3 从。

出现图片中的内容表示成功。7000这个服务器分配的哈希槽范围是0-5460,7001分配的是5461-10922 ...。

2、客户端连接测试

①、客户端连接

进入到/usr/local/redis目录当中,执行下面的命令

bash 复制代码
 ./bin/redis-cli -c -h 127.0.0.1 -p 7000
#这里的-c表示集群模式
②、连接三个主机完成之后,随便挑选一个客户端写入数据

在连接7002主机的客户端,写入数据,计算出key的哈希值为5798,数据7001主机哈希槽的范围,所以将数据写入到7001主机当中,客户端的连接也由7002变为了7001.

③、随机选取一个客户端,获取数据

和上面一样,通过计算key的哈希值,将请求路由到了7001主机。

相关推荐
z1234567898615 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
程序猿DD15 小时前
一个 API Key,统一调用大模型、生图和联网搜索
数据库·网关
TlSfoward16 小时前
抓包代理链路下的 TLS 指纹变化分析 TLSFOWARD抓包工具
数据库·爬虫·网络协议·搜索引擎·php
数智化管理手记16 小时前
账龄分析手工统计易遗漏?自动账龄分析工具怎么搭建
大数据·网络·数据库·人工智能·数据挖掘
LabVIEW开发16 小时前
NI Package Manager安装LabVIEW时InternalServerError错误
网络·数据库·labview·labview知识·labview功能·labview程序
SelectDB16 小时前
PostgreSQL 实时同步到 Apache Doris:一站式 CDC 解决方案
数据库
Database_Cool_17 小时前
AI Agent 长期记忆怎么存?阿里云 PolarDB-X 对接 Mem0 记忆框架实践
数据库·阿里云
时空无限17 小时前
vllm 缓存对模型启动时间的影响
缓存·vllm
会编程的土豆17 小时前
数据库范式
数据库·oracle
L16247617 小时前
MySQL 全环境生产快速安装 + 完整配置手册(整合国产银河麒麟适配 + 主从补充版)
数据库·mysql