Redis单机&主从&哨兵&集群部署全攻略

redis的单机、主从、哨兵、集群部署,网上资料很多,但是完备的资料真心没找到。不停的踩坑,千辛万苦、一步步的实操过来的成果。

使用一台阿里云服务器,实现违集群的模式

单机部署

在线安装

  • Redis是由C语⾔编写的,它的运⾏需要C环境,因此我们需要先安装gcc。

    # 检查版本
    gcc --version
    # 安装 gcc
    yum install gcc
    

  • 使用wget下载安装包

    # 创建文件夹
    mkdir -p /soft/redis
    # 切换文件夹
    cd /soft/redis
    # 下载文件  最新稳定版本
    wget https://download.redis.io/redis-stable.tar.gz
    # 解压文件
    tar -zxvf redis-stable.tar.gz
    
  • 编译、安装

    # 切换到解压目录
    cd /soft/redis/redis-stable
    # 编译
    make
    # 安装到指定的目录下
    make PREFIX=/soft/redis/redis-stable install
    
  • 更改配置文件

    # 切换到redis 安装目录
     cd /soft/redis/redis-stable
    # 更改配置文件
     vim redis.config
     
    # Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
    # 启用守护进程后,Redis会把pid写到一个pidfile中,在/var/run/redis.pid
    daemonize yes
    # 指定Redis监听端口,默认端口为6379
    # 如果指定0端口,表示Redis不监听TCP连接
    port 6379
    # Redis ip (云服务器配置的内网ip)
    bind 172.17.123.108
    # 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
    rdbcompression yes
    # 指定本地数据库文件名,默认值为dump.rdb
    dbfilename dump.rdb
    # 设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过auth <password>命令提供密码,默认关闭
    requirepass xiaoyuan 
    
  • 启动

    ./redis-server /soft/redis/redis-stable/redis.conf
    

在线安装离线包

  • Redis是由C语⾔编写的,它的运⾏需要C环境,因此我们需要先安装gcc。

    # 检查版本
    gcc --version
    # 安装 gcc
    yum install gcc
    

  • 创建目录上传redis文件

    mkdir /soft
    cd /soft
    
  • 解压redis文件

    tar -zxvf redis-7.0.4.tar.gz
    
  • 编译、安装redis

    # 切换到redis解压目录
    cd /soft/redis-7.0.4
    # 编译
    make
    # 安装到指定目录  PREFIX 指定安装目录前缀
    make PREFIX=/soft/redis-7.0.4 install
    
  • 更改配置文件

    # 切换到redis 安装目录
     cd /soft/redis-7.0.4
    # 更改配置文件
     vim redis.config
     
    # Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
    # 启用守护进程后,Redis会把pid写到一个pidfile中,在/var/run/redis.pid
    daemonize yes
    # 指定Redis监听端口,默认端口为6379
    # 如果指定0端口,表示Redis不监听TCP连接
    port 6379
    # Redis ip (云服务器配置的内网ip)
    bind 172.17.123.108
    # 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
    rdbcompression yes
    # 指定本地数据库文件名,默认值为dump.rdb
    dbfilename dump.rdb
    # 设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过auth <password>命令提供密码,默认关闭
    requirepass xiaoyuan 
    
  • 启动服务

    # 切换到启动服务路径
    cd /soft/redis-7.0.4/src
    # 启动服务
    ./redis-server /soft/redis-7.0.4/redis.conf
    

离线安装离线包

Redis是由C语⾔编写的,它的运⾏需要C环境,因此我们需要先安装gcc。但是又无法安装gcc时,可以选择以下的流程进行安装。

  • 在linux其它现成使用的redis,或者已经编译安装好的redis,进行打包。编译安装后的redis包,迁移到其它环境无需进行编译,直接使用

    # 压缩本地编译之后的安装包
    tar czvf redis-7.0.4.tar.gz redis-7.0.4/
    
  • 更改配置文件,启动

  • tar -zxvf redis-7.0.4.tar.gz
    # 更改配置文件
    vim redis.config
    # 切换到启动服务路径
    cd /soft/redis-7.0.4/src
    # 启动服务
    ./redis-server /soft/redis-7.0.4/redis.conf
    

主从部署(Master-Slave)

主从复制,是指将⼀台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(Master),后者称为从节点(Slave);数据的复制是单向的,只能由主节点到从节点。默认情况下,每台Redis服务器都是主节点;且⼀个主节点可以有多个从节点(或没有从节点),但⼀个从节点只能有⼀个主节点。

image-20241025005923916

主从复制的优势:

  • 数据冗余:主从复制实现了数据的热备份,是持久化之外的⼀种数据冗余⽅式。
  • 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是⼀种服务的冗余。
  • 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
  • 高可用:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。

主从复制的劣势:

  • 灵活性低:不能自动切换,如果主节点发生故障,从节点不能自动切换为主节点,需要人工修改配置文件;
  • 主节点压力大:所有的写操作都在主节点上进行,如果写请求量大,主节点可能会成为性能瓶颈。

部署

主节点按照单机进行部署,不需要做任何改变;从节点都需要在单机配置的基础上,添加上主节点的连接信息。配置完成后,可以再主库检查从节点信息,验证是否主从配置成功。

  • 在单机配置的基础上,slave节点的redis.config需要,添加master节点的连接信息

    # slave节点设置master节点的访问信息
    # slave节点 redis.conf 中不应该是云服务器的内网ip,而是公网ip;若还是内网ip,外部将无法访问
    replicaof 8.140.224.210 6380
    # master节点的密码(当master节点设置密码时,才将以下配置加上)
    masterauth xiaoyuan
    
  • 分别启动主、从节点

    # 启动master节点
    cd /soft/redis-stable-master/src
    ./redis-server /soft/redis-stable-master/redis.conf
    # 启动slave节点
    cd /soft/redis-stable-slave/src
    ./redis-server /soft/redis-stable-slave/redis.conf
    
  • 在master节点上验证,slave节点的信息

    cd /soft/redis-stable-master/src
    # 连接redis master节点服务
    ./redis-server -h 172.17.123.108 -p 6380 -a xiaoyuan
    # 查看 从节点信息
    info replication
    
    
    #结果显示如下 (如果connected_slaves为0的话,说明slave节点配置存在问题,或者网络不互通)
    # Replication
    role:master
    connected_slaves:2
    slave0:ip=172.17.123.108,port=6381,state=online,offset=61628,lag=1
    slave1:ip=172.17.123.108,port=6382,state=online,offset=61628,lag=1
    master_failover_state:no-failover
    master_replid:fe7fcef28aeeb3689699bb74c1ffd210c8979945
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:61642
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:61642
    

注:从节点配置master节点ip时,需为公网ip地址

哨兵部署(Sentinel)

Redis的主从架构主要用于实现数据的冗余备份和读分担,并不是为了提供高可用性。因此在系统高可用方面,单纯的主从架构,却无法很好的保证整个系统高可用。因此在主从架构的基础上,引入哨兵集群,确保主从架构的高可用性。

哨兵原理

Redis哨兵模式是通过在独立的哨兵节点上运行特定的哨兵进程来实现的。这些哨兵进程监控主从节点的状态,并在发现故障时自动完成故障发现和转移,并通知应用方,实现高可用性。

image-20241024133152866

哨兵工作原理

在启动时,每个哨兵节点会执⾏选举过程,其中⼀个哨兵节点被选为领导者(leader),负责协调其他哨兵节点。哨兵节点除了监控主从节点健康状态,让其下线;还会等到节点恢复之后,让其上线。

选举

每个在线的哨兵节点都可以成为领导者,每个哨兵节点会向其它哨兵发is-master-down-by-addr命令,征求判断并要求将自己设置为领导者;
当其它哨兵收到此命令时,可以同意或者拒绝它成为领导者;如果哨兵发现自己在选举的票数大于等于sentinelsNumber/2+1时,将成为领导者,如果没有超过,继续选举。

注:一般哨兵集群,设置哨兵个数为奇数。

监控

哨兵节点通过发送命令周期性地检查主从节点的健康状态(心跳检测),包括主节点是否在线、从节点是否同步等。如果哨兵节点发现主节点不可用,它会触发⼀次故障转移。

故障转移

⼀旦主节点被判定为不可用,哨兵节点会执执行故障转移操作。它会从当前的从节点中选出⼀个新的主节点,并将其他从节点切换到新的主节点。这样,系统可以继续提供服务而无需人工介入。

故障转移过程
  1. 由哨兵节点定期监控发现主节点是否出现了故障;
  2. 哨兵节点会向master节点发送心跳,PING来确认master节点是否存活;
  3. master节点在“⼀定时间范围”内不回应哨兵节点PING 或者是回复错误消息;
  4. 哨兵节点会主观的(单方面的)认为这个master节点已经不可用了。
确认主节点
  1. 过滤掉不健康的(下线或断线),没有回复过哨兵节点PING响应的从节点;
  2. 选择从节点优先级最高的;
  3. 选择复制偏移量最大,此指复制最完整的从节点;
  4. 当主节点出现故障, 由领导者负责处理主节点的故障转移。
客户端重定向

哨兵节点会通知客户端新的主节点的位置,使其能够与新的主节点建立连接并发送请求。这确保了客户端可以无缝切换到新的主节点,继续进行操作。

部署

在主从架构部署的基础上,对主从节点的sentinel.conf文件,进行以下更改。各个哨兵的配置其实都是一样,配置上主节点的连接,认证信息就好。

# 启用守护进程后
daemonize yes
# 哨兵服务的端口
port 26380
# 哨兵进程的id文件
pidfile “/var/run/redis-sentinel-26380.pid”
# 哨兵日志文件配置路径
logfile “/soft/redis-stable-master/redis-sentinel.log”
# 哨兵的工作目录
dir “/soft/redis-stable-master/redis-sentinel-working”
# 连接master主节点的连接信息
# 最后的2的含义与主节点的故障判定有关:⾄少需要2个哨兵节点同意,才能判定主节点故障并进⾏故障转移
# 哨兵模式下的 sentinel.conf 中不应该是云服务器的内网ip,而是公网ip;若还是内网ip,外部访问哨兵时将无法访问
sentinel monitor mymaster 8.140.224.210 6380 2
# 连接master主节点的认证密码
sentinel auth-pass mymaster xiaoyuan
# 判定服务器down掉的时间周期,默认30000毫秒
sentinel down-after-milliseconds mymaster 30000
# 故障节点的最⼤超时时间,默认180000毫秒
sentinel failover-timeout mymaster 180000

除了配置各个节点哨兵的sentinel.conf文件之外,还需要更改redis master和slave节点的redis.config文件

# 将从节点只读的属性关闭;在哨兵模式下,任何节点又有可能成为master、或者slave节点
replica-read-only no

以上各个哨兵、redis节点配置好之后,先启动主从节点服务,再启动各个哨兵

# 启动redis
cd /soft/redis-stable-master/src
./redis.server /soft/redis-stable-master/redis.config
cd /soft/redis-stable-slave/src
./redis.server /soft/redis-stable-slave/redis.config
cd /soft/redis-stable-slave02/src
./redis.server /soft/redis-stable-slave02/redis.config
# 启动哨兵
cd /soft/redis-stable-master/src
./sentinel.server /soft/redis-stable-master/sentinel.config
cd /soft/redis-stable-slave/src
./sentinel.server /soft/redis-stable-slave/sentinel.config
cd /soft/redis-stable-slave02/src
./sentinel.server /soft/redis-stable-slave02/sentinel.config

检查redis主从服务,哨兵服务是否启动

ps -ef |grep redis
root      3912     1 55 17:48 ?        00:00:52 ./redis-server 172.17.123.108:6380    //主
root      3926     1  0 17:49 ?        00:00:00 ./redis-server 172.17.123.108:6381    //从
root      3945     1 37 17:49 ?        00:00:23 ./redis-server 172.17.123.108:6382    //从
root      3961     1  0 17:49 ?        00:00:00 ./redis-sentinel *:26380 [sentinel]   //哨兵
root      3981     1  0 17:50 ?        00:00:00 ./redis-sentinel *:26381 [sentinel]   //哨兵
root      3995     1  0 17:50 ?        00:00:00 ./redis-sentinel *:26382 [sentinel]   //哨兵

易忽略点:

  1. 哨兵配置中,master节点的IP,在存在公网时,不应该为内网IP
  2. 原始master、slave节点的 redis.config,全都需要将从节点只读配置关闭

集群部署(Cluster)

Redis 集群是 Redis 的⼀种分布式运行模式,它通过分片(sharding)来提供数据的自动分区和管理,从而实现数据的高可用性和可扩展性。
在集群模式下,数据被分割成多个部分(称为槽或slots),分布在多个 Redis 节点上。
集群中的节点分为主节点和从节点:主节点负责读写请求和集群信息的维护;从节点只进行主节点数据和状态信息的复制。

image-20241025005858198

集群的优势:

  • 数据分区:数据分区(数据分片)是集群最核心的功能。 集群将数据分散到多个节点,一方面突破了Redis单机内存大小的限制,存储容量大大增加;另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力。
  • 高可用:集群支持主从复制和主节点的自动故障转移(与哨兵类似);当任⼀节点发生故障时,集群仍然可以对外提供服务。

数据分区

Redis集群引入了哈希槽的概念 Redis集群有16384个哈希槽(0-16383) 集群的每个节点负责⼀部分哈希槽 每个Key通过CRC16校验后对16384取余来决定放置哪个哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。

以3个节点组成的集群为例: 节点A包含0到5460号哈希槽;节点B包含5461到10922号哈希槽;节点C包含10923到16383号哈希槽。
Redis集群的主从复制模型 集群中具有A、B、C三个节点,如果节点B失败了,整个集群就会因缺少5461-10922这个范围的槽而不可以用。
为每个节点添加⼀个从节点A1、B1、C1整个集群便有三个Master节点和三个slave节点组成,在节点B失败后,集群选举B1位为的主节点继续服务。

部署

与单机模式一样的变更redis.config的配置信息之外,额外多更改cluster的配置信息;依次更改redis-6001.config、redis-6002.config、redis-6003.config、redis-6004.config、redis-6005.config、redis-6006.config的配置。

# Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
# 启用守护进程后,Redis会把pid写到一个pidfile中,在/var/run/redis.pid
daemonize yes
# 指定Redis监听端口,默认端口为6379
# 如果指定0端口,表示Redis不监听TCP连接
port 6001
# Redis ip (云服务器配置的内网ip)
bind 172.17.123.108
# 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
rdbcompression yes
# 指定本地数据库文件名,默认值为dump.rdb
dbfilename dump-6001.rdb
# 设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过auth <password>命令提供密码,默认关闭
requirepass xiaoyuan 

# 在单机的基础上 配置以下集群配置项
# 集群模式打开
cluster-enabled yes
# 生成node文件
cluster-config-file nodes-6001.conf
# 超时时间
cluster-node-timeout 15000

依次启动6001、6002、6003、6004、6005、6006

cd /soft/redis-cluster/redis-stable/src
./redis-server ../redis-6001.conf
./redis-server ../redis-6002.conf
./redis-server ../redis-6003.conf
./redis-server ../redis-6004.conf
./redis-server ../redis-6005.conf
./redis-server ../redis-6006.conf

启动后,依次连接上各个端口的redis服务,发现都是单机的服务

cd /soft/redis-cluster/redis-stable/src
./redis-cli -h 172.17.123.108 -p 6001 -a xiaoyuan

info replication
# 会发现各个服务都是单机服务

# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:ec49edfd6f527c783c59000719b4c145c0a28a58
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

创建集群

# -a 密码  --cluster-replicas 1 集群下一个主节点只跟一个从节点 ip:port 应该为公网ip
./redis-cli --cluster create -a xiaoyuan --cluster-replicas 1 8.140.224.210:6001 8.140.224.210:6002 8.140.224.210:6003 8.140.224.210:6004 8.140.224.210:6005 8.140.224.210:6006

在创建集群时,出现以下情况时(持续等待状态 waiting)

Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 3 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
M: 71d43d6c2c5a7685a0a8f693c84d42523d2af718 8.140.224.210:6001
   slots:[0-5460] (5461 slots) master
M: dfd40fa091176efb09ea3ee28818edddfc0dd791 8.140.224.210:6002
   slots:[5461-10922] (5462 slots) master
M: 22aca4140fd94bc640912575e9e4802a865643ba 8.140.224.210:6003
   slots:[10923-16383] (5461 slots) master
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................

说明集群总线的端口没有放开,需要将总线的端口开放。集群总线端口=节点端口+10000,也就是16001,16002,16003,16004,16005,16006端口开放(安全组策略释放;或者防火墙释放)。当释放后,集群迅速搭建完成。

Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 3 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
M: 71d43d6c2c5a7685a0a8f693c84d42523d2af718 8.140.224.210:6001
   slots:[0-5460] (5461 slots) master
M: dfd40fa091176efb09ea3ee28818edddfc0dd791 8.140.224.210:6002
   slots:[5461-10922] (5462 slots) master
M: 22aca4140fd94bc640912575e9e4802a865643ba 8.140.224.210:6003
   slots:[10923-16383] (5461 slots) master
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join

>>> Performing Cluster Check (using node 8.140.224.210:6001)
M: 71d43d6c2c5a7685a0a8f693c84d42523d2af718 8.140.224.210:6001
   slots:[0-5460] (5461 slots) master
M: 22aca4140fd94bc640912575e9e4802a865643ba 8.140.224.210:6003
   slots:[10923-16383] (5461 slots) master
M: dfd40fa091176efb09ea3ee28818edddfc0dd791 8.140.224.210:6002
   slots:[5461-10922] (5462 slots) master
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

注:集群模式下,都只有一个db0库。在set 设置键值对时,自动的切换对应的节点进行存储。

重启

当将各个节点服务停到,集群服务也停掉了。当我们按照启动的步骤重启redis各个节点,然后启动集群时发现出现了以下错误

[root@iZ2zee1rd1atxz543lbnbcZ redis-7.0.4]# ./src/redis-cli --cluster create -a xiaoyuan --cluster-replicas 0 8.140.224.210:6001 8.140.224.210:6002 8.140.224.210:6003
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
[ERR] Node 8.140.224.210:6001 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.

解决方案:需要将持久化存储文件rdb、aof文件删除;再将集群文件 cluster-config-file 删除,我的是将nodes-*.conf删除,再次重启各个节点redis服务和集群服务

rm -rf nodes-6001.conf
rm -rf nodes-6002.conf
rm -rf nodes-6003.conf
./redis-server ../redis-6001.conf
./redis-server ../redis-6002.conf
./redis-server ../redis-6003.conf
./redis-server ../redis-6004.conf
./redis-server ../redis-6005.conf
./redis-server ../redis-6006.conf
./redis-cli --cluster create -a xiaoyuan --cluster-replicas 1 8.140.224.210:6001 8.140.224.210:6002 8.140.224.210:6003 8.140.224.210:6004 8.140.224.210:6005 8.140.224.210:6006
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值