【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主机。

相关推荐
麦聪聊数据2 小时前
敏感数据安全吗?基于字段级血缘的 PII 数据全链路追踪
数据库·sql·安全
田里的水稻2 小时前
BI_双足机器人舞蹈动作的sim2sim和sim2Real(Gymnasium + Mujoco)
服务器·数据库·机器人
酸菜牛肉汤面2 小时前
15、联合索引是什么?为什么需要注意联合索引中的顺序?
数据库
在风中的意志2 小时前
[数据库SQL] [leetcode-511] 511. 游戏玩法分析 I
数据库·sql·游戏
一直跑2 小时前
UKB数据库/RAP平台批量下载数据教程
数据库·rap·ukb
AndyHeee3 小时前
【瑞芯微rk3576刷ubuntu根文件系统容量不足问题解决】
linux·数据库·ubuntu
李昊哲小课3 小时前
Ubuntu 24.04 在线安装 Redis 8.x 完整教程
linux·redis·ubuntu
李宥小哥3 小时前
SQLite03-数据库管理
数据库
『六哥』3 小时前
MySQL 版本安装教程
数据库·mysql