Redis は 1 つのマスターと 1 つのスレーブ Docker モードでデプロイされ、キープアライブおよびセンチネル モードを通じて高可用性を実現します。

サーバーが 2 つあり、1 つはマスター、マスター: 172.24.69.180
、もう 1 つはスレーブ、スレーブ: 172.24.69.181
vip アドレス: 172.24.69.185

1. ファイアウォールをオフにする

両方のサーバーのファイアウォールをオフにします

systemctl disable --now firewalld
firewall-cmd --state

SELinuxをオフにする

setenforce 0
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
sestatus

まずファイアウォールをオフにします。オフにしないと、vip がドリフトできなくなり、長い間探していました。

2.ドッカーをインストールする


バイナリ インストールを使用して両方のサーバーに docker をインストールします。
1. docker オフライン バイナリ パッケージを取得します。

docker二进制包获取地址:https://download.docker.com/linux/static/stable/x86_64/

2.サーバーにアップロードして解凍する

tar xzf docker-20.10.8.tgz
#解压缩完成后将docker目录中的所有文件复制至/usr/bin/目录下
cp docker/* /usr/bin

3. docker.service ファイル
vim /usr/lib/systemd/system/docker.serviceを構成し
、ファイルに次の内容を入力します。

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target

[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s

[Install]
WantedBy=multi-user.target

4. マウントディレクトリを作成する

创建目录
mkdir /data/docker

5.daemon.jsonを確認する

mkdir /etc/docker

vim /etc/docker/daemon.json

daemon.json に次の内容を入力します。

{
    
    
    "graph": "/data/docker",
    "storage-driver": "overlay2",
    "registry-mirrors": ["https://q2gr04ke.mirror.aliyuncs.com"],
    "bip": "172.7.21.1/24",
    "log-driver":"json-file",
    "log-opts":{
    
     "max-size" :"100m","max-file":"3"},
    "exec-opts": ["native.cgroupdriver=systemd"]
}

6. Dockerサービスを開始する

systemctl daemon-reload
systemctl enable --now docker

3. Redisをインストールする

Redis は両方のサーバーにインストールされていますが、マスター/スレーブ構成は若干異なります
。 1. イメージをプルします。

 docker pull redis:6.2.6

2. マウントディレクトリを作成する

mkdir -p /data/redis/logs
mkdir -p /data/redis/data
chmod 777 /data/redis/data
chmod 777 /data/redis/logs

3. マスターノードの構成(172.24.69.180)

cat > /data/redis/redis.conf << EOF
bind 0.0.0.0
daemonize no
port 6379
tcp-backlog 511
timeout 300
tcp-keepalive 60
databases 16
 
save 900 1
save 300 10
save 60 10000
 
dbfilename dump.rdb
 
loglevel notice
logfile "/var/log/redis-server.log"
dir "/data"
appendonly yes
appendfilename appendonly.aof
maxmemory-policy volatile-lru
maxmemory 6442450944
appendfsync everysec
 
requirepass pass123
masterauth pass123
EOF

構成ファイルの pass123 は、設定された Redis パスワードです。

スレーブノードの構成(172.24.69.181)

cat > /data/redis/redis.conf << EOF
bind 0.0.0.0
daemonize no
port 6379
tcp-backlog 511
timeout 300
tcp-keepalive 60
databases 16
 
save 900 1
save 300 10
save 60 10000
 
dbfilename dump.rdb
 
loglevel notice
logfile "/var/log/redis-server.log"
dir "/data"
appendonly yes
appendfilename appendonly.aof
maxmemory-policy volatile-lru
maxmemory 6442450944
appendfsync everysec
 
requirepass pass123
masterauth  pass123
 
slaveof 172.24.69.180 6379        
EOF

172.24.69.180 のスレーブ これはマスターノードの IP です

4. Docker が Redis
マスターノードを起動します

docker run -dit --name mianredis --restart=always -v /data/redis/redis.conf:/etc/redis.conf -v /data/redis/data/:/data/ -v /data/redis/logs:/var/log -p 6379:6379 redis:6.2.6 redis-server /etc/redis.conf

スレーブノード

docker run -dit --name slaveredis --restart=always -v /data/redis/redis.conf:/etc/redis.conf -v /data/redis/data/:/data/ -v /data/redis/logs:/var/log -p 6379:6379 redis:6.2.6 redis-server /etc/redis.conf

5. Redis を起動した後、redis-cli をホストの /usr/local/bin/directory
マスター ノードにコピーします。

docker cp mianredis:/usr/local/bin/redis-cli /usr/local/bin/

スレーブノード

docker cp slaveredis:/usr/local/bin/redis-cli /usr/local/bin/

4. Redis マスター/スレーブ + センチネル + キープアライブ

両方のノードがインストールされていますが、構成が異なります。

実施の原則

マスター サーバーとバックアップ サーバーにそれぞれ Sentry と keepalived をインストールします。マスターの優先順位は 100、バックアップの優先順位は 99 です。スレーブ サーバーで vrrp_script を設定して、スクリプト ルールをチェックし、スレーブの現在のロール ステータスをチェックします。スレーブの Redis ロール ステータスがmaster 、VIP 権限を取得できるように、スレーブの優先順位を 2 増やして 101 にします。
マスターの Redis サービスがハングアップすると、センチネルはスレーブを新しいマスターに昇格させ、スレーブは、ロールのステータスはマスターです。2 VIP を取得します。元のマスターの Redis サービスが開始されると、Sentinel はそれをスレーブとしてマスター/スレーブ レプリケーションに追加します。マスターとなるスレーブ ノード上の Redis サービスがハングアップすると、Sentinel は Redis を設定します
。マスターを元のマスターノード vrrp_script に変更します。自分の Redis がマスターではないことを確認する場合は、優先度を 2 下げて 99 にします。元のマスターの優先度はスレーブの優先度よりも高く、元のマスターは VIP 権限を取得します。

1. Sentinel.conf の設定
マスターノードの設定
パスは /data/redis/sentinel.conf で、sentinel.conf に次の内容を入力します。

port 26379
dir "/var/log/sentinel"
logfile "/var/log/sentinel/26379.log"
sentinel monitor mymaster 172.24.69.180 6379 1
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel auth-pass mymaster pass123
sentinel announce-ip "172.24.69.180"
sentinel announce-port 26379

ノードから Sentinel.conf 構成を構成します
。パスは /data/redis/sentinel.conf です。

port 26379
dir "/var/log/sentinel"
logfile "/var/log/sentinel/26379.log"
sentinel monitor mymaster 172.24.69.180 6379 1
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel auth-pass mymaster pass123
sentinel announce-ip "172.24.69.181"
sentinel announce-port 26379

172.24.69.180 はマスター ノードの IP です。
172.24.69.181 はスレーブ ノードの IP です。

2. Sentinel
マスター ノードを起動します。

docker run -d --name main --restart=always -v /data/redis/sentinel.conf:/conf/sentinel.conf -v /data/logs/sentinel:/var/log/sentinel  -p 26379:26379 redis:6.2.6  redis-sentinel /conf/sentinel.conf

ノードから:

docker run -d --name slave --restart=always -v /data/redis/sentinel.conf:/conf/sentinel.conf -v /data/logs/sentinel:/var/log/sentinel  -p 26379:26379 redis:6.2.6  redis-sentinel /conf/sentinel.conf

5.キープアライブをインストールする

両方のサーバーがインストールされていますが、構成が異なります

yum -y install keepalived 

1. 設定ファイルの変更
マスターノードの設定:
設定ファイルは/etc/keepalived/keepalived.confです。

! Configuration File for keepalived
global_defs {
    
    
   router_id redis-225 ##设备名称
}
vrrp_script chkmaster{
    
    
     script "/etc/keepalived/chkmaster.sh  127.0.0.1 6379 pass123" #检查当前redis是否为master
     interval 3 #每3秒检查一次
      weight -2 #当本机为master检测结果返回1,将优先级加2
}
vrrp_instance VI_redis {
    
    
    state MASTER ##当前设备为master
    interface enp4s1  ##vip绑定的网卡
    virtual_router_id 79 ##备份组id,同一备份组要一致
    priority 100 ##优先级,优先级高的成为master
    advert_int 3 ##每多少秒进行一次健康检查
    unicast_src_ip  172.24.69.180 ##(本地IP地址)
    unicast_peer {
    
    
                  172.24.69.181  ##(对端IP地址)此地址一定不能忘记
                       }
    authentication {
    
    
        auth_type PASS
        auth_pass redis
    }

    virtual_ipaddress {
    
    
        172.24.69.185/24
    }
   track_script
     {
    
     ##调用状态检查
          chkmaster
     }
}

スレーブノード構成

! Configuration File for keepalived
global_defs
 {
    
    
     router_id redis-224
 }
vrrp_script chkmaster
 {
    
    
     script "/etc/keepalived/chkmaster.sh  127.0.0.1 6379 pass123" #检查当前redis是否为master
     interval 3 #每3秒检查一次
      weight -2 #当本机为master检测结果返回1,将优先级加2
  }
vrrp_instance VI_redis
{
    
    
   state BACKUP #本机的状态信息
   interface enp4s1   #vip绑定的网卡
    virtual_router_id 79 ##备份组id,同一备份组要一致
    priority 99 ##优先级,优先级高的成为master
    advert_int 3 ##每多少秒进行一次健康检查
    unicast_src_ip  172.24.69.181 ##(本地IP地址)
    unicast_peer {
    
    
                  172.24.69.180  ##(对端IP地址)此地址一定不能忘记
                       }
    authentication
    {
    
    
        auth_type PASS
        auth_pass redis
     }
     virtual_ipaddress
     {
    
    
         172.24.69.185/24
     }
     track_script
     {
    
     ##调用状态检查
          chkmaster
     }
}

2. マスタースクリプトとスレーブスクリプトは同じであり、ステータスチェックスクリプトの内容は次のとおりです。

#!/bin/bash
STATUS=`/usr/local/bin/redis-cli -h $1 -p $2 -a $3 info | grep role:master | wc -l`
echo $STATUS
if [ "$STATUS" -eq 0 ];then    
    exit 1
else    
    exit 0
fi

3. スクリプトに許可を与えます

chmod -R 755 /etc/keepalived/chkmaster.sh

4.キープアライブを再起動する

systemctl daemon-reload
systemctl enable --now keepalived
systemctl stop keepalived     #关闭keepalived
systemctl start keepalived     #启动keepalived

5. Redis が正常かどうかを確認する

#登录redis
/usr/local/bin/redis-cli -h 127.0.0.1 -p 6379 -a pass123
#查看redis信息
/usr/local/bin/redis-cli -h 127.0.0.1 -p 6379 -a pass123 info

6. VIP がドリフトできるかどうかを確認します。
現時点で VIP が存在するサーバーを確認します。VIP が配置されているサーバー上の Redis コンテナを手動で停止して、VIP が別のサーバーにドリフトできるかどうかを確認します。ドリフトできる場合は、再起動します。次に、vip が配置されているサーバーの redis コンテナーを停止して、vip が別のサーバーにドリフトできるかどうかを確認します。そうであれば、成功します。

キープアライブのステータスを確認して優先度の変更を確認する
ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/javascript_good/article/details/132605070