Linux高可用集群 Corosync(共6篇)由网友“catheley”投稿提供,今天小编在这给大家整理过的Linux高可用集群 Corosync,我们一起来阅读吧!
篇1:Linux高可用集群 Corosync
Coreosync在传递信息的时候可以通过一个简单的配置文件来定义信息传递的方式和协议等,它是一个新兴的软件,推出,但其实它并不是一个真正意义上的新软件,在的时候有一个项目Openais , 它由于过大,分裂为两个子项目,其中可以实现HA心跳信息传输的功能就是Corosync ,它的代码60%左右来源于Openais. Corosync可以提供一个完整的HA功能,但是要实现更多,更复杂的功能,那就需要使用Openais了。Corosync是未来的发展方向,
在以后的新项目里,一般采用Corosync,而hb_gui可以提供很好的HA管理功能,可以实现图形化的管理。另外相关的图形化有RHCS的套件 luci+ricci.
介绍内容摘自 blog.csdn.net/deansrk/article/details/6780639
项目主页:www.open-open.com/lib/view/home/1338942164312
篇2:Nginx + varnish 构建高可用CDN节点集群
一、 环境描述
Linux server A (CentOS release 5.8 Final) 实IP:192.168.4.97 虚IP:192.168.4.96
Linux server B (CentOS release 5.8 Final) 实IP:192.168.4.99 虚IP:192.168.4.98
域名环境(DNS轮询解析到虚IP):
server.osapub.com 192.168.4.96
server.osapub.com 192.168.4.98
二、 简单架构示意图
描述:前端两台NGINX做DNS轮询,通过虚IP漂移+HA监控脚本相结合,实现前端两台NGINX高可用,利用NGINX反向代理功能对后端varnish实现高可用集群,
三、软件环境搭建
3.1 编译安装nginx
?#!/bin/bash####nginx 环境安装脚本,注意环境不同可能导致脚本运行出错,如果环境不同建议手工一条一条执行指令。#创建工作目录mkdir -p /dist/{dist,src}cd /dist/dist#下载安装包wget bbs.osapub.com/down/google-perftools-1.8.3.tar.gz &> /dev/nullwget bbs.osapub.com/down/libunwind-0.99.tar.gz &> /dev/nullwget bbs.osapub.com/down/pcre-8.01.tar.gz &> /dev/nullwget bbs.osapub.com/down/nginx-1.0.5.tar.gz &> /dev/null#------------------------------------------------------------------------# 使用Google的开源TCMalloc库,忧化性能cd /dist/srctar zxf ../dist/libunwind-0.99.tar.gzcd libunwind-0.99/## 注意这里不能加其它 CFLAGS加速编译参数CFLAGS=-fPIC ./configuremake cleanmake CFLAGS=-fPICmake CFLAGS=-fPIC installif [ “$?” == “0” ]; then echo “libunwind-0.99安装成功.” >> ./install_log.txtelse echo “libunwind-0.99安装失败.” >> ./install_log.txt exit 1fi##----------------------------------------------------------## 使用Google的开源TCMalloc库,提高MySQL在高并发情况下的性能cd /dist/srctar zxf ../dist/google-perftools-1.8.3.tar.gzcd google-perftools-1.8.3/CHOST=“x86_64-pc-linux-gnu” CFLAGS=“-march=nocona -O2 -pipe” CXXFLAGS=“-march=nocona -O2 -pipe” ./configuremake cleanmake && make installif [ “$?” == “0” ]; then echo “google-perftools-1.8.3安装成功.” >> ./install_log.txtelse echo “google-perftools-1.8.3安装失败.” >> ./install_log.txt exit 1fiecho “/usr/local/lib” > /etc/ld.so.conf.d/usr_local_lib.conf/sbin/ldconfig################ 安装nginx ###########################安装Nginx所需的pcre库cd /dist/srctar zxvf ../dist/pcre-8.01.tar.gzcd pcre-8.01/CHOST=“x86_64-pc-linux-gnu” CFLAGS=“-march=nocona -O2 -pipe” CXXFLAGS=“-march=nocona -O2 -pipe” ./configuremake && make installif [ “$?” == “0” ]; then echo “pcre-8.01安装成功.” >> ./install_log.txtelse echo “pcre-8.01安装失败.” >> ./install_log.txt exit 1ficd ../## 安装Nginx## 为优化性能,可以安装 google 的 tcmalloc ,之前己经安装过了## 所以我们编译 Nginx 时,加上参数 --with-google_perftools_module## 然后在启动nginx前需要设置环境变量 export LD_PRELOAD=/usr/local/lib/libtcmalloc.so## 加上 -O2 参数也能优化一些性能#### 默认的Nginx编译选项里居然是用 debug模式的(-g参数),在 auto/cc/gcc 文件最底下,去掉那个 -g 参数## 就是将 CFLAGS=“$CFLAGS -g” 修改为 CFLAGS=“$CFLAGS” 或者直接删除这一行cd /dist/srcrm -rf nginx-1.0.5tar zxf ../dist/nginx-1.0.5.tar.gzcd nginx-1.0.5/sed -i 's#CFLAGS=“$CFLAGS -g”#CFLAGS=“$CFLAGS ”#' auto/cc/gccmake cleanCHOST=“x86_64-pc-linux-gnu” CFLAGS=“-march=nocona -O2 -pipe” CXXFLAGS=“-march=nocona -O2 -pipe” ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-google_perftools_modulemake && make installif [ “$?” == “0” ]; then echo “nginx-1.0.5安装成功.” >> ./install_log.txtelse echo “nginx-1.0.5安装失败.” >> ./install_log.txt exit 1ficd ../#创建Nginx日志目录mkdir -p /data/logschmod +w /data/logschown -R www:www /data/logscd /usr/local/nginx/mv conf conf_bakln -s /data/conf/nginx/ confecho 'export LD_PRELOAD=/usr/local/lib/libtcmalloc.so' > /root/nginx_startecho 'ulimit -SHn 51200' >> /root/nginx_startecho '/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf' >> /root/nginx_startecho '/usr/local/nginx/sbin/nginx -t' > /root/nginx_reloadecho 'kill -HUP `cat /usr/local/nginx/logs/nginx.pid`' >> /root/nginx_reloadchmod 700 /root/nginx_*
3.2 编译安装varnish
#!/bin/bash#进入工作目录cd /dist/dist#下载安装包wget bbs.osapub.com/down/varnish-3.0.0.tar.gz &> /dev/nullcd /dist/srcrm -fr varnish-3.0.0export PKG_CONFIG_PATH=/usr/local/lib/pkgconfigtar zxvf ../dist/varnish-3.0.0.tar.gzcd varnish-3.0.0#编译参数可以根据自己需要定制./configure -prefix=/usr/local/varnish -enable-debugging-symbols -enable-developer-warnings -enable-dependency-trackingmake && make installif [ “$?” == “0” ]; then echo “varnish-3.0.0安装成功.” >> ./install_log.txtelse echo “varnish-3.0.0安装失败.” >> ./install_log.txt exit 1fi#设置启动、重启脚本cat > /root/varnish_restart.sh < 三、 配置varnish一些参数说明: Backend servers Varnish有后端(或称为源)服务器的概念。后端服务器是指Varnish提供加速服务的那台,通常提供内容。 第一件要做的事情是告诉Varnish,哪里能找到要加速的内容。 vcl_recv vcl_recv是在请求开始时调用的。完成该子程序后,请求就被接收并解析了。用于确定是否需要服务请求,怎么服务,如果可用,使用哪个后端。 在vcl_recv中,你也可以修改请求。通常你可以修改cookie,或添加/移除请求头信息。 注意在vcl_recv中,只可以使用请求对象req。 vcl_fetch vcl_fetch是在文档从后端被成功接收后调用的。通常用于调整响应头信息,触发ESI处理,万一请求失败就换个后端服务器。 在vcl_fecth中,你还可以使用请求对象req。还有个后端响应对象beresp。Beresp包含了后端的HTTP头信息。 varnish 3.X 配置参考文档:anykoro.sinaapp.com/?p=261 编辑:/usr/local/varnish/vcl.conf ,文件不存在则创建。注意:Server A 与server B 配置一致! 配置详情如下: ?###########后台代理服务器########backend server_osapub_com{ .host = “192.168.4.97”; .port = “82”;}acl purge { “localhost”; “127.0.0.1”;}#############################################sub vcl_recv { #################BAN##########################begin if (req.request == “BAN”) { # Same ACL check as above: if (!client.ip ~ purge) { error 405 “Not allowed.”; } ban(“req.http.host == ” + req.http.host + “&& req.url == ” + req.url); error 200 “Ban added”; } #################BAN##########################end ###############配置域名################################## if(req.http.host ~ “^server.osapub.com” ||req.http.host ~ “.osapub.com” ) { #使用哪一组后台服务器 set req.backend = server_osapub_com; } ################################################## if (req.restarts == 0) { if (req.http.x-forwarded-for) { set req.http.X-Forwarded-For = req.http.X-Forwarded-For + “, ” + client.ip; } else { set req.http.X-Forwarded-For = client.ip; } } if (req.http.Accept-Encoding) { if (req.url ~ “.(jpg|jpeg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf)$”) { remove req.http.Accept-Encoding; } elsif (req.http.Accept-Encoding ~ “gzip”) { set req.http.Accept-Encoding = “gzip”;} elsif (req.http.Accept-Encoding ~ “deflate”) { set req.http.Accept-Encoding = “deflate”;} else { remove req.http.Accept-Encoding; } } if (req.http.Cache-Control ~ “no-cache”) { return (pass); } if (req.request != “GET” && req.request != “HEAD” && req.request != “PUT” && req.request != “POST” && req.request != “TRACE” && req.request != “OPTIONS” && req.request != “DELETE”) { return (pipe); } if (req.request != “GET” && req.request != “HEAD”) { return(pass); } if (req.http.Authorization || req.http.Cookie ||req.http.Authenticate) { return (pass); } if (req.request == “GET” && req.url ~ “(?i).php($|?)”){ return (pass); } if (req.url ~ “.(css|jpg|jpeg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf)$”) { unset req.http.Cookie; } return (lookup);}sub vcl_fetch { set beresp.grace = 5m; if (beresp.status == 404 || beresp.status == 503 || beresp.status == 500 || beresp.status == 502) { set beresp.http.X-Cacheable = “NO: beresp.status”; set beresp.http.X-Cacheable-status = beresp.status; return (hit_for_pass); } #决定哪些头不缓存 if (req.url ~ “.(php|shtml|asp|aspx|jsp|js|ashx)$”) { return (hit_for_pass); } if (req.url ~ “.(jpg|jpeg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf)$”) { unset beresp.http.set-cookie; } if (beresp.ttl <= 0s) { set beresp.http.X-Cacheable = “NO: !beresp.cacheable”; return (hit_for_pass); } else { unset beresp.http.expires; } return (deliver);}sub vcl_deliver {if (resp.http.magicmarker) { unset resp.http.magicmarker; set resp.http.age = “0”; }# add cache hit dataif (obj.hits > 0) { set resp.http.X-Cache = “HIT”; set resp.http.X-Cache-Hits = obj.hits;}else { set resp.http.X-Cache = “MISS”;}# hidden some sensitive http header returning to client, when the cache server received from backend server responseremove resp.http.X-Varnish;remove resp.http.Via;remove resp.http.Age;remove resp.http.X-Powered-By;remove resp.http.X-Drupal-Cache;return (deliver);}sub vcl_error { if (obj.status == 503 && req.restarts < 5) { set obj.http.X-Restarts = req.restarts; return (restart); }}sub vcl_hit {if (req.http.Cache-Control ~ “no-cache”) { if (! (req.http.Via || req.http.User-Agent ~ “bot|MSIE”)) { set obj.ttl = 0s; return (restart); }} return(deliver);} 配置完成后执行:/root/varnish_start.sh 如果启动成功则表示配置无误! 四、 配置nginx编辑: /usr/local/nginx/conf/nginx.conf ,nginx 的配置方法请参考网上文档资料。 Server A(192.168.4.97) nginx配置如下: ?user www www;worker_processes 16;error_log /logs/nginx/nginx_error.log crit;#Specifies the value for maximum file descriptors that can be opened by this process.worker_rlimit_nofile 65500;events{ use epoll; worker_connections 65500;}http{ include mime.types; default_type application/octet-stream; server_names_hash_bucket_size 128; client_header_buffer_size 64k; large_client_header_buffers 4 64k; client_max_body_size 10m; server_tokens off; expires 1h; sendfile on; tcp_nopush on; keepalive_timeout 60; tcp_nodelay on; fastcgi_connect_timeout 200; fastcgi_send_timeout 300; fastcgi_read_timeout 600; fastcgi_buffer_size 128k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; fastcgi_temp_path /dev/shm; gzip on; gzip_min_length 2048; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_types text/plain text/css application/xml application/x-javascript ; log_format access '$remote_addr - $remote_user [$time_local] “$request” ' '$status $body_bytes_sent “$http_referer” ' '“$http_user_agent” $http_x_forwarded_for';################# include ################### upstream varnish_server { server 127.0.0.1:81 weight=2 max_fails=3 fail_timeout=30s; server 192.168.4.99:81 weight=2 max_fails=3 fail_timeout=30s; ip_hash; } server { listen 80; server_name 192.168.4.96 192.168.4.98; index index.html index.htm index.php index.aspx; location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 200; proxy_send_timeout 300; proxy_read_timeout 500; proxy_buffer_size 256k; proxy_buffers 4 128k; proxy_busy_buffers_size 256k; proxy_temp_file_write_size 256k; proxy_temp_path /dev/shm; proxy_pass varnish_server; expires off; access_log /logs/nginx/192.168.4.96.log access; } } server { listen 82; server_name 192.168.4.97; index index.html index.htm index.php; root /data/web/awstats/www; location ~ .*.php$ { include fcgi.conf; fastcgi_pass 127.0.0.1:10080; fastcgi_index index.php; expires off; } access_log /logs/nginx/awstats.osapub.com.log access; } } server B (192.168.4.99)配置如下: ?user www www;worker_processes 16;error_log /logs/nginx/nginx_error.log crit;#Specifies the value for maximum file descriptors that can be opened by this process.worker_rlimit_nofile 65500;events{ use epoll; worker_connections 65500;}http{ include mime.types; default_type application/octet-stream; server_names_hash_bucket_size 128; client_header_buffer_size 64k; large_client_header_buffers 4 64k; client_max_body_size 10m; server_tokens off; expires 1h; sendfile on; tcp_nopush on; keepalive_timeout 60; tcp_nodelay on; fastcgi_connect_timeout 200; fastcgi_send_timeout 300; fastcgi_read_timeout 600; fastcgi_buffer_size 128k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; fastcgi_temp_path /dev/shm; gzip on; gzip_min_length 2048; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_types text/plain text/css application/xml application/x-javascript ; log_format access '$remote_addr - $remote_user [$time_local] “$request” ' '$status $body_bytes_sent “$http_referer” ' '“$http_user_agent” $http_x_forwarded_for';################# include ################### upstream varnish_server { server 127.0.0.1:81 weight=2 max_fails=3 fail_timeout=30s; server 192.168.4.97:81 weight=2 max_fails=3 fail_timeout=30s; ip_hash; } server { listen 80; server_name 192.168.4.96 192.168.4.98; index index.html index.htm index.php index.aspx; location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 200; proxy_send_timeout 300; proxy_read_timeout 500; proxy_buffer_size 256k; proxy_buffers 4 128k; proxy_busy_buffers_size 256k; proxy_temp_file_write_size 256k; proxy_temp_path /dev/shm; proxy_pass varnish_server; expires off; access_log /logs/nginx/192.168.4.98.log access; } } server { listen 82; server_name 192.168.4.99; index index.html index.htm index.php; root /data/web/awstats/www; location ~ .*.php$ { include fcgi.conf; fastcgi_pass 127.0.0.1:10080; fastcgi_index index.php; expires off; } access_log /logs/nginx/awstats.osapub.com.log access; } } 启动nginx: /root/nginx_start 启动正常会监听80,82端口! 五、 运行nginx ha脚本 server A 的脚本下载地址:bbs.osapub.com/down/server_a_ha.tar.gz 解压力后得到三个脚本: nginx_watchdog.sh nginxha.sh nginx_ha1.sh server B 的脚本下载地址:bbs.osapub.com/down/server_b_ha.tar.gz 解压力后得到三个脚本: nginx_watchdog.sh nginxha.sh nginx_ha2.sh 注意:脚本建议放到:/data/sh/ha 目录下,否则需要修改nginxha.sh 里面的程序路径! 六、 测试1,测试之前先把nginx 负载去掉,可以在前面加#号暂时注释,只保留本机解析,确保测试结果准确, 2,修改本机host文件 添加:192.168.4.99 server.osapub.com 到末尾,保存后访问。 3,正常结果显示如下: 到这里整个架构基本能运行起来了,根据大家的实际需求,对配置文件进行调优,HA脚本也可以进一步调优,关于报警,请参考社区自动安装mutt报警的脚本! 来自:my.oschina.net/imot/blog/289208 如果将web服务器集群当作一个城池,那么负载均衡服务器则相当于城门,重要性不言而喻, Nginx双机高可用 (1):一台服务器加一台热被备务器,正常情况下,主服务器绑定一个公网虚拟IP,提供负载均衡服务,热备服务器处于空闲状态,当主服务器发生故障时,热备服务器接管主服务器的公网虚拟IP,提供负载均衡服务; (2):两台负载均衡服务器都处于活动状态,各自绑定一个公网虚拟IP,提供负载均衡服务,当其中一台发生故障时,另一台接管发生故障服务器的公网虚拟IP。 第一种方式: (1)www.yourdomin.com域名解析到虚拟IP 61.1.1.2 (2)正常情况下,主机61.1.1.4绑定虚拟IP 61.1.1.2 /sbin/ifconfig eth0:1 61.1.1.2 broadcast 61.1.1.255 netmask 255.255.255.0 up/sbin/route add -host 61.1.1.2 dev eth0:1/sbin/arping -I eth0 -c 61.1.1.2 61.1.1.1 (3):用户访问:www.yourdomin.com(虚拟IP: 61.1.1.2)实际访问的是主机61.1.1.4,而备用机 61.1.1.5 则处于空闲状态。 (4):如果主机61.1.1.4发生故障,背机61.1.1.5将在几秒钟内接管虚拟IP61.1.1.2,与自己绑定,并发送APping的公网网关刷新MAC地址。 /sbin/ifconfig etho:1 61.1.1.2 broadcast 61.1.1.255 netmask 255.255.255.0 up/sbin/ifconfig add -host 61.1.1.2 dev eth0:1/sbin/arping -I etho -c 3 -s 61.1.1.2 61.1.1.1 (5):这时,用户访问www.yourdomin.com(虚拟IP)实际上访问的是备机 61.1.1.1,从而实现故障转移与高可用,避免了单点故障。 另外,第一种方式可以利用基于VRRP路由协议的Keeoalive软件实现的。 第二种方式: (1):www.yourdomin.com 域名通过DNS轮询解析到虚拟IP 61.1.1.2和61.1.1.3上。 (2)正常情况下,服务器个绑定一个虚拟IP。 在服务器161.1.1.4上执行以下命令 /sbin/ifconfig etho:1 61.1.1.2 broadcast 61.1.1.255 netmask 255.255.255.0 up /sbin/ifconfig add -host 61.1.1.2 dev eth0:1 /sbin/arping -I etho -c 3 -s 61.1.1.2 61.1.1.1 在服务器161.1.1.5上执行以下命令 /sbin/ifconfig etho:1 61.1.1.3 broadcast 61.1.1.255 netmask 255.255.255.0 up /sbin/ifconfig add -host 61.1.1.2 dev eth0:1 /sbin/arping -I etho -c 3 -s 61.1.1.3 61.1.1.1 (3):用户访问www,yourdomin.com (虚拟IP 61.1.1.2和61.1.1.3)实际上是根据DNS轮询访问两台负载均衡服务器,两台服务器均处于活跃状态。 (4):如果服务器1发生故障,服务器2将在几秒钟内接管服务器1的虚拟IP 61.1.1.2,与自己已绑定,并发送ARPing包给IDC的公关网关刷新新的MAC地址。 在服务器2上执行以下命令: /sbin/ifconfig etho:1 61.1.1.2 broadcast 61.1.1.255 netmask 255.255.255.0 up /sbin/ifconfig add -host 61.1.1.2 dev eth0:1 /sbin/arping -I etho -c 3 -s 61.1.1.2 61.1.1.1 我们可以写两个脚本,来实现第二种方式的自动故障转移。 以下是部署在Nginx负载均衡服务器1的脚本: #!/bin/shLANG=Cdate=$(date -d “today” +“%Y-%m-%d %H:%M:%S”)function_bind_vip1{ /sbin/ifconfig etho:ha1 61.1.1.2 broadcast 219.232.254.255 netmask 255.255.255.192 up /sbin/route add -host 61.1.1.2 dev eth0:hal}function_bind_vip2(){ /sbin/ifconfig etho:ha2 61.1.1.3 broadcast 219.232.254.255 netmask 255.255.255.192 up /sbin/route add -host 61.1.1.2 dev eth0:ha2}function_restart_nginx(){ kill -USR1 'cat /usr/local/webserver/nginx/nginx.pid'}function_remove_vip1(){ /sbin/ifconfig etho:ha1 61.1.1.2 broadcast 219.232.254.255 netamsk 255.255.255.192 down}function_remove_vip2(){ /sbin/ifconfig etho:ha2 61.1.1.3 broadcast 219.232.254.255 netamsk 255.255.255.192 down}function_vip_arping1(){ /sbin/ifconfig -I eth0 -c 3 -e 611..1.1.2 61.1.1.1 > /dev/null 2>&1}function_vip_arping2(){ /sbin/ifconfig -I eth0 -c 3 -e 611..1.1.3 61.1.1.1 > /dev/null 2>&1}bind_time_vip1=“N”;bind_time_vip2=“N”;while truedo httpcode_arp1='/usr/bin/cur1 -o /dev/null s -w %{http_code} 61.1.1.4' httpcode_arp2='/usr/bin/cur1 -o /dev/null s -w %{http_code} 61.1.1.5' if [x$httpcode_rip1 == “x200”]; then function_bind_vip1 function_vip_arping1 function_restart_nginx bind_time_vip1=“Y” fi function_vip_arping1 else if [$bind_time_vip1 == “Y”]; thenfunction_remote_vip1bind_time_vip=“N” fi fi if [x$httpcode_arp2 == “x200”]; then if[ $bind_time_vip2 == “Y”] thenfunction_rempve_vip2bind_time_vip2=“N” fi else if[$bind_time_vip2 == “N”]; then function_bind_vip2 function_vip_arping2 function_restart_nginx bind_time_vip2=“Y” fi function_vip_arping2fisleep 5done 在Nginx服务器1将脚本驻留后台运行: nohup /bin/sh ./nginx_hal.sh 2>&1 > dev/null & 以下代码部署在服务器2: #!/bin/shLANG=Cdate=$(date -d “today” +“%Y-%m-%d %H:%M:%S”)function_bind_vip1(){ /sbin/ifconfig etho:ha1 61.1.1.3 broadcast 219.232.254.255 netmask 255.255.255.192 up /sbin/route add -host 61.1.1.3 dev eth0:hal}function_bind_vip2(){ /sbin/ifconfig etho:ha2 61.1.1.2 broadcast 219.232.254.255 netmask 255.255.255.192 up /sbin/route add -host 61.1.1.2 dev eth0:ha2}function_restart_nginx(){ kill -USR1 'cat /usr/local/webserver/nginx/nginx.pid'}function_remove_vip1(){ /sbin/ifconfig etho:ha1 61.1.1.3 broadcast 219.232.254.255 netamsk 255.255.255.192 down}function_remove_vip2(){ /sbin/ifconfig etho:ha2 61.1.1.2 broadcast 219.232.254.255 netamsk 255.255.255.192 down}function_vip_arping1(){ /sbin/ifconfig -I eth0 -c 3 -e 61.1.1.3 61.1.1.1 > /dev/null 2>&1}function_vip_arping2(){ /sbin/ifconfig -I eth0 -c 3 -e 61.1.1.2 61.1.1.1 > /dev/null 2>&1}bind_time_vip1=“N”;bind_time_vip2=“N”;while truedo httpcode_arp1='/usr/bin/cur1 -o /dev/null s -w %{http_code} 61.1.1.5' httpcode_arp2='/usr/bin/cur1 -o /dev/null s -w %{http_code} 61.1.1.4' if [x$httpcode_rip1 == “x200”]; then function_bind_vip1 function_vip_arping1 function_restart_nginx bind_time_vip1=“Y” fi function_vip_arping1 else if [$bind_time_vip1 == “Y”]; thenfunction_remote_vip1bind_time_vip=“N” fi fi if [x$httpcode_arp2 == “x200”]; then if[ $bind_time_vip2 == “Y”] thenfunction_rempve_vip2bind_time_vip2=“N” fi else if [$bind_time_vip2 == “N”]; then function_bind_vip2 function_vip_arping2 function_restart_nginx bind_time_vip2=“Y” fi function_vip_arping2fisleep 5done 在Nginx服务器2将脚本驻留后台运行: nohup /bin/sh ./nginx_ha2.sh 2>&1 > dev/null & 计算机系统的可靠性用平均无故障时间(MTTF)来度量,即计算机系统平均能够正常运行多长时间,才发生一次故障,系统的可靠性越高,平均无故障时间越长。可维护性用平均维修时间(MTTR)来度量,即系统发生故障后维修和重新恢复正常运行平均花费的时间。系统的可维护性越好,平均维修时间越短。计算机系统的可用性定义为:MTTF/(MTTF+MTTR) * 100%。由此可见,计算机系统的可用性定义为系统保持正常运行时间的百分比。 计算机产业界通常用如下表所示的“9”的个数来划分计算机系统可用性的类型。 可用性分类 可用水平 每年停机时间 容错可用性 99.9999 < 1 min 极高可用性 99.999 5 min 具有故障自动恢复能力的可用性 99.99 53 min 高可用性 99.9 8.8 h 商品可用性 99 43.8h 通过硬件冗余或软件的方法都可以从很大程度上提高系统的可用性。硬件冗余主要是通过在系统中维护多个冗余部件如硬盘、网线等来保证工作部件失效时可以继续使用冗余部件来提供服务;而软件的方法是通过软件对集群中的多台机器的运行状态进行监测,在某台机器失效时启动备用机器接管失效机器的工作来继续提供服务。 一般来说,需要保证集群管理器的高可用性和节点的高可用性, Eddie、Linux Virtual Server、Turbolinux、Piranha和Ultramonkey 都采用了类似于图1的高可用性解决方案。 集群管理器的高可用性 为了屏蔽集群管理器的失效,需要为它建立一个备份机。主管理器和备份管理器上都运行着heartbeat程序,通过传送诸如“我活着”这样的信息来监测对方的运行状况。当备份机不能在一定的时间内收到这样的信息时,它就激活fake程序,让备份管理器接管主管理器继续提供服务;当备份管理器又从主管理器收到“我活着”这样的信息时,它就使fake程序无效,从而释放IP地址,这样主管理器就开始再次进行集群管理的工作了。 节点的高可用性 节点的高可用性可以通过不断监视节点的状态以及节点上的应用程序的运行状态来实现,当发现节点已经失效时,可以重新配置系统并且将工作负载交给那些运行正常的节点来完成。如图1所示,系统通过在集群管理器上运行mon精灵程序来监视集群中的实际服务器上的服务程序的运行状况。例如使用 fping.monitor 以一定的时间间隔来监视实际服务器是否还在正常运转;使用http.monitor 来监测http服务,使用ftp.monitor来监测ftp服务等等。如果发现某个实际服务器出了故障,或者是其上的服务已失败,则在集群管理器中删除有关这个实际服务器的所有规则。反之,如果不久以后发现系统已经重新能够提供服务,则增加相应的所有规则。通过这种方法,集群管理器可以自动屏蔽服务器和其上运行的服务程序的失效,并且当实际服务器正常运转时能将它们重新加入到集群系统中。 如今的企业收集并储存了海量数据,学会充分利用这些数据不但可让企业稳固持续地发展,也能协助他们取得竞争优势,而基于准确信息的BI与分析是实现这一目标的重点。 新技术的发展 BI一直在不断演化发展。时至今日,企业已拥有了专业的工具和知识来根据实情做出决策。自然,决策需要有准确与一致的数据支持,这也正是BI战略的基本要素之一。 随着BI需求的增长,在IT行业中衍生了一系列的重要技术,不断将一切不可能变成可能。从初期的单一报表,到多维度分析,再到虚拟化与多层部署,不过直到现在,许多企业仍无法很好地把握BI所带来的优势。 实际上,任何企业在经营中都会涉及到部分的BI,它可以是简单的经营报表,也可以是复杂的电子表格应用。其中,最令人头疼的问题就是数据质量。信息的一致与准确是BI战略的关键,但当企业过于依赖某范围内的数据源时,他们就会面临数据不一致的风险。 数据不一致 在日常生活中,数据不一致的例子随处可见,比如收到写错姓名或地址的信函,这些错误会对通信产生负面的影响。 在企业中,这一问题更会被放大,因此它所带来的影响也被成倍放大。在一个商业环境下,数据不一致最终将导致决策失误。比如在CRM系统中或许会因为输入错误而导致同一地址下出现多家名字相似的供应商,造成不必要的麻烦。确保数据在两种或多种应用间转移的过程中的一致性与准确性,是企业必须要面对的严峻问题。 如今全球化市场所带来的竞争越来越激烈,企业对效率的要求也越来越高。竞争优势的重要意义提升到了一个新的高度。企业必须充分了解自己及对手的优势与弱势,这样才能成为未来的赢家。 成熟的市场 BI不只是一套软件与工具,同时也是建立在灵活性、响应速度和远见基础上的一套商业运作的方法, 随着越来越多的企业采用BI并从中获益,BI市场也在逐步壮大。所谓水涨船高,企业对自己所使用的软件工具力求精益求精。更多新客户的开发,更多新产品的面世,都将这种变革推向一个新的高度。 如今,企业绩效管理(CPM)大行其道。CPM这一名词最早是由分析机构Gartner于所提出。Gartner将其定义为“测量并管理公司绩效的所有流程、方法、度量与系统。”并由此衍生了许多新名词,比如商业绩效管理、运营绩效管理等。 实际上,CPM是传统BI的一种延伸与发展。所有的企业都在以某种形式的CPM运作着,它包括预算、计划、预测、盈利模式和优化、记分卡与分析、财务报告与财务整合在内的一系列职能。 每家企业都设定了自己的目标与测量方法,而CPM能对它们进行有效监控,并制定相应的计划来改善整体绩效。其实,CPM是一种循环的流程: 测量企业绩效 监控企业绩效 管理企业改善 BI能让企业访问大量的信息,分析了解日常经营状况。财务计划能让企业使用从BI中获取的深度信息来有效计划并制定预算。而CPM则能让企业通过单个、集成的平台来掌控所有的商业效率工具。 效率与盈利改善 为了保持竞争力或改善绩效,企业必须充分了解自己、客户,以及竞争对手。随着数据量的几何级增长,企业必须找到掌控数据的方法,并将它们转化为可用的信息。要做到以信息为中心,而又不仅仅是一座数据中心。只有基于准确一致的信息,决策才是有价值的,才能帮助企业设立确切的目标。准确、一致、可用、深入,这些都是企业成功部署信息资产的关键。 运行Sendmail的服务器群集能够在有竞争力的价格上提供高性能和高可用性,对于经验丰富的系统管理员,这一贯是常用的做法。本文描述了我们的研究,量化和描述实现高可用/可伸缩Sendmail 的方法。 我们研究了Linux上Sendmail群集的几种配置,并对它们的相对性能进行了量化。我们通过调整 Sendmail 的配置以及 Linux 操作系统中的参数,研究并测试了公共性能。我们还没有一个共享磁盘用于这些测试,因此我们将项目的范围限定在只包括 SMTP 路由和排队。这是位于专用网的边缘或作为内部邮件存储的前端的Sendmail群集的常用配置。 虽然我们的硬件资源很普通,但我们相信这些相对差异会使我们的结果对于那些要实现基于Linux的 Sendmail服务器群集的系统架构设计师是非常重要的,因为我们的结果说明了Sendmail群集的设计特性的相对重要性。 汇总结果 Sendmail、LDAP 和 DNS 有许多配置选项,但我们只考虑那些对于该应用程序很重要的选项, 除非另有声明,否则我们使用标准软件和缺省设置。在这些选项中,我们发现有少数因素可以对性能产生巨大影响,或者是实现可伸缩性必不可少的,如 LogLevel 和 QueueDirectory。 最后,我们发现即使正确配置了 Sendmail,所有这些重要因素也会告诉我们两个事实: Sendmail 是磁盘密集型的,磁盘速度越快,Sendmail 的速度就越快。 不受控因素也许会影响我们所感知到的性能。如,远程 DNS 服务器发生故障,路由失常、队列填满和其它第三方问题。 我们发现了什么 集群的服务器:通过集群两个服务器并在前端添加负载均衡器,我们发现了最佳消息吞吐量 — 大约每秒 100 条消息。这是最佳单服务器结果的性能的两倍,单服务器的最佳性能大约是每秒 50 条消息。当添加第三个服务器时,几乎看不到性能有所改进。 ★ 学习心得如何总结 ★ 企业年终总结 ★ 企业年度总结范文 【Linux高可用集群 Corosync(共6篇)】相关文章: Windows Vista下安装SQL Server2022-04-30 市场报告2022-06-20 高级运维工程师的工作职责描述2024-02-12 计算机四级《网络工程师》巩固练习题2022-05-08 网络云计算技术研究现状综述论文2023-01-13 简历详述范文2022-10-13 如何保护Linux 网络安全2022-10-13 强工业 演讲稿范文2023-03-02 linux高级技巧:集群之keepalived2022-05-06 广播电视供电系统配置及运维分析论文2023-06-15篇3:Nginx双机高可用
nginx负载均衡服务器的双机高可用
篇4:集群管理器的高可用性
篇5:结合BI与CPM 精炼高可用数据
篇6:Linux下高可用/可伸缩Sendmail研究服务器教程