REDIS哨兵配置

一、REDIS介绍

1、简介

为了提高网站响应速度,企业会将热点数据保存在内存中而不是直接从后端数据库中读取。大型网站应用,热点数据往往巨大,几十G上百G是很正常的事,这种情况下,就需要用到缓存服务器,通过缓存服务器承载大部分用户请求,小部分用户请求交给后端服务器处理,如此一来,就可以大大提高用户访问的速度,提升用户使用体验。
常用的缓存服务器有:
memcache
redis

Redis 是一种开源(BSD 许可)内存中数据结构存储,用作数据库、缓存、消息代理和流引擎。
为了实现最佳性能,Redis 使用 内存数据集。根据您的使用案例,Redis 可以通过定期将数据集转储到磁盘或将每个命令附加到基于磁盘的日志来持久保存您的数据。如果您只需要功能丰富的网络内存缓存,您还可以禁用持久性。
Redis 支持异步复制,具有快速非阻塞同步和自动重新连接以及网络分割上的部分重新同步。

2、REDIS集群

redis集群分类
集群是一组相互独立、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群就像是一个独立的服务器。集群配置是用于提高可用性和可缩放性。
redis集群是一个由多个主从节点群组成的分布式服务集群,它具有复制、高可用和分片特性。
redis集群有三种集群模式:
1.主从模式
2.哨兵(Sentinel)模式
3.Cluster模式
在服务开发中,单机都会存在单点故障的问题,即服务部署在一台服务器上,一旦服务器宕机服务就不可用,所以为了让服务高可用,分布式服务就出现了,将同一服务部署到多台机器上,即使其中几台服务器宕机,只要有一台服务器可用服务就可用。
redis也是一样,为了解决单机故障引入了主从模式,但主从模式存在一个问题:master节点故障后服务,需要人为的手动将slave节点切换成为maser节点后服务才恢复。redis为解决这一问题又引入了哨兵模式,哨兵模式能在master节点故障后能自动将salve节点提升成master节点,不需要人工干预操作就能恢复服务可用。
但是主从模式、哨兵模式都没有达到真正的数据sharding(分布式)存储,每个redis实例中存储的都是全量数据,所以redis cluster就诞生了,实现了真正的数据分片存储。

3、主从模式

redis单节点虽然有通过RDB和AOF持久化机制能将数据持久化到硬盘上,但数据是存储在一台服务器上的,如果服务器出现硬盘故障等问题,会导致数据不可用,而且读写无法分离,读写都在同一台服务器上,请求量大时会出现I/O瓶颈。
为了避免单点故障 和 读写不分离,Redis 提供了复制(replication)功能实现master数据库中的数据更新后,会自动将更新的数据同步到其他slave数据库上。

通过数据复制,Redis 的一个 master 可以挂载多个 slave,而 slave 下还可以挂载多个 slave,形成多层嵌套结构。所有写操作都在 master 实例中进行,master 执行完毕后,将写指令分发给挂在自己下面的 slave 节点。slave 节点下如果有嵌套的 slave,会将收到的写指令进一步分发给挂在自己下面的 slave。
通过多个 slave,Redis 的节点数据就可以实现多副本保存,任何一个节点异常都不会导致数据丢失,同时多 slave 可以 N 倍提升读性能。master 只写不读,这样整个 master-slave 组合,读写能力都可以得到大幅提升。

主从模式优缺点

1、优点: 主从结构具有读写分离,提高效率、数据备份,提供多个副本等优点。
2、不足: 最大的不足就是主从模式不具备自动容错和恢复功能,主节点故障,集群则无法进行工作,可用性比较低,从节点升主节点需要人工手动干预。

普通的主从模式,当主数据库崩溃时,需要手动切换从数据库成为主数据库:
在从数据库中使用SLAVE NO ONE命令将从数据库提升成主数据继续服务。
启动之前崩溃的主数据库,然后使用SLAVEOF命令将其设置成新的主数据库的从数据库,即可同步数据。

4、哨兵模式

主从同步/复制的模式,当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用,这时候就需要哨兵模式登场了。
哨兵模式是从Redis的2.6版本开始提供的,但是当时这个版本的模式是不稳定的,直到Redis的2.8版本以后,这个哨兵模式才稳定下来。
哨兵模式核心还是主从复制,只不过在相对于主从模式在主节点宕机导致不可写的情况下,多了一个竞选机制:从所有的从节点竞选出新的主节点。竞选机制的实现,是依赖于在系统中启动一个sentinel(哨兵)进程。

哨兵本身也有单点故障的问题,所以在一个一主多从的Redis系统中,可以使用多个哨兵进行监控,哨兵不仅会监控主数据库和从数据库,哨兵之间也会相互监控。每一个哨兵都是一个独立的进程,作为进程,它会独立运行。

哨兵模式作用

监控所有服务器是否正常运行:通过发送命令返回监控服务器的运行状态,除了监控主服务器、从服务器外,哨兵之间也相互监控。
故障切换:当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换master。同时那台有问题的旧主也会变为新主的从,也就是说当旧的主即使恢复时,并不会恢复原来的主身份,而是作为新主的一个从。

哨兵模式优缺点

优点:
1、哨兵模式是基于主从模式的,解决主从模式中master故障不能自动切换故障的问题。
缺点:
1、哨兵模式下每台 Redis 服务器都存储相同的数据,很浪费内存空间;数据量太大,主从同步时严重影响了master性能。
2、哨兵模式是中心化的集群实现方案,每个从机和主机的耦合度很高,master宕机到salve选举master恢复期间服务不可用。因为投票选举结束之前,谁也不知道主机和从机是谁,此时Redis也会开启保护机制,禁止写操作,直到选举出了新的Redis主机。
3、哨兵模式始终只有一个Redis主机来接收和处理写请求,写操作还是受单机瓶颈影响,没有实现真正的分布式架构。

5、Cluster模式

主从模式或哨兵模式每个节点存储的数据都是全量的数据,数据量过大时,就需要对存储的数据进行分片后存储到多个redis实例上。此时就要用到Redis Sharding技术。

redis在3.0上加入了 Cluster 集群模式,实现了 Redis 的分布式存储,也就是说每台 Redis 节点上存储不同的数据。cluster模式为了解决单机Redis容量有限的问题,将数据按一定的规则分配到多台机器,内存/QPS不受限于单机,可受益于分布式集群高扩展性。

Redis Cluster是一种服务器Sharding技术(分片和路由都是在服务端实现),采用多主多从,每一个分区都是由一个Redis主机和多个从机组成,片区和片区之间是相互平行的。Redis Cluster集群采用了P2P的模式,完全去中心化。

Redis Cluster特点

官方推荐,集群部署至少要 3 台以上的master节点,最好使用 3 主 3 从六个节点的模式。Redis Cluster集群具有如下几个特点:
1、集群完全去中心化,采用多主多从;所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
2、客户端与 Redis 节点直连,不需要中间代理层。客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
3、每一个分区都是由一个Redis主机和多个从机组成,分片和分片之间是相互平行的。
4、每一个master节点负责维护一部分槽,以及槽所映射的键值数据;集群中每个节点都有全量的槽信息,通过槽每个node都知道具体数据存储到哪个node上。

redis cluster主要是针对海量数据+高并发+高可用的场景,如果你的数据量很大,那么建议就用redis cluster,数据量不是很大时,使用sentinel就够了。redis cluster的性能和高可用性均优于哨兵模式。
Redis Cluster采用虚拟哈希槽分区而非一致性hash算法,预先分配一些卡槽,所有的键根据哈希函数映射到这些槽内,每一个分区内的master节点负责维护一部分槽以及槽所映射的键值数据。

二、redis单机部署

1、下载安装包

[root@redis ~]# yum -y install tar net-tools make wget gcc gcc-c++ chrony
//先做时钟同步
[root@redis ~]# systemctl restart chronyd
[root@redis ~]# systemctl enable chronyd
[root@redis ~]# hwclock -w
//查看selinux和firewalld是否关闭
[root@redis ~]# getenforce
Disabled
[root@redis ~]# systemctl status firewalld
○ firewalld.service - firewalld - dynamic firewall daemon
     Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; preset: enabled)
     Active: inactive (dead)
       Docs: man:firewalld(1)

//下载redis包文件
[root@redis ~]# wget https://download.redis.io/redis-stable.tar.gz

2、解压编译redis

[root@redis ~]# ll
total 3548
-rw-------. 1 root root    1140 Jul 10 19:30 anaconda-ks.cfg
-rw-r--r--  1 root root 3626624 Jul 29 13:41 redis-stable.tar.gz
[root@redis ~]# tar -zxvf redis-stable.tar.gz 
[root@redis ~]# ls
anaconda-ks.cfg  redis-stable  redis-stable.tar.gz

[root@redis ~]# cd redis-stable/
[root@redis redis-stable]# make
//最后出现这个就表示成功了
Hint: It's a good idea to run 'make test' ;)

make[1]: Leaving directory '/root/redis-stable/src'

[root@redis redis-stable]# make install
//出现这些是表示安装好了,不是报错
cd src && make install
make[1]: Entering directory '/root/redis-stable/src'

Hint: It's a good idea to run 'make test' ;)

    INSTALL redis-server
    INSTALL redis-benchmark
    INSTALL redis-cli
make[1]: Leaving directory '/root/redis-stable/src'

3、修改内核参数

Linux操作系统对大部分申请内存的请求都回复yes, 以便能运行更多的程序。 因为申请内存后, 并不会马上使用内存, 这种技术叫做overcommit。
0:表示内核将检查是否有足够的可用内存。如果有足够的可用内存,内存申请通过,否则内存申请失败,并将错误返回给应用程序。
1:表示内核允许超量使用内存直到用完为止
2:表示内核决不过量使用内存,即系统整个内存地址空间不能超过swap+50%的RAM(运行内存)值,50%是overcommit_ratio的默认值,此参数同样支持修改。
Redis建议把这个值设置为1, 是为了让fork操作能够在低内存下也执行成功。

[root@redis redis-stable]# vim /etc/sysctl.conf 
//在最后添加一行信息
vm.overcommit_memory = 1

//让配置生效
[root@redis redis-stable]# sysctl -p
vm.overcommit_memory = 1

//关闭HTP透明大页面
//THP透明大页面,尽管THP的本意是为提升性能,但某些数据库厂商还是建议直接关闭THP。
//否则可能导致性能下降,内存锁,甚至系统重启等问题。
[root@redis redis-stable]# cat /sys/kernel/mm/transparent_hugepage/enabled 
[always] madvise never
[root@redis redis-stable]# echo never > /sys/kernel/mm/transparent_hugepage/enabled 
[root@redis redis-stable]# cat /sys/kernel/mm/transparent_hugepage/enabled 
always madvise [never]

//创建redis配置文件存放目录
[root@redis redis-stable]# mkdir /etc/redis
[root@redis redis-stable]# cp redis.conf /etc/redis/
[root@redis redis-stable]# cd /etc/redis/
[root@redis redis]# ls
redis.conf

4、redis运行

redis运行分为前端运行与后台运行
但是我们一般选择后台运行

前端运行

[root@redis redis]# redis-server redis.conf 
6115:C 08 Aug 2024 10:26:14.494 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
6115:C 08 Aug 2024 10:26:14.494 * Redis version=7.4.0, bits=64, commit=00000000, modified=0, pid=6115, just started
6115:C 08 Aug 2024 10:26:14.495 * Configuration loaded
6115:M 08 Aug 2024 10:26:14.495 * Increased maximum number of open files to 10032 (it was originally set to 1024).
6115:M 08 Aug 2024 10:26:14.495 * monotonic clock: POSIX clock_gettime
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis Community Edition      
  .-`` .-```.  ```\/    _.,_ ''-._     7.4.0 (00000000/0) 64 bit
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 6115
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           https://redis.io       
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

6115:M 08 Aug 2024 10:26:14.498 * Server initialized
6115:M 08 Aug 2024 10:26:14.498 * Ready to accept connections tcp

此时你会发现前端运行的话当前窗口就不能再使用了需要再开一个窗口,不那么方便

后台运行

首先Ctrl+c停止运行,然后修改redis配置文件

[root@redis redis]# vim redis.conf 
################################# GENERAL #####################################

# By default Redis does not run as a daemon. Use 'yes' if you need it.
# Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
# When Redis is supervised by upstart or systemd, this parameter has no impact.
daemonize yes
//找到这一行将no改为yes

5、redis密码认证

默认情况下,redis连接是不需要经过认证的,而redis承载了企业大部分的请求流量,如果不经过认证很有可能在互联网上遭受攻击,所以需要在配置文件中为redis设置密码认证,且密码最好随机生成,保证没有规律可言。

[root@redis redis]# vim redis.conf


# The requirepass is not compatible with aclfile option and the ACL LOAD
# command, these will cause requirepass to be ignored.
#
 requirepass foobared
//将这一行的#删除
//验证密码就是foobared,这是默认密码

//启动redis
[root@redis redis]# redis-server redis.conf
[root@redis redis]# ps -ef | grep redis
root        6136       1  0 10:36 ?        00:00:00 redis-server 127.0.0.1:6379
root        6143     669  0 10:37 pts/0    00:00:00 grep --color=auto redis
//查看redis服务是否启动

[root@redis redis]# redis-cli 
127.0.0.1:6379> auth foobared   //验证密码
OK
127.0.0.1:6379> set name tom    //设置名字
OK
127.0.0.1:6379> get name
"tom"
127.0.0.1:6379> quit

redis单机部署完成

三、redis主从

1、更改配置文件

其中6379是主,6380是从

[root@redis redis]# mv redis.conf 6379.conf
[root@redis redis]# cp 6379.conf 6380.conf
[root@redis redis]# ls
6379.conf  6380.conf  dump.rdb

//修改主的配置文件
[root@redis redis]# vim 6379.conf   
# masterauth <master-password>
//搜索上面一行,找到后在其下面插入一行
masterauth foobared
//最后保存退出


//修改从的配置文件
[root@redis redis]# vim 6380.conf 
# masterauth <master-password>
//搜索上面一行,找到后在其下面插入一行
masterauth foobared

# Accept connections on the specified port, default is 6379 (IANA #815344).
# If port 0 is specified Redis will not listen on a TCP socket.
port 6380
//搜索port找到这一行,将端口修改为6380
# TCP listen() backlog.

# replicaof <masterip> <masterport>
//搜索上面一行,找到后在其下面插入一行,让从知道主是哪个
replicaof 127.0.0.1 6379
//最后保存退出

2、启动主从

[root@redis redis]# ps -ef | grep redis
root        6136       1  0 10:36 ?        00:00:02 redis-server 127.0.0.1:6379
root        6185     669  0 10:57 pts/0    00:00:00 grep --color=auto redis
//先把redis进程给干掉
[root@redis redis]# pkill redis
[root@redis redis]# ps -ef | grep redis
root        6188     669  0 10:58 pts/0    00:00:00 grep --color=auto redis
//然后将主从分别启动
[root@redis redis]# redis-server 6379.conf 
[root@redis redis]# redis-server 6380.conf 
[root@redis redis]# ps -ef | grep redis
root        6192       1  0 10:58 ?        00:00:00 redis-server 127.0.0.1:6379
root        6201       1  0 10:58 ?        00:00:00 redis-server 127.0.0.1:6380
root        6208     669  0 10:58 pts/0    00:00:00 grep --color=auto redis

//查看端口信息
[root@redis redis]# ss -anlt
State            Recv-Q           Send-Q                     Local Address:Port                     Peer Address:Port           Process           
LISTEN           0                128                              0.0.0.0:22                            0.0.0.0:*                                
LISTEN           0                511                            127.0.0.1:6379                          0.0.0.0:*                                
LISTEN           0                511                            127.0.0.1:6380                          0.0.0.0:*                                
LISTEN           0                511                                [::1]:6379                             [::]:*                                
LISTEN           0                511                                [::1]:6380                             [::]:*                                
LISTEN           0                128                                 [::]:22        

3、验证

[root@redis redis]# redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> auth foobared
OK
127.0.0.1:6379> set age 19
OK
127.0.0.1:6379> get age
"19"
127.0.0.1:6379> inforeplication

//查看当前复制设置和状态的详细信息
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=865,lag=0
master_failover_state:no-failover
master_replid:49a1b50ab358c0dff73cc1981bdbb7aef463e296
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:865
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:865
127.0.0.1:6379> exit

[root@redis redis]# redis-cli -h 127.0.0.1 -p 6380
127.0.0.1:6380> auth foobared
OK
127.0.0.1:6380> get age
"19"
127.0.0.1:6380> exit

四、redis哨兵

哨兵的配置文件redis解压出来就有

1、配置哨兵

[root@redis ~]# cd redis-stable/
[root@redis redis-stable]# ls
00-RELEASENOTES     CONTRIBUTING.md  LICENSE.txt  README.md               runtest            runtest-sentinel  src     utils
BUGS                deps             Makefile     redis.conf              runtest-cluster    SECURITY.md       tests
CODE_OF_CONDUCT.md  INSTALL          MANIFESTO    REDISCONTRIBUTIONS.txt  runtest-moduleapi  sentinel.conf     TLS.md
[root@redis redis-stable]# cp sentinel.conf /etc/redis/
[root@redis redis-stable]# cd /etc/redis/
[root@redis redis]# ls
6379.conf  6380.conf  dump.rdb  sentinel.conf
[root@redis redis]# vim sentinel.conf 
//修改文件内容
# By default Redis Sentinel does not run as a daemon. Use 'yes' if you need it.
# Note that Redis will write a pid file in /var/run/redis-sentinel.pid when
# daemonized.
daemonize yes
//找到这里修改为yes,允许后台运行

# Note: master name should not include special characters or spaces.
# The valid charset is A-z 0-9 and the three characters ".-_".
sentinel monitor mymaster 127.0.0.1 6379 1
//搜索找到这一行,将2改为1

# Example:
#
# sentinel auth-pass mymaster MySUPER--secret-0123passw0rd
//找到这一行,在其下写入
sentinel auth-pass mymaster foobared

//保存退出

2、启动哨兵

[root@redis redis]# redis-sentinel sentinel.conf 
[root@redis redis]# ps -ef | grep redis
root        6192       1  0 10:58 ?        00:00:05 redis-server 127.0.0.1:6379
root        6201       1  0 10:58 ?        00:00:05 redis-server 127.0.0.1:6380
root        6273       1  0 11:45 ?        00:00:00 redis-sentinel *:26379 [sentinel]
root        6280     669  0 11:46 pts/0    00:00:00 grep --color=auto redis

在sentinel集群环境下需要多个sentinel互相沟通来确认某个master是否真的死了,quorum这个参数是进行客观下线的一个依据,意思是至少有quorum个sentinel认为这个master有故障,才会对这个master进行下线以及故障转移。因为有的时候,某个sentinel节点可能因为自身网络原因,导致无法连接master,而此时master并没有出现故障,所以,这就需要多个sentinel都一致认为该master有问题,才可以进行下一步操作,这就保证了公平性和高可用。

  • 28
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis Sentinel(哨兵)是Redis官方提供的高可用性解决方案,它可以自动检测主节点的故障,并将其转移为新的主节点,以保证Redis集群的高可用性。 以下是Redis Sentinel(哨兵)的配置步骤: 1. 在redis的安装目录下创建sentinel.conf文件,并编辑该文件,添加以下内容: ``` sentinel monitor mymaster 127.0.0.1 6379 2 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 60000 sentinel parallel-syncs mymaster 1 ``` - `sentinel monitor mymaster 127.0.0.1 6379 2`:监控名为mymaster的Redis主节点,IP地址为127.0.0.1,端口号为6379,2表示当有2个哨兵认为主节点不可用时,主节点才被判断为不可用。 - `sentinel down-after-milliseconds mymaster 5000`:当主节点在5秒内没有响应时,哨兵会将其判断为不可用。 - `sentinel failover-timeout mymaster 60000`:当主节点不可用时,哨兵进行故障转移的超时时间为60秒。 - `sentinel parallel-syncs mymaster 1`:进行故障转移时,每个从节点最多同时同步1个主节点。 2. 启动Redis Sentinel(哨兵): ``` redis-sentinel /path/to/sentinel.conf ``` 3. 在其他Redis节点上,也需要配置相同的sentinel.conf文件,并启动Redis Sentinel(哨兵)。 4. 在客户端连接Redis时,需要连接到哨兵而不是直接连接到主节点。可以使用以下命令连接到Redis Sentinel(哨兵): ``` redis-cli -h sentinel_ip -p sentinel_port ``` 其中,sentinel_ip为Redis Sentinel(哨兵)的IP地址,sentinel_port为Redis Sentinel(哨兵)的端口号(默认为26379)。 5. 当主节点不可用时,哨兵会自动将从节点升级为主节点,并重新选举从节点。客户端会自动连接到新的主节点,无需手动干预。 以上就是Redis Sentinel(哨兵)的配置步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值