Keepalived + Tengine 고가 용 집단 실현
최근 몇 년 동안 Nginx 가 국내 에서 발전 하 는 추세 에 따라 점점 더 많은 인터넷 회사 들 이 Nginx 를 사용한다.Nginx 의 고성능, 안정성 등 으로 많은 IT 자 들 이 선 호 하 는 WEB 역방향 프 록 시 서버 가 되 었 다.그러나 Nginx 는 강력 한 프 록 시 기능 을 가지 고 있 지만 Nginx 서버 한 대 만 문제 가 발생 하지 않 을 수 있 습 니 다. 이 로 인해 단일 고장 문제 가 발생 했 습 니 다. 마침 Keepalived 를 사용 하여 단일 고장 문 제 를 해결 할 수 있 습 니 다. Keepalived 고장 의 전이 시간 이 비교적 짧 고 설정 이 간단 하고 사용 하기 쉬 운 것 도 Keepalived 를 선택 하여 사용 할 수 있 는 주요 원인 입 니 다.만약 에 일 PV 수치 가 큰 중 소기 업 이 아니라면 이런 방안 을 고려 해 볼 수 있다.
Tengine
텐 진 은 타 오 바 오 에서 시 작 된 웹 서버 프로젝트 입 니 다.이 는 Nginx 를 바탕 으로 큰 방문 사이트 의 수요 에 따라 고급 기능 과 특성 을 많이 추가 했다.텐 진의 성능 과 안정성 은 이미 대형 사이트 인 타 오 바 오, 티몰 등에 서 좋 은 검 사 를 받 았 다.그의 최종 목 표 는 효율 적 이 고 안정 적 이 며 안전 하 며 사용 하기 쉬 운 웹 플랫폼 을 만 드 는 것 이다.
Tengine 특성:
1. Nginx - 1.2.9 의 모든 특성 을 계승 하고 Nginx 의 설정 을 100% 호 환 합 니 다.
2. 동적 모듈 로 딩 (DSO) 지원.모듈 을 추가 하면 Tengine 전 체 를 다시 컴 파일 할 필요 가 없습니다.
3. 더욱 강력 한 부하 균형 능력, 일치 성 hash 모듈, 세 션 유지 모듈 을 포함 하고 백 엔 드 서버 에 대해 주동 적 이 고 건강 한 검 사 를 할 수 있 습 니 다. 4. 서버 상태 에 따라 자동 으로 오프라인 으로 올 라 갈 수 있 습 니 다.
5. 입력 필터 메커니즘 지원.이러한 메커니즘 을 사용 하여 웹 응용 방화벽 의 작성 이 더욱 편리 하 다.
6. 여러 개의 CSS, JavaScript 파일 을 조합 하 는 접근 요청 이 하나의 요청 으로 변 합 니 다.
7. CPU 수 에 따라 프로 세 스 개수 와 바 인 딩 CPU 친연 성 을 자동 으로 설정 합 니 다.
8. 시스템 의 부하 와 자원 점용 을 감시 하고 시스템 을 보호 한다.
9 、 더욱 강력 한 방어 * * (접근 속도 제한) 모듈
10. 동적 스 크 립 트 언어 Lua 지원.확장 기능 이 매우 효율 적 이 고 간단 하 다.
......
1. Nginx + Keepalived 는 두 가지 높 은 설정 방법 이 있 습 니 다.
1, Nginx + Keepalived 메 인 모드
하나의 가상 IP 주 소 를 사용 하면 됩 니 다. 전단 에 두 대의 Nginx 서버 가 예약 을 할 수 있 습 니 다. 그 중에서 한 대 는 주요 노드 이 고 다른 한 대 는 예비 노드 가 있 습 니 다. 두 대의 서버 는 한 대 만 서 비 스 를 제공 하고 다른 한 대 는 유 휴 상태 에 있 습 니 다. 메 인 노드 서버 가 고장 이 났 을 때 예비 노드 서버 만 메 인 노드 서버 의 모든 서비스 와 가상 IP 를 연결 하고 서 비 스 를 계속 제공 할 수 있 습 니 다.이 모든 것 은 클 라 이언 트 에 게 투명 하 다.
2, Nginx + Keepalived 메 인 모드
이 모델 은 두 개의 가상 IP 주 소 를 사용 해 야 합 니 다. 전단 에 두 대의 Nginx 서버 가 스케줄 링 을 하고 두 대의 서버 가 서로 위주 로 준비 하 며 동시에 작업 을 해 야 합 니 다. 만약 에 한 대의 서버 가 고장 이 났 을 때 모든 요 구 를 다른 서버 에 전송 합 니 다. 이렇게 하 는 것 은 경제적 이지 않 고 두 대의 서버 가 동시에 서 비 스 를 제공 합 니 다.메 인 모드 에 비해 서버 한 대의 압력 을 분담 할 뿐만 아니 라 병발 량 도 높 였 다.
2. Keepalived + Nginx 가 어떻게 사용 가능 한 지 를 하나의 사례 로 설정 합 니 다.
환경 소개:
시스템 버 전: CentOS 6x86_64
Tengine 버 전: Tengine - 1.5.1
Keepalived 버 전: keepalived - 1.2.7 - 3. el6
1. Nginx 1 과 Nginx 2 서버 에 Tengine 설치
###### Nginx1
[root@nginx1 ~]# useradd -r nginx
[root@nginx1 ~]# tar xf tengine-1.5.1.tar.gz
[root@nginx1 ~]# cd tengine-1.5.1
###### Tengine
[root@nginx1 ~]# yum -y install pcre-devel openssl-devel libxml2-devel libxslt-devel gd-devel lua-devel GeoIP-devel gcc gcc-c++
[root@nginx1 ~]# ./configure \
--prefix=/usr/local/nginx \
--sbin-path=/usr/local/nginx/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--user=nginx \
--group=nginx \
--enable-mods-shared=all
[root@nginx1 tengine-1.5.1]# make && make install
###### Nginx2
[root@nginx2 ~]# scp 172.16.14.1:/root/tengine-1.5.1.tar.gz ./
[root@nginx2 tengine-1.5.1]# yum -y install pcre-devel openssl-devel libxml2-devel libxslt-devel gd-devel lua-devel GeoIP-devel gcc gcc-c++
[root@nginx2 tengine-1.5.1]# ./configure \
--prefix=/usr/local/nginx \
--sbin-path=/usr/local/nginx/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--user=nginx \
--group=nginx \
--enable-mods-shared=all
[root@nginx2 tengine-1.5.1]# make && make install
2. Nginx 1 과 Nginx 2 서버 에서 Tengine 을 위 한 Sysv 서비스 스 크 립 트 준비
######Nginx1
[root@nginx1 ~]# vim /etc/init.d/nginx
#!/bin/sh
# nginx - this script starts and stops the nginx daemon
# chkconfig: - 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# processname: nginx
# config: /etc/nginx/nginx.conf
# config: /etc/sysconfig/nginx
# pidfile: /var/run/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/etc/nginx/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
make_dirs() {
# make required directories
user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
options=`$nginx -V 2>&1 | grep 'configure arguments:'`
for opt in $options; do
if [ `echo $opt | grep '.*-temp-path'` ]; then
value=`echo $opt | cut -d "=" -f 2`
if [ ! -d "$value" ]; then
# echo "creating" $value
mkdir -p $value && chown -R $user $value
fi
fi
done
}
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
make_dirs
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
configtest || return $?
stop
sleep 1
start
}
reload() {
configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|
try-restart|reload|force-reload|configtest}"
exit 2
esac
###### Nginx
[root@nginx1 ~]# chmod +x /etc/init.d/nginx
[root@nginx1 ~]# chkconfig --add nginx
[root@nginx1 ~]# service nginx start
###### Nginx1 Nignx2
[root@nginx2 ~]# scp 172.16.14.1:/etc/init.d/nginx /etc/init.d/
[root@nginx2 ~]# chmod +x /etc/init.d/nginx
[root@nginx2 ~]# chkconfig --add nginx
[root@nginx2 ~]# service nginx start
3. 방문 테스트 Nginx 서비스 정상 여부
3.1, Nginx 1 서버 에서 테스트
[root@nginx1 ~]# netstat -anpt|grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 15088/nginx
3.2, Nginx 2 서버 에서 테스트
[root@nginx2 ~]# netstat -anpt|grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 7281/nginx
3. Httpd 1 과 Httpd 2 서버 에 Apache 설치
1. Httpd 1 서버 에 YUM 소스 를 설정 하고 YUM 으로 HTTPD 서 비 스 를 설치 합 니 다.
[root@httpd1 ~]# yum -y install httpd
[root@httpd1 ~]# chkconfig httpd on
[root@httpd1 ~]# service httpd start
###### Httpd1
[root@httpd1 ~]# echo '172.16.14.3 httpd1' > /var/www/html/index.html
2. Httpd 2 서버 에 YUM 소스 를 설정 하고 YUM 으로 HTTPD 서 비 스 를 설치 합 니 다.
[root@httpd2 ~]# yum -y install httpd
[root@httpd2 ~]# chkconfig httpd on
[root@httpd2 ~]# service httpd start
[root@httpd2 ~]# echo '172.16.14.4 httpd2' > /var/www/html/index.html
4. Tengine 설정
1. 메 인 프로필 을 백업 한 다음 에 메 인 프로필 을 수정 합 니 다.
[root@nginx1 ~]# cd /etc/nginx/
[root@nginx1 nginx]# cp nginx.conf nginx.conf.bak
[root@nginx1 nginx]# vim nginx.conf
user nginx nginx;
worker_processes 2;
worker_rlimit_nofile 51200;
#error_log logs/error.log;
#pid logs/nginx.pid;
events {
use epoll;
worker_connections 51200;
}
# load modules compiled as Dynamic Shared Object (DSO)
dso { #
load ngx_http_upstream_session_sticky_module.so; # session
}
http {
include mime.types;
default_type application/octet-stream;
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;
client_max_body_size 20m;
client_header_buffer_size 16k;
large_client_header_buffers 4 16k;
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
gzip on; #
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_proxied any;
gzip_http_version 1.1;
gzip_comp_level 3;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
proxy_temp_path /tmp/proxy_temp;
proxy_cache_path /tmp/proxy_cache levels=1:2 keys_zone=cache_one:500m inactive=1d max_size=3g;
proxy_connect_timeout 50;
proxy_read_timeout 600;
proxy_send_timeout 600;
proxy_buffer_size 128k;
proxy_buffers 16 256k;
proxy_busy_buffers_size 512k;
proxy_temp_file_write_size 1024m;
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404 http_502 http_504;
upstream allen {
server 172.16.14.3;
server 172.16.14.4;
check interval=3000 rise=2 fall=5 timeout=1000 type=http; # Server
check_http_send "GET / HTTP/1.0\r
\r
";
check_http_expect_alive http_2xx http_3xx;
session_sticky; #
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://allen;
}
location /status { #
check_status;
}
#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
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.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 {
# deny all;
#}
}
# HTTPS server
#
#server {
# listen 443;
# server_name localhost;
# ssl on;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_timeout 5m;
# ssl_protocols SSLv2 SSLv3 TLSv1;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
:Nginx
2. Tengine 서비스 액세스 테스트 부하 균형 재 개
[root@nginx1 ~]# service nginx restart
위의 그림 에서 보 듯 이 백 엔 드 에 성공 적 으로 접근 할 수 있 는 Httpd 서 비 스 는 다음 테스트 상태 모니터링 모듈 에 접근 합 니 다.
3. Nginx 2 서버 에 Tengine 메 인 프로필 설정
###### Nginx1 Nginx2
[root@nginx2 ~]# scp 172.16.14.1:/etc/nginx/nginx.conf /etc/nginx/
[root@nginx2 ~]# service nginx restart
: Tengine ; Nginx1 ,
5. Keepalived 설치 및 설정
1. Nginx 1 과 Nginx 2 서버 에 Keepalived 설치
###### Nginx1
[root@nginx1 ~]# yum -y install keepalived
###### Nginx2
[root@nginx2 ~]# yum -y install keepalived
2. Keepalived 더 블 메 인 모드 설정
2.1, Nginx 1 서버 의 Keepalived 메 인 프로필 정의 수정
[root@nginx1 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost # ,
}
notification_email_from [email protected] #
smtp_server 127.0.0.1 # smtp
smtp_connect_timeout 30 # smtp
router_id LVS_DEVEL # Keepalived , ;
}
vrrp_script chk_nginx { #
script "/etc/keepalived/chk_nginx.sh"#
interval 1 #
weight 2
}
vrrp_script chk_proess {
script "/etc/keepalived/chk_proess.sh"
interval 1
weight 2
}
vrrp_instance nginx_1 {
state MASTER # {MASTER|BACKUP}
interface eth0 #HA
virtual_router_id 56 # ID; ID
priority 100 # ,BACKUP MASTER
advert_int 1 #
garp_master_delay 1
authentication {
auth_type PASS #
auth_pass 1234 # ,
}
virtual_ipaddress { # IP ,
172.16.14.10
}
track_script { #
chk_nginx # vrrp_script
chk_proess
}
notify_master "/etc/keepalived/chk_nginx.sh master" # Master
notify_backup "/etc/keepalived/chk_nginx.sh backup" # Backup
notify_fault "/etc/keepalived/chk_nginx.sh fault" # Fault
}
vrrp_instance nginx_2 {
state BACKUP
interface eth0
virtual_router_id 58
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 4321
}
virtual_ipaddress {
172.16.14.11
}
track_script {
chk_nginx
}
}
2.2, Nginx 2 서버 의 Keepalived 메 인 프로필 정의 수정
[root@nginx2 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_nginx {
script "/etc/keepalived/chk_nginx.sh"
interval 1
weight 2
}
vrrp_script chk_nginx {
script "/etc/keepalived/chk_proess.sh"
interval 1
weight 2
}
vrrp_instance nginx_1 {
state BACKUP
interface eth0
virtual_router_id 56
priority 98
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
172.16.14.10
}
track_script {
chk_nginx
}
}
vrrp_instance nginx_2 {
state MASTER
interface eth0
virtual_router_id 58
priority 92
advert_int 1
authentication {
auth_type PASS
auth_pass 4321
}
virtual_ipaddress {
172.16.14.11
}
track_script {
chk_nginx
chk_proess
}
notify_master "/etc/keepalived/chk_nginx.sh master"
notify_backup "/etc/keepalived/chk_nginx.sh backup"
notify_fault "/etc/keepalived/chk_nginx.sh fault"
}
3. Nginx 1 과 Nginx 2 서버 에서 각각 Keepalived 에 상태 감지 스 크 립 트 와 알림 스 크 립 트 를 제공 합 니 다.
######
vim /etc/keepalived/chk_nginx.sh
#!/bin/bash
# Author: ALLEN
# description: An example of notify script
#
vip=172.16.14.10
contact='root@localhost'
notify() {
mailsubject="`hostname` to be $1: $vip floating"
mailbody="`date '+%F %H:%M:%S'`: vrrp transition, `hostname` changed to be $1"
echo $mailbody | mail -s "$mailsubject" $contact
}
case "$1" in
master)
notify master
/etc/init.d/keepalived start
exit 0
;;
backup)
notify backup
/etc/init.d/keepalived stop
exit 0
;;
fault)
notify fault
exit 0
;;
*)
echo 'Usage: `basename $0` {master|backup|fault}'
exit 1
;;
esac
######
vim /etc/keepalived/chk_proess.sh
#!/bin/bash
killall -0 nginx
if [[ $? -ne 0 ]];then
/etc/init.d/keepalived stop
fi
######
chkmod +x /etc/keepalived/chk_*
6. 테스트 Keepalived + Tengine 고가 용
1. Nginx 1 과 Nginx 2 서버 의 Keepalived 와 Tengine 서 비 스 를 각각 재 시작 합 니 다.
[root@nginx1 ~]# service keepalived restart;service nginx restart
[root@nginx2 ~]# service keepalived restart;service nginx restart
2. Nginx 1 과 Nginx 2 서버 의 IP 주 소 를 각각 봅 니 다.
###### Nginx1
[root@nginx1 ~]# ip addr show eth0
2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:2c:1a:24 brd ff:ff:ff:ff:ff:ff
inet 172.16.14.1/16 brd 172.16.255.255 scope global eth0
inet 172.16.14.10/32 scope global eth0
inet6 fe80::20c:29ff:fe2c:1a24/64 scope link
valid_lft forever preferred_lft forever
###### Nginx2
[root@nginx2 ~]# ip addr show eth0
2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:ec:f6:3f brd ff:ff:ff:ff:ff:ff
inet 172.16.14.2/16 brd 172.16.255.255 scope global eth0
inet 172.16.14.11/32 scope global eth0
inet6 fe80::20c:29ff:feec:f63f/64 scope link
valid_lft forever preferred_lft forever
: , IP
3. 방문 테스트 172.16.14.10
4. 아 날로 그 중 한 대의 전단 Nginx 서버 가 고장 이 나 서 정상적으로 서 비 스 를 제공 하지 못 합 니 다.
[root@nginx1 ~]# killall nginx
[root@nginx1 ~]# ip addr show eth0
2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:2c:1a:24 brd ff:ff:ff:ff:ff:ff
inet 172.16.14.1/16 brd 172.16.255.255 scope global eth0
inet6 fe80::20c:29ff:fe2c:1a24/64 scope link
valid_lft forever preferred_lft forever
###### , IP
========================================================================
###### Nginx2 IP
[root@nginx2 ~]# ip addr show eth0
2: eth0: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:ec:f6:3f brd ff:ff:ff:ff:ff:ff
inet 172.16.14.2/16 brd 172.16.255.255 scope global eth0
inet 172.16.14.11/32 scope global eth0
inet 172.16.14.10/32 scope global eth0
inet6 fe80::20c:29ff:feec:f63f/64 scope link
valid_lft forever preferred_lft forever
: , IP
5 、 Nginx 2 서버 에서 메 일 알림 보기
[root@nginx2 ~]# mail
Heirloom Mail version 12.4 7/29/08. Type ? for help.
"/var/spool/mail/root": 3 messages 2 unread
>U 1 root Wed Sep 25 16:54 19/712 "nginx2.allen.com to be master: 172.16.14.10 floating"
U 2 root Wed Sep 25 17:23 19/712 "nginx2.allen.com to be master: 172.16.14.10 floating"
3 root Wed Sep 25 18:06 19/713 "nginx2.allen.com to be master: 172.16.14.10 floating"
& 3
Message 3:
From [email protected] Wed Sep 25 18:06:27 2013
Return-Path:
X-Original-To: root@localhost
Delivered-To: [email protected]
Date: Wed, 25 Sep 2013 18:06:27 +0800
To: [email protected]
Subject: nginx2.allen.com to be master: 172.16.14.10 floating
User-Agent: Heirloom mailx 12.4 7/29/08
Content-Type: text/plain; charset=us-ascii
From: [email protected] (root)
Status: RO
2013-09-25 18:06:27: vrrp transition, nginx2.allen.com changed to be master
& quit #
: Nginx2 Master, Nginx1 Backup; Nginx1 ,
6. 재 방문 172.16.14.10 테스트
위의 그림 에서 볼 수 있 듯 이 여전히 정상적으로 방문 할 수 있다.Keepalived + Tengine 고가 용 가능
7. 여 기 는 다른 가상 IP (172.16.14.11) 를 테스트 하지 않 고 테스트 방법 은 (172.16.14.10) 과 같다.실제 환경 에서 DNS 서버 에서 두 개의 가상 IP 주 소 를 A 로 기록 하면 두 개의 전단 Nginx 스케줄 의 부하 균형 을 실현 할 수 있다.여기 서 두 개의 인 스 턴 스 를 설정 할 때 모두 eth 0 네트워크 카드 를 사용 하지만 실제 환경 에서 서로 다른 네트워크 카드 를 사용 하 는 것 이 좋 습 니 다.내용 이 많 기 때문에 다음은 Corosync + DRBD + Mysql 의 실현 을 쓰 지 않 습 니 다. 만약 에 여러분 이 관심 이 있 으 면 앞에서 쓴 블 로 그 를 보 세 요.
http://502245466.blog.51cto.com/7559397/1299082
다음으로 전송:https://blog.51cto.com/502245466/1301772
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.