当前位置: 首页 > 编程日记 > 正文

FastDFS之Linux下搭建

1.软件环境

CentOS6.5

FastDFS v5.05

libfastcommon- - master.zip(是从 FastDFS 和 FastDHT 中提取出来的公共 C 函数库)

fastdfs- - nginx- - module_v1.16.tar.gz

nginx- - 1.6.2.tar.gz

fastdfs_client_java._v1.25.tar.gz

2.FastDFS集群规划

描述

IP地址

虚拟机名称

用户名

分组

跟踪服务器1

192.168.1.170

tracker01_170

tracker01

跟踪服务器2

192.168.1.180

tracker02_180

tracker02

存储服务器1

192.168.1.171

storage01_g1_171

storage01

group1

存储服务器2

192.168.1.172

storage02_g1_172

storage02

group1

存储服务器3

192.168.1.173

storage03_g2_173

storage03

group2

存储服务器4

192.168.1.174

storage04_g2_174

storage04

group2

存储服务器5

192.168.1.175

storage05_g3_175

storage05

group3

存储服务器6

192.168.1.176

storage06_g3_176

storage06

group3

1.FastDFS安装(所有tracker服务器和storage服务器均有如下操作)

1.1 编译和安装所需的依赖包

# yum install make cmake gcc gcc-c++

1.2 安装libfastcommon

1.2.1上传或下载 libfastcommon-master.zip 到/usr/local/src目录,解压

# cd /usr/local/src/

# unzip libfastcommon-master.zip

# cd libfastcommon-master

1.2.2编译和安装

# ./make.sh

# ./make.sh install

libfastcommon 默认安装到了

/usr/lib64/libfastcommon.so

/usr/lib64/libfdfsclient.so

1.2.3因为 FastDFS 主程序设置的 lib 目录是/usr/local/lib,所以需要创建软链接

# ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so

# ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so

# ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so

# ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so

1.3安装 FastDFS

1.3.1上传或下载 FastDFS 源码包(FastDFS_v5.05.tar.gz)到 /usr/local/src 目录,解压

# cd /usr/local/src/

# tar -zxvf FastDFS_v5.05.tar.gz

# cd FastDFS

1.3.2编译、安装(编译前要确保已经成功安装了 libfastcommon)

# ./make.sh

# ./make.sh install

采用默认安装的方式安装,安装后的相应文件与目录:

A、服务脚本在:

/etc/init.d/fdfs_storaged

/etc/init.d/fdfs_tracker

B、配置文件在(样例配置文件):

/etc/fdfs/client.conf.sample

/etc/fdfs/storage.conf.sample

/etc/fdfs/tracker.conf.sample

C、命令工具在/usr/bin/目录下的:

fdfs_appender_test

fdfs_appender_test1

fdfs_append_file

fdfs_crc32

fdfs_delete_file

fdfs_download_file

fdfs_file_info

fdfs_monitor

fdfs_storaged

fdfs_test

fdfs_test1

fdfs_trackerd

fdfs_upload_appender

fdfs_upload_file

stop.sh

restart.sh

1.3.3因为 FastDFS 服务脚本设置的 bin 目录是/usr/local/bin,但实际命令安装在/usr/bin,可以进入/user/bin 目录使用以下命令查看 fdfs 的相关命令:

# cd /usr/bin/

# ls | grep fdfs

因此需要修改 FastDFS 服务脚本中相应的命令路径,也就是把/etc/init.d/fdfs_storaged和/etc/init.d/fdfs_tracker 两个脚本中的/usr/local/bin 修改成/usr/bin:

# vi /etc/init.d/fdfs_trackerd

使用查找替换命令进统一修改::%s+/usr/local/bin+/usr/bin

# vi /etc/init.d/fdfs_storaged

使用查找替换命令进统一修改::%s+/usr/local/bin+/usr/bin

2. 配置FastDFS跟踪器Tracker192.168.1.170192.168.1.180

2.1复制 FastDFS 跟踪器样例配置文件,并重命名

# cd /etc/fdfs/

# cp tracker.conf.sample tracker.conf

2.2编辑跟踪器配置文件

# vi /etc/fdfs/tracker.conf

修改的内容如下:

disabled=false #启用配置文件

port=22122  #tracker 的端口号,一般采用 22122 这个默认端口

base_path=/fastdfs/tracker  #tracker 的数据文件和日志目录

# the method of selecting group to upload files

# 0: round robin

# 1: specify group

# 2: load balance, select the max free space group to upload file

store_lookup=0(采取轮巡方式选择要上传的组进行存储,默认2 选择最大空闲空间的组)

(其它参数保留默认配置,附跟踪器配置文件/conf/tracker.conf

2.3创建基础数据目录(参考基础目录 base_path 配置)

# mkdir -p /fastdfs/tracker

2.4防火墙中打开跟踪器端口(默认为 22122)

# vi /etc/sysconfig/iptables

添加如下端口行:

## FastDFS Tracker Port

-A INPUT -m state --state NEW -m tcp -p tcp --dport 22122 -j ACCEPT

重启防火墙:

# service iptables restart

2.5启动 Tracker

# /etc/init.d/fdfs_trackerd start

(初次成功启动,会在/fastdfs/tracker 目录下创建 data、logs 两个目录)可以通过以下两个方法查看 tracker 是否启动成功:

2.5.1查看 22122 端口监听情况

# netstat -unltp|grep fdfs

2.5.2 通过以下命令查看 tracker 的启动日志,看是否有错误

# tail -100f /fastdfs/tracker/logs/trackerd.log

2.6关闭 Tracker

# /etc/init.d/fdfs_trackerd stop

2.7设置 FastDFS 跟踪器开机启动

# vi /etc/rc.d/rc.local

添加以下内容:

## FastDFS Tracker

/etc/init.d/fdfs_trackerd start

3.配置FastDFS存储(192.168.1.171 ~ 176)

3.1复制 FastDFS 存储器样例配置文件,并重命名

# cd /etc/fdfs/

# cp storage.conf.sample storage.conf

3.2编辑存储器样例配置文件

# vi /etc/fdfs/storage.conf

修改的内容如下:

disabled=false #启用配置文件

group_name=group1                                    #组名(第一组为 group1,第二组为 group2)

port=23000                                                   #storage 的端口号,同一个组的 storage 端口号必须相同

base_path=/fastdfs/storage                         #设置 storage 的日志目录

store_path0=/fastdfs/storage                       #存储路径

store_path_count=1                                      #存储路径个数,需要和 store_path 个数匹配

tracker_server=192.168.1.170:22122          #tracker 服务器的 IP 地址和端口

tracker_server=192.168.1.180:22122          #多个 tracker 直接添加多条配置

http.server_port=8888                                  #设置 http 端口号

(其它参数保留默认配置,附存储节点配置文件/conf/storage.conf

3.3创建基础数据目录(参考基础目录 base_path 配置)

# mkdir -p /fastdfs/storage

3.4防火墙中打开存储器端口(默认为 23000)

# vi /etc/sysconfig/iptables

添加如下端口行:

## FastDFS Storage Port

-A INPUT -m state --state NEW -m tcp -p tcp --dport 23000 -j ACCEPT

重启防火墙:

# service iptables restart

3.5启动 Storage

# /etc/init.d/fdfs_storaged start

(初次成功启动,会在/fastdfs/storage 目录下创建数据目录 data 和日志目录 logs)

各节点启动动,使用 tail -f /fastdfs/storage/logs/storaged.log 命令监听存储节点日志,可以

看到存储节点链接到跟踪器,并提示哪一个为 leader 跟踪器。同时也会看到同一组中的其他节点加入

进来的日志信息。

查看 23000 端口监听情况:

# netstat -unltp|grep fdfs

所有 Storage 节点都启动之后,可以在任一 Storage 节点上使用如下命令查看集群信息:

# /usr/bin/fdfs_monitor /etc/fdfs/storage.conf

3.6关闭storage

# /etc/init.d/fdfs_storaged stop

3.7设置storage开机启动

# vi /etc/rc.d/rc.local

添加:

## FastDFS Storage

/etc/init.d/fdfs_storaged start

4.文件上传测试(192.168.1.170)

4.1修改 Tracker 服务器中的客户端配置文件

# cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf

# vi /etc/fdfs/client.conf

base_path=/fastdfs/tracker

tracker_server=192.168.1.170:22122

tracker_server=192.168.1.180:22122

4.2Xftp5上传test.png到192.168.1.170目录/usr/local/src/,用作上传测试

FastDFS上传命令如下:

# /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /usr/local/src/test.png

group2/M00/00/00/wKgBrlhEbz6ARyVHAAB9W1YdTCY793.png

能返回文件ID号,说明上传成功。

在group2下(173和174)的数据目录下可找到刚才上传的文件:

# ll /fastdfs/storage/data/00/00/

5.在各个存储节点上安装Nginx(192.168.1.171 ~ 176)

5.1fastdfs-nginx-module 作用说明

FastDFS 通过 Tracker 服务器,将文件放在 Storage 服务器存储,但是同组存储服务器之间需要进入文件复制,有同步延迟的问题。假设 Tracker 服务器将文件上传到了 192.168.1.135,上传成功后文件 ID已经返回给客户端。此时 FastDFS 存储集群机制会将这个文件同步到同组存储 192.168.1.136,在文件还没有复制完成的情况下,客户端如果用这个文件 ID 在 192.168.1.136 上取文件,就会出现文件无法访问的错误。而 fastdfs-nginx-module 可以重定向文件连接到源服务器取文件,避免客户端由于复制延迟导致的文件无法访问错误。(解压后的 fastdfs-nginx-module 在 nginx 安装时使用)

5.2上传 fastdfs-nginx-module_v1.16.tar.gz 到/usr/local/src,解压

# cd /usr/local/src/

# tar -zxvf fastdfs-nginx-module_v1.16.tar.gz

5.3修改 fastdfs-nginx-module 的 config 配置文件

# vi /usr/local/src/fastdfs-nginx-module/src/config

CORE_INCS="$CORE_INCS /usr/local/include/fastdfs /usr/local/include/fastcommon/"

修改为:CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"

(注意:这个路径修改是很重要的,不然在 nginx 编译的时候会报错的)

5.4上传当前的稳定版本 Nginx(nginx-1.6.2.tar.gz)到/usr/local/src 目录

5.5安装编译 Nginx 所需的依赖包

# yum install gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel

5.6编译安装 Nginx(添加 fastdfs-nginx-module 模块)

# cd /usr/local/src/

# tar -zxvf nginx-1.6.2.tar.gz

# cd nginx-1.6.2

# ./configure --prefix=/usr/local/nginx --add-module=/usr/local/src/fastdfs-nginx-module/src

# make && make install

5.7复制 fastdfs-nginx-module 源码中的配置文件到/etc/fdfs 目录,并修改

# cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/

# vi /etc/fdfs/mod_fastdfs.conf

5.7.1第一组 Storage 的 mod_fastdfs.conf 配置如下

connect_timeout=10

base_path=/tmp

tracker_server=192.168.1.170:22122

tracker_server=192.168.1.180:22122

storage_server_port=23000

group_name=group1

url_have_group_name = true

store_path0=/fastdfs/storage

group_count = 3

[group1]

group_name=group1

storage_server_port=23000

store_path_count=1

store_path0=/fastdfs/storage

[group2]

group_name=group2

storage_server_port=23000

store_path_count=1

store_path0=/fastdfs/storage

[group3]

group_name=group3

storage_server_port=23000

store_path_count=1

store_path0=/fastdfs/storage

5.7.2第二组 Storage 的 mod_fastdfs.conf 配置与第一组配置只有 group_name 不同

group_name=group2

5.7.3第三组 Storage 的 mod_fastdfs.conf 配置与第一组配置只有 group_name 不同

group_name=group3

(附配置文件/conf/mod_fastdfs.conf

5.8复制 FastDFS 的部分配置文件到/etc/fdfs 目录

# cd /usr/local/src/FastDFS/conf

# cp http.conf mime.types /etc/fdfs/

5.9在/fastdfs/storage 文件存储目录下创建软连接,将其链接到实际存放数据的目录

# ln -s /fastdfs/storage/data/ /fastdfs/storage/data/M00

5.10配置 Nginx,简洁版 nginx 配置样例

# vi /usr/local/nginx/conf/nginx.conf

部分配置如下:

user storage01;

server {

listen 8888;

server_name localhost;

location /group1/M00 {

#alias /fastdfs/storage/data;

ngx_fastdfs_module;

}

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root html;

}

}

(附配置文件/conf/storage_nginx/nginx.conf

注意、说明:

A、8888 端口值是要与/etc/fdfs/storage.conf 中的 http.server_port=8888 相对应,

因为 http.server_port 默认为 8888,如果想改成 80,则要对应修改过来。

B、Storage 对应有多个 group 的情况下,访问路径带 group 名,如/group1/M00/00/00/xxx,

对应的 Nginx 配置为:

location ~/group([0-9])/M00 {

ngx_fastdfs_module;

}

C、如查下载时如发现老报 404,将 nginx.conf 第一行 user nobody 修改为 user root 后重新启动。

5.11防火墙中打开 Nginx 的 8888 端口

# vi /etc/sysconfig/iptables

添加:

## Nginx Port

-A INPUT -m state --state NEW -m tcp -p tcp --dport 8888 -j ACCEPT

重启防火墙: # service iptables restart

5.12启动 Nginx

# /usr/local/nginx/sbin/nginx

ngx_http_fastdfs_set pid=xxx

(重启 Nginx 的命令为:/usr/local/nginx/sbin/nginx -s reload)

5.13设置Nginx开机启动

# vi /etc/rc.local

加入:

## Nginx

/usr/local/nginx/sbin/nginx

5.14通过浏览器访问测试时上传的文件

http://192.168.1.173:8888/group2/M00/00/00/wKgBrlhEbz6ARyVHAAB9W1YdTCY793.png

http://192.168.1.184:8888/group2/M00/00/00/wKgBrlhEbz6ARyVHAAB9W1YdTCY793.png

6.在跟踪器上安装Nginx(192.168.1.170,192.168.1.180)

6.1在 tracker 上安装的 nginx 主要为了提供 http 访问的反向代理、负载均衡以及缓存服务

6.2安装编译 Nginx 所需的依赖包

# yum install gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel

6.3上传 ngx_cache_purge-2.3.tar.gz 到/usr/local/src,解压

# cd /usr/local/src/

# tar -zxvf ngx_cache_purge-2.3.tar.gz

6.4上传当前的稳定版本 Nginx(nginx-1.6.2.tar.gz)到/usr/local/src 目录

6.5编译安装 Nginx(添加 ngx_cache_purge 模块)

# cd /usr/local/src/

# tar -zxvf nginx-1.6.2.tar.gz

# cd nginx-1.6.2

# ./configure --prefix=/usr/local/nginx --add-module=/usr/local/src/ngx_cache_purge-2.3

# make && make install

6.6配置 Nginx,设置负载均衡以及缓存

# vi /usr/local/nginx/conf/nginx.conf

部分配置如下:

user tracker01;

events {

worker_connections 1024;

use epoll;

}

http {

#设置缓存

。。。。

#设置缓存存储路径、存储方式、分配内存大小、磁盘最大空间、缓存期限

。。。。

#设置 group1 的服务器

upstream fdfs_group1 {

server 192.168.1.171:8888 weight=1 max_fails=2 fail_timeout=30s;

server 192.168.1.172:8888 weight=1 max_fails=2 fail_timeout=30s;

}

#group2

#group3

server{

listen 8000;

server_name localhost;

#设置 group 的负载均衡参数

location /group1/M00 {

proxy_pass http://fdfs_group1;

。。。。

}

#group2

#group3

#设置清除缓存的访问权限

location ~/purge(/.*) {

allow 127.0.0.1;

allow 192.168.1.111;

allow 192.168.1.0/24;

deny all;

proxy_cache_purge http-cache $1$is_args$args;

}

}

}

(附配置文件/conf/tracker_nginx/nginx.conf

6.7按以上 nginx 配置文件的要求,创建对应的缓存目录

# mkdir -p /fastdfs/cache/nginx/proxy_cache

# mkdir -p /fastdfs/cache/nginx/proxy_cache/tmp

6.8系统防火墙打开对应的端口

# vi /etc/sysconfig/iptables

## Nginx

-A INPUT -m state --state NEW -m tcp -p tcp --dport 8000 -j ACCEPT

重启防火墙

# service iptables restart

6.9启动 Nginx

# /usr/local/nginx/sbin/nginx

6.10重启 Nginx

# /usr/local/nginx/sbin/nginx -s reload

6.11设置 Nginx 开机启动

# vi /etc/rc.local

加入:

## Nginx

/usr/local/nginx/sbin/nginx

6.12文件访问测试

http://192.168.1.170:8000/group2/M00/00/00/wKgBrlhEbz6ARyVHAAB9W1YdTCY793.png

http://192.168.1.180:8000/group2/M00/00/00/wKgBrlhEbz6ARyVHAAB9W1YdTCY793.png

以上是最间配置,多次测试可以发现,每一个 Tracker 中的 Nginx 都单独对后端的 Storage 组做了负载均衡,但整套 FastDFS 集群如果想对外提供统一的文件访问地址,还需要对两个 Tracker 中的 Nginx 进行 HA 集群。

=======================================Keepalived+Nginx实现高可用Web负载均衡==========================================

一.所需安装包

keepalived-1.2.18.tar.gz

二.方案规划

VIP

IP

主机名

Nginx端口

默认主从

192.168.1.77

192.168.1.170

tracker01

8000

MASTER

192.168.1.180

tracker02

8000

BACKUP

3.本文档操作是在FastDFS安装并完成基础配置之后,故Nginx均已安装完毕。直接开始Keepalived开始配置

1.安装Keepalived(192.168.1.170, 192.168.1.180)

1.1上传或下载 keepalived(keepalived-1.2.18.tar.gz)到 /usr/local/src 目录

1.2解压安装

# cd /usr/local/src

# tar -zxvf keepalived-1.2.18.tar.gz

# cd keepalived-1.2.18

# ./configure --prefix=/usr/local/keepalived

# make && make install

备注:编译可能报错

configure: error:

!!! OpenSSL is not properly installed on your system. !!!

!!! Can not include OpenSSL headers files.

解决:yum -y install openssl-devel

1.3将 keepalived 安装成 Linux 系统服务

因为没有使用 keepalived 的默认路径安装(默认是/usr/local),安装完成之后,需要做一些工作

复制默认配置文件到默认路径

# mkdir /etc/keepalived

# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

复制 keepalived 服务脚本到默认的地址

# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/

# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/

# ln -s /usr/local/sbin/keepalived /usr/sbin/

# ln -s /usr/local/keepalived/sbin/keepalived /sbin/

设置 keepalived 服务开机启动

# chkconfig keepalived on

1.4修改 Keepalived 配置文件

# vi /etc/keepalived/keepalived.conf

1.4.1 MASTER 节点配置文件(192.168.1.170)

! Configuration File for keepalived

global_defs {

## keepalived 自带的邮件提醒需要开启 sendmail 服务。建议用独立的监控或第三方 SMTP

router_id tracker01  ## 标识本节点的字条串,通常为 hostname

}

## keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态调整 vrrp_instance 的优先级。如果脚本执行结果为 0,并且 weight 配置的值大于 0,则优先级相应的增加。如果脚本执行结果非 0,并且 weight配置的值小于 0,则优先级相应的减少。其他情况,维持原本配置的优先级,即配置文件中 priority 对应的值。

vrrp_script chk_nginx {

script "/etc/keepalived/nginx_check.sh"  ## 检测 nginx 状态的脚本路径

interval 2  ## 检测时间间隔

weight -20  ## 如果条件成立,权重-20

}

## 定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称

vrrp_instance VI_1 {

state MASTER  ## 主节点为 MASTER,对应的备份节点为 BACKUP

interface eth1 ## 绑定虚拟 IP 的网络接口,与本机 IP 地址所在的网络接口相同,我的是 eth1

virtual_router_id 170  ## 虚拟路由的 ID 号,两个节点设置必须一样,可选 IP 最后一段使用, 相同的 VRID 为一个组,他将决定多播的 MAC 地址

mcast_src_ip 192.168.1.170  ## 本机 IP 地址

priority 100  ## 节点优先级,值范围 0-254,MASTER 要比 BACKUP 高

nopreempt ## 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题

advert_int 1  ## 组播信息发送间隔,两个节点设置必须一样,默认 1s

## 设置验证信息,两个节点必须一致

authentication {

auth_type PASS

auth_pass 1111 ## 真实生产,按需求对应该过来

}

## 将 track_script 块加入 instance 配置块

track_script {

chk_nginx ## 执行 Nginx 监控的服务

}

## 虚拟 IP 池, 两个节点设置必须一样

virtual_ipaddress {

192.168.1.77  ## 虚拟 ip,可以定义多个

}

}

(附配置文件/conf/keepalived/master/keepalived.conf

1.4.2 BACKUP节点配置文件(192.168.1.180)

! Configuration File for keepalived

global_defs {

## keepalived 自带的邮件提醒需要开启 sendmail 服务。建议用独立的监控或第三方 SMTP

router_id tracker02  ## 标识本节点的字条串,通常为 hostname

}

## keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态调整 vrrp_instance 的优先级。如果脚本执行结果为 0,并且 weight 配置的值大于 0,则优先级相应的增加。如果脚本执行结果非 0,并且 weight配置的值小于 0,则优先级相应的减少。其他情况,维持原本配置的优先级,即配置文件中 priority 对应的值。

vrrp_script chk_nginx {

script "/etc/keepalived/nginx_check.sh"  ## 检测 nginx 状态的脚本路径

interval 2  ## 检测时间间隔

weight -20  ## 如果条件成立,权重-20

}

## 定义虚拟路由,VI_1 为虚拟路由的标示符,自己定义名称

vrrp_instance VI_1 {

state BACKUP                    ## 主节点为 MASTER,对应的备份节点为 BACKUP

interface eth1                   ## 绑定虚拟 IP 的网络接口,与本机 IP 地址所在的网络接口相同,我的是 eth1

virtual_router_id 170              ## 虚拟路由的 ID号,两个节点设置必须一样,可选 IP 最后一段使用, 相同的VRID为一个组,他将决定多播的 MAC地址

mcast_src_ip 192.168.1.180   ## 本机IP地址

priority 100                       ## 节点优先级,值范围 0-254,MASTER 要比 BACKUP 高

nopreempt                        ## 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题

advert_int 1                      ## 组播信息发送间隔,两个节点设置必须一样,默认 1s

## 设置验证信息,两个节点必须一致

authentication {

auth_type PASS

auth_pass 1111 ## 真实生产,按需求对应该过来

}

## 将 track_script 块加入 instance 配置块

track_script {

chk_nginx ## 执行 Nginx 监控的服务

}

## 虚拟 IP 池, 两个节点设置必须一样

virtual_ipaddress {

192.168.1.77  ## 虚拟 ip,可以定义多个

}

}

(附配置文件/conf/keepalived/backup/keepalived.conf

1.5编写 Nginx 状态检测脚本 /etc/keepalived/nginx_check.sh (已在 keepalived.conf 中配置)

# vi /etc/keepalived/nginx_check.sh

脚本要求:如果 nginx 停止运行,尝试启动,如果无法启动则杀死本机的 keepalived 进程,keepalied将虚拟 ip 绑定到 BACKUP 机器上。内容如下:

#!/bin/bash

A=`ps -C nginx –no-header |wc -l`

if [ $A -eq 0 ];then

/usr/local/nginx/sbin/nginx

sleep 2

if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then

killall keepalived

fi

fi

保存后,给脚本赋执行权限:

# chmod +x /etc/keepalived/nginx_check.sh

1.6启动 Keepalived

# service keepalived start

1.7 Keepalived+Nginx 的高可用测试

1.7.1关闭 192.168.1.170中的 Nginx,Keepalived 会将它重新启动

# /usr/local/nginx/sbin/nginx -s stop

1.7.2关闭 192.168.1.170中的 Keepalived,VIP会切换到 192.168.1.180中

# service keepalived stop

1.7.3重新启动 192.168.1.170中的 Keepalived,VIP又会切回到 192.168.1.170中来

service keepalived start

查看虚拟IP状态 # ip add

Keepalived 服务管理命令:

停止:service keepalived stop

启动:service keepalived start

重启:service keepalived restart

查看状态:service keepalived status

1.8方便测试,将170和180的Nginx主页修改一下

# vi /usr/local/nginx/html/index.html

<hr/>

<b>tracker01_170_master</b>

<hr/>

<hr/>

<b>tracker02_180_backup</b>

<hr/>

1.9文件访问测试:

http://192.168.1.77:8000/group2/M00/00/00/wKgBrlhEbz6ARyVHAAB9W1YdTCY793.png

至此配置完毕。

VIP(8000)

tracker_Nginx(8000)

storage_Nginx(8888)

192.168.1.77

192.168.1.170

192.168.1.180

192.168.1.171

192.168.1.172

192.168.1.173

192.168.1.174

192.168.1.175

192.168.1.176

文件访问:

storage

http://192.168.1.173:8888/group2/M00/00/00/wKgBrlhEbz6ARyVHAAB9W1YdTCY793.png

http://192.168.1.174:8888/group2/M00/00/00/wKgBrlhEbz6ARyVHAAB9W1YdTCY793.png

tracker

http://192.168.1.170:8000/group2/M00/00/00/wKgBrlhEbz6ARyVHAAB9W1YdTCY793.png

http://192.168.1.180:8000/group2/M00/00/00/wKgBrlhEbz6ARyVHAAB9W1YdTCY793.png

VIP

http://192.168.1.77:8000/group2/M00/00/00/wKgBrlhEbz6ARyVHAAB9W1YdTCY793.png

转载于:https://www.cnblogs.com/zengnansheng/p/10389726.html

相关文章:

Linux进程与线程的区别 详细总结(面试经验总结)

首先&#xff0c;简要了解一下进程和线程。对于操作系统而言&#xff0c;进程是核心之核心&#xff0c;整个现代操作系统的根本&#xff0c;就是以进程为单位在执行任务。系统的管理架构也是基于进程层面的。在按下电源键之后&#xff0c;计算机就开始了复杂的启动过程&#xf…

【HDU/POJ/ZOJ】Calling Extraterrestrial Intelligence Again (素数打表模板)

http://poj.org/problem?id1411 POJ http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode1689 ZOJ http://acm.hdu.edu.cn/showproblem.php?pid1239 HDU 都是同一个题&#xff0c;但是可能你在HDU上AC&#xff0c;在POJ和ZOJ上是TLE&#xff08;所以还有待…

[AVR]使用AVR单片机驱动舵机

最近参加了三系举办的小车比赛(好像叫什么"驭远杯")。领导要求我驱动3-4个舵机。研究了几日&#xff0c;总算折腾出一个方案..、 1.舵机驱动的基本原理 &#xff08;可以参考http://blog.sina.com.cn/s/blog_8240cbef01018hu1.html&#xff09; "控制信号由接收…

高阶函数的使用

问题 字节跳动面试时问题&#xff1a;原函数例如fetchData是一个异步函数&#xff0c;尝试从服务器端获取一些信息并返回一个Promise。写一个新的函数可以自动重试一定次数&#xff0c;并且在使用上和原函数没有区别。 思路 这个问题其实不是很难&#xff0c;不过可能是太菜了紧…

内存溢出和内存泄漏的定义,产生原因以及解决方法(面试经验总结)

一、定义&#xff08;概念与区别&#xff09; 内存溢出 out of memory&#xff0c;是指程序在申请内存时&#xff0c;没有足够的内存空间供其使用&#xff0c;出现out of memory&#xff1b;比如申请 了一个integer,但给它存了long才能存下的数&#xff0c;那就是内存溢出。 …

【Codeforces】716B Complete the Word (26个字母)

http://codeforces.com/contest/716/problem/B 给你一个字符串该字符串中是否存在长度为26且这26个字母没有重复 一个满足上述条件但是部分区域是问号的话&#xff0c;需要用剩下的字母覆盖掉问号&#xff0c;其余部分的问号可以随便赋值 没有的话输出-1 暴力即可。 #incl…

MySQL ERROR 1878 解决办法

MySQL ERROR 1878报错解决办法错误重现Part1:大表修改字段mysql> ALTER TABLE erp-> ADD COLUMN eas_status tinyint(3) unsigned NOT NULL DEFAULT 0 AFTER totalprice;ERROR 1878 (HY000): Temporary file write failure.mysql> \q这里可以看到&#xff0c;添加字…

共享程序集和强命名程序集(3):强命名程序集的一些作用

强命名程序集能防篡改 用私钥对程序集进行签名&#xff0c;并将公钥和签名嵌入程序集&#xff0c;CLR就可以炎症程序集未被修改或破坏。程序集安装到GAC时&#xff0c;系统对包含清单的那个文件的内容进行哈希处理&#xff0c;将Hash值与PE文件中嵌入的RSA数字签名进行比较。如…

堆和栈的区别(面试经验总结)

C中&#xff0c;内存分为5个区&#xff1a;堆、栈、自由存储区、全局/静态存储区和常量存储区。 栈&#xff1a;是由编译器在需要时自动分配&#xff0c;不需要时自动清除的变量存储区。通常存放局部变量、函数参数等。 堆&#xff1a;是由new分配的内存块&#xff0c;由程序员…

百度Q3财报里的“大生意”

在今日发布的Q3财报中&#xff0c;百度花了不少篇幅来介绍人工智能业务的进展&#xff0c;作为百度的技术核心&#xff0c;近段时间几乎所有百度业务都在与人工智能做深入结合&#xff0c;这预示着移动互联网信息化技术发展已经全面开启人工智能时代&#xff0c;而百度势必要在…

【Codeforces/HDU】76A Plus and xor / 2095 find your present (2)(异或)。

http://codeforces.com/contest/76/problem/D A X Y B X xor Y 异或&#xff08;不进位加法&#xff09;&#xff1a;两个二进制数&#xff0c;对应的位置上&#xff0c;相同为0&#xff0c;不同为1 性质&#xff1a;a^a0&#xff0c;a^0a&#xff0c;满足交换律 所以…

前端项目如何管理

前端项目如何管理 前端项目的管理分为两个维度&#xff1a;项目内的管理与多项目之间的管理。 1. 项目内的管理 在一个项目内&#xff0c;当有多个开发者一起协作开发时&#xff0c;或者功能越来越多、项目越来越庞大时&#xff0c;保证项目井然有序的进行是相当重要的。 一般会…

CMake学习(一)

什么是 CMake 你或许听过好几种 Make 工具&#xff0c;例如 GNU Make &#xff0c;QT 的 qmake &#xff0c;微软的 MS nmake&#xff0c;BSD Make&#xff08;pmake&#xff09;&#xff0c;Makepp&#xff0c;等等。这些 Make 工具遵循着不同的规范和标准&#xff0c;所执行…

【Codeforces】1104C Grid game (变异的俄罗斯方块)

http://codeforces.com/problemset/problem/1104/C 4 X 4 的方格 放置 1*2的矩形&#xff08;用1表示&#xff09;和2*1的矩形&#xff08;用0表示&#xff09; 只要有一行或者一列都填满了&#xff0c;就会自动消除&#xff0c;就可以放心的矩形了&#xff0c;只要不重叠就可…

如何创建.gitignore文件,忽略git不必要提交的文件

1、在需要创建 .gitignore 文件的文件夹, 右键选择Git Bash 进入命令行&#xff0c;进入项目所在目录。 2、输入 touch .gitignore &#xff0c;生成“.gitignore”文件。 3、在”.gitignore” 文件里输入你要忽略的文件夹及其文件就可以了。&#xff08;注意格式&#xff09; …

软件安全访谈:ZipSlip、NodeJS安全性和BBS攻击

正如Nodejs Security WG成员和Snyk开发者布道师Liran Tal所写的那样&#xff0c;自BBS早期以来&#xff0c;这种漏洞利用的矢量攻击已经为人所知。InfoQ采访了Tal&#xff0c;了解了更多有关软件安全性&#xff08;尤其是Nodejs安全性&#xff09;的相关信息。今年早些时候&…

客户端与服务器的数据交互

毕设需要接粗到一些关于app和前端后端的东西&#xff0c;学习记录一下。 首先不要管安卓端还是苹果端&#xff0c;现在一般都是响应式的app&#xff0c;放到安卓或者苹果或者pc或者平板都是没有问题的。一般采用的是http接口通讯&#xff0c;或者socket连接。具体你要去查资料…

【Codeforces】908B New Year and Buggy Bot(暴力+全排列)

http://codeforces.com/contest/908/problem/B 0 1 2 3 可以对应 上下左右。&#xff08;具体哪个对应哪个&#xff0c;试过才知道&#xff09; str 的 长度 为 100&#xff0c;0 1 2 3 的全排列一共24种&#xff0c;最坏的情况可以看成遍历长为2400的字符串&#xff0c;不会…

swoole实现数据库连接池

2019独角兽企业重金招聘Python工程师标准>>> 原生 PHP CURD 让我们来回顾一下PHP中数据库的使用 <?php # curd.php$id 1;$dbh new PDO(); $stmt $dbh->prepare(SELECT * FROM user WHERE id:id); $stmt ->bindValue(:id, $id); $user $stmt->f…

bats-Bash自动化测试工具

本文分析了bats--Bash自动化测试工具的安装、语法、常用指令及常用函数等内容。上篇文章回顾&#xff1a;学习RAID 01/10/10E的区别bats 是一个符合 TAP 标准 的 Bash 版测试框架&#xff0c;它使用了一种极为简便的方法来验证命令行程序是否正常运行。bats 要求 Bash 的最低版…

ORB + OPENCV

一、介绍 假如有两张人物图片&#xff0c;我们的目标是要确认这两张图片中的人物是否是同一个人。如果人来判断&#xff0c;这太简单了。但是让计算机来完成这个功能就困难重重。一种可行的方法是&#xff1a; 分别找出两张图片中的特征点描述这些特征点的属性&#xff0c;比较…

【Codeforces】967C Stairs and Elevators (二分)。

http://codeforces.com/contest/967/problem/C 从一个地方到另一个地方&#xff0c;可以选择爬楼梯或者坐电梯 &#xff0c;前提是楼梯或者电梯存在。 n 楼层数 m 每一层的房间数 s 楼梯的数量 e 电梯的数量 v 电梯的速度 第2行是s个楼梯的位置 第3行是e个电梯的位置 …

webpack 最简打包结果分析

原文链接&#xff1a;https://ssshooter.com/2019-02... 现在的 webpack 不再是入门噩梦,过去 webpack 最让人心塞的莫过于配置文件&#xff0c;而 webpack4 诞生随之而来的是无配置 webpack。 使用 webpack4&#xff0c;至少只需要安装 webpack 和 webpack cli。所以大家完全可…

orb-slam2(学习笔记)+相机

单目&#xff08;Monocular&#xff09;、双目&#xff08;Stereo&#xff09;、深度相机&#xff08;RGB-D&#xff09; 深度相机能够读取每个像素离相机的距离 &#xff0c;单目相机 只使用一个摄像头进行SLAM的做法叫做单目SLAM&#xff08;Monocular SLAM&#xff09;,结构…

如何在nuget上传自己的包+搭建自己公司的NuGet服务器(新方法)

运维相关&#xff1a;http://www.cnblogs.com/dunitian/p/4822808.html#iis 先注册一个nuget账号https://www.nuget.org/ 下载并安装一下NuGetPackageExplorer&#xff1a;https://github.com/NuGetPackageExplorer/NuGetPackageExplorer 创建一个包&#xff08;vs其实也是可以…

【Codeforces】1080C Masha and two friends (棋盘染色)

http://codeforces.com/problemset/problem/1080/C 给定一个棋盘&#xff0c;&#xff08;1&#xff0c;1&#xff09;的位置是白色&#xff0c;观察可以知道&#xff0c;如果横纵坐标之和是偶数&#xff0c;那么是白色&#xff0c;奇数的话就是黑色。 只要算出染色以后白色方…

Java多线程001——一图读懂线程与进程

本博客 猫叔的博客&#xff0c;转载请申明出处前言 本系列将由浅入深&#xff0c;学习Java并发多线程。 一图读懂线程与进程 1、一个进程可以包含一个或多个线程。&#xff08;其实你经常听到“多线程”&#xff0c;没有听过“多进程”嘛&#xff09;2、进程存在堆和方法区 3、…

TermCriteria模板类

学习写vo过程中遇到的 类功能&#xff1a;模板类&#xff0c;作为迭代算法的终止条件。 构造函数&#xff1a; TermCriteria(int type,int maxCount,double epsilon); 参数说明&#xff1a; type 迭代终止条件类型 typeTermCriteria::MAX_ITER/TermCrite…

SQL优化快速入门

最近遇到一个专门进行SQL技术优化的项目&#xff0c;对很多既有的老存储过程进行调优&#xff08;现在已经不再新增任何存储过程&#xff09;&#xff0c;因此系统的对SQL语句编写进行一次科学的学习变得很有必要。这儿将基于黄德承大神的Oracle SQL语句优化一书&#xff0c;选…

【HDU】4509 湫湫系列故事——减肥记II (区间覆盖 暴力)

http://acm.hdu.edu.cn/showproblem.php?pid4509 给出的时间段是被占用的时间&#xff0c;24h 1440 min&#xff0c;求出这些区间以外的区间长度 把00&#xff1a;00 - 23&#xff1a;59 变成0-1440 1-5都是被占用的区域&#xff0c;暴力很好理解 #include <iostream>…