Redis三种集群方式安装及配置

本文详细介绍了Redis的安装过程,包括yum安装和编译安装,并讲解了主从模式、哨兵模式和集群模式的配置及工作原理。在主从模式中,数据同步和读写分离得以实现;哨兵模式提供了自动故障恢复功能;Redis-Cluster通过无中心结构实现了分布式存储和高可用性。文章还包含了故障检测、数据分配和集群管理的详细步骤。
摘要由CSDN通过智能技术生成


一、安装

注:
此处只做单节点安装,其他节点的安装跟这一步一样;
此处提供yum安装和编译安装两种方式,此文后续配置是根据编译安装完成的,yum安装方式的配置修改基本相同。

创建目录

日志文件目录

mkdir /var/log/redis

数据文件目录

mkdir /var/db/redis

配置文件目录

mkdir /etc/redis

1、yum安装

添加软件安装源

yum install epel-release

安装Redis

yum install redis -y

启动

启动Redis

systemctl start redis

启动Redis哨兵(此步只在哨兵模式时候使用)

systemctl start redis-sentinel

允许Redis开机启动

systemctl enable redis

允许Redis哨兵开机启动(此步只在哨兵模式时候使用)

systemctl enable redis-sentinel

2、编译&安装

安装编辑器

yum -y install gcc automake autoconf libtool make
yum -y install gcc gcc-c++ kernel-devel

创建安装目录

mkdir /usr/local/redis

下载(具体版本可以到Redis官网选择)

cd /usr/local/redis
wget http://download.redis.io/releases/redis-6.0.6.tar.gz

解压

tar zxvf redis-6.0.6.tar.gz

安装

cd redis-6.0.6
make
make install

修改配置文件

复制安装包下的redis配置文件到etc目录

cp /usr/local/redis/redis-6.0.6/redis.conf /etc/redis/

编辑配置文件

vim /etc/redis/redis.conf

redis默认只允许本机连接,所以需要找到“bind 127.0.0.1”并将这行注释掉:

# IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES
# JUST COMMENT THE FOLLOWING LINE.
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#bind 127.0.0.1

# Protected mode is a layer of security protection, in order to avoid that
# Redis instances left open on the internet are accessed and exploited.

redis在3.0版本以后增加了保护模式,需要设置密码,如不需要设置密码,可将“protected-mode yes”改为no,即关闭保护模式:

# By default protected mode is enabled. You should disable it only if
# you are sure you want clients from other hosts to connect to Redis
# even if no authentication is configured, nor a specific set of interfaces
# are explicitly listed using the "bind" directive.
protected-mode yes

# 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 6379

若设置密码,master和slave需同时配置下面两个参数:
masterauth:连接master的密码
requirepass:自己的密码(在配置集群的时候需要添加一条)

# If the master is password protected (using the "requirepass" configuration
# directive below) it is possible to tell the replica to authenticate before
# starting the replication synchronization process, otherwise the master will
# refuse the replica request.
#
masterauth Redis@2021
requirepass Redis@2021

将默认的“daemonize no”改为yes,设置redis以后台运行方式启动:

################################# 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.
daemonize yes

# If you run Redis from upstart or systemd, Redis can interact with your
# supervision tree. Options:

分别配置pid,log,db文件的保存地址,目录为我们事先创建好的相关目录:

# Creating a pid file is best effort: if Redis is not able to create it
# nothing bad happens, the server will start and run normally.

pidfile /var/run/redis_6379.pid

# Specify the server verbosity level.
# This can be one of:
# Specify the log file name. Also the empty string can be used to force
# Redis to log on the standard output. Note that if you use standard
# output for logging but daemonize, logs will be sent to /dev/null
logfile /var/log/redis/redis.log

# The Append Only File will also be created inside this directory.
#
# Note that you must specify a directory here, not a file name.
dir /var/db/redis/

################################# REPLICATION #################################

创建启动脚本

vim /etc/init.d/redis

添加以下配置

#!/bin/sh
# 
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.

### BEGIN INIT INFO
# Provides:     redis_6379
# Default-Start:        2 3 4 5
# Default-Stop:         0 1 6
# Short-Description:    Redis data structure server
# Description:          Redis data structure server. See https://redis.io
### END INIT INFO
PATH=/usr/local/redis/redis-6.0.6/bin:/sbin:/usr/bin:/bin

REDISPORT=6379
EXEC=/usr/local/bin/redis-server
CLIEXEC=/usr/local/bin/redis-cli

PIDFILE=/var/run/redis.pid
CONF="/etc/redis/redis.conf"

case "$1" in
    start)
        if [ -f $PIDFILE ]
        then
                echo "$PIDFILE exists, process is already running or crashed"
        else
                echo "Starting Redis server..."
                $EXEC $CONF
        fi
        ;;
    stop)
        if [ ! -f $PIDFILE ]
        then
                echo "$PIDFILE does not exist, process is not running"
        else
                PID=$(cat $PIDFILE)
                echo "Stopping ..."
                $CLIEXEC -p $REDISPORT shutdown
                while [ -x /proc/${PID} ]
                do
                    echo "Waiting for Redis to shutdown ..."
                    sleep 1
                done
                echo "Redis stopped"
        fi
        ;;
    *)
        echo "Please use start or stop as first argument"
        ;;
esac

设置服务权限并配置为可执行文件

chmod 777 /etc/init.d/redis
chown root:root /etc/init.d/redis

启动并设置开机自启

启动

service redis start

查看

redis-cli

设置开机自启

chkconfig redis on

二、主从模式

主从复制原理:

从服务器连接主服务器,发送SYNC命令;
主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;(从服务器初始化完成)
主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令(从服务器初始化完成后的操作)
主从复制优缺点:

优点:

支持主从复制,主机会自动将数据同步到从机,可以进行读写分离
为了分载Master的读操作压力,Slave服务器可以为客户端提供只读操作的服务,写服务仍然必须由Master来完成
Slave同样可以接受其它Slaves的连接和同步请求,这样可以有效的分载Master的同步压力。
Master Server是以非阻塞的方式为Slaves提供服务。所以在Master-Slave同步期间,客户端仍然可以提交查询或修改请求。
Slave Server同样是以非阻塞的方式完成数据同步。在同步期间,如果有客户端提交查询请求,Redis则返回同步之前的数据

缺点:

Redis不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。
主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。
Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。

实现

主节点(172.16.12.101)与从节点(172.16.12.102)(172.16.12.103)均按照步骤二安装redis

从节点配置

修改redis配置文件,添加一行配置“slaveof 192.168.0.101 6379”映射到主节点

vi /opt/redis-5.0.0/redis.conf

slaveof 172.16.12.101 6379

重启从节点的redis

service redis stop
service redis start

或:

service redis restart

三、哨兵模式

当主服务器中断服务后,可以将一个从服务器升级为主服务器,以便继续提供服务,但是这个过程需要人工手动来操作。 为此,Redis 2.8中提供了哨兵工具来实现自动化的系统监控和故障恢复功能。
哨兵的作用就是监控Redis系统的运行状况。它的功能包括以下两个。
(1)监控主服务器和从服务器是否正常运行。
(2)主服务器出现故障时自动将从服务器转换为主服务器。

工作方式:

每个Sentinel(哨兵)进程以每秒钟一次的频率向整个集群中的Master主服务器,Slave从服务器以及其他Sentinel(哨兵)进程发送一个 PING 命令。
如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被 Sentinel(哨兵)进程标记为主观下线(SDOWN)
如果一个Master主服务器被标记为主观下线(SDOWN),则正在监视这个Master主服务器的所有 Sentinel(哨兵)进程要以每秒一次的频率确认Master主服务器的确进入了主观下线状态
当有足够数量的 Sentinel(哨兵)进程(大于等于配置文件指定的值)在指定的时间范围内确认Master主服务器进入了主观下线状态(SDOWN), 则Master主服务器会被标记为客观下线(ODOWN)
在一般情况下, 每个 Sentinel(哨兵)进程会以每 10 秒一次的频率向集群中的所有Master主服务器、Slave从服务器发送 INFO 命令。
当Master主服务器被 Sentinel(哨兵)进程标记为客观下线(ODOWN)时,Sentinel(哨兵)进程向下线的 Master主服务器的所有 Slave从服务器发送 INFO 命令的频率会从 10 秒一次改为每秒一次。
若没有足够数量的 Sentinel(哨兵)进程同意 Master主服务器下线, Master主服务器的客观下线状态就会被移除。若 Master主服务器重新向 Sentinel(哨兵)进程发送 PING 命令返回有效回复,Master主服务器的主观下线状态就会被移除。
哨兵模式的优缺点

优点:

哨兵模式是基于主从模式的,所有主从的优点,哨兵模式都具有。
主从可以自动切换,系统更健壮,可用性更高。

缺点:

Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。

实现

创建Sentinel目录

mkdir /etc/redis-sentinel

复制配置文件

cp cp /usr/local/redis/redis-6.0.6/sentinel.conf /etc/redis-sentinel/

修改配置文件

vim /etc/redis-sentinel/sentinel.conf

daemonize yes
dir "/var/db/redis/"
logfile "sentinel.log"
sentinel monitor mymaster 172.16.12.101 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000

启动sentinel

./redis-sentinel /etc/redis-sentinel/sentinel.conf

当我们的 哨兵启动完成后自动将redis的slave节点和其他的哨兵节点的信息写入到其配置文件中,也就是哨兵的配置文件发生了变化

四、Redis-Cluster集群

redis的哨兵模式基本已经可以实现高可用,读写分离 ,但是在这种模式下每台redis服务器都存储相同的数据,很浪费内存,所以在redis3.0上加入了cluster模式,实现的redis的分布式存储,也就是说每台redis节点上存储不同的内容。
Redis-Cluster采用无中心结构,它的特点如下:
所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
节点的fail是通过集群中超过半数的节点检测失效时才生效。
客户端与redis节点直连,不需要中间代理层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。

工作方式:

在redis的每一个节点上,都有这么两个东西,一个是插槽(slot),它的的取值范围是:0-16383。还有一个就是cluster,可以理解为是一个集群管理的插件。当我们的存取的key到达的时候,redis会根据crc16的算法得出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。
为了保证高可用,redis-cluster集群引入了主从模式,一个主节点对应一个或者多个从节点,当主节点宕机的时候,就会启用从节点。当其它主节点ping一个主节点A时,如果半数以上的主节点与A通信超时,那么认为主节点A宕机了。如果主节点A和它的从节点A1都宕机了,那么该集群就无法再提供服务了。

实现

redis官方已经redis-trib.rb命令来给我们实现redis搭建了。但是为了了解原理,首先我们用“方法一”来手动搭建不使用官方的命令。如果大家想快速搭建,可以直接跳过,使用官方提供的“方法二”。

单节点安装

要让集群正常运行至少需要三个主节点,所以Redis-Cluster集群实现就要使用六个节点: 其中三个为主节点, 而其余三个则是各个主节点的从节点。单节点的安装采用步骤一的方法。

修改配置文件

aof日志开启,它会每次写操作都记录一条日志

# Please check http://redis.io/topics/persistence for more information.

appendonly yes

# The name of the append only file (default: "appendonly.aof")

appendfilename "appendonly.aof"

开启集群,把注释#去掉;集群配置文件首次启动自动生成;请求超时默认15秒,可自行设置;

# Normal Redis instances can't be part of a Redis Cluster; only nodes that are
# started as cluster nodes can. In order to start a Redis instance as a
# cluster node enable the cluster support uncommenting the following:
#
cluster-enabled yes

# Every cluster node has a cluster configuration file. This file is not
# intended to be edited by hand. It is created and updated by Redis nodes.
# Every Redis Cluster node requires a different cluster configuration file.
# Make sure that instances running in the same system do not have
# overlapping cluster configuration file names.
#
cluster-config-file nodes-6379.conf

# Cluster node timeout is the amount of milliseconds a node must be unreachable
# for it to be considered in failure state.
# Most other internal time limits are multiple of the node timeout.
#
cluster-node-timeout 15000

# A replica of a failing master will avoid to start a failover if its data
# looks too old.

是否需要每个节点都可用,集群才算可用,最好设置为关闭

# However sometimes you want the subset of the cluster which is working,
# to continue to accept queries for the part of the key space that is still
# covered. In order to do so, just set the cluster-require-full-coverage
# option to no.
#
cluster-require-full-coverage no

重启redis实例/查看启动状态

systemctl restart redis
systemctl status redis

在这里插入图片描述

查看redis启动模式

ps -ef | grep redis
在这里插入图片描述

集群处于失败状态,并且只感应到自己一个在集群里面,slots也没有分配

redis-cli -a Redis@2021 cluster info

在这里插入图片描述

配置集群

方法一:手动配置
添加感知

集群之间相互握手,只要一个在集群里面的机器meet了其他机器,这个集群里的其他机器也能感知到刚刚meet的集群

redis-cli -a Redis@2021 cluster meet 172.16.12.12 6379
redis-cli -a Redis@2021 cluster meet 172.16.12.13 6379
redis-cli -a Redis@2021 cluster meet 172.16.12.21 6379
redis-cli -a Redis@2021 cluster meet 172.16.12.22 6379
redis-cli -a Redis@2021 cluster meet 172.16.12.23 6379

此时,所有的机器都感知彼此的存在了,并且集群里面集群的数据增加到了6

redis-cli -a Redis@2021 cluster nodes
redis-cli -a Redis@2021 cluster info

在这里插入图片描述

设置副本

为了保证高可用,把172.16.12.21设置为172.16.12.11的从节点,把172.16.12.22设置为172.16.12.12的从节点,把172.16.12.23设置为172.16.12.13的从节点。
在172.16.12.21上执行(6a8a0294130416efa4f05bffba558501ed33d919为172.16.12.11的ID)

redis-cli -a Redis@2021 cluster replicate 6a8a0294130416efa4f05bffba558501ed33d919

在172.16.12.22上执行(e1bab52130175600fa3b94d6e8063980288348d0为172.16.12.12的ID)

redis-cli -a Redis@2021 cluster replicate e1bab52130175600fa3b94d6e8063980288348d0

在172.16.12.23上执行(14de51765e37409e3341df88fd612be14ebd41d5为172.16.12.13的ID)

redis-cli -a Redis@2021 cluster replicate 14de51765e37409e3341df88fd612be14ebd41d5

至此从节点设置成功

redis-cli -a Redis@2021 cluster nodes

在这里插入图片描述

分配slots

到目前为止,slots还是空的,并且集群处于不可用状态,因为没有分配slots

redis-cli -a Redis@2021 cluster info

在这里插入图片描述

分配槽

redis-cluster一共有16383个槽,现在分配到三个主从节点11/21的槽0——5461,12/22的槽5462——10922,13/23的槽10923——16383
在172.168.12.11上执行:

redis-cli -p 6379 -a Redis@2021 cluster addslots {0…5461}

在172.168.12.12上执行:

redis-cli -p 6379 -a Redis@2021 cluster addslots {5462…10922}

在172.168.12.13上执行:

redis-cli -p 6379 -a Redis@2021 cluster addslots {10923…16383}

验证集群

redis-cli -a Redis@2021 cluster slots

槽已经根据集群和主从分配了
在这里插入图片描述

并且集群处于可用状态
在这里插入图片描述

自此,手动搭建集群成功。关闭之后下次启动还可以是集群状态,因为信息已经持久化到dump文件里面,也就是db目录下存放的dump文件:
在这里插入图片描述

方法二:使用官方的redis-trib.rb搭建集群

使用官方的redis-trib.rb搭建集群更加简单,而请更加高效、准确

搭建ruby环境

redis-trib.rb这个命令后面是rb的,所以一看就是需要有ruby环境
安装ruby前置库

yum install -y zlib-devel
yum install -y openssl-devel

安装ruby

yum install -y ruby

安装ruby的redis的客户端
查看redis客户端的所有版本https://rubygems.org/gems/redis/versions
找到需要的redis,点进去查看具体依赖关系,看自己的版本符不符合安装要求,右下角“下载”按钮,右击复制链接地址

wget https://rubygems.org/downloads/redis-4.5.0.gem
gem install -l redis-4.5.0.gem

在这里插入图片描述
校验安装

gem list – check redis gem

注意:“–”之后有一个空格,看到如下信息,说明成功!
在这里插入图片描述

准备redis目录和配置文件

同一的第1步类似,不需要scripts目录,如果在一中手动实现过,把db和log目录下的文件删除

使用redis-trib.rb创建集群

redis-trib.rb是官方提供的Redis Cluster的管理工具,无需额外下载,默认位于源码包的src目录下

redis-trib.rb create --replicas 1 172.16.12.11:6379 172.16.12.12:6379 172.16.12.13:6379 172.16.12.21:6379 172.16.12.22:6379 172.16.12.23:6379

注:

  1. 需为真实ip,不然外网无法访问;
  2. –replicas参数指定集群中每个主节点配备几个从节点,这里设置为1;
  3. 给redis-trib.rb的节点地址必须是不包含任何槽/数据的节点,否则会拒绝创建集群

可以看到:
172.16.12.21是172.16.12.11主节点的从节点,管理槽0-5460
172.16.12.22是172.16.12.12主节点的从节点,管理槽5461-10992
172.16.12.23是172.16.12.13主节点的从节点,管理槽10992-16383

五、测试

验证主从(主从和哨兵模式)

登录主节点redis,set age 24,到从节点直接get age,看到可以get到在主节点设置的值24,说明主从配置成功
主节点:

set age 18
OK

从节点1:

get age
“18”

从节点2

get age
“18”

验证集群

其中一个主节点:
注:-c选项可以防 止moved和ask异常,在写入数据的时候会自动根据插槽选择对应节点

redis-cli -c -a Redis@2021

在这里插入图片描述
任意另一个节点:

redis-cli -c -a Redis@2021

在这里插入图片描述

验证高可用

主从和哨兵模式

关闭主节点,其中一个从节点会自动拉起成为主节点

ps -ef | grep redis
kill pid #进程号

systemctl stop redis

集群模式

在其中一个主节点查看集群信息

redis-cli -a Redis@2021 cluster nodes

在这里插入图片描述
关闭这个节点

ps -ef | grep redis
kill pid #进程号

systemctl stop redis

在这里插入图片描述
在其余任意节点上可以看到前面主节点172.16.12.22已经处于下线状态,其从节点172.16.12.12已经上线成为master节点

redis-cli -a Redis@2021 cluster nodes

在这里插入图片描述

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值