Redis-Clusteraufbau (basierend auf 6.x)

1. CentOS-Installationsabhängigkeiten

1. Centos-Systemversion:

[root@dn3 redis-6.0.8]# lsb_release -a
LSB Version:    :core-4.1-amd64:core-4.1-noarch
Distributor ID: CentOS
Description:    CentOS Linux release 7.7.1908 (Core)
Release:        7.7.1908
Codename:       Core

2. Laden Sie das Redis-Quellinstallationspaket herunter

# 下载redis安装包
wget -c http://download.redis.io/releases/redis-6.0.8.tar.gz

3. Installieren Sie die Redis-Abhängigkeitsbibliothek

# 安装redis依赖组件
yum -y install gcc
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
scl enable devtoolset-9 bash
# 启动gcc
echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile
yum -y install tcl

4. Installieren Sie Redis

cd /opt/software

# 解压并编译redis源码包
tar xzf redis-6.0.8.tar.gz -C /opt/module

cd redis-6.0.8

make PREFIX=/usr/local/redis install

5. Der Standalone-Modus startet den Redis-Test

# 启动redis server
[root@dn3 redis-6.0.8]# src/redis-server 
16109:C 24 Jul 2022 16:43:23.076 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
16109:C 24 Jul 2022 16:43:23.076 # Redis version=6.0.8, bits=64, commit=00000000, modified=0, pid=16109, just started
16109:C 24 Jul 2022 16:43:23.076 # Warning: no config file specified, using the default config. In order to specify a config file use src/redis-server /path/to/redis.conf
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 6.0.8 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 16109
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

16109:M 24 Jul 2022 16:43:23.078 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
16109:M 24 Jul 2022 16:43:23.078 # Server initialized
16109:M 24 Jul 2022 16:43:23.078 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo madvise > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled (set to 'madvise' or 'never').
16109:M 24 Jul 2022 16:43:23.078 * Ready to accept connections

# 这种启动方式不好,手动执行Ctrl+c关闭
^C16109:signal-handler (1658653088) Received SIGINT scheduling shutdown...
16109:M 24 Jul 2022 16:58:08.970 # User requested shutdown...
16109:M 24 Jul 2022 16:58:08.970 * Saving the final RDB snapshot before exiting.
16109:M 24 Jul 2022 16:58:08.975 * DB saved on disk
16109:M 24 Jul 2022 16:58:08.975 # Redis is now ready to exit, bye bye...

Beschreibung des Redis-Daemonize-Parameters:
A. Der Daemonize-Daemon-Thread in der Konfigurationsdatei redis.conf ist standardmäßig NO.
B. daemonize wird verwendet, um anzugeben, ob Redis als Daemon-Thread gestartet werden soll.

Daemonize setzt Ja oder Nein, um zwischen
Daemonize zu unterscheiden: Ja: Redis verwendet einen Einzelprozess-Multithread-Modus. Wenn die Option daemonize in redis.conf auf „yes“ gesetzt ist, bedeutet dies, dass der Daemon-Modus aktiviert ist. In diesem Modus wird Redis im Hintergrund ausgeführt und schreibt die Prozess-PID-Nummer in die Datei, die durch die redis.conf-Option pidfile festgelegt wird. Zu diesem Zeitpunkt wird Redis immer ausgeführt, es sei denn, der Prozess wird manuell beendet.
daemonize: no: Wenn die Daemonize-Option auf no gesetzt ist, wird die aktuelle Schnittstelle in die Befehlszeilenschnittstelle von Redis eingegeben, und das erzwungene Beenden von Exit oder das Schließen von Verbindungstools (Putty, Xshell usw.) führt zum Redis-Prozess beenden.

Standalone-Modus läuft im Hintergrund:

[root@dn3 redis-6.0.8]# /opt/module/redis-6.0.8/src/redis-server /opt/module/redis-6.0.8/redis.conf 
[root@dn3 redis-6.0.8]# 

# 进入客户端
[root@dn3 redis-6.0.8]# /usr/local/redis/bin/redis-cli -h localhost -p 6379
localhost:6379> keys *
(empty array)

# 插入数据后,再次查询
localhost:6379> keys *
1) "DIM:DIM_BASE_CATEGORY1:19"
localhost:6379> get "DIM:DIM_BASE_CATEGORY1:19"
"{
    
    \"ID\":\"19\",\"NAME\":\"ECHO\"}"
localhost:6379> 

# 去除json中的转义字符(redis-cli命令后添加--raw参数)
[root@dn3 redis-6.0.8]# /usr/local/redis/bin/redis-cli -h localhost -p 6379 --raw
localhost:6379> keys *
DIM:DIM_BASE_CATEGORY1:19
localhost:6379> get "DIM:DIM_BASE_CATEGORY1:19"
{
    
    "ID":"19","NAME":"ECHO"}

# 测试ttl
localhost:6379> expire DIM:DIM_BASE_CATEGORY1:19 10
1

localhost:6379> ttl "DIM:DIM_BASE_CATEGORY1:19"
9
localhost:6379> ttl "DIM:DIM_BASE_CATEGORY1:19"
7
localhost:6379> ttl "DIM:DIM_BASE_CATEGORY1:19"
6
localhost:6379> ttl "DIM:DIM_BASE_CATEGORY1:19"
1
localhost:6379> ttl "DIM:DIM_BASE_CATEGORY1:19"
0
localhost:6379> ttl "DIM:DIM_BASE_CATEGORY1:19"
-2
localhost:6379> ttl "DIM:DIM_BASE_CATEGORY1:19"
-2

So legen Sie fest, dass der Fernzugriff zulässig ist:

  • Kommentar hinzufügen (standardmäßig deaktiviert): bind 127.0.0.1 ::1
  • Kommentar hinzufügen (standardmäßig geöffnet): #bind 127.0.0.1
  • Der geschützte Modus ist auf Nein eingestellt (Standard: Ja): Protected-Mode-Nr
################################## NETWORK #####################################

# By default, if no "bind" configuration directive is specified, Redis listens
# for connections from all the network interfaces available on the server.
# It is possible to listen to just one or multiple selected interfaces using
# the "bind" configuration directive, followed by one or more IP addresses.
#
# Examples:
#
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1 ::1
#
# ~~~ WARNING ~~~ If the computer running Redis is directly exposed to the
# internet, binding to all the interfaces is dangerous and will expose the
# instance to everybody on the internet. So by default we uncomment the
# following bind directive, that will force Redis to listen only into
# the IPv4 loopback interface address (this means Redis will be able to
# accept connections only from clients running into the same computer it
# is running).
#
# 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.
#
# When protected mode is on and if:
#
# 1) The server is not binding explicitly to a set of addresses using the
#    "bind" directive.
# 2) No password is configured.
#
# The server only accepts connections from clients connecting from the
# IPv4 and IPv6 loopback addresses 127.0.0.1 and ::1, and from Unix domain
# sockets.
#
# 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 no

# 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

2. Verteilte Clusterkonfiguration

Der Standalone-Modus wird in der PROD-Umgebung nicht verwendet und im Allgemeinen muss eine Cluster-Umgebung konfiguriert werden.
Hier muss in Experiment 3 der Redis-Cluster im Master- und 3-Slave-Modus 6 Redis-Instanzen starten und auf 3 Servern bereitstellen bzw. (wenn die Anzahl der Maschinen gering ist, können Sie auch die Simulation verwenden, indem Sie unterschiedliche Portnummern auf einem Server angeben), jeder Server startet zwei Redis-Instanzen (einen Master und einen Slave), die Portnummer der Master-Instanz ist 7000, und die Portnummer der Slave-Instanz ist 7001.

1. Ändern Sie die Redis-Konfigurationsdatei

cd /usr/local/redis-6.0.8
# 编辑redis配置文件,修改以下配置信息:
vim redis.conf

# 后台方式运行redis
daemonize yes
# redis server运行端口号,配置文件拷贝到redisCluster文件中后这里的端口号要根据实际情况修改
port 7000
# bind 127.0.0.1 要改成0.0.0.0,不然redis客户端无法通过ip连接服务端
bind 0.0.0.0

# 在 REDIS CLUSTER 配置模块下开启以下配置
# 开启redis集群支持
cluster-enabled yes
# 集群配置文件,redis首次启动时会在redis.conf所在的文件夹下自动创建该文件,注意这里的node-7000.conf要根据实例启动的端口号自行修改
cluster-config-file node-7000.conf
# pidfile的端口号也需要根据实际启动的端口号自行修改
pidfile /var/run/redis_7000.pid
# 请求超时时间
cluster-node-timeout 15000

2. Erstellen Sie ein Redis-Instanzverzeichnis

# 创建redis主从实例文件夹
mkdir -p /usr/local/redisCluster/7000
mkdir -p /usr/local/redisCluster/7001

# 拷贝配置文件到redisCluster文件夹中,并各自修改配置文件的port, cluster-config-file 这两个参数
cp /usr/local/redis-6.0.8/redis.conf /usr/local/redisCluster/7000
cp /usr/local/redis-6.0.8/redis.conf /usr/local/redisCluster/7001

# 拷贝redis目录下的bin目录文件到redisCluster文件夹中
cp -r /usr/local/redis/bin/ /usr/local/redisCluster/7000
cp -r /usr/local/redis/bin/ /usr/local/redisCluster/7001

# 将redis-server,  redis-cli拷贝到RedisCluster目录下,便于启动服务和通过客户端连接
cp /usr/local/redis-6.0.8/src/redis-server /usr/local/redisCluster/
cp /usr/local/redis-6.0.8/src/redis-cli /usr/local/redisCluster/

3. Erstellen Sie ein Redis-Cluster-Startskript

Starten Sie die Redis-Instanz auf jedem Server separat:

Umgebungsvariablen hinzufügen

# 将redis添加到系统变量中
vim /etc/profile

export REDIS_HOME=/usr/local/redis
export PATH=$PATH:$REDIS_HOME/bin

# 生效环境变量
source /etc/profile

Erstellen Sie die Redis-Cluster-Startdatei
vim /usr/local/redisCluster/start.sh

# 集群启动脚本内容
cd /usr/local/redisCluster
./redis-server /usr/local/redisCluster/7000/redis.conf
./redis-server /usr/local/redisCluster/7001/redis.conf

4. Führen Sie den Redis-Cli-Redis-Cluster-Startbefehl aus

Nachdem alle Redis-Instanzen ausgeführt wurden, können neue Redis-Versionen (über 5.0) redis-cli direkt zum Erstellen von Clustern verwenden, und Redis-Versionen unter 5.0 können Cluster nur über das Tool redis-trib.rb erstellen.

# 创建redis集群,运行命令后会有一个确认的提示,必须输入 yes 才能创建集群
./redis-cli --cluster create dn3:7000 dn3:7001 dn4:7000 dn4:7001 dn5:7000 dn5:7001 --cluster-replicas 1

# 连接redis集群,命令格式:redis-cli -h <ip> -p <port> -a <password>
./redis-cli -h dn3 -p 7000
# 查看当前集群信息
127.0.0.1:7000> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:473
cluster_stats_messages_pong_sent:464
cluster_stats_messages_sent:937
cluster_stats_messages_ping_received:459
cluster_stats_messages_pong_received:473
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:937

# 查看当前集群有多少个节点
127.0.0.1:7000> cluster nodes
c8ac621fcd7a85cb468883bc46e524d349a8c487 dn4:7001@17001 slave 8cde20f19ae9b72c92cbfe6eb5df622a87aa4417 0 1600680450000 1 connected
648728286cc40550017169ce80795ebd72d1805e dn5:7000@17000 master - 0 1600680451376 5 connected 10923-16383
fa24f272828f84d0862665f33b16e292c514944e dn5:7001@17001 slave 5e5bf132bce0fef67cb86d4f0923c317bc9a949c 0 1600680449371 3 connected
5e5bf132bce0fef67cb86d4f0923c317bc9a949c dn4:7000@17000 master - 0 1600680451000 3 connected 5461-10922
8cde20f19ae9b72c92cbfe6eb5df622a87aa4417 dn3:7000@17000 myself,master - 0 1600680450000 1 connected 0-5460
85835667da45edea2a74bae3d0c817a8681fcfe1 dn3:7001@17001 slave 648728286cc40550017169ce80795ebd72d1805e 0 1600680452378 5 connected

5. Legen Sie das Passwort für die Clusterverbindung fest

Führen Sie den folgenden Befehl auf allen Redis-Servern aus:

Konfigurationssatz Masterauth 123456
Konfigurationssatz Requirepass 123456

Nachdem der Befehl ausgeführt wurde,
werden diese beiden Kennwortparameterkonfigurationen automatisch am Ende der Datei redis.conf hinzugefügt, und die Kennwortänderung kann ohne Neustart des Redis-Dienstes abgeschlossen werden. Hinweis:
Wenn es sich um einen Redis-Cluster handelt, stellen Sie sicher, dass die Die Passwörter aller Dienste sind gleich, andernfalls ist die dienstübergreifende Verbindung abnormal.

# 如果对集群设置密码,requirepass和masterauth都需要设置,否则发生主从切换时,就会遇到授权问题
# 连接命名格式:./redis-cli -c -p <port> -a <password>
## 示例: ./redis-cli -h 10.0.27.38 -c -p 7000 -a 123456
127.0.0.1:7000> config set masterauth 123456
OK
127.0.0.1:7000> config set requirepass 123456
OK
127.0.0.1:7000> config rewrite
OK

3. Betrieb und Wartung des Redis-Clusters

1. Stellen Sie Redis so ein, dass es beim Booten automatisch startet

cd /etc/init.d/

vim redis.sh
#!/bin/sh
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.
# chkconfig: 2345 80 90
# description: redis start up script

REDISPORT0=7000
REDISPORT1=7001
EXEC=/usr/local/redisCluster/redis-server
CLIEXEC=/usr/local/redisCluster/redis-cli

case "$1" in
    start)
        CONF="/usr/local/redisCluster/${REDISPORT0}/redis.conf"
        echo "Starting Redis server on $REDISPORT0..."
        $EXEC $CONF &
!
        CONF="/usr/local/redisCluster/${REDISPORT1}/redis.conf"
        echo "Starting Redis server on $REDISPORT1..."
        $EXEC $CONF &
!
        ;;
stop)
    es_pid=`ps -aux|grep redis|grep ${
     
     REDISPORT0}|grep -v grep|awk '{print $2}'`
    kill -9 $es_pid
    echo "$REDISPORT0 stopped"
    es_pid=`ps -aux|grep redis|grep ${
     
     REDISPORT1}|grep -v grep|awk '{print $2}'`
    kill -9 $es_pid
    echo "$REDISPORT1 stopped"
    ;;
*)
    echo "start|stop"
    ;;
esac

exit $?

2. Fügen Sie dem Skript ausführbare Berechtigungen hinzu und treten Sie dem Startdienst bei

# 给启动脚本添加可执行权限
chmod +x /etc/init.d/redis
# 注册为系统服务
chkconfig --add redis
# 列出名字为redis的系统服务
chkconfig --list redis
# 设置为开机运行服务
chkconfig redis on

Viertens die bei der Installation aufgetretenen Probleme

1. Fehler beim Herstellen einer Verbindung zum Redis-Cluster: (Fehler) CLUSTERDOWN Der Cluster ist ausgefallen

Führen Sie den Cluster-Info-Befehl aus, um festzustellen, dass der Status des Knotens „Fehler“ ist (nicht alle Knotenstatus sind „Fehler“, nur der Status eines abnormalen Knotens mit Befehlsausführung ist „Fehler“, der Rückgabestatus anderer normaler Knoten mit Befehlsausführung ist „OK“, alle müssen alle Knoten überprüfen).

Lösung:
Wenn in Redis keine wichtigen Daten vorhanden sind, können Sie den Redis-Cluster neu erstellen.

Schritte zur Neuerstellung:

  • 1. Sie können zunächst alle Redis-Dienste stoppen;
  • 2. Löschen Sie die nodes-7000.conf unter allen Knoten (der Name der Datei wird gemäß der Cluster-Config-File-Konfiguration in der Konfigurationsdatei redis.config festgelegt), dump.rdb zwei Dateien;
  • 3. Starten Sie alle Redis-Knotendienste neu und erstellen Sie den Cluster neu: ./redis-cli --cluster create dn3:7000 dn3:7001 dn4:7000 dn4:7001 dn5:7000 dn5:7001 --cluster-replicas 1 -a

おすすめ

転載: blog.csdn.net/liuwei0376/article/details/125955746