linux下的redis使用及redis集群(主从、哨兵)

    科技2025-04-29  12

    文章目录

    linux下安装redisredis集群Redis主从复制的搭建(一主二仆)角色设计redis主库搭建redis从库搭建测试主从复制的机制Redis主从复制(一主两从/一主多从)的分析 Redis Sentinel(高可用集群-哨兵模式)配置Sentinel.conf文件启动reids集群启动sentinel测试springboot中的配置(application.yml)

    redis单点、redis主从、redis哨兵 sentinel,redis集群cluster配置搭建与使用

    linux下安装redis

    上传文件到opt文件夹tar zxvf redis-3.2.9.tar.gz 解压mv redis-3.2.9 /usr/local/ 移动redis文件夹至/usr/local进入redis-版本号下的src目录(应该是进入带有版本号的文件夹是我们解压后的文件,local下还有一个自带我的redis文件夹,不是这个):cd /usr/local/redis-3.2.9/src编译源码:make测试编译结果:make test修改redis.conf bind 绑定端口号注释,如果不注释将不能在本机以外客户端访问 requirepass 打开注释 修改密码 端口号加入白名单 firewall-cmd --permanent --zone=public --add-port=6379/tcp firewall-cmd --reload 启动redis 进入redis启动命令目录:cd /usr/local/redis-3.2.9/src执行redis启动命令:./redis-server …/redis.conf & (&符号表示在后台执行)连接Redis:./redis-cli -h 127.0.0.1 -p 6379;auth:密码输入指令exit退出 停止redis服务 ps -ef|grep redis Kill -9 进程号

    如果客户端无法访问,请检查防护墙设置和redis.config是否绑定ip

    redis集群

    redis主从复制简单介绍 一个master可以有多个slave主从复制不会阻塞master。也就是说当一个或多个slave与master进行初次同步数据时,master可以继续处理client发来的请求。相反slave在初次同步数据时则会阻塞不能处理client的请求。主从复制可以用来提高系统的可伸缩性,我们可以用多个slave 专门用于client的读请求,比如sort操作可以使用slave来处理。也可以用来做简单的数据冗余 Redis主从复制的常用的几种方式 一主二仆 A(B、C) 一个Master两个Slave薪火相传(去中心化)A - B - C ,B既是主节点(C的主节点),又是从节点(A的从节点)反客为主(主节点down掉后,手动操作升级从节点为主节点)哨兵模式(主节点down掉后,自动升级从节点为主节点)

    Redis主从复制的搭建(一主二仆)

    角色设计

    需要搭建3个Redis环境6379端口的Redis作为主(Master)6380和6381端口的Redis作为仆从(Slave)

    redis主库搭建

    在安装时配置的基础上,放开masterauth,设置密码,并将rdb和log生成的文件都带上6379以作区分。 logfile "/var/log/redis6379.log" masterauth root dbfilename dump6379.rdb

    redis从库搭建

    复制主库文件夹,修改名字:cp -r /usr/local/redis-3.2.9/redis6379.conf /usr/local/redis-3.2.9/redis.6380.conf修改配置文件 端口号:port 6380 主库配置:slaveof 192.168.14.204 6379 主库密码:masterauth root 以及其他6379相关都改成6380 6381同理。6380和6381加入防火墙白名单 firewall-cmd --permanent --zone=public --add-port=6380/tcp firewall-cmd --permanent --zone=public --add-port=6381/tcp firewall-cmd --reload 配置完成,启动。先启动主库,后启动从库。

    测试

    redis客户端连接,插入两条数据,查看主库日志。

    连接主库客户端,输入指令info replication

    进入从库客户端。日志中可以看出,当前角色是slave,master的ip和port都已经显示出来。

    由于conf文件中的配置,从库只能读取不能写。

    主从复制的机制

    全量复制:slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。(第一次全量)增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步。(之后增量)但是只要是重新连接master,一次完全同步(全量复制)将被自动执行。

    Redis主从复制(一主两从/一主多从)的分析

    IO剧增 每次slave断开以后(无论是主动断开,还是网路故障)再连接master都要将master全部dump出来rdb,在aof,即同步的过程都要重新执行一遍;所以要记住多台slave不要一下都启动起来,否则master可能IO剧增(间隔1-2分)

    复制延迟 由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。

    可用性不高 当有主节点发生异常情况,就会导致不能写入,导致业务出错! 注意: Redis 集群不保证数据的强一致性(strong consistency)Redis 集群的一致性保证(guarantee): 在特定条件下, Redis 集群可能会丢失已经被执行过的写命令。

    Redis Sentinel(高可用集群-哨兵模式)

    Redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能进行自动切换。Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务: 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。

    配置Sentinel.conf文件

    复制三份,端口号分别为:26379、26380、26381需要修改:port、logfile、mymaster的IP、端口和连接密码。 # sentinel.6381.conf protected-mode no port 26381 dir /tmp logfile "/var/log/redis/sentinel.6381.log" sentinel monitor mymaster 192.168.14.204 6379 2 sentinel auth-pass mymaster root sentinel down-after-milliseconds mymaster 3000 sentinel failover-timeout mymaster 180000 配置文件的注释 port 20086 #默认端口26379 dir "/tmp" logfile "/var/log/redis/sentinel_20086.log" daemonize yes #格式:sentinel <option_name> <master_name> <option_value>;#该行的意思是:监控的master的名字叫做T1(自定义),地址为127.0.0.1:10086,行尾最后的一个2代表在sentinel集群中,多少个sentinel认为masters死了,才能真正认为该master不可用了。 sentinel monitor T1 127.0.0.1 10086 2 #sentinel会向master发送心跳PING来确认master是否存活,如果master在“一定时间范围”内不回应PONG 或者是回复了一个错误消息,那么这个sentinel会主观地(单方面地)认为这个master已经不可用了(subjectively down, 也简称为SDOWN)。而这个down-after-milliseconds就是用来指定这个“一定时间范围”的,单位是毫秒,默认30秒。 sentinel down-after-milliseconds T1 15000 #failover过期时间,当failover开始后,在此时间内仍然没有触发任何failover操作,当前sentinel将会认为此次failoer失败。默认180秒,即3分钟。 sentinel failover-timeout T1 120000 #在发生failover主备切换时,这个选项指定了最多可以有多少个slave同时对新的master进行同步,这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意味着越多的slave因为replication而不可用。可以通过将这个值设为 1 来保证每次只有一个slave处于不能处理命令请求的状态。 sentinel parallel-syncs T1 1 #sentinel 连接设置了密码的主和从 #sentinel auth-pass <master_name> xxxxx #发生切换之后执行的一个自定义脚本:如发邮件、vip切换等 ##sentinel notification-script <master-name> <script-path> #sentinel client-reconfig-script <master-name> <script-path>

    启动reids集群

    启动sentinel

    在src目录下执行 ./redis-server …/sentinel.6379.conf --sentinel & ./redis-server …/sentinel.6380.conf --sentinel & ./redis-server …/sentinel.6381.conf --sentinel &

    测试

    ps -ef|grep redis 查看进程

    杀掉主库的进程 端口号是6379的进程,观察日志

    进入6380客户端,可以看见,此时的主库变成了6381

    进入6381客户端,可以看见6381角色变成了主库,并且有一个从库6380

    启动6379:./redis-server …/redis6379.conf & 如果启动报错,是同步数据时出错,修改redis.conf配置文件,masterauth属性

    查看6379客户端,6379已经变成了从库

    springboot中的配置(application.yml)

    Processed: 0.010, SQL: 8