マルコ SRE 第 8 週のコースワーク

redis、lvs、nginx

1. Redis はセンチネルの原則とクラスターの実装を構築します。

1.1 セントリー

1.1.1 redis Sentinel の概要

マスター/スレーブ アーキテクチャは、MySQL のマスター/スレーブ レプリケーションと同じです。マスターとスレーブの役割の自動切り替えを実現できません。つまり、マスターに障害が発生した場合、スレーブ ノードを新しいマスター ノードに自動的に昇格させることはできません
。つまり、マスター/スレーブ レプリケーションは自動化できません。フェイルオーバー機能を実装したい場合は、
スレーブ サーバーを新しいマスター ノードに昇格させるように構成を手動で変更する必要があります。また、書き込み
操作をサポートするマスター ノードは 1 つだけです。ビジネス量が大きい場合、Redis サービスのパフォーマンスがボトルネックに達し、
解決する必要があります。 マスター/スレーブ レプリケーションには次の欠点があります。

  • ビジネスに影響を与えずにマスターとスレーブの役割を自動的に切り替える

  • Redis サービスの全体的なパフォーマンスを向上させ、より高い同時アクセスをサポートします

1.1.2 Sentinel アーキテクチャの実装

次のケースでは、1 つのマスターと 2 つのスレーブを備えた Sentinel ベースの高可用性 Redis アーキテクチャを実装します。
ここに画像の説明を挿入

1.1.3 Sentry は最初にマスター/スレーブ レプリケーションを実装する必要があります

Sentinel は Redis のマスター/スレーブ レプリケーションが実現していることを前提としています
注: マスターの設定ファイルでは masterauth とslave が同じである必要があります
すべてのマスター/スレーブ ノードの redis.conf のキー設定
例: 準備マスター/スレーブ環境構成

#在所有主从节点执行
[root@centos8 ~]#dnf -y install redis
[root@centos8 ~]#vim /etc/redis.conf
bind 0.0.0.0
masterauth "123456"
requirepass "123456"
#或者非交互执行
[root@centos8 ~]#sed -i -e 's/bind 127.0.0.1/bind 0.0.0.0/' -e 's/^# masterauth 
.*/masterauth 123456/' -e 's/^# requirepass .*/requirepass 123456/' 
/etc/redis.conf
#在所有从节点执行
[root@centos8 ~]#echo "replicaof 10.0.0.8 6379" >> /etc/redis.conf
#在所有主从节点执行
[root@centos8 ~]#systemctl enable --now redis

マスターサーバーのステータス

[root@redis-master ~]#redis-cli -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not 
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.0.0.28,port=6379,state=online,offset=112,lag=1
slave1:ip=10.0.0.18,port=6379,state=online,offset=112,lag=0
master_replid:8fdca730a2ae48fb9c8b7e739dcd2efcc76794f3
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:112
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:112
127.0.0.1:6379>

スレーブ1の構成

[root@redis-slave1 ~]#redis-cli -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
127.0.0.1:6379> REPLICAOF 10.0.0.8 6379
OK
127.0.0.1:6379> CONFIG SET masterauth "123456"
OK
127.0.0.1:6379> INFO replication
# Replication
role:slave
master_host:10.0.0.8
master_port:6379
master_link_status:up
master_last_io_seconds_ago:4
master_sync_in_progress:0
slave_repl_offset:140
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:8fdca730a2ae48fb9c8b7e739dcd2efcc76794f3
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:140
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:99
repl_backlog_histlen:42

スレーブ2の構成

[root@redis-slave2 ~]#redis-cli -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
127.0.0.1:6379> REPLICAOF 10.0.0.8 6379
OK
127.0.0.1:6379> CONFIG SET masterauth "123456"
OK
127.0.0.1:6379> INFO replication
# Replication
role:slave
master_host:10.0.0.8
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:182
slave_priority:100

1.1.4 センチネル構成の編集

Sentinel の構成
Sentinel は、実際には特別な Redis サーバーです。一部の Redis コマンドはサポートされていますが、多くのコマンドはサポートされていません。デフォルトのリスナーは
26379/tcp ポートです。Sentinel
サービスは、異なるホスト上の Redis サーバーとは別にデプロイできますが、順番にデプロイできます。コストを節約するために、通常は一緒にデプロイされます。
すべての Redis ノードは次の例と同じ構成ファイルを使用します。

#如果是编译安装,在源码目录有sentinel.conf,复制到安装目录即可,
如:/apps/redis/etc/sentinel.conf
[root@centos8 ~]#cp redis-6.2.5/sentinel.conf /apps/redis/etc/sentinel.conf
[root@centos8 ~]#chown redis.redis /apps/redis/etc/sentinel.conf 
[root@centos8 ~]#vim /etc/redis-sentinel.conf 
bind 0.0.0.0
port 26379
daemonize yes
pidfile "redis-sentinel.pid"
logfile "sentinel_26379.log"
dir "/tmp"  #工作目录
sentinel monitor mymaster 10.0.0.8 6379 2
#mymaster是集群的名称,此行指定当前mymaster集群中master服务器的地址和端口
#2为法定人数限制(quorum),即有几个sentinel认为master down了就进行故障转移,一般此值是所有
sentinel节点(一般总数是>=3的 奇数,如:3,5,7等)的一半以上的整数值,比如,总数是3,即3/2=1.5,
取整为2,是master的ODOWN客观下线的依据
sentinel auth-pass mymaster 123456
#mymaster集群中master的密码,注意此行要在上面行的下面
sentinel down-after-milliseconds mymaster 30000
#判断mymaster集群中所有节点的主观下线(SDOWN)的时间,单位:毫秒,建议3000
sentinel parallel-syncs mymaster 1
#发生故障转移后,可以同时向新master同步数据的slave的数量,数字越小总同步时间越长,但可以减轻新
master的负载压力
sentinel failover-timeout mymaster 180000
#所有slaves指向新的master所需的超时时间,单位:毫秒
sentinel deny-scripts-reconfig yes #禁止修改脚本
logfile /var/log/redis/sentinel.log

3 台の Sentinel サーバーの構成は次のとおりです。

[root@redis-master ~]#grep -vE "^#|^$" /etc/redis-sentinel.conf 
port 26379
daemonize no
pidfile "/var/run/redis-sentinel.pid"
logfile "/var/log/redis/sentinel.log"
dir "/tmp"
sentinel monitor mymaster 10.0.0.8 6379 2   #修改此行
sentinel auth-pass mymaster 123456 #增加此行
sentinel down-after-milliseconds mymaster 3000   #修改此行
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
#注意此行自动生成必须唯一,一般不需要修改,如果相同则修改此值需重启redis和sentinel服务
sentinel myid 50547f34ed71fd48c197924969937e738a39975b  
.....
# Generated by CONFIG REWRITE
protected-mode no
supervised systemd
sentinel leader-epoch mymaster 0
sentinel known-replica mymaster 10.0.0.28 6379
sentinel known-replica mymaster 10.0.0.18 6379
sentinel current-epoch 0
[root@redis-master ~]#scp /etc/redis-sentinel.conf redis-slave1:/etc/
[root@redis-master ~]#scp /etc/redis-sentinel.conf redis-slave2:/etc/

1.1.5 センチネルサービスを開始する

すべてのセンチネル サーバーを起動します

#确保每个哨兵主机myid不同,如果相同,必须手动修改为不同的值
[root@redis-slave1 ~]#vim /etc/redis-sentinel.conf
sentinel myid 50547f34ed71fd48c197924969937e738a39975c 
[root@redis-slave2 ~]#vim /etc/redis-sentinel.conf
sentinel myid 50547f34ed71fd48c197924969937e738a39975d 
[root@redis-master ~]#systemctl enable --now redis-sentinel.service
[root@redis-slave1 ~]#systemctl enable --now redis-sentinel.service
[root@redis-slave2 ~]#systemctl enable --now redis-sentinel.service

コンパイルしてインストールされている場合は、すべての Sentinel サーバーで次の操作を実行して Sentinel を起動します。

[root@redis-master ~]##vim /apps/redis/etc/sentinel.conf
bind 0.0.0.0
port 26379
daemonize yes
pidfile "redis-sentinel.pid"
Logfile "sentinel_26379.log"
dir "/apps/redis/data"
sentinel monitor mymaster 10.0.0.8 6379 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 15000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
[root@redis-master ~]#/apps/redis/bin/redis-sentinel 
/apps/redis/etc/sentinel.conf
#如果是编译安装,可以在所有节点生成新的service文件
[root@redis-master ~]#cat /lib/systemd/system/redis-sentinel.service
[Unit]
Description=Redis Sentinel
After=network.target
[Service]
ExecStart=/apps/redis/bin/redis-sentinel /apps/redis/etc/sentinel.conf --
supervised systemd
ExecStop=/bin/kill -s QUIT $MAINPID
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
#注意所有节点的目录权限,否则无法启动服务
[root@redis-master ~]#chown -R redis.redis /apps/redis/

1.1.6 Sentry サービスの検証

1.1.6.1 Sentinel サービスのポートステータスを確認する

[root@redis-master ~]#ss -ntl
State   Recv-Q Send-Q Local Address:Port Peer Address:Port        
LISTEN  0       128          0.0.0.0:22         0.0.0.0:*           
LISTEN  0       128          0.0.0.0:26379      0.0.0.0:*           
LISTEN  0       128          0.0.0.0:6379       0.0.0.0:*           
LISTEN  0       128             [::]:22           [::]:*           
LISTEN  0       128             [::]:26379         [::]:*           
LISTEN  0       128             [::]:6379         [::]:* 

1.1.6.2 セントリーログの表示

マスターのセンチネルログ

[root@redis-master ~]#tail -f /var/log/redis/sentinel.log 
38028:X 20 Feb 2020 17:13:08.702 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
38028:X 20 Feb 2020 17:13:08.702 # Redis version=5.0.3, bits=64, 
commit=00000000, modified=0, pid=38028, just started
38028:X 20 Feb 2020 17:13:08.702 # Configuration loaded
38028:X 20 Feb 2020 17:13:08.702 * supervised by systemd, will signal readiness
38028:X 20 Feb 2020 17:13:08.703 * Running mode=sentinel, port=26379.
38028:X 20 Feb 2020 17:13:08.703 # WARNING: The TCP backlog setting of 511 
cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value 
of 128.
38028:X 20 Feb 2020 17:13:08.704 # Sentinel ID is 
50547f34ed71fd48c197924969937e738a39975b
38028:X 20 Feb 2020 17:13:08.704 # +monitor master mymaster 10.0.0.8 6379 quorum 
2
38028:X 20 Feb 2020 17:13:08.709 * +slave slave 10.0.0.28:6379 10.0.0.28 6379 @ 
mymaster 10.0.0.8 6379
38028:X 20 Feb 2020 17:13:08.709 * +slave slave 10.0.0.18:6379 10.0.0.18 6379 @ 
mymaster 10.0.0.8 6379

スレーブセントリーログ

[root@redis-slave1 ~]#tail -f /var/log/redis/sentinel.log 
25509:X 20 Feb 2020 17:13:27.435 * Removing the pid file.
25509:X 20 Feb 2020 17:13:27.435 # Sentinel is now ready to exit, bye bye...
25572:X 20 Feb 2020 17:13:27.448 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
25572:X 20 Feb 2020 17:13:27.448 # Redis version=5.0.3, bits=64, 
commit=00000000, modified=0, pid=25572, just started
25572:X 20 Feb 2020 17:13:27.448 # Configuration loaded
25572:X 20 Feb 2020 17:13:27.448 * supervised by systemd, will signal readiness
25572:X 20 Feb 2020 17:13:27.449 * Running mode=sentinel, port=26379.
25572:X 20 Feb 2020 17:13:27.449 # WARNING: The TCP backlog setting of 511 
cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value 
of 128.
25572:X 20 Feb 2020 17:13:27.449 # Sentinel ID is 
50547f34ed71fd48c197924969937e738a39975b
25572:X 20 Feb 2020 17:13:27.449 # +monitor master mymaster 10.0.0.8 6379 quorum 
2

1.1.6.3 現在のセンチネルのステータス

センチネル状態、特に最後の行では、関与するマスターIPの数、スレーブの数、存在するセンチネルの数は、すべてのサーバーの数と一致している必要があります。

[root@redis-master ~]#redis-cli -p 26379
127.0.0.1:26379> INFO sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=10.0.0.8:6379,slaves=2,sentinels=3 #两个
slave,三个sentinel服务器,如果sentinels值不符合,检查myid可能冲突

1.1.7 マスターを停止してフェイルオーバーを実装する

1.1.7.1 マスターノードの停止

[root@redis-master ~]#killall redis-server
# 查看各节点上哨兵信息:
[root@redis-master ~]#redis-cli -a 123456 -p 26379
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
127.0.0.1:26379> INFO sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=10.0.0.18:6379,slaves=2,sentinels=2

フェールオーバー中のセンチネル情報:

[root@redis-master ~]#tail -f /var/log/redis/sentinel.log 
38028:X 20 Feb 2020 17:42:27.362 # +sdown master mymaster 10.0.0.8 6379
38028:X 20 Feb 2020 17:42:27.418 # +odown master mymaster 10.0.0.8 6379 #quorum 
2/2
38028:X 20 Feb 2020 17:42:27.418 # +new-epoch 1
38028:X 20 Feb 2020 17:42:27.418 # +try-failover master mymaster 10.0.0.8 6379
38028:X 20 Feb 2020 17:42:27.419 # +vote-for-leader 
50547f34ed71fd48c197924969937e738a39975b 1
38028:X 20 Feb 2020 17:42:27.422 # 50547f34ed71fd48c197924969937e738a39975d 
voted for 50547f34ed71fd48c197924969937e738a39975b 1
38028:X 20 Feb 2020 17:42:27.475 # +elected-leader master mymaster 10.0.0.8 6379
38028:X 20 Feb 2020 17:42:27.475 # +failover-state-select-slave master mymaster 
10.0.0.8 6379
38028:X 20 Feb 2020 17:42:27.529 # +selected-slave slave 10.0.0.18:6379 
10.0.0.18 6379 @ mymaster 10.0.0.8 6379
38028:X 20 Feb 2020 17:42:27.529 * +failover-state-send-slaveof-noone slave 
10.0.0.18:6379 10.0.0.18 6379 @ mymaster 10.0.0.8 6379
38028:X 20 Feb 2020 17:42:27.613 * +failover-state-wait-promotion slave 
10.0.0.18:6379 10.0.0.18 6379 @ mymaster 10.0.0.8 6379
38028:X 20 Feb 2020 17:42:28.506 # +promoted-slave slave 10.0.0.18:6379 
10.0.0.18 6379 @ mymaster 10.0.0.8 6379
38028:X 20 Feb 2020 17:42:28.506 # +failover-state-reconf-slaves master mymaster 
10.0.0.8 6379
38028:X 20 Feb 2020 17:42:28.582 * +slave-reconf-sent slave 10.0.0.28:6379 
10.0.0.28 6379 @ mymaster 10.0.0.8 6379
38028:X 20 Feb 2020 17:42:28.736 * +slave-reconf-inprog slave 10.0.0.28:6379 
10.0.0.28 6379 @ mymaster 10.0.0.8 6379
38028:X 20 Feb 2020 17:42:28.736 * +slave-reconf-done slave 10.0.0.28:6379 
10.0.0.28 6379 @ mymaster 10.0.0.8 6379
38028:X 20 Feb 2020 17:42:28.799 # +failover-end master mymaster 10.0.0.8 6379
38028:X 20 Feb 2020 17:42:28.799 # +switch-master mymaster 10.0.0.8 6379 
10.0.0.18 6379
38028:X 20 Feb 2020 17:42:28.799 * +slave slave 10.0.0.28:6379 10.0.0.28 6379 @ 
mymaster 10.0.0.18 6379
38028:X 20 Feb 2020 17:42:28.799 * +slave slave 10.0.0.8:6379 10.0.0.8 6379 @ 
mymaster 10.0.0.18 6379
38028:X 20 Feb 2020 17:42:31.809 # +sdown slave 10.0.0.8:6379 10.0.0.8 6379 @ 
mymaster 10.0.0.18 6379

1.1.7.2 フェイルオーバーの検証

redis.confのreplicaof行のマスターIPはフェイルオーバー後に変更されます

[root@redis-slave2 ~]#grep ^replicaof /etc/redis.conf 
replicaof 10.0.0.18 6379
哨兵配置文件的sentinel monitor IP 同样也会被修改

[root@redis-slave1 ~]#grep "^[a-Z]" /etc/redis-sentinel.conf
port 26379
daemonize no
pidfile "/var/run/redis-sentinel.pid"
logfile "/var/log/redis/sentinel.log"
dir "/tmp"
sentinel myid 50547f34ed71fd48c197924969937e738a39975b
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 10.0.0.18 6379 2  #自动修改此行
sentinel down-after-milliseconds mymaster 3000
sentinel auth-pass mymaster 123456
sentinel config-epoch mymaster 1
protected-mode no
supervised systemd
sentinel leader-epoch mymaster 1
sentinel known-replica mymaster 10.0.0.8 6379
sentinel known-replica mymaster 10.0.0.28 6379
sentinel known-sentinel mymaster 10.0.0.28 26379
50547f34ed71fd48c197924969937e738a39975d
sentinel current-epoch 1
[root@redis-slave2 ~]#grep "^[a-Z]" /etc/redis-sentinel.conf
port 26379
daemonize no
pidfile "/var/run/redis-sentinel.pid"
logfile "/var/log/redis/sentinel.log"
dir "/tmp"
sentinel myid 50547f34ed71fd48c197924969937e738a39975d
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 10.0.0.18 6379 2  #自动修改此行
sentinel down-after-milliseconds mymaster 3000
sentinel auth-pass mymaster 123456
sentinel config-epoch mymaster 1
protected-mode no
supervised systemd
sentinel leader-epoch mymaster 1
sentinel known-replica mymaster 10.0.0.28 6379  
sentinel known-replica mymaster 10.0.0.8 6379
sentinel known-sentinel mymaster 10.0.0.8 26379
50547f34ed71fd48c197924969937e738a39975b
sentinel current-epoch 1

1.1.7.3 各 Redis ノードのステータスを確認する

新しいマスター状態

[root@redis-slave1 ~]#redis-cli -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
127.0.0.1:6379> INFO replication
# Replication
role:master   #提升为master
connected_slaves:1
slave0:ip=10.0.0.28,port=6379,state=online,offset=56225,lag=1
master_replid:75e3f205082c5a10824fbe6580b6ad4437140b94
master_replid2:b2fb4653bdf498691e5f88519ded65b6c000e25c
master_repl_offset:56490
second_repl_offset:46451
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:287
repl_backlog_histlen:56204

別のスレーブが新しい​​マスターを指す

[root@redis-slave2 ~]#redis-cli -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
127.0.0.1:6379> INFO replication
# Replication
role:slave
master_host:10.0.0.18  #指向新的master
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:61029
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:75e3f205082c5a10824fbe6580b6ad4437140b94
master_replid2:b2fb4653bdf498691e5f88519ded65b6c000e25c
master_repl_offset:61029
second_repl_offset:46451
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:61029

元のマスターのステータスを観察します

[root@redis-master ~]#redis-cli -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
127.0.0.1:6379> INFO replication
# Replication
role:slave
master_host:10.0.0.18
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:764754
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:75e3f205082c5a10824fbe6580b6ad4437140b94
master_replid2:b2fb4653bdf498691e5f88519ded65b6c000e25c
master_repl_offset:764754
second_repl_offset:46451
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:46451
repl_backlog_histlen:718304
[root@redis-master ~]#redis-cli -p 26379
127.0.0.1:26379> INFO sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=10.0.0.18:6379,slaves=2,sentinels=3
127.0.0.1:26379> 

新しいマスターのステータスとログを観察します。

[root@redis-slave1 ~]#redis-cli -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.0.0.28,port=6379,state=online,offset=769027,lag=0
slave1:ip=10.0.0.8,port=6379,state=online,offset=769027,lag=0
master_replid:75e3f205082c5a10824fbe6580b6ad4437140b94
master_replid2:b2fb4653bdf498691e5f88519ded65b6c000e25c
master_repl_offset:769160
second_repl_offset:46451
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:287
repl_backlog_histlen:768874
127.0.0.1:6379> 
[root@redis-slave1 ~]#tail -f /var/log/redis/sentinel.log 
25717:X 20 Feb 2020 17:42:33.757 # +sdown slave 10.0.0.8:6379 10.0.0.8 6379 @ 
mymaster 10.0.0.18 6379
25717:X 20 Feb 2020 18:41:29.566 # -sdown slave 10.0.0.8:6379 10.0.0.8 6379 @ 
mymaster 10.0.0.18 6379

1.1.7.4 元のマスターが Redis クラスターに再参加します

1.1.8 センチネルの運用と保守

[root@redis-master ~]#cat /etc/redis.conf 
#sentinel会自动修改下面行指向新的master
replicaof 10.0.0.18 6379  

マスター ノードを手動でオフラインにします (ディスク点滅黄色ライト アラーム)
127.0.0.1:26379> センチネル フェールオーバー

例: 手動フェイルオーバー

[root@centos8 ~]#vim /etc/redis.conf
replica-priority 10 #指定优先级,值越小sentinel会优先将之选为新的master,默为值为100
[root@centos8 ~]#systemctl restart redis
#或者动态修改
[root@centos8 ~]#redis-cli -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
127.0.0.1:6379> CONFIG GET replica-priority
1) "replica-priority"
2) "100"
127.0.0.1:6379> CONFIG SET replica-priority 99
OK
127.0.0.1:6379> CONFIG GET replica-priority
1) "replica-priority"
2) "99"
[root@centos8 ~]#redis-cli   -p 26379
127.0.0.1:26379> sentinel failover mymaster 
OK

1.2 クラスター

1.2.1 Redis クラスターの概要

Sentinel Sentinel を使用すると、Redis の高可用性の問題を解決し、Redis の自動フェイルオーバーを実現することしかできませんが、スタンドアロン パフォーマンスのボトルネックを解決し、Redis マスターの全体的なパフォーマンスを向上させるために、 Redis マスターの
単一ノードのパフォーマンス ボトルネックの問題を解決することはできません。
Redis サービスでは、分散クラスター ソリューションを使用できます。 ソリューション
初期の Redis 分散クラスター展開ソリューション:
クライアント パーティション: 書き込み分散、高可用性管理、フェイルオーバーなどはクライアント プログラム自体によって実装されており、クライアントの開発は比較的複雑
です
。プロキシ サービス: クライアントは Redis に直接接続しませんが、最初にプロキシ サービスに接続し、プロキシ サービスは対応する読み取りおよび書き込み割り当てを実装します。現在のプロキシ サービスはサードパーティによって実装されます。このソリューションでは、クライアント
実装特別な開発は必要なく、実装は簡単ですが、プロキシ サービス ノードには依然として単一
障害点とパフォーマンスのボトルネックの問題があります。例: Pea Pod によって開発された codis Redis のバージョン 3.0 の後
、センターレス アーキテクチャを備えた Redis Cluster が開始されました。これは、複数のマスター ノードの並列書き込みと
障害時の運動エネルギーの自動転送をサポートします。

1.2.2 Redis クラスターのアーキテクチャ

ここに画像の説明を挿入
Redis クラスターの実装には少なくとも 3 つのマスター ノードが必要であり、スレーブ ノードの数に制限はありません。もちろん、各マスターは少なくとも 1 つのスレーブ ノードに対応します。マスター ノードが 3 つある場合、ハッシュ スロットを使用して 16384 スロットが割り当てられ
ます

これら 3 つのノードが担当するスロット間隔は、次のように割り当てることができます。

ノードM1 0-5460
ノードM2 5461-10922
ノードM3 10923-16383

ここに画像の説明を挿入

1.2.3 Redis クラスターの動作原理

1.2.3.1 データのパーティショニング

スタンドアロン ストレージの場合は、データをスタンドアロン Redis に直接保存するだけです。ただし、クラスターストレージの場合は、データのパーティショニングを考慮する必要があります

ここに画像の説明を挿入
ここに画像の説明を挿入
順次分散ではデータの順序性が保証されますが、離散性が低いと、特定のパーティションではデータの人気が高く、他のパーティションではデータの人気が低くなり、
パーティションへのアクセスが不均衡になる可能性があります。(スキュー)
ハッシュ分散も、リージョナル ハッシュ パーティション、コンシステント ハッシュ パーティションなど、さまざまな分散方法に分類されます。そして、redis クラスターは
仮想スロット分割という方式を採用しています。
仮想スロットパーティション

Redis クラスターは 0 ~ 16383 のスロットで設定されます。各スロットはデータのサブセットをマップします。データはハッシュ関数を通じて異なるスロットに保存され、各クラスター ノードはスロットの一部を保存します

各キーを格納するときは、まずハッシュ関数 CRC16 (キー) によって整数が取得され、次に 16384 からその整数が減算されてスロットの値が取得され、対応するノードが見つかり、データがスロットに格納されます
。対応するスロット。

ここに画像の説明を挿入

1.2.3.2 クラスタ通信

ただし、スロットを見つけるプロセスは1 回限りのヒットではありません。たとえば、上の図のキーは 14396 スロットに格納されますが、node3 ノードはすぐにはロックされません。最初にノード 1 を尋ね、次に
ノード 1 を尋ねることもできます。ノード3にアクセスします。
クラスター内のノード間の通信により、対応するスロットが配置されているノードは最大 2 回ヒットできることが保証されます。各ノードには
他のノードの情報が保存されており、どのスロットがどのノードを担当しているかがわかるためです。これにより、最初のアクセスがスロットにヒットしなかった場合でも、そのスロットがどのノードにあるかがクライアントに通知されるため
、対応するノードへのアクセスを正確にヒットさせることができます。
ここに画像の説明を挿入

  1. ノード A はノード B にミート操作を送信し、B は戻って A と B が通信できることを示します。
  2. ノード A はノード C にミート操作を送信し、C が戻った後、A と C も通信できるようになります。
  3. そうすれば、B は A についての理解に基づいて C を見つけることができ、B と C の間にもつながりが確立されます。
  4. すべてのノードが接続を確立できるまで。
    このようにして、各ノードは、他のノードがどのスロットを担当しているかを知ることができます。

1.2.3.3 クラスターのスケーリング

クラスタ構築後はノード数は固定ではなく、新たなノードがクラスタに参加したり、クラスタ内のノードがオフラインになったりすることが
クラスタの拡張・縮小となります。
ここに画像の説明を挿入
ただし、クラスターのノードとスロットは密接に関連しているため、クラスターのスケーリングはスロットとデータの移行にも対応します
。 2つの参加方法。1 つは
クラスター ノードを通じてコマンドを実行して孤立ノードをハンドシェイクする方法、もう 1 つはスクリプトを使用してノードを追加する方法です。

  1. cluster_node_ip:port: クラスターの IP ポートに適合します new_node_ip:port
  2. redis-trib.rb add-node new_node_ip:port cluster_node_ip:port
    通常、この新しいノードには、マスター ノードまたはスレーブ ノードとして 2 つの ID があります。
  • マスターノード: スロットとデータを割り当てます
  • スレーブノード: フェイルオーバーバックアップ用

ここに画像の説明を挿入
スロットの移行には次の手順があります。
ここに画像の説明を挿入
クラスターのスケールダウンとオフライン ノード
ここに画像の説明を挿入
のプロセスは次のとおりです。

  1. ノードがスロットを保持しているかどうかを確認します。スロットを保持していない場合は、次のステップに進みます。スロットを保持している場合は、まずスロットを他のノードに移行します。
  2. 他のノードにオフライン ノードを忘れるように通知します (クラスタの忘れ)
  3. オフラインノードのサービスをシャットダウンする場合、
    マスターノードが先にオフラインになり、次にスレーブノードがオフラインになるとフェイルオーバーが実行されるため、最初にスレーブノードをオフラインにする必要があることに注意してください。

1.2.3.4 フェイルオーバー

ノードを手動でオフラインにするだけでなく、予期しない障害も発生します以下で説明するメイン ノードはマスター ノードの障害です。スレーブ ノードの障害は
マスター ノードの動作に影響を与えず、対応するマスター ノードはどのスレーブ ノードがオフラインであるかを記憶するだけであり、その情報を他のノードに送信します。ノード。障害のあるスレーブ ノードが
再接続された後、元のジョブが再開され、マスター ノードのデータがコピーされます。
フェイルオーバーが必要なのはプライマリ ノードのみです。以前にマスター/スレーブ レプリケーションを学習したときは、フェイルオーバーを実現するために redis Sentinel を使用する必要がありました
Redis クラスターには、それ自体がフェイルオーバー機能を備えている Redis Sentinel は必要ありません。
先ほど学んだことによると、ノードは相互に通信し、ピンポンを通じてメッセージを交換するため、これを通じて障害を見つけることができます
クラスタ ノードが障害を検出すると、主観的オフラインと客観的オフラインもあり、ノードごと

ここに画像の説明を挿入
障害リストがあり、障害リストには現在のノードが他のすべてのノードから受信した情報が保持されます。スロットを保持しているマスター ノードの半分以上が
ノードを主観的にオフラインとしてマークすると、そのノードは客観的にオフラインになろうとします。
目的のオフライン
ここに画像の説明を挿入
フェイルオーバー
クラスターにはセンチネルに似た自動フェイルオーバーの機能もあり、目的のオフラインになった後、障害が発生
したノードのスレーブ ノードが「就任」する準備が整います。
1 つ目は、資格を確認することです。資格のあるスレーブ ノードのみが選挙に参加できます。

  • 障害が発生したノードと障害が発生したマスターのすべてのスレーブ チェック間の切断時間
  • クラスタノードタイムアウト * クラスタスレーブ検証ファクタ (デフォルトは 10) を超えると、選挙は失格になり、選挙
    シーケンスの準備が整います。オフセットが異なるノードは、選挙に参加する順序が異なります。最大のオフセットを持つスレーブ ノードは、最高の選出順序と最高の優先順位を持ちます。オフセットが小さいスレーブ ノードは選出を遅らせます。スレーブノードが選挙に参加すると、マスターノードはその情報を受け取った後に投票を開始します。オフセットが最も大きいノードは、最初に選挙に参加すると最も多くの票を獲得する可能性が高く、マスター ノードと呼ばれます。スレーブ ノードが就任してマスター ノードになったら、マスター ノードの交換を開始する必要があります。

    ここに画像の説明を挿入


    ここに画像の説明を挿入
  1. スレーブノードにslaveof no oneを実行させてマスターノードにします
  2. 障害が発生したノードの原因となるスロットをそのノードに割り当てます。
  3. クラスター内の他のノードに Pong メッセージをブロードキャストして、フェイルオーバーが完了したことを示します。
  4. 障害のあるノードが再起動すると、そのノードは new_master のスレーブ ノードになります。

1.2.3.4 Redis クラスターのデプロイメントアーキテクチャの説明

テスト環境: 3 台のサーバー、各サーバーは 2 つの Redis サービス インスタンス 6379 および 6380 を開始し、テスト環境に適しています。 実
ここに画像の説明を挿入
稼働環境: 6 台のサーバー、それぞれマスター/スレーブの 3 つのグループ、実稼働環境に適しています。
ここに画像の説明を挿入

#クラスターノード
10.0.0.8
10.0.0.18
10.0.0.28
10.0.0.38
10.0.0.48
10.0.0.58
#予約サーバー拡張機能は
10.0.0.68
10.0.0.78を使用します

注: 以前のバージョンと比較して、Redis 5.X は大きく変更されており、2 つのバージョン 5.X と 4.X の構成をそれぞれ以下に紹介します。

1.2.3.5 導入方法の概要

Redis クラスターには複数のデプロイ方法がある
ネイティブ コマンドのインストール
Redis クラスターのアーキテクチャを理解している
本番環境では使用されていない
公式ツールのインストール
効率的かつ正確な
本番環境が利用可能
独自の研究開発
可視化された自動デプロイメントが実現可能

1.2.4 実際のケース: Redis 5 以降に基づく Redis クラスターのデプロイメント

公式ドキュメント: https://redis.io/topics/cluster-tutorial
Redis クラスター関連コマンド
例: --cluster オプションのヘルプを表示

[root@centos8 ~]#redis-cli --cluster help
范例: 查看CLUSTER 指令的帮助
[root@centos8 ~]#redis-cli CLUSTER HELP

1.2.4.1 Redisクラスタクラスタを作成するための環境準備

ここに画像の説明を挿入
各 Redis ノードは、同じ Redis バージョン、同じパスワード、およびハードウェア構成を使用します。
すべての Redis サーバーにデータがあってはなりません。
次のアドレスを持つ 6 台のホストを準備します。

10.0.0.8
10.0.0.18
10.0.0.28
10.0.0.38
10.0.0.48
10.0.0.58

1.2.4.2 Redis クラスター構成を有効にする

6 台すべてのホストで次の構成を実行します
[root@centos8 ~]#dnf -y install redis
各ノードで Redis 構成を変更し、クラスター機能のパラメーターを有効にする必要があります

#手动修改配置文件
[root@redis-node1 ~]vim /etc/redis.conf
bind 0.0.0.0
masterauth 123456   #建议配置,否则后期的master和slave主从复制无法成功,还需再配置
requirepass 123456
cluster-enabled yes #取消此行注释,必须开启集群,开启后 redis 进程会有cluster标识
cluster-config-file nodes-6379.conf #取消此行注释,此为集群状态数据文件,记录主从关系
及slot范围信息,由redis cluster 集群自动创建和维护
cluster-require-full-coverage no   #默认值为yes,设为no可以防止一个节点不可用导致整
个cluster不可用
#或者执行下面命令,批量修改
[root@redis-node1 ~]#sed -i.bak -e 's/bind 127.0.0.1/bind 0.0.0.0/' -e 
'/masterauth/a masterauth 123456' -e '/# requirepass/a requirepass 123456' -
e '/# cluster-enabled yes/a cluster-enabled yes' -e '/# cluster-config-file 
nodes-6379.conf/a cluster-config-file nodes-6379.conf' -e '/cluster-require
full-coverage yes/c cluster-require-full-coverage no' /etc/redis.conf
#如果是编译安装可以执行下面操作
[root@redis-node1 ~]#sed -i.bak -e '/masterauth/a masterauth 123456' -e 
'/# cluster-enabled yes/a cluster-enabled yes' -e '/# cluster-config-file 
nodes-6379.conf/a cluster-config-file nodes-6379.conf' -e '/cluster-require
full-coverage yes/c cluster-require-full-coverage no' 
/apps/redis/etc/redis.conf
[root@redis-node1 ~]#systemctl enable --now redis

現在の Redis サービスのステータスを確認します。

#开启了16379的cluster的端口,实际的端口=redis port + 10000
[root@centos8 ~]#ss -ntl
State       Recv-Q       Send-Q Local Address:Port     Peer Address:Port 
       
LISTEN       0             128           0.0.0.0:22            0.0.0.0:*     
      
LISTEN       0             100         127.0.0.1:25            0.0.0.0:*     
      
LISTEN       0             128           0.0.0.0:16379         0.0.0.0:*     
      
LISTEN       0             128           0.0.0.0:6379          0.0.0.0:*     
      
LISTEN       0             128             [::]:22               [::]:*     
      
LISTEN       0             100             [::1]:25               [::]:*     
      
#注意进程有[cluster]状态
[root@centos8 ~]#ps -ef|grep redis
redis   1939    1  0 10:54 ?    00:00:00 /usr/bin/redis-server 0.0.0.0:6379 
[cluster]
root    1955   1335  0 10:57 pts/0    00:00:00 grep --color=auto redis

1.2.4.3 クラスターの作成

#命令redis-cli的选项 --cluster-replicas 1 表示每个master对应一个slave节点
[root@redis-node1 ~]#redis-cli -a 123456 --cluster create 10.0.0.8:6379   
10.0.0.18:6379   10.0.0.28:6379   10.0.0.38:6379   10.0.0.48:6379   
10.0.0.58:6379 --cluster-replicas 1 
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 10.0.0.38:6379 to 10.0.0.8:6379
Adding replica 10.0.0.48:6379 to 10.0.0.18:6379
Adding replica 10.0.0.58:6379 to 10.0.0.28:6379
M: cb028b83f9dc463d732f6e76ca6bbcd469d948a7 10.0.0.8:6379 #带M的为master
   slots:[0-5460] (5461 slots) master #当前master的槽位起始
和结束位
M: 99720241248ff0e4c6fa65c2385e92468b3b5993 10.0.0.18:6379
   slots:[5461-10922] (5462 slots) master
M: d34da8666a6f587283a1c2fca5d13691407f9462 10.0.0.28:6379
   slots:[10923-16383] (5461 slots) master
S: f9adcfb8f5a037b257af35fa548a26ffbadc852d 10.0.0.38:6379  #带S的slave
   replicates cb028b83f9dc463d732f6e76ca6bbcd469d948a7      
S: d04e524daec4d8e22bdada7f21a9487c2d3e1057 10.0.0.48:6379
   replicates 99720241248ff0e4c6fa65c2385e92468b3b5993
S: 9875b50925b4e4f29598e6072e5937f90df9fc71 10.0.0.58:6379
   replicates d34da8666a6f587283a1c2fca5d13691407f9462
Can I set the above configuration? (type 'yes' to accept): yes #输入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 10.0.0.8:6379)
M: cb028b83f9dc463d732f6e76ca6bbcd469d948a7 10.0.0.8:6379
   slots:[0-5460] (5461 slots) master #已经分配的槽位
   1 additional replica(s)   #分配了一个slave
S: 9875b50925b4e4f29598e6072e5937f90df9fc71 10.0.0.58:6379
   slots: (0 slots) slave   #slave没有分配槽位
   replicates d34da8666a6f587283a1c2fca5d13691407f9462  #对应的master的10.0.0.28的
ID
S: f9adcfb8f5a037b257af35fa548a26ffbadc852d 10.0.0.38:6379
   slots: (0 slots) slave
   replicates cb028b83f9dc463d732f6e76ca6bbcd469d948a7 #对应的master的10.0.0.8的ID
S: d04e524daec4d8e22bdada7f21a9487c2d3e1057 10.0.0.48:6379
   slots: (0 slots) slave
   replicates 99720241248ff0e4c6fa65c2385e92468b3b5993 #对应的master的10.0.0.18的
ID
M: 99720241248ff0e4c6fa65c2385e92468b3b5993 10.0.0.18:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: d34da8666a6f587283a1c2fca5d13691407f9462 10.0.0.28:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.  #所有节点槽位分配完成
>>> Check for open slots... #检查打开的槽位
>>> Check slots coverage... #检查插槽覆盖范围
[OK] All 16384 slots covered. #所有槽位(16384个)分配完成
#观察以上结果,可以看到3组master/slave
master:10.0.0.8---slave:10.0.0.38
master:10.0.0.18---slave:10.0.0.48
master:10.0.0.28---slave:10.0.0.58
#如果节点少于3个会出下面提示错误
[root@node1 ~]#redis-cli -a 123456 --cluster create 10.0.0.8:6379   
10.0.0.18:6379 
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
*** ERROR: Invalid configuration for cluster creation.
*** Redis Cluster requires at least 3 master nodes.
*** This is not possible with 2 nodes and 0 replicas per node.
*** At least 3 nodes are required.

1.2.4.4 クラスターの検証

マスター/スレーブのステータスを表示する

[root@redis-node1 ~]#redis-cli -a 123456 -c INFO replication
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
# Replication
role:master
connected_slaves:1
slave0:ip=10.0.0.38,port=6379,state=online,offset=896,lag=1
master_replid:3a388865080d779180ff240cb75766e7e57877da
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:896
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:896
[root@redis-node2 ~]#redis-cli -a 123456 INFO replication
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
# Replication
role:master
connected_slaves:1
slave0:ip=10.0.0.48,port=6379,state=online,offset=980,lag=1
master_replid:b9066d3cbf0c5fecc7f4d1d5cb2433999783fa3f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:980
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:980
[root@redis-node3 ~]#redis-cli -a 123456 INFO replication
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
# Replication
role:master
connected_slaves:1
slave0:ip=10.0.0.58,port=6379,state=online,offset=980,lag=0
master_replid:53208e0ed9305d721e2fb4b3180f75c689217902
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:980
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:980
[root@redis-node4 ~]#redis-cli -a 123456 INFO replication
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
# Replication
role:slave
master_host:10.0.0.8
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:1036
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:3a388865080d779180ff240cb75766e7e57877da
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1036
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1036
[root@redis-node5 ~]#redis-cli -a 123456 INFO replication
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
# Replication
role:slave
master_host:10.0.0.18
master_port:6379
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:1064
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:b9066d3cbf0c5fecc7f4d1d5cb2433999783fa3f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1064
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1064
[root@redis-node6 ~]#redis-cli -a 123456 INFO replication
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
# Replication
role:slave
master_host:10.0.0.28
master_port:6379
master_link_status:up
master_last_io_seconds_ago:7
master_sync_in_progress:0
slave_repl_offset:1078
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:53208e0ed9305d721e2fb4b3180f75c689217902
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1078
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1078

例: 指定したマスターノードのスレーブノード情報を表示する

[root@centos8 ~]#redis-cli -a 123456 cluster nodes 
4f146b1ac51549469036a272c60ea97f065ef832 10.0.0.28:6379@16379 master - 0
1602571565772 12 connected 10923-16383
779a24884dbe1ceb848a685c669ec5326e6c8944 10.0.0.48:6379@16379 slave 
97c5dcc3f33c2fc75c7fdded25d05d2930a312c0 0 1602571565000 11 connected
97c5dcc3f33c2fc75c7fdded25d05d2930a312c0 10.0.0.18:6379@16379 master - 0
1602571564000 11 connected 5462-10922
07231a50043d010426c83f3b0788e6b92e62050f 10.0.0.58:6379@16379 slave 
4f146b1ac51549469036a272c60ea97f065ef832 0 1602571565000 12 connected
a177c5cbc2407ebb6230ea7e2a7de914bf8c2dab 10.0.0.8:6379@16379 myself,master - 0
1602571566000 10 connected 0-5461
cb20d58870fe05de8462787cf9947239f4bc5629 10.0.0.38:6379@16379 slave 
a177c5cbc2407ebb6230ea7e2a7de914bf8c2dab 0 1602571566780 10 connected
#以下命令查看指定master节点的slave节点信息,其中
#a177c5cbc2407ebb6230ea7e2a7de914bf8c2dab 为master节点的ID
[root@centos8 ~]#redis-cli -a 123456 cluster slaves 
a177c5cbc2407ebb6230ea7e2a7de914bf8c2dab
1) "cb20d58870fe05de8462787cf9947239f4bc5629 10.0.0.38:6379@16379 slave 
a177c5cbc2407ebb6230ea7e2a7de914bf8c2dab 0 1602571574844 10 connected"

クラスターのステータスを確認する

[root@redis-node1 ~]#redis-cli -a 123456 CLUSTER INFO
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
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:837
cluster_stats_messages_pong_sent:811
cluster_stats_messages_sent:1648
cluster_stats_messages_ping_received:806
cluster_stats_messages_pong_received:837
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:1648
#查看任意节点的集群状态
[root@redis-node1 ~]#redis-cli -a 123456 --cluster info 10.0.0.38:6379
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
10.0.0.18:6379 (99720241...) -> 0 keys | 5462 slots | 1 slaves.
10.0.0.28:6379 (d34da866...) -> 0 keys | 5461 slots | 1 slaves.
10.0.0.8:6379 (cb028b83...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.

通信を見る

[root@redis-node1 ~]#redis-cli -a 123456 CLUSTER NODES
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
9875b50925b4e4f29598e6072e5937f90df9fc71 10.0.0.58:6379@16379 slave 
d34da8666a6f587283a1c2fca5d13691407f9462 0 1582344815790 6 connected
f9adcfb8f5a037b257af35fa548a26ffbadc852d 10.0.0.38:6379@16379 slave 
cb028b83f9dc463d732f6e76ca6bbcd469d948a7 0 1582344811000 4 connected
d04e524daec4d8e22bdada7f21a9487c2d3e1057 10.0.0.48:6379@16379 slave 
99720241248ff0e4c6fa65c2385e92468b3b5993 0 1582344815000 5 connected
99720241248ff0e4c6fa65c2385e92468b3b5993 10.0.0.18:6379@16379 master - 0
1582344813000 2 connected 5461-10922
d34da8666a6f587283a1c2fca5d13691407f9462 10.0.0.28:6379@16379 master - 0
1582344814780 3 connected 10923-16383
cb028b83f9dc463d732f6e76ca6bbcd469d948a7 10.0.0.8:6379@16379 myself,master - 0
1582344813000 1 connected 0-5460
[root@redis-node1 ~]#redis-cli -a 123456 --cluster check 10.0.0.38:6379
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
10.0.0.18:6379 (99720241...) -> 0 keys | 5462 slots | 1 slaves.
10.0.0.28:6379 (d34da866...) -> 0 keys | 5461 slots | 1 slaves.
10.0.0.8:6379 (cb028b83...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 10.0.0.38:6379)
S: f9adcfb8f5a037b257af35fa548a26ffbadc852d 10.0.0.38:6379
   slots: (0 slots) slave
   replicates cb028b83f9dc463d732f6e76ca6bbcd469d948a7
S: d04e524daec4d8e22bdada7f21a9487c2d3e1057 10.0.0.48:6379
   slots: (0 slots) slave
   replicates 99720241248ff0e4c6fa65c2385e92468b3b5993
M: 99720241248ff0e4c6fa65c2385e92468b3b5993 10.0.0.18:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 9875b50925b4e4f29598e6072e5937f90df9fc71 10.0.0.58:6379
   slots: (0 slots) slave
   replicates d34da8666a6f587283a1c2fca5d13691407f9462
M: d34da8666a6f587283a1c2fca5d13691407f9462 10.0.0.28:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: cb028b83f9dc463d732f6e76ca6bbcd469d948a7 10.0.0.8:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

1.2.4.5 テストクラスタの書き込みデータ

ここに画像の説明を挿入
ここに画像の説明を挿入
redis cluster 写入key

#经过算法计算,当前key的槽位需要写入指定的node
[root@redis-node1 ~]#redis-cli -a 123456 -h 10.0.0.8 SET key1 values1
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
(error) MOVED 9189 10.0.0.18:6379    #槽位不在当前node所以无法写入
#指定槽位对应node可写入
[root@redis-node1 ~]#redis-cli -a 123456 -h 10.0.0.18 SET key1 values1
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
OK
[root@redis-node1 ~]#redis-cli -a 123456 -h 10.0.0.18 GET key1
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
"values1"
#对应的slave节点可以KEYS *,但GET key1失败,可以到master上执行GET key1
[root@redis-node1 ~]#redis-cli -a 123456 -h 10.0.0.48 KEYS "*"
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
1) "key1"
[root@redis-node1 ~]#redis-cli -a 123456 -h 10.0.0.48 GET key1
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
(error) MOVED 9189 10.0.0.18:6379

redis cluster 计算key所属的slot

[root@centos8 ~]#redis-cli -h 10.0.0.8 -a 123456 --no-auth-warning cluster 
nodes
4f146b1ac51549469036a272c60ea97f065ef832 10.0.0.28:6379@16379 master - 0
1602561649000 12 connected 10923-16383
779a24884dbe1ceb848a685c669ec5326e6c8944 10.0.0.48:6379@16379 slave 
97c5dcc3f33c2fc75c7fdded25d05d2930a312c0 0 1602561648000 11 connected
97c5dcc3f33c2fc75c7fdded25d05d2930a312c0 10.0.0.18:6379@16379 master - 0
1602561650000 11 connected 5462-10922
07231a50043d010426c83f3b0788e6b92e62050f 10.0.0.58:6379@16379 slave 
4f146b1ac51549469036a272c60ea97f065ef832 0 1602561650229 12 connected
a177c5cbc2407ebb6230ea7e2a7de914bf8c2dab 10.0.0.8:6379@16379 myself,master - 0
1602561650000 10 connected 0-5461
cb20d58870fe05de8462787cf9947239f4bc5629 10.0.0.38:6379@16379 slave 
a177c5cbc2407ebb6230ea7e2a7de914bf8c2dab 0 1602561651238 10 connected
#计算得到hello对应的slot
[root@centos8 ~]#redis-cli -h 10.0.0.8 -a 123456 --no-auth-warning cluster 
keyslot hello
(integer) 866
[root@centos8 ~]#redis-cli -h 10.0.0.8 -a 123456 --no-auth-warning set hello 
magedu
OK
[root@centos8 ~]#redis-cli -h 10.0.0.8 -a 123456 --no-auth-warning cluster 
keyslot name 
(integer) 5798
[root@centos8 ~]#redis-cli -h 10.0.0.8 -a 123456 --no-auth-warning set name 
wang
(error) MOVED 5798 10.0.0.18:6379
[root@centos8 ~]#redis-cli -h 10.0.0.18 -a 123456 --no-auth-warning set name 
wang
OK
[root@centos8 ~]#redis-cli -h 10.0.0.18 -a 123456 --no-auth-warning get name
"wang"
#使用选项-c 以集群模式连接
[root@centos8 ~]#redis-cli -c -h 10.0.0.8 -a 123456 --no-auth-warning 
10.0.0.8:6379> cluster keyslot linux
(integer) 12299
10.0.0.8:6379> set linux love
-> Redirected to slot [12299] located at 10.0.0.28:6379
OK
10.0.0.28:6379> get linux 
"love"
10.0.0.28:6379> exit
[root@centos8 ~]#redis-cli -h 10.0.0.28 -a 123456 --no-auth-warning get linux
"love"

1.2.4.6 模拟故障实现故障转移

#模拟node2节点出故障,需要相应的数秒故障转移时间
[root@redis-node2 ~]#tail -f /var/log/redis/redis.log  
[root@redis-node2 ~]#redis-cli -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
127.0.0.1:6379> shutdown
not connected> exit
[root@redis-node2 ~]#ss -ntl
State       Recv-Q       Send-Q Local Address:Port Peer Address:Port        
LISTEN       0             128           0.0.0.0:22         0.0.0.0:*           
LISTEN       0             100         127.0.0.1:25         0.0.0.0:*           
LISTEN       0             128             [::]:22           [::]:*           
LISTEN       0             100             [::1]:25           [::]:*   
[root@redis-node2 ~]# redis-cli -a 123456 --cluster info 10.0.0.8:6379
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
Could not connect to Redis at 10.0.0.18:6379: Connection refused
10.0.0.8:6379 (cb028b83...) -> 3331 keys | 5461 slots | 1 slaves.
10.0.0.48:6379 (d04e524d...) -> 3340 keys | 5462 slots | 0 slaves. #10.0.0.48为新
的master
10.0.0.28:6379 (d34da866...) -> 3329 keys | 5461 slots | 1 slaves.
[OK] 10000 keys in 3 masters.
0.61 keys per slot on average.
[root@redis-node2 ~]# redis-cli -a 123456 --cluster check 10.0.0.8:6379
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
Could not connect to Redis at 10.0.0.18:6379: Connection refused
10.0.0.8:6379 (cb028b83...) -> 3331 keys | 5461 slots | 1 slaves.
10.0.0.48:6379 (d04e524d...) -> 3340 keys | 5462 slots | 0 slaves.
10.0.0.28:6379 (d34da866...) -> 3329 keys | 5461 slots | 1 slaves.
[OK] 10000 keys in 3 masters.
0.61 keys per slot on average.
>>> Performing Cluster Check (using node 10.0.0.8:6379)
M: cb028b83f9dc463d732f6e76ca6bbcd469d948a7 10.0.0.8:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 9875b50925b4e4f29598e6072e5937f90df9fc71 10.0.0.58:6379
   slots: (0 slots) slave
   replicates d34da8666a6f587283a1c2fca5d13691407f9462
S: f9adcfb8f5a037b257af35fa548a26ffbadc852d 10.0.0.38:6379
   slots: (0 slots) slave
   replicates cb028b83f9dc463d732f6e76ca6bbcd469d948a7
M: d04e524daec4d8e22bdada7f21a9487c2d3e1057 10.0.0.48:6379
   slots:[5461-10922] (5462 slots) master
M: d34da8666a6f587283a1c2fca5d13691407f9462 10.0.0.28:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@redis-node2 ~]#redis-cli -a 123456 -h 10.0.0.48
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
10.0.0.48:6379> INFO replication
# Replication
role:master
connected_slaves:0
master_replid:0000698bc2c6452d8bfba68246350662ae41d8fd
master_replid2:b9066d3cbf0c5fecc7f4d1d5cb2433999783fa3f
master_repl_offset:2912424
second_repl_offset:2912425
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1863849
repl_backlog_histlen:1048576
10.0.0.48:6379> 
#恢复故障节点node2自动成为slave节点
[root@redis-node2 ~]#systemctl start redis
#查看自动生成的配置文件,可以查看node2自动成为slave节点
[root@redis-node2 ~]#cat /var/lib/redis/nodes-6379.conf
99720241248ff0e4c6fa65c2385e92468b3b5993 10.0.0.18:6379@16379 myself,slave 
d04e524daec4d8e22bdada7f21a9487c2d3e1057 0 1582352081847 2 connected
f9adcfb8f5a037b257af35fa548a26ffbadc852d 10.0.0.38:6379@16379 slave 
cb028b83f9dc463d732f6e76ca6bbcd469d948a7 1582352081868 1582352081847 4 connected
cb028b83f9dc463d732f6e76ca6bbcd469d948a7 10.0.0.8:6379@16379 master -
1582352081868 1582352081847 1 connected 0-5460
9875b50925b4e4f29598e6072e5937f90df9fc71 10.0.0.58:6379@16379 slave 
d34da8666a6f587283a1c2fca5d13691407f9462 1582352081869 1582352081847 3 connected
d04e524daec4d8e22bdada7f21a9487c2d3e1057 10.0.0.48:6379@16379 master -
1582352081869 1582352081847 7 connected 5461-10922
d34da8666a6f587283a1c2fca5d13691407f9462 10.0.0.28:6379@16379 master -
1582352081869 1582352081847 3 connected 10923-16383
vars currentEpoch 7 lastVoteEpoch 0
[root@redis-node2 ~]#redis-cli -a 123456 -h 10.0.0.48
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
10.0.0.48:6379> INFO replication
# Replication
role:master
connected_slaves:1
slave0:ip=10.0.0.18,port=6379,state=online,offset=2912564,lag=1
master_replid:0000698bc2c6452d8bfba68246350662ae41d8fd
master_replid2:b9066d3cbf0c5fecc7f4d1d5cb2433999783fa3f
master_repl_offset:2912564
second_repl_offset:2912425
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1863989
repl_backlog_histlen:1048576
10.0.0.48:6379> 

1.2.5 Redis cluster 管理

1.2.5.1 集群扩容(不支持多数据库了)

扩容适用场景:
当前客户量激增,现有的Redis cluster架构已经无法满足越来越高的并发访问请求,为解决此问题,新购
置两台服务器,要求将其动态添加到现有集群,但不能影响业务的正常访问。
注意: 生产环境一般建议master节点为奇数个,比如:3,5,7,以防止脑裂现象
ここに画像の説明を挿入
添加节点准备
增加Redis 新节点,需要与之前的Redis node版本和配置一致,然后分别再启动两台Redis node,应为
一主一从。

#配置node7节点
[root@redis-node7 ~]#dnf -y install redis
[root@redis-node7 ~]#sed -i.bak -e 's/bind 127.0.0.1/bind 0.0.0.0/' -e 
'/masterauth/a masterauth 123456' -e '/# requirepass/a requirepass 123456' -e '/# 
cluster-enabled yes/a cluster-enabled yes' -e '/# cluster-config-file nodes-
6379.conf/a cluster-config-file nodes-6379.conf' -e '/cluster-require-full
coverage yes/c cluster-require-full-coverage no' /etc/redis.conf 
#编译安装执行下面操作
[root@redis-node7 ~]#sed -i.bak -e '/masterauth/a masterauth 123456' -e '/# 
cluster-enabled yes/a cluster-enabled yes' -e '/# cluster-config-file nodes-
6379.conf/a cluster-config-file nodes-6379.conf' -e '/cluster-require-full
coverage yes/c cluster-require-full-coverage no' 
/apps/redis/etc/redis.conf;systemctl restart redis
[root@redis-node7 ~]#systemctl enable --now redis
#配置node8节点
[root@redis-node8 ~]#dnf -y install redis
[root@redis-node8 ~]#sed -i.bak -e 's/bind 127.0.0.1/bind 0.0.0.0/' -e 
'/masterauth/a masterauth 123456' -e '/# requirepass/a requirepass 123456' -e '/# 
cluster-enabled yes/a cluster-enabled yes' -e '/# cluster-config-file nodes-
6379.conf/a cluster-config-file nodes-6379.conf' -e '/cluster-require-full
coverage yes/c cluster-require-full-coverage no' /etc/redis.conf 
#编译安装执行下面操作
[root@redis-node8 ~]#sed -i.bak -e '/masterauth/a masterauth 123456' -e '/# 
cluster-enabled yes/a cluster-enabled yes' -e '/# cluster-config-file nodes-
6379.conf/a cluster-config-file nodes-6379.conf' -e '/cluster-require-full
coverage yes/c cluster-require-full-coverage no' 
/apps/redis/etc/redis.conf;systemctl restart redis
[root@redis-node8 ~]#systemctl enable --now redis

添加新的master节点到集群
使用以下命令添加新节点,要添加的新redis节点IP和端口添加到的已有的集群中任意节点的IP:端口

add-node new_host:new_port existing_host:existing_port [--slave --master-id
<arg>]
#说明:
new_host:new_port #指定新添加的主机的IP和端口
existing_host:existing_port #指定已有的集群中任意节点的IP和端口

Redis 5 以上版本的添加命令:

#将一台新的主机10.0.0.68加入集群,以下示例中10.0.0.58可以是任意存在的集群节点
[root@redis-node1 ~]#redis-cli -a 123456 --cluster add-node 10.0.0.68:6379 <当前
任意集群节点>:6379
#观察到该节点已经加入成功,但此节点上没有slot位,也无从节点,而且新的节点是master
[root@redis-node1 ~]#redis-cli -a 123456 --cluster info 10.0.0.8:6379
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
10.0.0.8:6379 (cb028b83...) -> 6672 keys | 5461 slots | 1 slaves.
10.0.0.68:6379 (d6e2eca6...) -> 0 keys | 0 slots | 0 slaves.
10.0.0.48:6379 (d04e524d...) -> 6679 keys | 5462 slots | 1 slaves.
10.0.0.28:6379 (d34da866...) -> 6649 keys | 5461 slots | 1 slaves.
[OK] 20000 keys in 5 masters.
1.22 keys per slot on average.
[root@redis-node1 ~]#redis-cli -a 123456 --cluster check 10.0.0.8:6379
Warning: Using a password with '-a' or '-u' option on the command line interface 

[root@redis-node1 ~]#cat /var/lib/redis/nodes-6379.conf 

#和上面显示结果一样
[root@redis-node1 ~]#redis-cli -a 123456 CLUSTER NODES
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.

#查看集群状态
[root@redis-node1 ~]#redis-cli -a 123456 CLUSTER INFO
Warning: Using a password with '-a' or '-u' option on the command line interface 

在新的master上重新分配槽位
新的node节点加到集群之后,默认是master节点,但是没有slots,需要重新分配,否则没有槽位将无法访

注意: 重新分配槽位需要清空数据,所以需要先备份数据,扩展后再恢复数据
Redis 5以上版本命令:(计算16384/总节点数槽位、新的masterID、从原有哪几个节点分担槽点)

[root@redis-node1 ~]#redis-cli -a 123456 --cluster reshard <当前の任意集合群节点>:6379
警告: コマンド ライン インターフェイスで '-a' または '-u' オプションを指定してパスワードを使用すると
、安全に過ごしてください。

クラスター チェックの実行 (ノード 10.0.0.68:6379 を使用)
M: d6e2eca6b338b717923f64866bd31d42e52edc98 10.0.0.68:6379
スロット: (0 スロット) マスター
M: d34da8666a6f587283a1c2fca5d13691407f 9462 10.0.0.28:6379
スロット:[10923-16383] (5461 スロット) マスター
1 追加レプリカ(s)
M: d04e524daec4d8e22bdada7f21a9487c2d3e1057 10.0.0.48:6379
スロット:[5461-10922] (5462 スロット) マスター
1 追加レプリカ
M: cb028b83f9dc463d732f6e76ca6bbcd469d948a
7 10.0.0.8:6379 スロット:[0-5460] (5461 スロット) マスター
1追加のレプリカ
S: 99720241248ff0e4c6fa65c2385e92468b3b5993 10.0.0.18:6379
スロット: (0 スロット) スレーブ
レプリケート d04e524daec4d8e22bdada7f21a9487c2d3e1057
M: f67f1c02c742cd48d3f48d8c362f9f1b9aa31549 10.0.0.78:6379
slots: (0 slots) master
S: f9adcfb8f5a037b257af35fa548a26ffbadc852d 10.0.0.38:6379
slots: (0 slots) slave
replicates cb028b83f9dc463d732f6e76ca6bbcd469d948a7
S: 9875b50925b4e4f29598e6072e5937f90df9fc71 10.0.0.58:6379
slots: (0 slots) slave
replicates d34da8666a6f587283a1c2fca5d13691407f9462
[ [OK] すべてのノードがスロット構成について同意します。
開いているスロットを確認してください…
スロットのカバレッジを確認してください…
[OK] 16384 個のスロットすべてがカバーされています。
移動したいスロットの数 (1 ~ 16384)? 4096 #新規割り当てスロット数=16384/マスター数受信ノードIDは何ですかd6e2eca6b338b717923f64866bd31d42e52edc98 #新規マスターのID


すべてのソース ノード ID を入力してください。
すべてのノードをハッシュ スロットのソース ノードとして使用するには、「
all」と入力します。すべてのソース ノード ID を入力したら、「done」と入力
します。ソース ノード #1: all #すべてを入力してください。ソース ホストのスロットが新しいノードに割り当てられ、すべてが自動的に選択され、すべての Redis ノードに分割されます。ホストが Redis クラスターから削除された場合、この方法を使用して、指定したホスト上のすべてのスロットを他の Redis に移動できますホスト
...
提案されたリシャード プランを続行しますか (はい/いいえ)? はい #割り当てを確認
...
スロット 12280 を 10.0.0.28:6379 から 10.0.0.68:6379 に移動: .
スロット 12281 を 10.0 から移動します。 0.28:6379 から 10.0.0.68:6379: .0.0.28:
6379
から
10.0.0.68:6379:
Moving slot 12285 from 10.0.0.28:6379 to 10.0.0.68:6379: .
Moving slot 12286 from 10.0.0.28:6379 to 10.0.0.68:6379:
Moving slot 12287 from 10.0.0.28:6379 to 10.0.0.68:6379: …
[root@redis-node1 ~]#
#确定slot分配成功
[root@redis-node1 ~]#redis-cli -a 123456 --cluster check 10.0.0.8:6379
Warning: Using a password with ‘-a’ or ‘-u’ option on the command line interface
may not be safe.

为新的master指定新的slave节点
当前Redis集群中新的master节点存单点问题,还需要给其添加一个对应slave节点,实现高可用功能
有两种方式:
方法1:在新加节点到集群时,直接将之设置为slave

redis-cli -a 123456 --cluster add-node 10.0.0.78:6379 <任意集群节点>:6379 --
cluster-slave --cluster-master-id d6e2eca6b338b717923f64866bd31d42e52edc98
#范例:
#查看当前状态
[root@redis-node1 ~]#redis-cli -a 123456 --cluster check 10.0.0.8:6379
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
10.0.0.8:6379 (cb028b83...) -> 5019 keys | 4096 slots | 1 slaves.
10.0.0.68:6379 (d6e2eca6...) -> 4948 keys | 4096 slots | 0 slaves.
10.0.0.48:6379 (d04e524d...) -> 5033 keys | 4096 slots | 1 slaves.
10.0.0.28:6379 (d34da866...) -> 5000 keys | 4096 slots | 1 slaves.
[OK] 20000 keys in 4 masters.
1.22 keys per slot on average.
>>> Performing Cluster Check (using node 10.0.0.8:6379)
M: cb028b83f9dc463d732f6e76ca6bbcd469d948a7 10.0.0.8:6379
   slots:[1365-5460] (4096 slots) master
   1 additional replica(s)
M: d6e2eca6b338b717923f64866bd31d42e52edc98 10.0.0.68:6379
   slots:[0-1364],[5461-6826],[10923-12287] (4096 slots) master
S: 9875b50925b4e4f29598e6072e5937f90df9fc71 10.0.0.58:6379
   slots: (0 slots) slave
   replicates d34da8666a6f587283a1c2fca5d13691407f9462
S: f9adcfb8f5a037b257af35fa548a26ffbadc852d 10.0.0.38:6379
   slots: (0 slots) slave
   replicates cb028b83f9dc463d732f6e76ca6bbcd469d948a7
M: d04e524daec4d8e22bdada7f21a9487c2d3e1057 10.0.0.48:6379
   slots:[6827-10922] (4096 slots) master
   1 additional replica(s)
S: 99720241248ff0e4c6fa65c2385e92468b3b5993 10.0.0.18:6379
   slots: (0 slots) slave
   replicates d04e524daec4d8e22bdada7f21a9487c2d3e1057
M: d34da8666a6f587283a1c2fca5d13691407f9462 10.0.0.28:6379
   slots:[12288-16383] (4096 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
#直接加为slave节点
[root@redis-node1 ~]#redis-cli -a 123456 --cluster add-node 10.0.0.78:6379 
10.0.0.8:6379 --cluster-slave --cluster-master-id 
d6e2eca6b338b717923f64866bd31d42e52edc98
#验证是否成功
[root@redis-node1 ~]#redis-cli -a 123456 --cluster check 10.0.0.8:6379
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
10.0.0.8:6379 (cb028b83...) -> 5019 keys | 4096 slots | 1 slaves.
10.0.0.68:6379 (d6e2eca6...) -> 4948 keys | 4096 slots | 1 slaves.
10.0.0.48:6379 (d04e524d...) -> 5033 keys | 4096 slots | 1 slaves.
10.0.0.28:6379 (d34da866...) -> 5000 keys | 4096 slots | 1 slaves.
[OK] 20000 keys in 4 masters.
1.22 keys per slot on average.
>>> Performing Cluster Check (using node 10.0.0.8:6379)
M: cb028b83f9dc463d732f6e76ca6bbcd469d948a7 10.0.0.8:6379
   slots:[1365-5460] (4096 slots) master
   1 additional replica(s)
M: d6e2eca6b338b717923f64866bd31d42e52edc98 10.0.0.68:6379
   slots:[0-1364],[5461-6826],[10923-12287] (4096 slots) master
   1 additional replica(s)
S: 36840d7eea5835ba540d9b64ec018aa3f8de6747 10.0.0.78:6379
   slots: (0 slots) slave
   replicates d6e2eca6b338b717923f64866bd31d42e52edc98
S: 9875b50925b4e4f29598e6072e5937f90df9fc71 10.0.0.58:6379
   slots: (0 slots) slave
   replicates d34da8666a6f587283a1c2fca5d13691407f9462
S: f9adcfb8f5a037b257af35fa548a26ffbadc852d 10.0.0.38:6379
   slots: (0 slots) slave
   replicates cb028b83f9dc463d732f6e76ca6bbcd469d948a7
M: d04e524daec4d8e22bdada7f21a9487c2d3e1057 10.0.0.48:6379
   slots:[6827-10922] (4096 slots) master
   1 additional replica(s)
S: 99720241248ff0e4c6fa65c2385e92468b3b5993 10.0.0.18:6379
   slots: (0 slots) slave
   replicates d04e524daec4d8e22bdada7f21a9487c2d3e1057
M: d34da8666a6f587283a1c2fca5d13691407f9462 10.0.0.28:6379
   slots:[12288-16383] (4096 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@centos8 ~]#redis-cli -a 123456 -h 10.0.0.8 --no-auth-warning cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:8   #8个节点
cluster_size:4          #4组主从
cluster_current_epoch:11
cluster_my_epoch:10
cluster_stats_messages_ping_sent:1810
cluster_stats_messages_pong_sent:1423
cluster_stats_messages_auth-req_sent:5
cluster_stats_messages_update_sent:14
cluster_stats_messages_sent:3252
cluster_stats_messages_ping_received:1417
cluster_stats_messages_pong_received:1368
cluster_stats_messages_meet_received:2
cluster_stats_messages_fail_received:2
cluster_stats_messages_auth-ack_received:2
cluster_stats_messages_update_received:4
cluster_stats_messages_received:2795

方法2:先将新节点加入集群,再修改为slave
为新的master添加slave节点
Redis 5 以上版本命令:

#把10.0.0.78:6379添加到集群中:
[root@redis-node1 ~]#redis-cli -a 123456 --cluster add-node 10.0.0.78:6379 
10.0.0.8:6379

更改新节点更改状态为slave:
需要手动将其指定为某个master的slave,否则其默认角色为master。
[root@redis-node1 ~]#redis-cli -h 10.0.0.78 -p 6379 -a 123456 #登录到新添加节点
10.0.0.78:6380> CLUSTER NODES #查看当前集群节点,找到目标master 的ID
10.0.0.78:6380> CLUSTER REPLICATE 886338acd50c3015be68a760502b239f4509881c #将其设
置slave,命令格式为cluster replicate MASTERID
10.0.0.78:6380> CLUSTER NODES #再次查看集群节点状态,验证节点是否已经更改为指定master 的
slave

1.2.5.2 集群缩容

スケールダウンの適用シナリオ:
ビジネスの縮小に伴い、ユーザー数が大幅に減少するため、リーダーと協議した結果、既存の Redis クラスター内の 8 台のホストのうち 2 台をオフラインで他の用途に使用することに決定しました。パフォーマンスはまだ
現在のビジネス ニーズを満たすことができます
ノードの削除 プロセス:
容量を拡張する場合は、最初にクラスターにノードを追加してからスロットを割り当てますが、縮小する場合はその逆の操作が行われます。まず、削除するノード上のスロットが移行されます。クラスタ内の他のノードにスロットを割り当てると、スロットがクラスタから削除されます。ノード上のスロットが完全に移行されて空になっていない場合は、データ エラーが発生し、削除できないことを示すプロンプトも表示されます。ノードが削除されます。
ここに画像の説明を挿入
削除するマスター ノードのスロットを別のマスターに移行します。
注: 移行する Redis マスターのソース サーバーは、データがないことを確認する必要があります。データがない場合、移行はエラーを報告し、強制的に中断されます。

Redis バージョン 5 以降のコマンド – 人々から取得し、人々に返す(移動ターゲットは 1 つのオブジェクトしか操作できないため、追加の 4096 を直接書き込むことはできません。そのため、毎回異なるオブジェクトに 3 回移動します。スロットは Extra です) 4096\元のプライマリ ノード)

#查看当前状态
[root@redis-node1 ~]#redis-cli -a 123456 --cluster check 10.0.0.8:6379
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
10.0.0.8:6379 (cb028b83...) -> 5019 keys | 4096 slots | 1 slaves.
10.0.0.68:6379 (d6e2eca6...) -> 4948 keys | 4096 slots | 1 slaves.
10.0.0.48:6379 (d04e524d...) -> 5033 keys | 4096 slots | 1 slaves.
10.0.0.28:6379 (d34da866...) -> 5000 keys | 4096 slots | 1 slaves.
[OK] 20000 keys in 4 masters.
1.22 keys per slot on average.
>>> Performing Cluster Check (using node 10.0.0.8:6379)
M: cb028b83f9dc463d732f6e76ca6bbcd469d948a7 10.0.0.8:6379
   slots:[1365-5460] (4096 slots) master
   1 additional replica(s)
M: d6e2eca6b338b717923f64866bd31d42e52edc98 10.0.0.68:6379
   slots:[0-1364],[5461-6826],[10923-12287] (4096 slots) master
   1 additional replica(s)
S: 36840d7eea5835ba540d9b64ec018aa3f8de6747 10.0.0.78:6379
   slots: (0 slots) slave
   replicates d6e2eca6b338b717923f64866bd31d42e52edc98
S: 9875b50925b4e4f29598e6072e5937f90df9fc71 10.0.0.58:6379
   slots: (0 slots) slave
   replicates d34da8666a6f587283a1c2fca5d13691407f9462
S: f9adcfb8f5a037b257af35fa548a26ffbadc852d 10.0.0.38:6379
   slots: (0 slots) slave
   replicates cb028b83f9dc463d732f6e76ca6bbcd469d948a7
M: d04e524daec4d8e22bdada7f21a9487c2d3e1057 10.0.0.48:6379
   slots:[6827-10922] (4096 slots) master
   1 additional replica(s)
S: 99720241248ff0e4c6fa65c2385e92468b3b5993 10.0.0.18:6379
   slots: (0 slots) slave
   replicates d04e524daec4d8e22bdada7f21a9487c2d3e1057
M: d34da8666a6f587283a1c2fca5d13691407f9462 10.0.0.28:6379
   slots:[12288-16383] (4096 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
#连接到任意集群节点,#最后1365个slot从10.0.0.8移动到第一个master节点10.0.0.28上
[root@redis-node1 ~]#redis-cli -a 123456 --cluster reshard 10.0.0.18:6379
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
>>> Performing Cluster Check (using node 10.0.0.18:6379)
S: 99720241248ff0e4c6fa65c2385e92468b3b5993 10.0.0.18:6379
   slots: (0 slots) slave
   replicates d04e524daec4d8e22bdada7f21a9487c2d3e1057
S: f9adcfb8f5a037b257af35fa548a26ffbadc852d 10.0.0.38:6379
   slots: (0 slots) slave
   replicates cb028b83f9dc463d732f6e76ca6bbcd469d948a7
S: 36840d7eea5835ba540d9b64ec018aa3f8de6747 10.0.0.78:6379
   slots: (0 slots) slave
   replicates d6e2eca6b338b717923f64866bd31d42e52edc98
M: cb028b83f9dc463d732f6e76ca6bbcd469d948a7 10.0.0.8:6379
   slots:[1365-5460] (4096 slots) master
   1 additional replica(s)
M: d6e2eca6b338b717923f64866bd31d42e52edc98 10.0.0.68:6379
   slots:[0-1364],[5461-6826],[10923-12287] (4096 slots) master
   1 additional replica(s)
S: 9875b50925b4e4f29598e6072e5937f90df9fc71 10.0.0.58:6379
   slots: (0 slots) slave
   replicates d34da8666a6f587283a1c2fca5d13691407f9462
M: d04e524daec4d8e22bdada7f21a9487c2d3e1057 10.0.0.48:6379
   slots:[6827-10922] (4096 slots) master
   1 additional replica(s)
M: d34da8666a6f587283a1c2fca5d13691407f9462 10.0.0.28:6379
   slots:[12288-16383] (4096 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 1356 #共4096/3分别给其它三个
master节点
What is the receiving node ID? d34da8666a6f587283a1c2fca5d13691407f9462 #master 
10.0.0.28
Please enter all the source node IDs.
 Type 'all' to use all the nodes as source nodes for the hash slots.
 Type 'done' once you entered all the source nodes IDs.
Source node #1: cb028b83f9dc463d732f6e76ca6bbcd469d948a7 #输入要删除节点10.0.0.8的
ID
Source node #2: done
Ready to move 1356 slots.
 Source nodes:
   M: cb028b83f9dc463d732f6e76ca6bbcd469d948a7 10.0.0.8:6379
       slots:[1365-5460] (4096 slots) master
       1 additional replica(s)
 Destination node:
   M: d34da8666a6f587283a1c2fca5d13691407f9462 10.0.0.28:6379
       slots:[12288-16383] (4096 slots) master
       1 additional replica(s)
 Resharding plan:
   Moving slot 1365 from cb028b83f9dc463d732f6e76ca6bbcd469d948a7
......
 Moving slot 2719 from cb028b83f9dc463d732f6e76ca6bbcd469d948a7
   Moving slot 2720 from cb028b83f9dc463d732f6e76ca6bbcd469d948a7
Do you want to proceed with the proposed reshard plan (yes/no)? yes #确定
......
Moving slot 2718 from 10.0.0.8:6379 to 10.0.0.28:6379: ..
Moving slot 2719 from 10.0.0.8:6379 to 10.0.0.28:6379: .
Moving slot 2720 from 10.0.0.8:6379 to 10.0.0.28:6379: ..
#非交互式方式
#再将1365个slot从10.0.0.8移动到第二个master节点10.0.0.48上
[root@redis-node1 ~]#redis-cli -a 123456 --cluster reshard 10.0.0.18:6379 --
cluster-slots 1365 --cluster-from cb028b83f9dc463d732f6e76ca6bbcd469d948a7 --
cluster-to d04e524daec4d8e22bdada7f21a9487c2d3e1057 --cluster-yes
#最后的slot从10.0.0.8移动到第三个master节点10.0.0.68上
[root@redis-node1 ~]#redis-cli -a 123456 --cluster reshard 10.0.0.18:6379 --
cluster-slots 1375 --cluster-from cb028b83f9dc463d732f6e76ca6bbcd469d948a7 --
cluster-to d6e2eca6b338b717923f64866bd31d42e52edc98 --cluster-yes
#确认10.0.0.8的所有slot都移走了,上面的slave也自动删除,成为其它master的slave 
[root@redis-node1 ~]#redis-cli -a 123456 --cluster check 10.0.0.8:6379
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
10.0.0.8:6379 (cb028b83...) -> 0 keys | 0 slots | 0 slaves.
10.0.0.68:6379 (d6e2eca6...) -> 6631 keys | 5471 slots | 2 slaves.
10.0.0.48:6379 (d04e524d...) -> 6694 keys | 5461 slots | 1 slaves.
10.0.0.28:6379 (d34da866...) -> 6675 keys | 5452 slots | 1 slaves.
[OK] 20000 keys in 4 masters.
1.22 keys per slot on average.
>>> Performing Cluster Check (using node 10.0.0.8:6379)
M: cb028b83f9dc463d732f6e76ca6bbcd469d948a7 10.0.0.8:6379
   slots: (0 slots) master
M: d6e2eca6b338b717923f64866bd31d42e52edc98 10.0.0.68:6379
   slots:[0-1364],[4086-6826],[10923-12287] (5471 slots) master
   2 additional replica(s)
S: 36840d7eea5835ba540d9b64ec018aa3f8de6747 10.0.0.78:6379
   slots: (0 slots) slave
 replicates d6e2eca6b338b717923f64866bd31d42e52edc98
S: 9875b50925b4e4f29598e6072e5937f90df9fc71 10.0.0.58:6379
   slots: (0 slots) slave
   replicates d34da8666a6f587283a1c2fca5d13691407f9462
S: f9adcfb8f5a037b257af35fa548a26ffbadc852d 10.0.0.38:6379
   slots: (0 slots) slave
   replicates d6e2eca6b338b717923f64866bd31d42e52edc98
M: d04e524daec4d8e22bdada7f21a9487c2d3e1057 10.0.0.48:6379
   slots:[2721-4085],[6827-10922] (5461 slots) master
   1 additional replica(s)
S: 99720241248ff0e4c6fa65c2385e92468b3b5993 10.0.0.18:6379
   slots: (0 slots) slave
   replicates d04e524daec4d8e22bdada7f21a9487c2d3e1057
M: d34da8666a6f587283a1c2fca5d13691407f9462 10.0.0.28:6379
   slots:[1365-2720],[12288-16383] (5452 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
#原有的10.0.0.38自动成为10.0.0.68的slave
[root@redis-node1 ~]#redis-cli -a 123456 -h 10.0.0.68 INFO replication
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
# Replication
role:master
connected_slaves:2
slave0:ip=10.0.0.78,port=6379,state=online,offset=129390,lag=0
slave1:ip=10.0.0.38,port=6379,state=online,offset=129390,lag=0
master_replid:43e3e107a0acb1fd5a97240fc4b2bd8fc85b113f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:129404
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:129404
[root@centos8 ~]#redis-cli -a 123456 -h 10.0.0.8 --no-auth-warning cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:8  #集群中8个节点
cluster_size:3         #少了一个主从的slot
cluster_current_epoch:16
cluster_my_epoch:13
cluster_stats_messages_ping_sent:3165
cluster_stats_messages_pong_sent:2489
cluster_stats_messages_fail_sent:6
cluster_stats_messages_auth-req_sent:5
cluster_stats_messages_auth-ack_sent:1
cluster_stats_messages_update_sent:27
cluster_stats_messages_sent:5693
cluster_stats_messages_ping_received:2483
cluster_stats_messages_pong_received:2400
cluster_stats_messages_meet_received:2
cluster_stats_messages_fail_received:2
cluster_stats_messages_auth-req_received:1
cluster_stats_messages_auth-ack_received:2
cluster_stats_messages_update_received:4
cluster_stats_messages_received:4894

クラスターからサーバーを削除します
。 上記の手順が完了すると、スロットは移行されましたが、ノードはまだクラスターのメンバーであるため、ノードをクラスターから削除する必要があります。 注: サーバーを削除する前に、スロット上のスロット
はホストをクリアする必要があります。そうでない場合、ホストの削除は失敗します。

Redis バージョン 5 以降のコマンド:

[root@redis-node1 ~]#redis-cli -a 123456 --cluster del-node <任意集群节点的IP>:6379 
cb028b83f9dc463d732f6e76ca6bbcd469d948a7
#cb028b83f9dc463d732f6e76ca6bbcd469d948a7是删除节点的ID
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
>>> Removing node cb028b83f9dc463d732f6e76ca6bbcd469d948a7 from cluster 
10.0.0.8:6379
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node. 
#删除节点后,redis进程自动关闭
#删除节点信息
[root@redis-node1 ~]#rm -f /var/lib/redis/nodes-6379.conf

冗長スレーブノード検証結果の削除

#验证删除成功
[root@redis-node1 ~]#ss -ntl
State       Recv-Q       Send-Q   Local Address:Port     Peer Address:Port     
   
LISTEN       0             128            0.0.0.0:22             0.0.0.0:*       
    
LISTEN       0             128               [::]:22               [::]:*  
[root@redis-node1 ~]#redis-cli -a 123456 --cluster check 10.0.0.18:6379 
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
10.0.0.68:6379 (d6e2eca6...) -> 6631 keys | 5471 slots | 2 slaves.
10.0.0.48:6379 (d04e524d...) -> 6694 keys | 5461 slots | 1 slaves.
10.0.0.28:6379 (d34da866...) -> 6675 keys | 5452 slots | 1 slaves.
[OK] 20000 keys in 3 masters.
1.22 keys per slot on average.
>>> Performing Cluster Check (using node 10.0.0.18:6379)
S: 99720241248ff0e4c6fa65c2385e92468b3b5993 10.0.0.18:6379
   slots: (0 slots) slave
   replicates d04e524daec4d8e22bdada7f21a9487c2d3e1057
S: f9adcfb8f5a037b257af35fa548a26ffbadc852d 10.0.0.38:6379
   slots: (0 slots) slave
   replicates d6e2eca6b338b717923f64866bd31d42e52edc98
S: 36840d7eea5835ba540d9b64ec018aa3f8de6747 10.0.0.78:6379
   slots: (0 slots) slave
   replicates d6e2eca6b338b717923f64866bd31d42e52edc98
M: d6e2eca6b338b717923f64866bd31d42e52edc98 10.0.0.68:6379
   slots:[0-1364],[4086-6826],[10923-12287] (5471 slots) master
   2 additional replica(s)
S: 9875b50925b4e4f29598e6072e5937f90df9fc71 10.0.0.58:6379
   slots: (0 slots) slave
   replicates d34da8666a6f587283a1c2fca5d13691407f9462
M: d04e524daec4d8e22bdada7f21a9487c2d3e1057 10.0.0.48:6379
   slots:[2721-4085],[6827-10922] (5461 slots) master
   1 additional replica(s)
M: d34da8666a6f587283a1c2fca5d13691407f9462 10.0.0.28:6379
   slots:[1365-2720],[12288-16383] (5452 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
#删除多余的slave从节点
[root@redis-node1 ~]#redis-cli -a 123456 --cluster del-node 10.0.0.18:6379 
f9adcfb8f5a037b257af35fa548a26ffbadc852d
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
>>> Removing node f9adcfb8f5a037b257af35fa548a26ffbadc852d from cluster 
10.0.0.18:6379
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node. 
#删除集群文件
[root@redis-node4 ~]#rm -f /var/lib/redis/nodes-6379.conf 
[root@redis-node1 ~]#redis-cli -a 123456 --cluster check 10.0.0.18:6379 
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
10.0.0.68:6379 (d6e2eca6...) -> 6631 keys | 5471 slots | 1 slaves.
10.0.0.48:6379 (d04e524d...) -> 6694 keys | 5461 slots | 1 slaves.
10.0.0.28:6379 (d34da866...) -> 6675 keys | 5452 slots | 1 slaves.
[OK] 20000 keys in 3 masters.
1.22 keys per slot on average.
>>> Performing Cluster Check (using node 10.0.0.18:6379)
S: 99720241248ff0e4c6fa65c2385e92468b3b5993 10.0.0.18:6379
   slots: (0 slots) slave
   replicates d04e524daec4d8e22bdada7f21a9487c2d3e1057
S: 36840d7eea5835ba540d9b64ec018aa3f8de6747 10.0.0.78:6379
   slots: (0 slots) slave
   replicates d6e2eca6b338b717923f64866bd31d42e52edc98
M: d6e2eca6b338b717923f64866bd31d42e52edc98 10.0.0.68:6379
 slots:[0-1364],[4086-6826],[10923-12287] (5471 slots) master
   1 additional replica(s)
S: 9875b50925b4e4f29598e6072e5937f90df9fc71 10.0.0.58:6379
   slots: (0 slots) slave
   replicates d34da8666a6f587283a1c2fca5d13691407f9462
M: d04e524daec4d8e22bdada7f21a9487c2d3e1057 10.0.0.48:6379
   slots:[2721-4085],[6827-10922] (5461 slots) master
   1 additional replica(s)
M: d34da8666a6f587283a1c2fca5d13691407f9462 10.0.0.28:6379
   slots:[1365-2720],[12288-16383] (5452 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@redis-node1 ~]#redis-cli -a 123456 --cluster info 10.0.0.18:6379 
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
10.0.0.68:6379 (d6e2eca6...) -> 6631 keys | 5471 slots | 1 slaves.
10.0.0.48:6379 (d04e524d...) -> 6694 keys | 5461 slots | 1 slaves.
10.0.0.28:6379 (d34da866...) -> 6675 keys | 5452 slots | 1 slaves.
[OK] 20000 keys in 3 masters.
1.22 keys per slot on average.
#查看集群信息
[root@redis-node1 ~]#redis-cli -a 123456 -h 10.0.0.18 CLUSTER INFO
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6  #只有6个节点
cluster_size:3
cluster_current_epoch:11
cluster_my_epoch:10
cluster_stats_messages_ping_sent:12147
cluster_stats_messages_pong_sent:12274
cluster_stats_messages_update_sent:14
cluster_stats_messages_sent:24435
cluster_stats_messages_ping_received:12271
cluster_stats_messages_pong_received:12147
cluster_stats_messages_meet_received:3
cluster_stats_messages_update_received:28
cluster_stats_messages_received:24449

1.2.5.3 クラスターのスキュー

Redis クラスターで複数のノードが一定期間実行されると、チルト現象が発生することがあります。ノードのデータが多すぎるか、より多くのメモリを消費するか、より多くのアクセスを求めるユーザー リクエストを受け入れます。チルトの理由は次のとおり
です

  • ノードとスロットの不均等な分散
  • 異なるスロットに対応するキー値の数は大きく異なります
  • bigkey が含まれているため、使用量を減らすことをお勧めします
  • メモリ関連の構成に一貫性がない
  • アンバランスなホットスポット データ: 整合性が高くない場合は、このキャッシュと MQ を使用できます。

指定されたスロット内の対応するキー値の数を取得します

#redis-cli cluster countkeysinslot {slot的值}
范例: 获取指定slot对应的key个数
[root@centos8 ~]#redis-cli -a 123456 cluster countkeysinslot 1
(integer) 0
[root@centos8 ~]#redis-cli -a 123456 cluster countkeysinslot 2
(integer) 0
[root@centos8 ~]#redis-cli -a 123456 cluster countkeysinslot 3
(integer) 1

自動スロット リバランス配布を実行しますが、クライアント アクセスに影響します。この方法は注意して使用する必要があります。

[root@centos8 ~]#redis-cli -a 123456 --cluster rebalance 10.0.0.8:6379
>>> Performing Cluster Check (using node 10.0.0.8:6379)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
*** No rebalancing needed! All nodes are within the 2.00% threshold.

bigkey を取得するには、スレーブ ノードで実行することをお勧めします。

#redis-cli --bigkeys
范例: 查找 bigkey
[root@centos8 ~]#redis-cli -a 123456 --bigkeys
# Scanning the entire keyspace to find biggest keys as well as
# average sizes per key type. You can use -i 0.1 to sleep 0.1 sec
# per 100 SCAN commands (not usually needed).
[00.00%] Biggest string found so far 'key8811' with 9 bytes
[26.42%] Biggest string found so far 'testkey1' with 10 bytes
-------- summary -------
Sampled 3335 keys in the keyspace!
Total key length in bytes is 22979 (avg len 6.89)
Biggest string found 'testkey1' has 10 bytes
3335 strings with 29649 bytes (100.00% of keys, avg size 8.89)
0 lists with 0 items (00.00% of keys, avg size 0.00)
0 sets with 0 members (00.00% of keys, avg size 0.00)
0 hashs with 0 fields (00.00% of keys, avg size 0.00)
0 zsets with 0 members (00.00% of keys, avg size 0.00)
0 streams with 0 entries (00.00% of keys, avg size 0.00)

1.2.5.4 Redis クラスターの制限事項

クラスター モードのスレーブ ノードは読み取り専用接続です。つまり、クラスター モードのスレーブ ノードは読み取りおよび書き込み要求を拒否します。コマンドが
スレーブ ノードからデータを取得しようとすると、スレーブ ノードはデータが存在するスロットを担当するノードにコマンドをリダイレクトします。
なぜ読み取り専用接続なのでしょうか? スレーブはコマンド readonly を実行できるため、スレーブ ノードはリクエストを読み取ることができますが、これは
この接続でのみ有効です。つまり、クライアントが切断されて再起動されると、リクエストは再びリダイレクトされます。
クラスターモードでの読み取りと書き込みの分離はより複雑であり、スレーブノードと異なるマスターノードのスロット間の関係を維持する必要があります。
一般に、クラスター モードで読み取りと書き込みの分離を構築することは推奨されませんが、需要を解決するためにノードを追加することは推奨されません。ただし、
ノード間の情報交換によって発生する帯域幅の問題を考慮して、ノード数は 1,000 を超えないようにすることが公式に推奨されています。

1.2.5.5 スタンドアロン、センチネル、クラスターの選択

  • ほとんどの場合、クライアントのパフォーマンスが「低下」します
  • mget、keys、scan、flush、sinter などのコマンドをノード間で使用することはできません。
  • クライアント側のメンテナンスはより複雑です: SDK とアプリケーション自体が消費されます (接続プールの増加など)。
  • 複数のデータベースはサポートされていません。クラスター モードでは db 0 が 1 つだけです。
  • レプリケーションは 1 つのレベルのみをサポートします。ツリー レプリケーション構造はサポートされません。カスケード レプリケーションはサポートされません。
  • キー トランザクションと Lua のサポートは制限されています。操作のキーは 1 つのノード上にある必要があり、Lua とトランザクションはノード間で使用できません。

したがって、クラスタの構築においては、単一マシンの redis では業務の同時実行性を満たせなくなるかどうかも考慮する必要がありますが、redis Sentinel も高可用性を満たし、同時実行性が飽和していないことが前提であれば、クラスタの構築は不要です。

范例: 跨slot的局限性
[root@centos8 ~]#redis-cli -a 123456 mget key1 key2 key3
Warning: Using a password with '-a' or '-u' option on the command line interface 
may not be safe.
(error) CROSSSLOT Keys in request don't hash to the same slot

2. 一般的な LVS モデルの動作原理と実装。

2.1 LVSの動作原理

LVS は、リクエスト メッセージのターゲット IP、ターゲット プロトコル、ポートに従ってリクエスト メッセージをスケジュールして特定の RS に転送し、スケジューリング アルゴリズムに従って RS を選択します。LVS はカーネル
レベルの機能です。INPUT チェーンの位置で動作し、INPUT に送信されたトラフィックを「処理」します。
例: LVS のカーネル サポートを確認します。

[root@centos8 ~]#grep -i -C 10 ipvs /boot/config-4.18.0-147.el8.x86_64 
...(省略部分内容)...
CONFIG_NETFILTER_XT_MATCH_IPVS=m
CONFIG_NETFILTER_XT_MATCH_POLICY=m
...(省略部分内容)...
#
# IPVS transport protocol load balancing support
#
CONFIG_IP_VS_PROTO_TCP=y
CONFIG_IP_VS_PROTO_UDP=y
CONFIG_IP_VS_PROTO_AH_ESP=y
CONFIG_IP_VS_PROTO_ESP=y
CONFIG_IP_VS_PROTO_AH=y
CONFIG_IP_VS_PROTO_SCTP=y 
#
# IPVS scheduler
#
CONFIG_IP_VS_RR=m
CONFIG_IP_VS_WRR=m
CONFIG_IP_VS_LC=m
CONFIG_IP_VS_WLC=m
CONFIG_IP_VS_FO=m  #新增
CONFIG_IP_VS_OVF=m  #新增
CONFIG_IP_VS_LBLC=m
CONFIG_IP_VS_LBLCR=m
CONFIG_IP_VS_DH=m
CONFIG_IP_VS_SH=m
# CONFIG_IP_VS_MH is not set
CONFIG_IP_VS_SED=m
CONFIG_IP_VS_NQ=m
...(省略部分内容)... 

2.2 LVS クラスタータイプの用語

VS: 仮想サーバー、ディレクター サーバー (DS)、ディスパッチャー (スケジューラー)、ロード バランサー
RS: リアル サーバー (lvs)、アップストリーム サーバー (nginx)、バックエンド サーバー (haproxy)
CIP: クライアント IP
VIP: 仮想サーブ IP VS 外部ネットワーク IP
DIP: ディレクター IP VS イントラネット IP
RIP: リアルサーバー IP
アクセスプロセス: CIP <–> VIP == DIP <–> RIP

2.3 LVS クラスターの動作モード

2.3.1 LVSのNATモード

lvs-nat: リクエスト メッセージのターゲット IP、複数のターゲット IP の DNAT を変更します。
lvs-dr: 新しい MAC アドレスを操作してカプセル化します。
lvs-tun: 元のリクエスト IP メッセージに新しい IP ヘッダーを追加します。 lvs-
fullnat:リクエストメッセージ テキストのソースおよびターゲット IP、デフォルトのカーネルは
LVS の NAT モードをサポートしていません
(実際、dnat にもマルチターゲット機能がありますが、それらはすべて netfilter カーネル関数に基づいて実装されていますが、lvs はそれをサポートします)より良い)
dnat にはマルチターゲット機能しかありません 1 つだけ設定できます
利点: ポートマッピングをサポートします
欠点: バックエンドサーバー上の複数の DS の負荷が増加します
公式リンク

http://www.linuxvirtualserver.org/VS-NAT.html

lvs-nat:本質はマルチターゲット IP の DNAT であり、リクエスト メッセージ内のターゲット アドレスとターゲット ポートを選択した RS の RIP と PORT に変更することで転送が実現されます。
ここに画像の説明を挿入

入力チェーンに到達すると、lvs モジュールはユーザーのリクエストをハイジャックし、フォワード経由で戻ります。
ここに画像の説明を挿入

2.3.2 LVSのDRモード

公式リンク

http://www.linuxvirtualserver.org/VS-DRouting.html

例: Zhang San と話したいのですが、Li Si が応答します。Li Si に Zhang San のふりをさせることができます (最大の問題は、1 つのアドレス vip を複数のマシンにロードできないことです)

LVS-DR: ダイレクト ルーティング、ダイレクト ルーティング、LVS デフォルト モード、最も広く使用されており、要求メッセージの MAC ヘッダーを再カプセル化して転送します。ソース MAC は、DIP が配置されているインターフェイスの MAC であり、ターゲットMAC は選択された RS RIP が配置されているインターフェイスの MAC アドレス、ソース IP/ポート、およびターゲット IP/ポートは変更されません。rs は
ここに画像の説明を挿入
vip で設定されていますが、ルータは認識できません。そうでない場合は転送されます。 DSへ

DRモードの特徴:

  1. ディレクターと各 RS は VIP で構成されます
  2. フロントエンド ルーターが、宛先 IP を VIP として含む要求パケットをディレクターに送信することを確認します。
    • フロントエンド ゲートウェイ上の VIP とディレクターの MAC アドレスを静的にバインドします。
    • RS での arptables ツールの使用

arptables -A IN -d $VIP -j DROP
arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP

  • RS のカーネル パラメータを変更して、ARP 通知と応答レベルを制限します

例: 家にお金がたくさんある場合、他人が自分のことを考えるのが怖いので、
/proc/sys/net/ipv4/conf/all/arp_ignore #我不说,我 と尋ねられても無視します。听论你
#Free arp when ネットワーク カードが開始されると、ネットワーク カードが率先してメッセージを送信します。私はこのアドレスを所有しています
/proc/sys/net/ipv4/conf/all/arp_announce
#誰かがあなたに尋ねたら、私はあなたに率先して話すつもりはありませんし、私もそれについて率先して話すつもりはありません、だからあなたの知らない誰がいつもこのアドレスを持っているでしょう


  1. RS の RIP はプライベート ネットワーク アドレスまたはパブリック ネットワーク アドレスを使用できます。RIP と DIP は同じ IP ネットワーク内にあります。応答メッセージがディレクタを通過しないように、RIP のゲートウェイは DIP をポイントできません。
  2. RS と Director は同じ物理ネットワーク上にある必要があります (ds は rs の MAC アドレスを知りませんが、rs の ip は知っています、arp はブロードキャストによって完了し、ルーターはブロードキャストを分離し、途中にルーターを追加することはできません) )
  3. リクエスト メッセージはディレクターを経由する必要がありますが、応答メッセージはディレクターを経由せず、RS によってクライアントに直接送信されます。
  4. ポートマッピングはサポートされていません(ポートは変更できません)
  5. ip_forward を開く必要はありません
  6. RS はほとんどの OS システムを使用できます
    ここに画像の説明を挿入

2.3.3 LVSのTUNモード

ルーターを真ん中に置くことも可能
公式リンク

http://www.linuxvirtualserver.org/VS-IPTunneling.html

転送方法: リクエスト メッセージの IP ヘッダーは変更せず (送信元 IP は CIP、宛先 IP は VIP)、元の IP メッセージに加えて IP ヘッダーをカプセル化します (送信元 IP は DIP、宛先 IP は RIP)。選択したターゲット RS にメッセージを送信します
。RS はクライアントに直接応答します (ソース IP は VIP、ターゲット IP は CIP)。
ここに画像の説明を挿入

例: openvpn、クライアント パブリック ネットワーク ip103、vpn 内部ネットワーク ip10.8.0.5、バックエンド 172.16.xx は
送信元アドレス 10.8.0.5、宛先 172 から送信されました。バックエンドはプライベート ネットワーク アドレスであるため、これが元のメッセージです。送信できませんそれ。
ルーターを通過した後にバックエンドに到達できるように、メッセージのヘッダーにパブリック ネットワーク アドレスを追加してから削除します。172 が表示されると、それが入ってきます。ヘッダーを追加するだけでなく、暗号化する必要があります

ここに画像の説明を挿入

ここに画像の説明を挿入
TUN モードの機能:

  1. RIP と DIP は同じ物理ネットワーク内に存在しない場合があります。通常、RS のゲートウェイは DIP をポイントできません。RIP はパブリック ネットワークと通信できます。つまり
    、クラスター ノードはインターネット経由で実装できます。DIP、VIP、RIP はパブリック アドレスにすることができます
  2. ディレクターによって転送されたデータ パケットと応答パケットの
    ソース IPを受信するには、RealServer の tun インターフェイスで VIP アドレスを設定する必要があります。
  3. ディレクターは RealServer に転送するときにトンネルを使用する必要があります。トンネルの外層の IP ヘッダーの送信元 IP は DIP、宛先 IP は RIP、RealServer がクライアントに応答する IP ヘッダーは次のように取得されます
    。トンネルの内層の IP ヘッダーを分析します。ソース IP は VIP、ターゲット IP は CIP です。
  4. リクエスト メッセージは Director を通過する必要がありますが、応答は Director を通過せず、応答は RealServer 自体によって完了します。
  5. ポートマッピングはサポートされていません
  6. RS の OS はトンネリング機能をサポートする必要があります。
    アプリケーション シナリオ:

一般に、TUN モードは、キャッシュ サーバー グループの負荷スケジューリングによく使用され、これらのキャッシュ サーバーは通常、異なるネットワーク環境に配置され、近くのクライアントに返すことができます。リクエスト オブジェクトがキャッシュ サーバーによってローカルにヒットされない場合、キャッシュ サーバーはソース サーバーにリクエストを送信し、結果を取得し、最終的に結果をユーザーに返します。
LAN 環境では DR モードが一般的に採用され、WAN 環境では TUN モードが使用できますが、一般的に WAN 環境ではリクエストの転送は haproxy/nginx/DNS によって実装されます。したがって、TUN モードが実際に使用されることはほとんどなく、コンピューター ルーム間のアプリケーションは通常、専用の光ファイバー接続または DNS スケジューリングです。

2.3.4 LVSのFULLNATモード

nat と似ていますが、nat はターゲット IP のみを変更し、ソース IP は変更しません。元のルートに戻る必要がありますが、元のルートを確保できないため、ネットワーク通信障害が発生します。

利点は、rs はクライアントから送信された実際の IP アドレスを見ることができないことです。rs は、それが ds から送信されたリクエストであると考え、返信パケットが元のルートで返されることを保証します。そのようなことが起こったとき、Ali は、のために fullant を開発しました
。 2回目。
ここに画像の説明を挿入
リクエストメッセージの送信元IPアドレスと宛先IPアドレスを同時に変更して転送する(元のルートで返される必要があり、DNATの途中にルータが追加された場合は元のルートで返されない場合がある) CIP --> DIP
VIP
--> RIP
fullnat モードの機能:

  1. VIP はパブリック ネットワーク アドレスであり、RIP と DIP はプライベート ネットワーク アドレスであり、通常は同じ IP ネットワーク内にないため、通常、RIP のゲートウェイは DIP を指しません
  2. RS が受信したリクエスト メッセージの送信元アドレスは DIP であるため、RS は DIP に応答するだけで済みますが、Director はそれをクライアントにも送信します。
  3. 要求メッセージと応答メッセージは両方とも Director を通過します。
  4. NAT モードと比較して、LVS-RealServer 間のクロス VLAN 通信をより適切に実現できます。
  5. ポート マッピングのサポート
    注: このタイプのカーネルはデフォルトではサポートしません

2.3.6 LVS 動作モードの概要と比較

ここに画像の説明を挿入

lvs-nat と lvs-fullnat:

  • 要求メッセージと応答メッセージは両方とも Director を通過します。
  • lvs-nat: RIP のゲートウェイは DIP を指す必要があります

  • lvs-fullnat: RIP と DIP は同じ IP ネットワーク内になくてもかまいませんが、 lvs-dr および lvs-tun と通信できる必要があります。
  • リクエスト メッセージはディレクタを介して送信されますが、応答メッセージは RS によってクライアントに直接送信されます。
  • lvs-dr: 新しい MAC ヘッダーをカプセル化し、MAC ネットワーク経由で転送することで実現
  • lvs-tun: 転送は、元の IP パケットの外側に新しい IP ヘッダーをカプセル化することで実現され、長距離通信をサポートします。

2.3.5 LVS-DRモードの単一ネットワークセグメントの場合

LVS-DR モードの単一ネットワーク セグメントの場合
、DR モデルの各ホストで VIP を構成する必要があります。アドレスの競合を解決するには、次の 3 つの方法があります:
(1) フロントエンド ゲートウェイで静的バインドを実行する
(2) を使用する各 RS の arptables (3) 各 RS で arptables を使用する
RS はカーネル パラメータを変更して、arp 応答と通知のレベルを制限します
応答レベルの制限: arp_ignore

  • 0: デフォルト値。これは、任意のローカル インターフェイス上で設定された任意のアドレスを応答に使用できることを意味します。
  • 1: 要求された宛先 IP が要求メッセージを受信するローカル ホストのインターフェイス上に設定されている場合にのみ応答が返されます。制限された
    アナウンス レベル: arp_announce
  • 0: デフォルト値、本機の全インターフェースの全情報を各インターフェースのネットワークに広告します。
  • 1: 直接接続されていないネットワークへのインターフェイス情報のアドバタイズは避けるようにしてください。

  • 2:ローカルネットワーク以外へのインターフェース情報の広告は避ける必要があります。
  1. Director サーバーは、VIP と DIP の二重 IP ブリッジング ネットワークを採用しています。
  2. Web サーバーは、DIP と同じネットワーク セグメントを使用して Director に接続します。
  3. Web サーバーごとに VIP を構成する
  4. 各 Web サーバーはインターネットに接続できます
    。 例:
    ここに画像の説明を挿入

環境: ホスト 5 台
1: クライアント eth0: ホスト 192.168.10.6/24 のみ GW: 192.168.10.200 1:
ROUTER
eth0: NAT 10.0.0.200/24
eth1: ホスト 192.168.10.200/24 のみ
IP_FORWARD を有効にする
1: LVS
eth0:NAT:DIP:10.0.0.8/24 GW:10.0.0.200
2 つの RS:
RS1:eth0:NAT:10.0.0.7/24 GW:10.0.0.200
RS2:eth0:NAT:10.0.0.17/24 GW: 10.0。 0.200

2.3.5.1 LVSのネットワーク構成

#所有主机禁用iptables和SELinux
#internet主机环境
[root@internet ~]#hostname
internet
[root@internet ~]#hostname -I
192.168.10.6 
[root@internet ~]#route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref   Use Iface
192.168.10.0     0.0.0.0         255.255.255.0   U     1      0        0 eth0
0.0.0.0         192.168.10.200   0.0.0.0         UG    0      0        0 eth0
[root@internet ~]#ping 10.0.0.7 -c1
PING 10.0.0.7 (10.0.0.7) 56(84) bytes of data.
64 bytes from 10.0.0.7: icmp_seq=1 ttl=63 time=0.565 ms
[root@internet ~]#ping 10.0.0.17 -c1
PING 10.0.0.7 (10.0.0.17) 56(84) bytes of data.
64 bytes from 10.0.0.17: icmp_seq=1 ttl=63 time=0.565 ms
################################################################################
######
#路由器的网络配置
[root@router ~]#echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf 
[root@router ~]#sysctl -p
[root@router network-scripts]#pwd
/etc/sysconfig/network-scripts
[root@router network-scripts]#cat ifcfg-eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO=static
IPADDR=10.0.0.200
PREFIX=24
ONBOOT=yes
[root@router network-scripts]#cat ifcfg-eth1
DEVICE=eth1
NAME=eth1
BOOTPROTO=static
IPADDR=192.168.10.200
PREFIX=24
ONBOOT=yes
################################################################################
######
#RS1的网络配置
[root@rs1 ~]#hostname 
rs1.magedu.org
[root@rs1 ~]#hostname -I
10.0.0.7 
[root@rs1 ~]#cat /etc/sysconfig/network-scripts/ifcfg-eth0 
DEVICE=eth0
NAME=eth0
BOOTPROTO=static
IPADDR=10.0.0.7
PREFIX=24
GATEWAY=10.0.0.200
ONBOOT=yes
[root@rs1 ~]#route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref   Use Iface
0.0.0.0         10.0.0.200      0.0.0.0         UG    100    0        0 eth0
10.0.0.0        0.0.0.0         255.255.255.0   U     100    0        0 eth0
[root@rs1 ~]#yum -y install httpd
[root@rs1 ~]#systemctl enable --now httpd 
[root@rs1 ~]#hostname -I > /var/www/html/index.html
[root@rs1 ~]#ping 192.168.10.6 -c1
PING 192.168.10.6 (192.168.10.6) 56(84) bytes of data.
64 bytes from 192.168.10.6: icmp_seq=1 ttl=63 time=1.14 ms
[root@rs1 ~]#curl 10.0.0.7
10.0.0.7 
################################################################################
######
#RS2 的网络配置
[root@rs2 ~]#cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO=static
IPADDR=10.0.0.17
PREFIX=24
GATEWAY=10.0.0.200
ONBOOT=yes
[root@rs2 ~]#route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref   Use Iface
0.0.0.0         10.0.0.200      0.0.0.0         UG    100    0        0 eth0
10.0.0.0        0.0.0.0         255.255.255.0   U     100    0        0 eth0
[root@rs2 ~]#yum -y install httpd
[root@rs2 ~]#systemctl enable --now httpd
[root@rs2 ~]#hostname -I > /var/www/html/index.html
[root@rs2 ~]#curl 10.0.0.17
10.0.0.17 
[root@rs1 ~]#ping 192.168.10.6 -c1
PING 192.168.10.6 (192.168.10.6) 56(84) bytes of data.
64 bytes from 192.168.10.6: icmp_seq=1 ttl=63 time=1.14 ms
[root@rs2 ~]#curl 10.0.0.17
10.0.0.17
################################################################################
######
#LVS的网络配置
[root@lvs ~]#hostname 
lvs.magedu.org
[root@lvs ~]#hostname -I
10.0.0.8 
[root@lvs ~]#cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO=static
IPADDR=10.0.0.8
PREFIX=24
GATEWAY=10.0.0.200
ONBOOT=yes
[root@lvs ~]#route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref   Use Iface
0.0.0.0         10.0.0.200      0.0.0.0         UG    100    0        0 eth0
10.0.0.0        0.0.0.0         255.255.255.0   U     100    0        0 eth0
[root@lvs ~]#ping 192.168.10.6 -c1
PING 192.168.10.6 (192.168.10.6) 56(84) bytes of data.
64 bytes from 192.168.10.6: icmp_seq=1 ttl=63 time=2.32 ms

2.3.5.2 バックエンド RS の IPVS 設定

#RS1的IPVS配置
[root@rs1 ~]#echo 1 >   /proc/sys/net/ipv4/conf/all/arp_ignore
[root@rs1 ~]#echo 2 >   /proc/sys/net/ipv4/conf/all/arp_announce 
[root@rs1 ~]#echo 1 >   /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@rs1 ~]#echo 2 >   /proc/sys/net/ipv4/conf/lo/arp_announce 
[root@rs1 ~]#ifconfig lo:1 10.0.0.100/32
[root@rs1 ~]#ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group 
default qlen 1000
   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
   inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
   inet 10.0.0.100/0 scope global lo:1
       valid_lft forever preferred_lft forever
   inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP 
group default qlen 1000
   link/ether 00:0c:29:01:f9:48 brd ff:ff:ff:ff:ff:ff
   inet 10.0.0.7/24 brd 10.0.0.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
   inet6 fe80::20c:29ff:fe01:f948/64 scope link 
       valid_lft forever preferred_lft forever
    
#RS2的IPVS配置
[root@rs2 ~]#echo 1 >   /proc/sys/net/ipv4/conf/all/arp_ignore
[root@rs2 ~]#echo 1 >   /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@rs2 ~]#echo 2 >   /proc/sys/net/ipv4/conf/all/arp_announce 
[root@rs2 ~]#echo 2 >   /proc/sys/net/ipv4/conf/lo/arp_announce
[root@rs2 ~]#ifconfig lo:1 10.0.0.100/32
[root@rs2 ~]#ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group 
default qlen 1000
   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
   inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
   inet 10.0.0.100/0 scope global lo:1
       valid_lft forever preferred_lft forever
   inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP 
group default qlen 1000
   link/ether 00:0c:29:94:1a:f6 brd ff:ff:ff:ff:ff:ff
   inet 10.0.0.17/24 brd 10.0.0.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
   inet6 fe80::20c:29ff:fe94:1af6/64 scope link 
       valid_lft forever preferred_lft forever

2.3.5.3 LVS ホスト構成

#在LVS上添加VIP
[root@lvs ~]#ifconfig lo:1 10.0.0.100/32
[root@lvs ~]#ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group 
default qlen 1000
   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
   inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
   inet 10.0.0.100/0 scope global lo:1
       valid_lft forever preferred_lft forever
   inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP 
group default qlen 1000
   link/ether 00:0c:29:8a:51:21 brd ff:ff:ff:ff:ff:ff
   inet 10.0.0.8/24 brd 10.0.0.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
#实现LVS 规则
[root@lvs ~]#dnf -y install ipvsadm
[root@lvs ~]#ipvsadm -A -t 10.0.0.100:80 -s rr
[root@lvs ~]#ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.7:80 -g 
[root@lvs ~]#ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.17:80 -g 
[root@lvs ~]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.100:80 rr
  -> 10.0.0.7:80                 Route   1      0          0         
  -> 10.0.0.17:80                 Route   1      0          0  

2.3.5.4 テストアクセス

[root@internet ~]#curl 10.0.0.100
10.0.0.17 
[root@internet ~]#curl 10.0.0.100
10.0.0.7 
[root@rs1 ~]#tail -f /var/log/httpd/access_log -n0
192.168.10.6 - - [12/Jul/2020:10:36:21 +0800] "GET / HTTP/1.1" 200 10 "-"
"curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.27.1 zlib/1.2.3 
libidn/1.18 libssh2/1.4.2"

srcはルーターのmac、destはdsのmacです。
ここに画像の説明を挿入


LVS の eth0 ゲートウェイを設定できないかどうか考えてみてください。何気なく設定するとどんな問題が見つかるのでしょうか?設定されていない場合
、どうすれば解決できますか? (ただし、DS はパッケージなどをインストールするためにインターネットを積極的にサーフィンする可能性があるため、ルーター ゲートウェイを装備するのが最適です)

#默认值为1
[root@centos8 ~]#cat /proc/sys/net/ipv4/conf/all/rp_filter
1
#修改内核参数为0
[root@lvs ~]#echo "0" > /proc/sys/net/ipv4/conf/all/rp_filter
#说明:参数rp_filter用来控制系统是否开启对数据包源地址的校验。
#0标示不开启地址校验
#1表开启严格的反向路径校验。对每一个收到的数据包,校验其反向路径是否是最佳路径。如果反向路径不是
最佳路径,则直接丢弃该数据包;
#2表示开启松散的反向路径校验,对每个收到的数据包,校验其源地址是否可以到达,即反向路径是否可以
ping通,如反向路径不通,则直接丢弃该数据包。

2.3.6 LVS-DR モードのマルチネットワークセグメントの場合

単一ネットワーク セグメントの DR モードでは、バックエンド RS サーバーのアドレス情報が簡単に公開されます。ネットワーク プレーン全体で DR モデルを使用すると、より高いセキュリティを実現できます。例
ここに画像の説明を挿入
:

#internet主机的网络配置和4.2一样
[root@internet ~]#hostname -I
192.168.10.6 
#router的网络配置在4.2基础上添加172.16.0.200/24的地址
[root@router ~]#ip addr add 172.16.0.200/24 dev eth0
[root@router ~]#ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group 
default qlen 1000
   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
   inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
   inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP 
group default qlen 1000
   link/ether 00:0c:29:ab:8f:2b brd ff:ff:ff:ff:ff:ff
   inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
   inet 172.16.0.200/24 brd 172.16.0.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
   inet6 fe80::20c:29ff:feab:8f2b/64 scope link tentative 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP 
group default qlen 1000
   link/ether 00:0c:29:ab:8f:35 brd ff:ff:ff:ff:ff:ff
   inet 192.168.10200/24 brd 192.168.10255 scope global noprefixroute eth1
       valid_lft forever preferred_lft forever
   inet6 fe80::20c:29ff:feab:8f35/64 scope link 
       valid_lft forever preferred_lft forever
[root@router ~]#hostname -I
10.0.0.200 172.16.0.200 192.168.10200 
#LVS主机的网络配置和4.2一样
[root@lvs ~]#hostname -I
10.0.0.8 
[root@lvs ~]#route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref   Use Iface
0.0.0.0         10.0.0.200      0.0.0.0         UG    0      0        0 eth0
10.0.0.0        0.0.0.0         255.255.255.0   U     100    0        0 eth0
[root@rs1 ~]#hostname -I
10.0.0.7 
[root@rs1 ~]#route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref   Use Iface
0.0.0.0         10.0.0.200      0.0.0.0         UG    100    0        0 eth0
10.0.0.0        0.0.0.0         255.255.255.0   U     100    0        0 eth0
#RS主机的网络配置和4.2一样
[root@rs2 ~]#hostname -I
10.0.0.17 
[root@rs2 ~]#route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref   Use Iface
0.0.0.0         10.0.0.200      0.0.0.0         UG    100    0        0 eth0
10.0.0.0        0.0.0.0         255.255.255.0   U     100    0        0 eth0
#在LVS主机运行的脚本
#注意:VIP如果配置在LO网卡上,必须使用32bit子网掩码,如果VIP绑定在eth0上,可以是其它netmask
[root@lvs ~]#cat lvs_dr_vs.sh 
#!/bin/bash
#Author:wangxiaochun
#Date:2017-08-13
vip='172.16.0.100'
iface='lo:1'
mask='255.255.255.255'
port='80'
rs1='10.0.0.7'
rs2='10.0.0.17'
scheduler='wrr'
type='-g'
rpm -q ipvsadm &> /dev/null || yum -y install ipvsadm &> /dev/null
case $1 in
start)
   ifconfig $iface $vip netmask $mask #broadcast $vip up
   iptables -F
   ipvsadm -A -t ${vip}:${port} -s $scheduler
   ipvsadm -a -t ${vip}:${port} -r ${rs1} $type -w 1
   ipvsadm -a -t ${vip}:${port} -r ${rs2} $type -w 1
    echo "The VS Server is Ready!"
   ;;
stop)
   ipvsadm -C
   ifconfig $iface down
    echo "The VS Server is Canceled!"
   ;;
*)
    echo "Usage: $(basename $0) start|stop"
    exit 1
   ;;
esac
[root@lvs ~]#bash lvs_dr_vs.sh start
The VS Server is Ready!
#在RS后端服务器运行的脚本
[root@rs1 ~]#cat lvs_dr_rs.sh 
#!/bin/bash
#Author:wangxiaochun
#Date:2017-08-13
vip=172.16.0.100
mask='255.255.255.255'
dev=lo:1
rpm -q httpd &> /dev/null || yum -y install httpd &>/dev/null
service httpd start &> /dev/null && echo "The httpd Server is Ready!"
echo "`hostname -I`" > /var/www/html/index.html
case $1 in
start)
    echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
   ifconfig $dev $vip netmask $mask #broadcast $vip up
    echo "The RS Server is Ready!"
   ;;
stop)
   ifconfig $dev down
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
    echo "The RS Server is Canceled!"
   ;;
*) 
    echo "Usage: $(basename $0) start|stop"
    exit 1
   ;;
esac
[root@rs1 ~]#bash lvs_dr_rs.sh start
The RS Server is Ready!
#在RS后端服务器运行的脚本和RS1是一样的
[root@rs2 ~]#bash lvs_dr_rs.sh start
The RS Server is Ready!
#测试访问
[root@internet ~]#curl 172.16.0.100
10.0.0.7 
[root@internet ~]#curl 172.16.0.100
10.0.0.17

例 2:
RS 設定スクリプト

#!/bin/bash
vip=10.0.0.100
mask='255.255.255.255'
dev=lo:1
case $1 in
start)
     echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
     echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
     echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
     echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
     ifconfig $dev $vip netmask $You can't use 'macro parameter character #' in 
math modemask #broadcast $vip up
     #route add -host $vip dev $dev
     ;;
stop)
     ifconfig $dev down
     echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
     echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
     echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
     echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
     ;;
*) 
     echo "Usage: $(basename $0) start|stop"
     exit 1
     ;;
esac
VS的配置脚本
#!/bin/bash
vip='10.0.0.100'
iface='lo:1'
mask='255.255.255.255'
port='80'
rs1='192.168.8.101'
rs2='192.168.8.102'
scheduler='wrr'
type='-g'
case $1 in
start)
 ifconfig $iface $vip netmask $mask #broadcast $vip up
 iptables -F
 ipvsadm -A -t ${vip}:${port} -s $scheduler
 ipvsadm -a -t ${vip}:${port} -r ${rs1} $type -w 1
 ipvsadm -a -t ${vip}:${port} -r ${rs2} $type -w 1
 ;;
stop)
 ipvsadm -C
 ifconfig $iface down
 ;;
*)
 echo "Usage $(basename $0) start|stop“
 exit 1
esac

例 3: ネットワーク セグメントにわたる DR モデルの構成例
:

[root@rs1 ~]#cat lvs_dr_rs.sh 
#!/bin/bash
#Author:wangxiaochun
#Date:2017-08-13
vip=192.168.10100
mask='255.255.255.255'
dev=lo:1
#rpm -q httpd &> /dev/null || yum -y install httpd &>/dev/null
#service httpd start &> /dev/null && echo "The httpd Server is Ready!"
#echo "<h1>`hostname`</h1>" > /var/www/html/index.html
case $1 in
start)
    echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
 echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
   ifconfig $dev $vip netmask $mask #broadcast $vip up
    #route add -host $vip dev $dev
    echo "The RS Server is Ready!"
   ;;
stop)
   ifconfig $dev down
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce
    echo "The RS Server is Canceled!"
   ;;
*) 
    echo "Usage: $(basename $0) start|stop"
    exit 1
   ;;
esac
[root@rs1 ~]#bash lvs_dr_rs.sh start
[root@rs2 ~]#bash lvs_dr_rs.sh start
[root@LVS ~]#cat lvs_dr_vs.sh 
#!/bin/bash
#Author:wangxiaochun
#Date:2017-08-13
vip='192.168.10100'
iface='lo:1'
mask='255.255.255.255'
port='80'
rs1='10.0.0.7'
rs2='10.0.0.17'
scheduler='wrr'
type='-g'
rpm -q ipvsadm &> /dev/null || yum -y install ipvsadm &> /dev/null
case $1 in
start)
   ifconfig $iface $vip netmask $mask #broadcast $vip up
   iptables -F
   ipvsadm -A -t ${vip}:${port} -s $scheduler
   ipvsadm -a -t ${vip}:${port} -r ${rs1} $type -w 1
   ipvsadm -a -t ${vip}:${port} -r ${rs2} $type -w 1
    echo "The VS Server is Ready!"
   ;;
stop)
   ipvsadm -C
   ifconfig $iface down
    echo "The VS Server is Canceled!"
   ;;
*)
    echo "Usage: $(basename $0) start|stop"
    exit 1
   ;;
esac
[root@LVS ~]#bash lvs_dr_vs.sh start
[root@Router ~]#nmcli connection modify eth0 +ipv4.addresses 192.168.10200/24 
[root@Router ~]#nmcli connection reload
[root@Router ~]#nmcli connection up eth0
[root@Router ~]#ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group 
default qlen 1000
   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
   inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
   inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP 
group default qlen 1000
   link/ether 00:0c:29:4d:ef:3e brd ff:ff:ff:ff:ff:ff
   inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
   inet 192.168.10200/24 brd 192.168.10255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
   inet6 fe80::20c:29ff:fe4d:ef3e/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP 
group default qlen 1000
   link/ether 00:0c:29:4d:ef:48 brd ff:ff:ff:ff:ff:ff
   inet 172.20.200.200/16 brd 172.20.255.255 scope global noprefixroute eth1
       valid_lft forever preferred_lft forever
   inet6 fe80::20c:29ff:fe4d:ef48/64 scope link 
       valid_lft forever preferred_lft forever

3. LVS の負荷戦略は何か、各アプリケーションでどのようなシナリオが使用されているか、LVS DR を通じて 1 ~ 2 つのシナリオを任意に実現できます。

3.1 LVS スケジューリング アルゴリズム

ipvsスケジューラ:スケジューリング時に各RSの現在の負荷状況を考慮するかどうかにより、
静的方式と動的方式の2種類に分けられます。

3.1.1 静的メソッド

アルゴリズム自体にのみ従ったスケジューリング
1. RR: ラウンドロビン、ポーリング、より一般的に使用され、雨露が均等に浸る、大きな釜飯 2.
WRR: 加重 RR、加重ポーリング、より一般的に使用
3. SH: ソース ハッシュ、実現セッション スティッキー、送信元 IP アドレス ハッシュ ; セッション バインディングを実現するために、最初に選択した RS に常に同じ IP アドレスからリクエストを送信します (LAN SATパブリック ネットワーク アドレス、受信したすべてのメッセージは 1 つのアドレスで 1 つのアドレスにディスパッチされます)
4. DH : 宛先ハッシュ; 宛先アドレス ハッシュ、最初のポーリングは RS にスケジュールされ、同じ宛先アドレスへの後続の要求は常に最初に選択された RS に転送されます。典型的な使用シナリオは、フォワード プロキシの負荷です。キャッシュ シナリオ バランシング (例: Web キャッシュ)

3.1.2 動的メソッド

スケジューリングは主に各 RS の現在の負荷ステータスとスケジューリング アルゴリズムに基づいて行われます。オーバーヘッド = 値が小さい RS がスケジュールされます。1.
LC: 最小接続数は、長い接続アプリケーションに適しています。
オーバーヘッド = activeconns 256+inactiveconns
2. WLC: Weighted LC 、デフォルトのスケジューリング方法、より一般的に使用される
Overhead=(activeconns
256+inactiveconns)/weight
3、SED: Shortest Expectation Delay、初期接続の高重み優先度、非アクティブな接続に関係なく、アクティブな接続のみをチェック
Overhead=(activeconns+1​​)* 256/ウェイト
4 、NQ: Never Queue、最初のラウンドで均一分散、フォローアップ SED
5、LBLC: Locality-Based LC、動的 DH アルゴリズム、利用シナリオ: 負荷状況に応じたフォワード プロキシの実現、Web
キャッシュの実現など6 、LBLCR: レプリケーション機能付きLBLC、レプリケーション機能付きLBLC、重負荷のレプリケーションから軽負荷のRSまで
LBLCの負荷不均衡の問題を解決し、 Webキャッシュを実現します。

3.1.3 カーネル バージョン 4.15 以降の新しいスケジューリング アルゴリズム: FO および OVF

FO (加重フェイルオーバー) スケジューリング アルゴリズム。この FO アルゴリズムでは、仮想サービスに関連付けられた実サーバーのリンク リストを走査し、
過負荷になっていない (IP_VS_DEST_F_OVERLOAD フラグが設定されていない) 重みが最も高い実サーバーを見つけて、スケジュールを設定します。これは、静的アルゴリズム
OVF (オーバーフロー接続) スケジューリング アルゴリズムに属し、アクティブな接続の数と実サーバーの重み値に基づいて実装されます。新しい接続は、アクティブな接続の数が重み値を超えるまで、最も高い重み値を持つ実サーバーにディスパッチされ、その後、最も高い重み値を持つ次の実
サーバー、最も高い重み値を持つ利用可能な実サーバーが検索されます。、動的アルゴリズムに属する
利用可能な実サーバーは、同時に次の条件を満たす必要があります。

  • オーバーロードされていない (IP_VS_DEST_F_OVERLOAD フラグが設定されていない)
  • 実サーバーの現在のアクティブな接続数がその重み値よりも小さい
  • その重量値はゼロではありません

4. Web http プロトコルの通信プロセス、関連する技術用語の概要。

4.1 Web httpプロトコル通信プロセス

1 DNS
2 CDN
3 TCP
4 Web サーバーの処理
1) 接続の確立
2) リクエストの受信
3) リクエストの GET、POST およびその他のメソッドの処理
4) リソースの取得
5) 応答メッセージの作成 6
) 応答の送信
7) ログの記録
5 ブラウザが受信する応答メッセージとページのレンダリング

4.2 Cookieとセッションの比較

Cookie とセッションの同一性と相違点:
Cookie は通常サーバー上で生成されますが、クライアント側でも生成できます。セッションはサーバー側で
データ情報を保存するためにサーバー側で生成されます。データ情報はさまざまな形式で保存されます。メモリ、ファイル、データベースなど、Cookie はクライアントのメモリまたはファイルにデータを保存します。1
つの Cookie によって保存されるデータは 4K を超えることはできません。各サイトの Cookie の数は制限されています (IE8 の場合は 50、IE8 の場合は 50)。 Firefox、Opera は 30; セッションはサーバーに保存され、容量制限はありません。Cookie は
ユーザーのローカルに保存され、簡単にアクセスおよび変更でき、セキュリティは高くありません。セッションはサーバーに保存され、比較的安全な Cookie には、セッション Cookie と永続 Cookie が含まれます。ブラウザのセッションをライフサイクルとするセッション Cookie はキャッシュに保存され、ブラウザ ウィンドウを閉じるとブラウザ ウィンドウは消え、永続 Cookie は設定されるまでハードディスクに保存されます。有効期限を超えました。サーバー上のセッション ストレージの負荷が高まると、セッション データは必要に応じて定期的にクリーンアップされます。セッションには多くのデータがあり、セッション ID のみが 1 つのアイテムとして Cookie を介してクライアントに送信されます
。クライアントが次回アクセスすると、リクエスト メッセージ内の Cookie にセッション ID が自動的に送信され、サーバー上のセッションに関連付けられます。Cookie の欠点: 1. Cookie の数が増加すると、情報の送信に Cookie を使用します

Cookie が 200 バイトを占有し、1 日に数億の PV がある場合、どのくらいの帯域幅を占有することを想像してください。
2. Cookie は安全ではありません。Cookie はクライアントに保存されるため、これらの Cookie にアクセスしたり、プラグインを通じて設定を追加したり変更したりできる可能性があります。したがって、この観点から、セッションを使用したいのですが、セッションはサーバー側にデータを保存するもので、cookie を介して sessionId を渡すだけです。そのため、セッションはユーザーのプライバシーと重要なデータを保存するのに適しています。 デメリット: 1. 複数のサーバー間で共有するのは簡単ではありませ

セッション バインディング、セッション レプリケーション、セッション共有ソリューション 2 を使用できます
。セッションはサーバーに保存されるため、セッションが多すぎるとサーバーのパフォーマンスが消費されます。Cookie
とセッションにはそれぞれ長所と短所があります。大規模なインターネット システムでは、Cookie とセッションの両方を単独で使用することはできません

4.3 HTTP1.0とHTTP1.1の違い

  • キャッシュ処理については、HTTP1.0では主にヘッダー内のIf-Modified-SinceとExpiresをキャッシュ判定の基準として使用していましたが、HTTP1.1ではEntityタグ、If-Unmodified-Since、Ifなどのキャッシュ制御戦略がさらに導入されています。 -Match、If-NoneMatch、その他のオプションのキャッシュ ヘッダーによるキャッシュ戦略の制御
  • HTTP1.0 では、帯域幅の最適化とネットワーク接続の使用により、帯域幅を浪費する現象がいくつかあります。たとえば、クライアントはオブジェクトの一部のみを必要としますが、サーバーはオブジェクト全体を送信し、ブレークポイント再開をサポートしません。 function では、HTTP1.1 ではリクエスト ヘッダーに range ヘッダー フィールドが導入されています。これにより、リソースの特定の部分のみをリクエストできます。つまり、リターン コードは 206 (部分コンテンツ) であり、開発者が自由に選択できるため便利です。帯域幅を最大限に活用して接続エラーを通知するため、
    HTTP1.1 では、要求されたリソースがリソースの現在の状態と競合していることを示す 409 (Conflict)、リソースが存在しないことを示す 410 (Gone) など、24 個のステータス応答コードが追加されています。サーバー上のは完全に削除されました
  • ホスト ヘッダー処理では、HTTP1.0 では各サーバーが固有の IP アドレスにバインドされているとみなされるため、リクエスト メッセージ内の URL にはホスト名 (ホスト名) が渡されません。しかし、仮想ホスト技術の発展により、複数の仮想ホスト (マルチホーム Web サーバー) が 1 台の物理サーバー上に存在し、IP アドレスを共有できるようになりました。**HTTP1.1 リクエスト メッセージとレスポンス
    メッセージは、Host ヘッダー フィールドをサポートする必要があります。リクエスト メッセージに Host ヘッダー フィールドがない場合、エラー (400 Bad Request) が報告されます。
  • 長時間接続、HTTP 1.1 は永続接続 (PersistentConnection) とリクエスト パイプライン (Pipelining) 処理をサポートしており、複数の HTTP リクエストと応答を 1 つの TCP 接続で送信でき、HTTP1.1 では接続の確立と終了の消費と遅延が削減されます。接続が有効になっています。デフォルト: キープアライブ。HTTP1.0 の欠点を補い、リクエストごとに

HTTP 1.0 および 1.1 の問題

  • HTTP1.x がデータを送信する場合、毎回接続を再確立する必要があるため、特にモバイル側で間違いなく遅延時間が大幅に増加します。
  • HTTP1.x でデータを送信する場合、送信される内容はすべて平文であり、クライアントもサーバーも相手の身元を確認できず、データのセキュリティを保証できません。
  • HTTP1.x を使用すると、ヘッダーに含まれるコンテンツが大きすぎるため、送信コストが増加します。また、特にモバイル端末がユーザー トラフィックを増加させる場合、ヘッダーはリクエストごとにあまり変更されません。
  • HTTP1.x は、複数の接続の作成によって生じる遅延を補うためにキープアライブをサポートしていますが、キープアライブを過度に使用すると、サーバーや単一のファイルに対して常に要求されるサービスに多大なパフォーマンスの負荷がかかります (
    画像ストレージ Web サイトなど)、キープアライブは、ファイルがHTTPS プロトコルで要求された後、長時間不要な接続を維持するため、パフォーマンスに大きな影響を与える可能性があります。

5. ネットワーク IO モデルと nginx アーキテクチャを要約します。

5.1 ネットワーク IO モデル

5.1.1 モデル関連の概念

同期/非同期: メッセージ通信の仕組み、つまり、呼び出し側が 1 つの処理結果を待っているときに、呼び出し先が完了ステータスを通知するかどうかに焦点が当てられます。

  • 同期: 同期、呼び出し先はイベントの処理結果に関連する通知メッセージを提供せず、呼び出し元は問題が処理されたかどうかを積極的に尋ねる必要があります (マネージャーは従業員向けのライブケース、昔ながらの洗濯機のケースを手配します)
  • 非同期: 非同期。呼び出し先は、ステータス、通知、またはコールバック メカニズムを通じて、呼び出し元の実行ステータスを呼び出し元に積極的に通知します。 ブロッキング/非ブロッキング: 結果が返されるのを待つ前に、呼び出し元の状態に注意してください (新しい洗濯機は、思い出させる)
  • ブロッキング: ブロッキング。ユーザー空間に戻る前に IO 操作が完全に完了する必要があることを意味します。呼び出し結果が返される前に、呼び出し元は一時停止され、他のことができなくなります。座って洗濯機が洗濯を終えるのを待っています)
  • ノンブロッキング: ノンブロッキング、つまり、IO 操作が呼び出された直後に、IO 操作が完全に完了するのを待たずにステータス値がユーザーに返されることを意味します。最終的な呼び出し結果が返される前に、呼び出し元は一時停止されません。そして他のこともできます。洗濯中に他のことができます)
    最良の組み合わせは、非同期とノンブロッキングです(洗濯機は洗濯中に他のことができ、洗濯が終わると通知してくれます)

5.1.2 ネットワーク I/O モデル

ブロッキング、ノンブロッキング、多重化、シグナル駆動、非同期
参照: 「UNIX Network Programming Volume 1: Socket Networking API」(US) W. Richard Stevens

5.1.2.1 ブロッキング I/O モデル (ブロッキング IO)

以下の図では、中間がネットワークを経由する必要があるため、クライアントからカーネル バッファーまでの最初の段階が最も遅く、2 番目の段階の方が高速です。領域は異なりますが、すべてメモリにコピーされます。ブロッキング IO モデルは
ここに画像の説明を挿入
ここに画像の説明を挿入
最も単純な I/O モデルであり、ユーザー スレッドはカーネル内にあります。IO 操作の実行時にブロックされます。ユーザー スレッドは、
システム コール read を通じて I/O 読み取り操作を開始し、ユーザー空間からカーネル空間。カーネルは、データ パケットが到着するまで待機し、受信したデータをユーザー空間にコピーして、読み取り操作を完了します。ユーザーは、
受信データの処理を続行する前に、データをバッファーに読み取るために読み取りを待つ必要があります。I/O リクエストのプロセス全体でユーザー スレッドがブロックされるため、ユーザーは IO リクエストを開始するときに何もできなくなり、CPU のリソース使用率が十分ではなくなります。データ待機中にプロセス/スレッドがブロックされる サスペンド
、基本的にCPUリソースを占有しない
デメリット: 各接続を独立したプロセス/スレッドで個別に処理する必要がある 同時リクエストの量が多い場合、プログラムを維持するために、メモリとスレッドの切り替えオーバーヘッドが比較的大きいため、Apache のプリフォークはこのモードを使用します。

5.1.2.2 ノンブロッキング I/O モデル (ノンブロッキング IO)

ユーザー スレッドが IO リクエストを開始すると、すぐに戻ります。ただし、データは読み取られていないため、ユーザー スレッドは実際にデータを読み取って実行を続ける前に、データが到着するまで継続的に IO リクエストを開始する必要があります。つまり、「ポーリング」メカニズムには 2 つの問題があります。待機するファイル記述子が多数ある場合、それらを 1 つずつ読み取る必要があります。これにより、多くのコンテキスト スイッチが発生します (読み取りはシステム コールであり、呼び出すたびにユーザー モードとコア モードを切り替える必要があります)。ポーリング時間を把握するのは簡単ではありません。ここでは、データが到着するまでにどれくらい時間がかかるかを推測します。待ち時間を長く設定しすぎるとプログラムの応答遅延が大きくなりすぎ、短すぎるとリトライが頻繁になりCPUを消費してしまいCPUの無駄になりますので、一般的にはこのモデルは使用されません。他の IO モデルのノンブロッキング IO 機能を使用することです。

5.1.2.3 多重化(I/O多重化)

上記のモデルでは、各ファイルディスクリプタに対応するIOをスレッドで監視・処理していますが、多重IOとは、それぞれに
対応する複数のファイルディスクリプタをスレッドで監視・処理できることを意味します。
このスレッドはカーネル内で SELECT、POLL、EPOLL などのシステム コールを呼び出して IO を多重化するためです

  1. select (ローテーション トレーニング – IO の数が増えるほど、速度が遅くなります)
  2. epoll (IO はカーネルを完了し、すぐにアクティブにレポートします)
    I/O 多重化には、主に select、poll、epoll の 3 つのシステム コールが含まれます。select/poll/epoll の利点は、単一のプロセスがネットワークに接続された複数の IO を次の時点で処理できることです。同時に。
    その基本原理は、select/poll/epoll 関数が担当するすべてのソケットを継続的にポーリングし、ソケットにデータが到着するとユーザー プロセスに通知することです。
    ユーザー プロセスが select を呼び出すと、プロセス全体がブロックされます。同時に、カーネルは select を担当するすべてのソケットを「監視」します。いずれかのソケットのデータの準備ができたら、select が戻ります。このとき、ユーザー プロセスは読み取りオペレーションを呼び出して、カーネルからユーザー プロセスにデータをコピーします。
    Apache prefork がこのモードの選択であり、worker がポーリング モードです。

5.1.2.4 信号駆動型 I/O モデル (信号駆動型 IO)

ここに画像の説明を挿入
信号驱动I/O的意思就是进程现在不用傻等着,也不用去轮询。而是让内核在数据就绪时,发送信号通知进程。
调用的步骤是,通过系统调用 sigaction ,并注册一个信号处理的回调函数,该调用会立即返回,然后主程序可以继续向下执行,当有I/O操作准备就绪,即内核数据就绪时,内核会为该进程产生一个 SIGIO信号,并回调注册的信号回调函数,这样就可以在信号回调函数中系统调用 recvfrom 获取数据,将用户进程所需要的数据从内核空间拷贝到用户空间
此模型的优势在于等待数据报到达期间进程不被阻塞。用户主程序可以继续执行,只要等待来自信号处理函数的通知。
在信号驱动式 I/O 模型中,应用程序使用套接口进行信号驱动 I/O,并安装一个信号处理函数,进程继续运行并不阻塞
当数据准备好时,进程会收到一个 SIGIO 信号,可以在信号处理函数中调用 I/O 操作函数处理数据。优点:线程并没有在等待数据时被阻塞,内核直接返回调用接收信号,不影响进程继续处理其他请求因此可以提高资源的利用率
缺点:信号 I/O 在大量 IO 操作时可能会因为信号队列溢出导致没法通知

异步阻塞:程序进程向内核发送IO调用后,不用等待内核响应,可以继续接受其他请求,内核收到进程请求后进行的IO如果不能立即返回,就由内核等待结果,直到IO完成后内核再通知进程。

5.1.2.5 异步 I/O 模型 (asynchronous IO)

ここに画像の説明を挿入
Linux提供了AIO库函数实现异步,但是用的很少。目前有很多开源的异步IO库,例如libevent、libev、libuv。

5.1.3 五种 IO 对比

これら 5 つの I/O モデルのうち、後方にあるほどブロッキングが少なく、理論的には最高の効率になります。最初の 4 つは同期 I/O に属します。これは、実際の I/O 操作 (recvfrom) がプロセス/スレッドをブロックするためです
。非同期 I/O モデルは、POSIX で定義された非同期 I/O と一致します。
ここに画像の説明を挿入

5.1.4 I/O の一般的な実装

Nginx は、さまざまなオペレーティング システムでのさまざまなイベント駆動モデルの実装をサポートしていますが、その実装方法はオペレーティング システムやシステム バージョンによって異なります
。主な実装方法は次のとおりです。

1. select:
select ライブラリは、基本的に Linux と Windows の両方のプラットフォームでサポートされているイベント駆動型のモデル ライブラリであり、インターフェイスの定義は基本的に同じですが、いくつかのパラメーターの意味が若干異なります。は 1024 で、最も初期のイベント駆動型モデルです。
2. ポーリング:
Linux の基本ドライバー モデル。Windows はこのドライバー モデルをサポートしていません。これは、最大同時実行制限をキャンセルする select のアップグレード バージョンです。nginx のコンパイル時に –with-poll_module および –without-poll_module を使用できます。選択
ライブラリをコンパイルするかどうか。
3. epoll:
epoll は、Nginx サーバーでサポートされている最高パフォーマンスのイベント駆動型ライブラリの 1 つです。非常に優れたイベント駆動型モデルとして認識されています。選択やポーリングとは大きく異なります。Epoll は、ポーリングのアップグレード バージョンです。ただし、poll とは大きな違いがあります。epoll
の処理方法は、処理対象のイベントのリストを作成し、そのリストをカーネルに送信します。戻ってきたときに、このテーブルをポーリングして確認し、イベントが発生したかどうかを判断します。 Epoll はプロセスをサポートします 最大オープン イベント記述子の上限は、システムがオープンできるファイルの最大数です 同時に、epoll ライブラリの I/O 効率は、ファイル数の増加に応じて直線的に低下しませんカーネルによって報告された「アクティブな」記述子のみを実行するため、記述子の
操作が行われます。
4. kqueue:
BSD シリーズ プラットフォームをサポートするために使用される大学のイベント駆動モデルで、主に FreeBSD 4.1 以降、OpenBSD 2.0 以降、NetBSD 以降、および Mac OS X プラットフォームで使用されます。このモデルは投票ライブラリのバリアントでもあります。したがって、epoll と本質的な違いはなく、効率も epoll と同様です
5. IOCP:
Windows システム上での実装方法で、5 番目の (非同期 I/O) モデルに相当します。
6. /dev/poll:
主に Solaris プラットフォームと HP/UX 上で、UNIX 由来のプラットフォームの効率的なイベント駆動モデルをサポートするために使用されます。このモデルは、Solaris シリーズ プラットフォームの開発時にイベントを完了するために Sun によって提案されたソリューションです。 -driven メカニズムでは、仮想 /dev/poll デバイスを使用します。開発者は、表示したいファイル記述子をこのデバイスに追加し、ioctl() 呼び出しを通じてイベント通知を取得します。そのため、
上記で実行する場合は
/dev/poll を使用してください。一連のプラットフォームイベント駆動型メカニズム。効率は epoll
7 と似ています。 rtsig:
一般的に使用されるイベント ドライバではありません。最大キューは 1024 で、あまり一般的には使用されません。
8.eventport:
このソリューションも、Solaris の開発時に Sun によって提案されたイベント駆動型ライブラリですが、それは単なるSolaris 10 以降のバージョン。このドライバ ライブラリは、カーネル パニックなどから保護します。

ここに画像の説明を挿入

5.1.5 開発のオプション

クロスシステムは良いですが、パフォーマンスが犠牲になるため、1 つのシステムに対してのみ開発される場合があります。

  • 完全にクロスプラットフォームで、選択とポーリングを使用できます。しかしパフォーマンスが悪い
  • さまざまなオペレーティング システムでサポートされている最適なテクノロジを選択します。たとえば、Linux は epoll を使用し、Mac は kqueue を使用し、Windows は
    IOCP を使用して IO 処理のパフォーマンスを向上させます。

5.2 nginx アーキテクチャ

ここに画像の説明を挿入

5.2.1 Nginxのプロセス構造

Webリクエスト処理機構
マルチプロセス方式:サーバーがクライアントリクエストを受信するたびに、サーバーのメインプロセスがサブプロセスを生成し、ユーザーが接続を閉じるまでクライアントに応答するため、処理速度が速いという利点があります。ただし、アクセスが多すぎるとサーバーリソースが枯渇し、リクエストを提供できなくなります。
マルチスレッド モード: マルチプロセス モードに似ていますが、クライアント要求が受信されるたびに、サービス プロセスはクライアントと対話するためのスレッドを生成します。スレッドのオーバーヘッドはプロセスのオーバーヘッドよりもはるかに小さいため、マルチスレッド モードは非常に重要です。Web サーバーのシステム リソース要件はある程度軽減されますが、マルチスレッドには独自の欠点もあります。互いに同じメモリ アドレス空間にあるため、相互に影響を及ぼします メイン プロセスがハングアップすると、すべてのサブスレッドが動作できなくなります IIS サーバーはマルチスレッド方式を採用しており、一定時間後に再起動する必要があります安定させるために。Nginx はマルチプロセス組織モデルであり、マスター プロセスとワーカー プロセスで構成されます。
ここに画像の説明を挿入
マスタープロセスの機能

外部インターフェイス: 外部操作 (シグナル) の受信
内部転送: さまざまな外部操作に応じて、管理
シグナルによるワーカー監視: ワーカー プロセスの実行状態を監視 ワーカー プロセスが異常終了した後、自動的にワーカー プロセスを再起動します
。 Nginx 設定ファイルとその有効性と正確性の検証 ソケット
接続の確立、バインド、クローズ
設定に従って作業プロセスの生成、管理、終了サービスを中断することなく、
サーバーの再起動、アップグレード、終了などの外部指示を受け入れ、スムーズなアップグレードを実現
サービスを再起動し、新しい設定を適用する
ログ ファイルを開き、ファイル記述子を取得する
サービスを中断せず、スムーズなアップグレードを実現し、アップグレードが失敗した場合のロールバック処理
Perl スクリプトのコンパイルと処理

ワーカープロセスの機能:

すべてのワーカー プロセスは等しい
実際の処理: ネットワーク リクエスト、ワーカー プロセスによって処理される
ワーカー プロセスの数: 通常、CPU リソースを最大限に活用するためにコアの数に設定されますが、プロセスが CPU リソースを求めて競合する原因となるプロセスが多すぎることは避けられます。
コンテキストスイッチングの損失が増加します顧客
のリクエストを受け入れて処理します
各機能モジュールに順番にリクエストを送信して、
I/O 呼び出しを処理し、応答データを取得します
バックエンドサーバーと通信し、バックエンドサーバーから処理結果を受け取ります
データをキャッシュし、キャッシュにアクセスしますインデックス、クエリ、およびキャッシュ データの呼び出しを行って
リクエストを送信します。 その結果、顧客のリクエストに応答します。
再起動、アップグレード、終了などのメイン プログラム命令を受け取ります。

6. nginx は、コア構成と最適化を要約します。

6.1 設定ファイルの説明

nginx公式ヘルプドキュメント

http://nginx.org/en/docs/
ここに画像の説明を挿入
tengine ヘルプ ドキュメント
http://tengine.taabao.org/nginx_docs/cn/docs/

Nginx 構成ファイルのコンポーネント:

  • 主な設定ファイル: nginx.conf
  • サブ設定ファイル: conf.d/*.conf を含む
  • fastcgi、uwsgi、scgi などのプロトコル関連の設定ファイル。
  • mime.types: サポートされている MIME タイプ、MIME (MultiPurpose Internet Mail Extensions) 多目的インターネット メール
    拡張タイプ。MIME メッセージにはテキスト、画像、オーディオ、ビデオ、その他のアプリケーション固有のデータを含めることができます。
    特定のアプリケーション プログラムでファイルを開くと、この拡張子のファイルにアクセスすると、ブラウザは自動的に
    指定されたアプリケーション プログラムを使用してそのファイルを開きます。これは主に、クライアント定義のファイル名とメディア ファイルを開く方法を指定するために使用されます。
    MIME リファレンス ドキュメント: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_Types

nginx設定ファイル形式の説明

設定ファイルは命令と命令ブロックで構成されます
。各命令はセミコロンで終わり、命令と値はスペース記号で区切られます。
複数の命令を同じ行に配置し、セミコロンで区切ることもできますが、可読性は低く、推奨されません
命令ブロックは、{ } 中括弧を使用して複数の命令をまとめ、命令ブロックをネストできます include ステートメントを使用すると、
複数の構成ファイルを結合して保守性を向上できます
# 記号を使用してコメントを追加し、読みやすさを向上します
$ 記号を使用します変数
部分を使用するには ディレクティブパラメータは正規表現をサポートします

グローバル構成の説明:
質問: Nginx のメイン プロセスは root ユーザーを使用するのはなぜですか? その理由は、Nginx のメイン プロセスによって監視されるポートが 80 であるためです。特権ポートは一般ユーザーによって直接監視できません。nc を使用できます
。監視およびテストするコマンド

user nginx nginx; #启动Nginx工作进程的用户和组
worker_processes [number | auto]; #启动Nginx工作进程的数量,一般设为和CPU核心数相同
worker_cpu_affinity 00000001 00000010 00000100 00001000 | auto ; #将Nginx工作进程绑
定到指定的CPU核心,默认Nginx是不进行进程绑定的,绑定并不是意味着当前nginx进程独占以一核心CPU,
但是可以保证此进程不会运行在其他核心上,这就极大减少了nginx的工作进程在不同的cpu核心上的来回跳
转,减少了CPU对进程的资源分配与回收以及内存管理等,因此可以有效的提升nginx服务器的性能。
CPU MASK: 00000001:0号CPU
          00000010:1号CPU
  10000000:7号CPU
#示例:
worker_cpu_affinity 0001 0010 0100 1000;第0号---第3号CPU
worker_cpu_affinity 0101 1010; 
#示例
worker_processes  4;
worker_cpu_affinity 00000010 00001000 00100000 10000000;
[root@centos8 ~]# ps axo pid,cmd,psr | grep nginx
31093 nginx: master process /apps   1
34474 nginx: worker process         1
34475 nginx: worker process         3
34476 nginx: worker process         5
34477 nginx: worker process         7
35751 grep nginx
#auto 绑定CPU
#The special value auto (1.9.10) allows binding worker processes automatically to 
available CPUs:
worker_processes auto; 
worker_cpu_affinity auto;
#The optional mask parameter can be used to limit the CPUs available for 
automatic binding:
worker_cpu_affinity auto 01010101; 
#错误日志记录配置,语法:error_log file [debug | info | notice | warn | error | crit 
| alert | emerg]
#error_log logs/error.log;
#error_log logs/error.log notice;
error_log /apps/nginx/logs/error.log error; 
#pid文件保存路径
pid       /apps/nginx/logs/nginx.pid;
worker_priority 0; #工作进程优先级,-20~20(19)
worker_rlimit_nofile 65536; #所有worker进程能打开的文件数量上限,包括:Nginx的所有连接(例
如与代理服务器的连接等),而不仅仅是与客户端的连接,另一个考虑因素是实际的并发连接数不能超过系统级
别的最大打开文件数的限制.最好与ulimit -n 或者limits.conf的值保持一致,
daemon off;  #前台运行Nginx服务用于测试、或者以容器运行时,需要设为off
master_process off|on; #是否开启Nginx的master-worker工作模式,仅用于开发调试场景,默认为
on
events {
    
    
   worker_connections  65536;  #设置单个工作进程的最大并发连接数
   use epoll; #使用epoll事件驱动,Nginx支持众多的事件驱动,比如:select、poll、epoll,只
能设置在events模块中设置。
   accept_mutex on; #on为同一时刻一个请求轮流由worker进程处理,而防止被同时唤醒所有
worker,避免多个睡眠进程被唤醒的设置,默认为off,新请求会唤醒所有worker进程,此过程也称为"惊 
群",因此nginx刚安装完以后要进行适当的优化。建议设置为on
   multi_accept on; #on时Nginx服务器的每个工作进程可以同时接受多个新的网络连接,此指令默认
为off,即默认为一个工作进程只能一次接受一个新的网络连接,打开后几个同时接受多个。建议设置为on
}

httpプロトコルの設定手順

http {
    
    
   include       mime.types; #导入支持的文件类型,是相对于/apps/nginx/conf的目录
   default_type application/octet-stream; #除mime.types中文件类型外,设置其它文件默认
类型,访问其它类型时会提示下载不匹配的类型文件
#日志配置部分
    #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    #                 '$status $body_bytes_sent "$http_referer" '
    #                 '"$http_user_agent" "$http_x_forwarded_for"';
    #access_log logs/access.log main;
#自定义优化参数
   sendfile       on; 
    #tcp_nopush     on; #在开启了sendfile的情况下,合并请求后统一发送给客户端,必须开启
sendfile
    #tcp_nodelay   off; #在开启了keepalived模式下的连接是否启用TCP_NODELAY选项,当为
off时,延迟0.2s发送,默认On时,不延迟发送,立即发送用户响应报文。
    #keepalive_timeout 0;
   keepalive_timeout  65 65; #设置会话保持时间,第二个值为响应首部:keep
Alived:timeout=65,可以和第一个值不同
    #gzip on; #开启文件压缩
   server {
    
    
       listen       80; #设置监听地址和端口
       server_name localhost; #设置server name,可以以空格隔开写多个并支持正则表达式,
如:*.magedu.com www.magedu.* ~^www\d+\.magedu\.com$ default_server 
        #charset koi8-r; #设置编码格式,默认是俄语格式,建议改为utf-8
        #access_log logs/host.access.log main;
       location / {
    
    
           root   html;
           index index.html index.htm;
       }
        #error_page 404             /404.html;
        # redirect server error pages to the static page /50x.html
        #
       error_page   500 502 503 504 /50x.html; #定义错误页面
       location = /50x.html {
    
    
           root   html;
       }
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ { #以http的方式转发php请求到指定web服务器
        #   proxy_pass   http://127.0.0.1;
        #}
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ { #以fastcgi的方式转发php请求到php处理
        #   root           html;
        #   fastcgi_pass   127.0.0.1:9000;
        #   fastcgi_index index.php;
        #   fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
        #   include       fastcgi_params;
        #}
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht { #拒绝web形式访问指定文件,如很多的网站都是通过.htaccess文件来
改变自己的重定向等功能。
        #   deny all;
        #}
       location ~ /passwd.html {
    
    
           deny all;
       }
   }
    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server { #自定义虚拟server
    #   listen       8000;
    #   listen       somename:8080;
    #   server_name somename alias another.alias;
    #   location / { 
    #       root   html;
    #       index index.html index.htm; #指定默认网页文件,此指令由
ngx_http_index_module模块提供
    #   }
    #}
    # HTTPS server
    #
    #server { #https服务器配置
    #   listen       443 ssl;
    #   server_name localhost;
    #   ssl_certificate     cert.pem;
    #   ssl_certificate_key cert.key;
    #   ssl_session_cache   shared:SSL:1m;
    #   ssl_session_timeout 5m;
    #   ssl_ciphers HIGH:!aNULL:!MD5;
    #   ssl_prefer_server_ciphers on;
    #   location / {
    
    
    #       root   html;
    #       index index.html index.htm;
    #   }
    #}

マイム

#在响应报文中将指定的文件扩展名映射至MIME对应的类型
include           /etc/nginx/mime.types;
default_type     application/octet-stream;#除mime.types中的类型外,指定其它文件的默认
MIME类型,浏览器一般会提示下载
types {
    
    
   text/html html;
   image/gif gif;
   image/jpeg jpg;
}
#MIME参考文档:
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_Types

6.2 最適化

6.2.1 カーネルパラメータの最適化

/etc/sysctl.confを変更する

fs.file-max = 1000000
#表示单个进程较大可以打开的句柄数
net.ipv4.tcp_tw_reuse = 1 
#参数设置为 1 ,表示允许将TIME_WAIT状态的socket重新用于新的TCP链接,这对于服务器来说意义重
大,因为总有大量TIME_WAIT状态的链接存在
net.ipv4.tcp_keepalive_time = 600
#当keepalive启动时,TCP发送keepalive消息的频度;默认是2小时,将其设置为10分钟,可更快的清理无
效链接
net.ipv4.tcp_fin_timeout = 30
#当服务器主动关闭链接时,socket保持在FIN_WAIT_2状态的较大时间
net.ipv4.tcp_max_tw_buckets = 5000
#表示操作系统允许TIME_WAIT套接字数量的较大值,如超过此值,TIME_WAIT套接字将立刻被清除并打印警
告信息,默认为8000,过多的TIME_WAIT套接字会使Web服务器变慢
net.ipv4.ip_local_port_range = 1024 65000
#定义UDP和TCP链接的本地端口的取值范围
net.ipv4.tcp_rmem = 10240 87380 12582912
#定义了TCP接受缓存的最小值、默认值、较大值
net.ipv4.tcp_wmem = 10240 87380 12582912
#定义TCP发送缓存的最小值、默认值、较大值
net.core.netdev_max_backlog = 8096
#当网卡接收数据包的速度大于内核处理速度时,会有一个列队保存这些数据包。这个参数表示该列队的较大值
net.core.rmem_default = 6291456
#表示内核套接字接受缓存区默认大小
net.core.wmem_default = 6291456
#表示内核套接字发送缓存区默认大小
net.core.rmem_max = 12582912
#表示内核套接字接受缓存区较大大小
net.core.wmem_max = 12582912
#表示内核套接字发送缓存区较大大小
注意:以上的四个参数,需要根据业务逻辑和实际的硬件成本来综合考虑
net.ipv4.tcp_syncookies = 1 
#与性能无关。用于解决TCP的SYN攻击
net.ipv4.tcp_max_syn_backlog = 8192
#这个参数表示TCP三次握手建立阶段接受SYN请求列队的较大长度,默认1024,将其设置的大一些可使出现
Nginx繁忙来不及accept新连接时,Linux不至于丢失客户端发起的链接请求
net.ipv4.tcp_tw_recycle = 1 
#这个参数用于设置启用timewait快速回收
net.core.somaxconn=262114
#选项默认值是128,这个参数用于调节系统同时发起的TCP连接数,在高并发的请求中,默认的值可能会导致
链接超时或者重传,因此需要结合高并发请求数来调节此值。
net.ipv4.tcp_max_orphans=262114
#选项用于设定系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤立
链接将立即被复位并输出警告信息。这个限制指示为了防止简单的DOS攻击,不用过分依靠这个限制甚至认为
的减小这个值,更多的情况是增加这个值

6.2.2 PAM リソース制限の最適化

/etc/security/limits.conf の最後に以下を追加します。

* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535

7. スクリプトを使用して、nginx の任意のバージョンのコンパイルとインストールをワンクリックで完了します。

#!/bin/bash

NGINX_FILE=nginx-1.20.2
#NGINX_FILE=nginx-1.18.0
NGINX_URL=http://nginx.org/download/
TAR=.tar.gz
SRC_DIR=/usr/local/src
NGINX_INSTALL_DIR=/apps/nginx
CPUS=`lscpu |awk '/^CPU\(s\)/{print $2}'`
. /etc/os-release
color () {
    
    
    RES_COL=60
    MOVE_TO_COL="echo -en \\033[${RES_COL}G"
    SETCOLOR_SUCCESS="echo -en \\033[1;32m"
    SETCOLOR_FAILURE="echo -en \\033[1;31m"
    SETCOLOR_WARNING="echo -en \\033[1;33m"
    SETCOLOR_NORMAL="echo -en \E[0m"
    echo -n "$1" && $MOVE_TO_COL
    echo -n "["
    if [ $2 = "success" -o $2 = "0" ] ;then
        ${SETCOLOR_SUCCESS}
        echo -n $" OK "    
    elif [ $2 = "failure" -o $2 = "1" ] ;then 
        ${SETCOLOR_FAILURE}
        echo -n $"FAILED"
    else
        ${SETCOLOR_WARNING}
        echo -n $"WARNING"
    fi
    ${SETCOLOR_NORMAL}
    echo -n "]"
    echo
}
check () {
    
    
   [ -e ${NGINX_INSTALL_DIR} ] && {
    
     color "nginx 已安装,请卸载后再安装" 1; exit; }
    cd  ${SRC_DIR}
    if [  -e ${NGINX_FILE}${TAR} ];then
       color "相关文件已准备好" 0
    else
       color '开始下载 nginx 源码包' 0
        wget ${NGINX_URL}${NGINX_FILE}${TAR}
       [ $? -ne 0 ] && {
    
     color "下载 ${NGINX_FILE}${TAR}文件失败" 1; exit; } 
    fi
} 
install () {
    
    
   color "开始安装 nginx" 0
    if id nginx &> /dev/null;then
       color "nginx 用户已存在" 1
    else
       useradd -s /sbin/nologin -r nginx
       color "创建 nginx 用户" 0
    fi
   color "开始安装 nginx 依赖包" 0
    if [ $ID == "centos" ] ;then
    if [[ $VERSION_ID =~ ^7 ]];then
           yum -y -q install make gcc pcre-devel openssl-devel zlib-devel 
perl-ExtUtils-Embed
 elif [[ $VERSION_ID =~ ^8 ]];then
           yum -y -q install make gcc-c++ libtool pcre pcre-devel zlib zlib
devel openssl openssl-devel perl-ExtUtils-Embed 
 else
 color '不支持此系统!'  1
            exit
        fi
    elif [ $ID == "rocky" ];then
   yum -y -q install make gcc-c++ libtool pcre pcre-devel zlib zlib-devel 
openssl openssl-devel perl-ExtUtils-Embed 
 else
       apt update &> /dev/null
       apt -y install make gcc libpcre3 libpcre3-dev openssl libssl-dev zlib1g
dev &> /dev/null
    fi
    cd $SRC_DIR
   tar xf ${NGINX_FILE}${TAR}
    NGINX_DIR=`echo ${
     
     NGINX_FILE}${
     
     TAR}| sed -nr 's/^(.*[0-9]).*/\1/p'`
    cd ${NGINX_DIR}
   ./configure --prefix=${NGINX_INSTALL_DIR} --user=nginx --group=nginx --with
http_ssl_module --with-http_v2_module --with-http_realip_module --with
http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream
--with-stream_ssl_module --with-stream_realip_module
    make -j $CPUS && make install 
   [ $? -eq 0 ] && color "nginx 编译安装成功" 0 || {
    
     color "nginx 编译安装失败,退 
出!" 1 ;exit; }
    echo "PATH=${NGINX_INSTALL_DIR}/sbin:${
     
     PATH}" > /etc/profile.d/nginx.sh
    cat > /lib/systemd/system/nginx.service <<EOF
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=${NGINX_INSTALL_DIR}/logs/nginx.pid
ExecStartPre=/bin/rm -f ${NGINX_INSTALL_DIR}/logs/nginx.pid
ExecStartPre=${NGINX_INSTALL_DIR}/sbin/nginx -t
ExecStart=${NGINX_INSTALL_DIR}/sbin/nginx
ExecReload=/bin/kill -s HUP \$MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
LimitNOFILE=100000
[Install]
WantedBy=multi-user.target
EOF
   systemctl daemon-reload
   systemctl enable --now nginx &> /dev/null 
   systemctl is-active nginx &> /dev/null || {
    
     color "nginx 启动失败,退出!" 1 ; 
exit; }
   color "nginx 安装完成" 0 
}
check
install

8. サードパーティ製の nginx モジュールを任意にコンパイルして使用します。

3 番目のモジュールは nginx の機能拡張です。サードパーティ モジュールは、Nginx のコンパイルおよびインストール時にパスを指定するパラメーター –add-module=PATH を使用して追加する必要があります。一部のモジュールは、会社の開発者によってカスタマイズおよび開発されています
。モジュールは
オープンソース愛好家によって開発され、オープンソース モジュールの github にアップロードされます。nginx のサードパーティ モジュールは、サポートのためにソース コードから再コンパイルする必要があります

8.1 nginx-module-vts モジュールはトラフィック監視を実装します

https://github.com/vozlt/nginx-module-vts

[root@centos8 ~]#cd /usr/local/src
[root@centos8 src]#git clone git://github.com/vozlt/nginx-module-vts.git
[root@centos8 src]#cd nginx-1.18.0/
[root@centos8 nginx-1.18.0]#./configure --prefix=/apps/nginx --add
module=/usr/local/src/nginx-module-vts
[root@centos8 nginx-1.18.0]#make && make install
[root@centos8 ~]#vim /apps/nginx/conf/nginx.conf
http {
    
    
 ......
 vhost_traffic_status_zone;
 ......
 server {
    
    
 ......
 location /status {
    
    
   vhost_traffic_status_display;
 vhost_traffic_status_display_format html;
 }
 ......
 }
}
[root@centos8 ~]#systemctl restart nginx
#浏览器访问:http://<nginx_ip>/status 可以看到下面显示

8.2 echoモジュールは情報表示を実装します

オープンソースのエコー モジュールを使用して、情報や変数などを出力できます。

https://github.com/openresty/echo-nginx-module

[root@centos8 ~]# systemctl stop nginx
[root@centos8 ~]# vim /apps/nginx/conf/conf.d/pc.conf 
 location /main {
    
    
     index index.html;
     default_type text/html;
     echo "hello world,main-->";
     echo $remote_addr ;
     echo_reset_timer;   #将计时器开始时间重置为当前时间
     echo_location /sub1;
     echo_location /sub2;
     echo "took $echo_timer_elapsed sec for total.";
 }
 location /sub1 {
    
    
     echo_sleep 1;
     echo sub1;
 }
 location /sub2 {
    
    
     echo_sleep 1;
     echo sub2;
 }
[root@centos8 ~]# /apps/nginx/sbin/nginx -t
nginx: [emerg] unknown directive "echo_reset_timer" in
/apps/nginx/conf/conf.d/pc.conf:86
nginx: configuration file /apps/nginx/conf/nginx.conf test failed
#解决以上报错问题
[root@centos8 ~]# cd /usr/local/src
[root@centos8 src]# yum install git -y
#github网站国内访问不稳定,可能无法下载
[root@centos8 src]# git clone https://github.com/openresty/echo-nginx-module.git
#如果上面链接无法下载,可以用下面链接
[root@centos8 src]# git clone https://github.com.cnpmjs.org/openresty/echo
nginx-module.git
[root@centos8 src]# cd nginx-1.18.0/
[root@centos8 src]# ./configure \
--prefix=/apps/nginx \
--user=nginx --group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module \
--with-http_perl_module \
--add-module=/usr/local/src/echo-nginx-module  #指定模块源代码路径
[root@centos8 src]# make && make install
#确认语法检测通过
[root@centos8 ~]# /apps/nginx/sbin/nginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful
#编译新模块需要重启nginx才能访问测试,不支持reload
[root@centos8 ~]#systemctl restart nginx
[root@centos8 ~]#nginx -V
nginx version: wanginx/1.68.9
built by gcc 8.3.1 20191121 (Red Hat 8.3.1-5) (GCC) 
built with OpenSSL 1.1.1c FIPS  28 May 2019
TLS SNI support enabled
configure arguments: --prefix=/apps/nginx --user=nginx --group=nginx --with
http_ssl_module --with-http_v2_module --with-http_realip_module --with
http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream
--with-stream_ssl_module --with-stream_realip_module --add
module=/usr/local/src/echo-nginx-module
#测试查看结果
[root@centos7 ~]#curl http://www.magedu.org/main
hello world,main-->
10.0.0.7
sub1
sub2
took 2.003 sec for total.

おすすめ

転載: blog.csdn.net/qq_46229380/article/details/127727077
おすすめ