lvs + nginx + keepalived

基本的な環境の準備

2つのサーバー:192.168.199.101(マスター)と192.168.199.102(スレーブ)。各サーバーにnginxとkeepalivedをインストールします。

安装nginx:
yum -y install nginx
启动nginx:
systemctl start nginx

安装keepalived:
yum -y install keepalived
启动keepalived:
systemctl start keepalived
マスタースレーブ構成:

ノード計画

CPU名 ip ソフトウェア キャラクター
yfm01 192.168.199.101 nginx、キープアライブ 80 マスターノード
yfm02 192.168.199.102 nginx、キープアライブ 80 スレーブノード
VIP 192.168.199.99

キープアライブログを個別に保存するように設定します

默认keepalived日志存放在/var/log/messages

sed -i s#KEEPALIVED_OPTIONS=\"-D\"#KEEPALIVED_OPTIONS=\"-D\ -d\ -S\ 0\"#g /etc/sysconfig/keepalived

echo "local0.* /var/log/keepalived.log" >> /etc/rsyslog.conf

修改/lib/systemd/system/keepalived.service
sed -i s#EnvironmentFile=-/etc/sysconfig/keepalived#EnvironmentFile=/etc/sysconfig/keepalived#g /lib/systemd/system/keepalived.service

重新加载service:systemctl daemon-reload  #这种我试了不行
重启机器reboot

主192.168.199.101、/ etc / keepalived / keepalived.conf

! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.199.101 #指定smtp服务器地址
   smtp_connect_timeout 30
   router_id LVS_DEVEL1 #负载均衡标识,在局域网内应该是唯一的
   #vrrp_strict 不要开启
}

vrrp_script chk_http_port {
        script "/etc/keepalived/nginx_check.sh"
        interval 2
        weight 2
}

vrrp_instance VI_1 {
    state MASTER #指定该keepalived节点的初始状态
    interface ens33
    virtual_router_id 51 #指定VRRP实例ID
    priority 100 #指定优先级,优先级高的将成为MASTER
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.199.99 #指定VIP地址
    }
}

から192.168.199.102、/ etc / keepalived / keepalived.conf

! Configuration File for keepalived
global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.199.101
   smtp_connect_timeout 30
   router_id LVS_DEVEL2
}
vrrp_script chk_http_port {
        script "/etc/keepalived/nginx_check.sh"
        interval 2
        weight 2
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.199.99
    }
}

nginx_check.sh

#!/bin/bash
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
    /usr/sbin/nginx
    sleep 2
    counter=$(ps -C nginx --no-heading|wc -l)
    if [ "${counter}" = "0" ]; then
        systemctl stop keepalived
    fi
fi

総括する:

  • マスターがハングアップしていない場合、マスターはvipを占有し、nginxはマスター上で実行されます
  • マスターがハングし、スレーブがvipをプリエンプトし、スレーブでnginxサービスを実行します
  • マスターのnginxサービスがハングすると、nginxは自動的に再起動します。再起動が失敗すると、keepalivedは自動的に閉じられるため、VIPリソースもスレーブに転送されます。
  • マスターとスレーブの両方がnginxサービスを開始します。マスターまたはスレーブに関係なく、キープアライブサービスの1つが停止すると、VIPはキープアライブサービスがまだ存在するノードにドリフトします。
  • nginxサービスをハングアップさせ、vipを別のノードにドリフトさせる場合は、スクリプトを使用するか、構成ファイルでシェルコマンドを使用して制御する必要があります。(nginxサービスは、ダウンすると自動的に開始され、開始に失敗するとkeepalivedが強制的に閉じられるため、vipリソースが別のマシンにドリフトします)

マスタースレーブの欠点は、マスターが常に安定している場合、スレーブは常にアイドル状態になり、リソースの浪費につながることです。

マスターマスター構成

ノード計画

CPU名 ip ソフトウェア キャラクター
yfm01 192.168.199.101 nginx、キープアライブ 80 マスターノードとスレーブノード
yfm02 192.168.199.102 nginx、キープアライブ 80 スレーブ、スレーブノード
VIP 192.168.199.99、192.168.199.98

192.168.199.101

! Configuration File for keepalived

global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.199.101 #指定smtp服务器地址
   smtp_connect_timeout 30
   router_id LVS_DEVEL1 #负载均衡标识,在局域网内应该是唯一的
}

vrrp_script chk_http_port {
        script "/etc/keepalived/nginx_check.sh"
        interval 2
        weight 2
}

vrrp_instance VI_1 {
    state MASTER #指定该keepalived节点的初始状态
    interface ens33
    virtual_router_id 51 #指定VRRP实例ID
    priority 100 #指定优先级,优先级高的将成为MASTER
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.199.99 #指定VIP地址
    }
	track_script {
	chk_http_port
   }
}
vrrp_instance VI_2 {
    state BACKUP  #这里修改为BACKUP
    interface ens33
    virtual_router_id 52 #这里修改为52
    priority 90    #修改优先级
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.199.98  #绑定另外一个VIP
    }

   track_script {
	chk_http_port
   }
}

192.168.199.102

! Configuration File for keepalived
global_defs {
   notification_email {
     [email protected]
     [email protected]
     [email protected]
   }
   notification_email_from [email protected]
   smtp_server 192.168.199.101
   smtp_connect_timeout 30
   router_id LVS_DEVEL2
}
vrrp_script chk_http_port {
        script "/etc/keepalived/nginx_check.sh"
        interval 2
        weight 2
}
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.199.99
    }
	track_script {
   chk_http_port
	}
}
vrrp_instance VI_2 {
    state MASTER
    interface ens33
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.199.98
    }

track_script {
   chk_http_port
}
}

nginx_check.sh

#!/bin/bash
counter=$(ps -C nginx --no-heading|wc -l)
if [ "${counter}" = "0" ]; then
    /usr/sbin/nginx
    sleep 2
    counter=$(ps -C nginx --no-heading|wc -l)
    if [ "${counter}" = "0" ]; then
        systemctl stop keepalived
    fi
fi

VRRP_Instance(VI_1)の場合、192.168.199.101がマスターです。VRRP_Instance(VI_2)の場合、192.168.199.102がマスターです。

ブラウザがhttp://192.168.199.99/にアクセスすると、192.168.199.101のnginxがリクエストを処理します。ブラウザがhttp://192.168.199.98/にアクセスすると、192.168.199.102のnginxがリクエストを処理します。

いずれかのサーバーのキープアライブサービスが停止すると、他のサーバーのキープアライブはMASTER状態になり、要求を処理します。192.168.199.101でkeepalivedサービスを停止すると、192.168.199.102でのkeepalivedサービスのVRRP_Instance(VI_1)がMASTER状態になり、http://192.168.199.99/とhttp://192.168.199.98/を処理します。

http://192.168.199.99/にアクセスします
ここに画像の説明を挿入

http://192.168.199.98/にアクセスします
ここに画像の説明を挿入

lvs + keepalived + nginxマスタースレーブモード

ノード計画

CPU名 ip ソフトウェア キャラクター
yfm01 192.168.199.101 lvs、キープアライブ 80 主人
yfm02 192.168.199.102 lvs、キープアライブ 80 スレーブ
yfm03 192.168.199.103 nginx 80 realserver1
yfm04 192.168.199.104 nginx 80 realserver2
VIP 192.168.199.99
在yfm01、yfm02节点安装lvs
yum -y install ipvsadm
加载ipvsadm模块进系统
ipvsadm


在yfm03、yfm04节点安装nginx
yum -y install nginx

192.168.199.101、/ etc / keepalived / keepalived.conf

! Configuration File for keepalived

global_defs {
   router_id LVS_Master
}
   
vrrp_instance VI_1 {
    state MASTER               #指定instance初始状态,实际根据优先级决定.backup节点不一样
    interface ens33             #虚拟IP所在网
    virtual_router_id 51       #VRID,相同VRID为一个组,决定多播MAC地址
    priority 100               #优先级,另一台改为90.backup节点不一样
    advert_int 1               #检查间隔
    authentication {
        auth_type PASS         #认证方式,可以是pass或ha
        auth_pass 1111         #认证密码
    }
    virtual_ipaddress {
        192.168.199.99         #VIP
    }
}
   
virtual_server 192.168.199.99 80 {
    delay_loop 6               #服务轮询的时间间隔
    lb_algo wrr                #加权轮询调度,LVS调度算法 rr|wrr|lc|wlc|lblc|sh|sh
    lb_kind DR                 #LVS集群模式 NAT|DR|TUN,其中DR模式要求负载均衡器网卡必须有一块与物理网卡在同一个网段
    #nat_mask 255.255.255.0
    persistence_timeout 50     #会话保持时间
    protocol TCP              #健康检查协议
   
    ## Real Server设置,80就是MySQL连接端口
    real_server 192.168.199.103 80 {
        weight 3  ##权重
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
    real_server 192.168.199.104 80 {
        weight 3
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

192.168.199.102、/ etc / keepalived / keepalived.conf

! Configuration File for keepalived
   
global_defs {
   router_id LVS_Backup
}
   
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.199.99
    }
}
   
virtual_server 192.168.199.99 80 {
    delay_loop 6           
    lb_algo wrr         
    lb_kind DR
   
    persistence_timeout 50  
    protocol TCP          
   
    real_server 192.168.199.103 80 {
        weight 3
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
    real_server 192.168.199.104 80 {
        weight 3
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

192.168.199.103、192.168.199.104

新建/etc/init.d/realserver脚本

#!/bin/sh
#chkconfig: 2345 90 10
VIP=192.168.199.99
. /etc/rc.d/init.d/functions
   
case "$1" in
# 禁用本地的ARP请求、绑定本地回环地址
start)
    /sbin/ifconfig lo down
    /sbin/ifconfig lo up
    echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
    echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
    /sbin/sysctl -p >/dev/null 2>&1
    /sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 up     #在回环地址上绑定VIP,设定掩码,与Direct Server(自身)上的IP保持通信
    /sbin/route add -host $VIP dev lo:0
    echo "LVS-DR real server starts successfully.\n"
    ;;
stop)
    /sbin/ifconfig lo:0 down
    /sbin/route del $VIP >/dev/null 2>&1
    echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
    echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "LVS-DR real server stopped.\n"
    ;;
status)
    isLoOn=`/sbin/ifconfig lo:0 | grep "$VIP"`
    isRoOn=`/bin/netstat -rn | grep "$VIP"`
    if [ "$isLoON" == "" -a "$isRoOn" == "" ]; then
        echo "LVS-DR real server has run yet."
    else
        echo "LVS-DR real server is running."
    fi
    exit 3
    ;;
*)
    echo "Usage: $0 {start|stop|status}"
    exit 1
esac
exit 0

赋予可执行权限
chomd +x realserver

开机启动
chkconfig realserver on

ip addrコマンドを使用してyfm01とyfm02を表示します。VIPはyfm01にバインドされていますが、yfm02はバインドされていないことがわかります。
ここに画像の説明を挿入

ここに画像の説明を挿入

yfm01でipvsadm-lnを実行して、接続を確認します
ここに画像の説明を挿入

yfm03、yfm04、nginxウェルカムインターフェイスを変更し、ローカルIPを追加します

whereis nginx
[root@yfm03 nginx]# whereis nginx
nginx: /usr/sbin/nginx /usr/lib64/nginx /etc/nginx /usr/share/nginx /usr/share/man/man3/nginx.3pm.gz /usr/share/man/man8/nginx.8.gz
可以看到nginx配置文件在 /etc/nginx目录

ブラウザで192.168.199.103、192.168.199.104、および192.168.199.99にアクセスすることで、nginxサービスにアクセスできます(
外部リンクの画像転送が失敗し、ソースサイトにヒル防止メカニズムがある可能性があります。画像を保存することをお勧めします。直接アップロード(img-17J8MdJC-1614507612061)(https://s3.ax1x.com/2021/01/20/sRwCsP.png)]

総括する:

  • MASTERサーバーがサービスを提供できない場合、VIPは自動的にMASTERから削除され、BACKUPサーバーはMASTER状態にアップグレードされ、VIPをバインドしてサービスを引き継ぎます。
  • MASTERが修復してネットワークに参加すると、自動的にVIPを取り戻し、MASTERIDになります。
  • バックエンドによって提供されるnginxサービスが一時停止されると、他のnginxサーバーに自動的に切り替わります。
lvs + keepalived + nginxメインマスターモード

マスタースレーブ環境と比較すると、主な違いは

  1. LVSロードバランシングレイヤーには2つのVIPが必要です。例:192.168.199.98および192.168.199.99
  2. バックエンドの実サーバーは、これら2つのVIPをローカルループバックポートにバインドする必要があります。
  3. Keepalived.confの構成も、上記のマスタースレーブモードとは異なります。

yfm03、/ etc /init.dディレクトリに新しいrealserver98とrealserver99を作成します

realserver98

#!/bin/sh
#chkconfig: 2345 90 10
VIP=192.168.199.98
. /etc/rc.d/init.d/functions
   
case "$1" in
 
start)
    /sbin/ifconfig lo down
    /sbin/ifconfig lo up
    echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
    echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
    /sbin/sysctl -p >/dev/null 2>&1
    /sbin/ifconfig lo:0 $VIP netmask 255.255.255.255 up   
    /sbin/route add -host $VIP dev lo:0
    echo "LVS-DR real server starts successfully.\n"
    ;;
stop)
    /sbin/ifconfig lo:0 down
    /sbin/route del $VIP >/dev/null 2>&1
    echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
    echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "LVS-DR real server stopped.\n"
    ;;
status)
    isLoOn=`/sbin/ifconfig lo:0 | grep "$VIP"`
    isRoOn=`/bin/netstat -rn | grep "$VIP"`
    if [ "$isLoON" == "" -a "$isRoOn" == "" ]; then
        echo "LVS-DR real server has run yet."
    else
        echo "LVS-DR real server is running."
    fi
    exit 3
    ;;
*)
    echo "Usage: $0 {start|stop|status}"
    exit 1
esac
exit 0

realserver99

#!/bin/sh
#chkconfig: 2345 90 10
VIP=192.168.199.99
. /etc/rc.d/init.d/functions
   
case "$1" in
 
start)
    /sbin/ifconfig lo down
    /sbin/ifconfig lo up
    echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
    echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
    /sbin/sysctl -p >/dev/null 2>&1
    /sbin/ifconfig lo:1 $VIP netmask 255.255.255.255 up   
    /sbin/route add -host $VIP dev lo:1
    echo "LVS-DR real server starts successfully.\n"
    ;;
stop)
    /sbin/ifconfig lo:1 down
    /sbin/route del $VIP >/dev/null 2>&1
    echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
    echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "LVS-DR real server stopped.\n"
    ;;
status)
    isLoOn=`/sbin/ifconfig lo:1 | grep "$VIP"`
    isRoOn=`/bin/netstat -rn | grep "$VIP"`
    if [ "$isLoON" == "" -a "$isRoOn" == "" ]; then
        echo "LVS-DR real server has run yet."
    else
        echo "LVS-DR real server is running."
    fi
    exit 3
    ;;
*)
    echo "Usage: $0 {start|stop|status}"
    exit 1
esac
exit 0

赋予可执行权限
chomd +x realserver9*

在yfm04执行以下命令,复制刚刚新建的文件
scp [email protected]:/etc/init.d/realserver9* /etc/init.d/

在yfm03、yfm04执行以下命令
service realserver99 start
service realserver98 start

2つのVIPが正常にloにバインドされていることがわかります
ここに画像の説明を挿入

yfm01、/ etc / keepalived / keepalived.conf

! Configuration File for keepalived

global_defs {
   router_id LVS_Master
}
   
vrrp_instance VI_1 {
    state MASTER               #指定instance初始状态,实际根据优先级决定.backup节点不一样
    interface ens33             #虚拟IP所在网
    virtual_router_id 51       #VRID,相同VRID为一个组,决定多播MAC地址
    priority 100               #优先级,另一台改为90.backup节点不一样
    advert_int 1               #检查间隔
    authentication {
        auth_type PASS         #认证方式,可以是pass或ha
        auth_pass 1111         #认证密码
    }
    virtual_ipaddress {
        192.168.199.99         #VIP
    }
}

vrrp_instance VI_2 {
    state BACKUP           
    interface ens33          
    virtual_router_id 52   
    priority 90            
    advert_int 1           
    authentication {
        auth_type PASS      
        auth_pass 1111      
    }
    virtual_ipaddress {
        192.168.199.98
    }
}

virtual_server 192.168.199.99 80 {
    delay_loop 6               #服务轮询的时间间隔
    lb_algo wrr                #加权轮询调度,LVS调度算法 rr|wrr|lc|wlc|lblc|sh|sh
    lb_kind DR                 #LVS集群模式 NAT|DR|TUN,其中DR模式要求负载均衡器网卡必须有一块与物理网卡在同一个网段
    #nat_mask 255.255.255.0
    persistence_timeout 50     #会话保持时间
    protocol TCP              #健康检查协议
   
    ## Real Server设置,80就是MySQL连接端口
    real_server 192.168.199.103 80 {
        weight 3  ##权重
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
    real_server 192.168.199.104 80 {
        weight 3
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}


virtual_server 192.168.199.98 80 {
    delay_loop 6               #服务轮询的时间间隔
    lb_algo wrr                #加权轮询调度,LVS调度算法 rr|wrr|lc|wlc|lblc|sh|sh
    lb_kind DR                 #LVS集群模式 NAT|DR|TUN,其中DR模式要求负载均衡器网卡必须有一块与物理网卡在同一个网段
    #nat_mask 255.255.255.0
    persistence_timeout 50     #会话保持时间
    protocol TCP              #健康检查协议
   
    ## Real Server设置,80就是MySQL连接端口
    real_server 192.168.199.103 80 {
        weight 3  ##权重
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
    real_server 192.168.199.104 80 {
        weight 3
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

yfm02、/ etc / keepalived / keepalived.conf

! Configuration File for keepalived
   
global_defs {
   router_id LVS_Backup
}
   
vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.199.99
    }
}
vrrp_instance VI_2 {
    state Master          
    interface ens33          
    virtual_router_id 52  
    priority 100           
    advert_int 1           
    authentication {
        auth_type PASS      
        auth_pass 1111      
    }
    virtual_ipaddress {
        182.148.15.235    
    }
}


virtual_server 192.168.199.99 80 {
    delay_loop 6           
    lb_algo wrr         
    lb_kind DR
   
    persistence_timeout 50  
    protocol TCP          
   
    real_server 192.168.199.103 80 {
        weight 3
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
    real_server 192.168.199.104 80 {
        weight 3
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

virtual_server 192.168.199.98 80 {
    delay_loop 6           
    lb_algo wrr         
    lb_kind DR
   
    persistence_timeout 50  
    protocol TCP          
   
    real_server 192.168.199.103 80 {
        weight 3
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
    real_server 192.168.199.104 80 {
        weight 3
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}
在yfm01,打开ip_forward路由转发功能
echo "1" > /proc/sys/net/ipv4/ip_forward

在yfm01、yfm02上启动keepalived
service keepalived start

ここに画像の説明を挿入

ここに画像の説明を挿入

ご覧のとおり、yfm01は2つのVIPを正常にバインドしましたが、yfm02はバインドされていません。

参照:

NGINX高可用性キープアライブ+ nginxマスタースレーブモード+マスターマスターモードの構成方法

LVS + Keepalived + Nginxロードバランシング構築テスト

LVS + Keepalived高可用性環境デプロイメントコーミング(マスター-マスターおよびマスター-スレーブモード)

おすすめ

転載: blog.csdn.net/yfm081616/article/details/114234770