标签:nginx fastdfs ha keepalived 集群
集群部署IP地址 | 计算机名 | 部署的服务 |
172.16.10.10 | node1.fastdfs | StorageGroup1 |
172.16.10.11 | node2.fastdfs | StorageGroup1 |
172.16.10.12 | node3.fastdfs | StorageGroup2 |
172.16.10.13 | node4.fastdfs | StorageGroup2 |
172.16.10.17 | node5.fastdfs | Tracker1 |
172.16.10.18 | node6.fastdfs | Tracker2 |
172.16.10.14 | node1.nginx | nginx keepalived |
172.16.10.15 | node2.nginx | nginx keepalived |
172.16.10.16(VIP) |
服务器操作系统:CentOS Linux release 7.3.1611 (Core)
SELinux:关闭
Iptables:清空
时间:保持同步
FastDFS版本:v5.08(2016-02-14最新版本)
Hosts文件解析:
172.16.10.10 node1.fastdfs 172.16.10.11 node2.fastdfs 172.16.10.12 node3.fastdfs 172.16.10.13 node4.fastdfs 172.16.10.17 node5.fastdfs 172.16.10.18 node6.fastdfs 172.16.10.14 node1.nginx 172.16.10.15 node2.nginx
使用的软件包:
FastDFS_v5.08.tar.gz
fastdfs-nginx-module_v1.16.tar.gz
libfastcommon-master.zip
nginx-1.6.2.tar.gz
ngx_cache_purge-2.3.tar.gz
在tarcker节点和storage节点执行以下操作(172.16.10.10,172.16.10.11,172.16.10.12,172.16.10.13,172.16.10.17,172.16.10.18)
安装基础开发包
yum -y install gcc gcc-c++
首先需要安装libfastcommon
下载地址:https://github.com/happyfish100/libfastcommon,在源码包的INSTALL文件有说明
下载完成后解压进入到解压后目录执行以下命令
./make.sh ./make.sh install
安装成功后会生成一个文件:/usr/lib64/libfastcommon.so
我们需要创建软链接,因为FastDFS程序设置的目录不是这里
ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so
安装FastDFS
下载完成后进入安装目录执行以下命令
./make.sh ./make.sh install
安装完成后会配置文件在:/etc/fdfs
在tarcker节点执行下面命令(172.16.10.17,172.16.10.18)
创建的数据存储和日志存储目录
mkdir -pv /data/fastdfs-tracker
重命名tarcker配置文件
cd /etc/fdfs && mv tracker.conf.sample tracker.conf
修改tracker.conf配置文件
修改base_path的值为刚创建的目录
修改store_lookup的值为0
说明:store_lookup的值默认为2,2代表负载均衡模式,0代表轮询模式,1代表指定节点,为方便一会测试,我们选改为0。另外store_group这人选项只有当store_lookup值为1的时候才会生效
启动fdfs_trackerd服务
service fdfs_trackerd start
启动成功后在刚创建的目录下面会生成data和logs两个目录
/data/fastdfs-tracker ├── data │ ├── fdfs_trackerd.pid │ └── storage_changelog.dat └── logs └── trackerd.log
日志输出内容大概如下图所示
查看是否监听22122端口
配置开机自启动
chkconfig fdfs_trackerd on
在storage节点执行以下操作(172.16.10.10,172.16.10.11,172.16.10.12,172.16.10.13)
创建数据存储目录和日志存储目录
mkdir -p /data/fastdfs-storage
重命名tarcker配置文件
cd /etc/fdfs/ && mv storage.conf.sample storage.conf
修改配置文件
修改base_path路径为刚创建的路径
修改store_path0路径为刚创建的路径
修改tracker_server后面的IP的端口为tarcker服务器的IP和监听的端口,就算在同一台机器也不可以使用127.0.0.1,另外我们还需要再增加一个tarcker_server的选项,指定不同的tarcker,如下所示
base_path=/data/fastdfs-storage store_path0=/data/fastdfs-storage tracker_server=172.16.10.17:22122 tracker_server=172.16.10.18:22122
注意:配置文件里面有一项为group_name,用于指定group名,我们有两个分组,这里需要注意不同的storage节点,这里的名称都不一样,其它都一样,默认为group1,如果在是在172.16.10.12节点和172.16.10.13节点安装这里需要改成group2
启动服务
service fdfs_storaged start
启动成功后在刚创建的目录下面会生成data和logs两个目录,并且data目录里面会有很多子目录,最的会监听23000端口
日志说明:下面日志说明了客户端启动连接两台tracker server成功,选举172.16.10.13为leader,最后说明连接同一个group的storage server成功
加入开机自启动
chkconfig fdfs_storaged on
主要测试tracker server的高可用,我们可以试图关掉storage server选择出来的leader,这样正常情况下会触发重新选举出新的leader,并且会报错连接不上被关掉的tracker server,如果再把关掉的tracker server启动的话会提示连接成功的信息,这些都能在日志里面体现
在集群内任何的storage server节点执行以下命令
fdfs_monitor /etc/fdfs/storage.conf
会输出同样的信息,信息中包含有两个group,并且会输出每个group内的storage信息
客户端上传图片测试
在任何一台tracker节点测试
重命名客户端配置文件
cd /etc/fdfs/ && mv client.conf.sample client.conf
修改配置文件
修改base_path的值为tracker配置文件里面的base_path一样的路径
修改tracker_server为tracker监控的IP和端口,如果都在本机也不可以使127.0.0.1
如下所示
base_path=/data/fastdfs-tracker tracker_server=172.16.10.17:22122 tracker_server=172.16.10.18:22122
上传图片测试,执行下面命令
fdfs_upload_file client.conf test.png
fdfs_upload_file 命令
client.conf 指定的客户端配置文件
test.png 指定图片路径
上传成功后会返回一个类似下面的路径
group1/M00/00/00/rBAKCloXyT2AFH_AAAD4kx1mwCw538.png
group1 代表上传到了group1的内的storage节点
M00 代表磁盘目录,如果只有一个磁盘那么只有M00,多个就是M01……
00/00 代表磁盘目录,每个目录下又有00到FF共256个目录,两级目录就有256*256个目录
rBAKCloXyT2AFH_AAAD4kx1mwCw538.png 这是最终上传上去的文件
最终我们知道我们的图片被上传到了哪几台服务器的哪个目录,我们可以直接在服务器上找到我们上传的图片,同一个group内的图片一样的因为我们前面在配置tracker节点的时候我们配置的为0模式(轮询)因此我们上传的时候一次为group1一次为group2,如果有一个group宕机,那么就始终在另外的group如下图所示
这时候我们的group1里面所有storage的M00号磁盘上面的00/00目录下面将有rBAKClobtG6AS0JKAANxJpb_3dc838.png和rBAKC1obtHCAEMpMAANxJpb_3dc032.png而group2里面所有storage的M00号磁盘上面的00/00目录下面将有rBAKDFobtG-AIj2EAANxJpb_3dc974.png和rBAKDVobtHGAJgzTAANxJpb_3dc166.png
如下图所示
说明:如果同一组的其中一台storage发生故障,那么上传的文件只能存放到同一组的其它设备上面,等故障恢复后会自动将数据同步到该故障设备上面,不需要人工干预
加入开机自启动
chkconfig fdfs_storaged on
前面我们测试只是用客户端测试,我们需要使用http的方式来上传和下载,因此我们还需要搭建Nginx或apache,这里我们就使用,使用最多的Nginx
将所有源码包复制到/usr/local/src目录下面,然后解压
进入到/usr/local/src/fastdfs-nginx-module/src/
cd /usr/local/src/fastdfs-nginx-module/src
修改config文件里面的/usr/local/include/fastdfs为/usr/include/fastdfs
修改config文件里面的/usr/local/include/fastcommon/为/usr/include/fastcommon/
进入到Nginx解压后的目录执行下面命令
yum -y install zlib-devel openssl-devel ./configure --prefix=/usr/local/nginx --with-pcre --add-module=/usr/local/src/fastdfs-nginx-module/src make make install
添加nginx可执行文件到环境变量
cat >> /etc/profile.d/nginx.sh << EOF #!/bin/sh PATH=$PATH:/usr/local/nginx/sbin export PATH EOF
刷新环境变量
source /etc/profile.d/nginx.sh
复制配置文件
cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/ cp /usr/local/src/FastDFS/conf/{http.conf,mime.types} /etc/fdfs/
创建Nginx配置文件
nginx.conf(/usr/local/nginx/conf/nginx.conf)
worker_processes 2; worker_rlimit_nofile 51200; events { use epoll; worker_connections 51200; } http { include mime.types; default_type application/octet-stream; client_max_body_size 50m; sendfile on; tcp_nopush on; keepalive_timeout 60; gzip on; server_tokens off; include vhost/*.conf; }
FastDFS.conf(/usr/local/nginx/conf/vhost/FastDFS.conf)
server { listen 9000; location ~/group[1-3]/M00 { ngx_fastdfs_module; } }
更改Linux最大可打开文件数量
编辑/etc/security/limits.conf在文件最后加入以下内容
* soft nofile 65536 * hard nofile 65536
注销,重新登录即可
编辑/etc/fdfs/mod_fastdfs.conf配置文件
修改connect_timeout为10
修改tracker_server为taacker监听的服务器IP和地址,不可以使用127.0.0.1
修改url_have_group_name为true
修改store_path0的路径为storage配置文件配置的路径
修改group_count为2(因为我们就只有两个组)
在最后增加以下配置
[group1] group_name=group1 storage_server_port=23000 store_path_count=1 store_path0=/data/fastdfs-storage [group2] group_name=group2 storage_server_port=23000 store_path_count=1 store_path0=/data/fastdfs-storage
如下所示
connect_timeout=10 tracker_server=172.16.10.17:22122 tracker_server=172.16.10.18:22122 group_name=group1 url_have_group_name = true store_path0=/data/fastdfs-storage group_count = 2 [group1] group_name=group1 storage_server_port=23000 store_path_count=1 store_path0=/data/fastdfs-storage [group2] group_name=group2 storage_server_port=23000 store_path_count=1 store_path0=/data/fastdfs-storage
Nginx启动,停止,重启,Reload,配置检查脚本,脚本名(/etc/init.d/nginx)
#!/bin/bash # chkconfig: - 30 21 # description: http service. # Source Function Library . /etc/init.d/functions # Nginx Settings NGINX_SBIN="/usr/local/nginx/sbin/nginx" NGINX_CONF="/usr/local/nginx/conf/nginx.conf" NGINX_PID="/usr/local/nginx/logs/nginx.pid" RETVAL=0 prog="Nginx" start() { echo -n $"Starting $prog: " mkdir -p /dev/shm/nginx_temp daemon $NGINX_SBIN -c $NGINX_CONF RETVAL=$? echo return $RETVAL } stop() { echo -n $"Stopping $prog: " killproc -p $NGINX_PID $NGINX_SBIN -TERM rm -rf /dev/shm/nginx_temp RETVAL=$? echo return $RETVAL } reload(){ echo -n $"Reloading $prog: " killproc -p $NGINX_PID $NGINX_SBIN -HUP RETVAL=$? echo return $RETVAL } restart(){ stop start } configtest(){ $NGINX_SBIN -c $NGINX_CONF -t return 0 } case "$1" in start) start ;; stop) stop ;; reload) reload ;; restart) restart ;; configtest) configtest ;; *) echo $"Usage: $0 {start|stop|reload|restart|configtest}" RETVAL=1 esac exit $RETVAL
将nginx添加以系统服务,并设置开机自启动,最后再启动
chkconfig --add nginx chkconfig nginx on service nginx start
测试:通过任何一个存储节点的Nginx都可以访问到我们上传的所有图片
在/usr/local/src目录下解压nginx-1.6.2.tar.gz和ngx_cache_purge-2.3.tar.gz
安装依赖包
yum -y install zlib-devel openssl-devel
进入到/usr/local/src/nginx-1.6.2这个目录执行下面命令进行安装
./configure --prefix=/usr/local/nginx --with-pcre --add-module=/usr/local/src/ngx_cache_purge-2.3 make make install
添加nginx可执行文件到环境变量:参考在storage节点部署Nginx
编辑Nginx配置文件(nginx.conf)
worker_processes 2; worker_rlimit_nofile 51200; events { use epoll; worker_connections 51200; } http { include mime.types; default_type application/octet-stream; client_max_body_size 50m; sendfile on; tcp_nopush on; keepalive_timeout 60; gzip on; server_tokens off; proxy_redirect off; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; proxy_buffer_size 16k; proxy_buffers 4 64k; proxy_busy_buffers_size 128k; proxy_temp_file_write_size 128k; proxy_cache_path /data/cache/nginx/proxy_cache levels=1:2 keys_zone=http-cache:200m max_size=1g inactive=30d; proxy_temp_path /data/cache/nginx/proxy_cache/tmp; include vhost/*.conf; }
创建缓存目录和子配置文件目录
mkdir -p /data/cache/nginx/proxy_cache/tmp mkdir /usr/local/nginx/conf/vhost
修改子配置文件(/usr/local/nginx/conf/vhost/FastDFS.conf)
upstream fdfs_group1 { server 172.16.10.10:8888 weight=1 max_fails=2 fail_timeout=30s; server 172.16.10.11:8888 weight=1 max_fails=2 fail_timeout=30s; } upstream fdfs_group2 { server 172.16.10.12:8888 weight=1 max_fails=2 fail_timeout=30s; server 172.16.10.13:8888 weight=1 max_fails=2 fail_timeout=30s; } server { listen 8000; location /group1/M00 { proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_cache http-cache; proxy_cache_valid 200 304 12h; proxy_cache_key $uri$is_args$args; proxy_pass http://fdfs_group1; expires 30d; } location /group2/M00 { proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_cache http-cache; proxy_cache_valid 200 304 12h; proxy_cache_key $uri$is_args$args; proxy_pass http://fdfs_group2; expires 30d; } location ~/purge(/.*) { allow all; proxy_cache_purge http-cache $1$is_args$args; } }
Nginx启动,停止,重启,Reload,配置检查脚本,脚本名(/etc/init.d/nginx):参考在storage节点部署Nginx
将nginx添加以系统服务,并设置开机自启动,最后再启动:参考在storage节点部署Nginx
测试:通过两中中的任意一台trackr节点的8000端口去访问后端任何group里面的图片都没有问题
在172.16.10.17和172.16.10.18上面执行下面操作
安装软件
yum -y install nginx keepalived
node1的Keepalived配置
! Configuration File for keepalived global_defs { router_id NodeA } vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" interval 2 weight 20 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1314 } track_script { chk_nginx } virtual_ipaddress { 172.16.10.16/24 } }
node2的Keepalived配置
! Configuration File for keepalived global_defs { router_id NodeB } vrrp_script chk_nginx { script "/etc/keepalived/nginx_check.sh" interval 2 weight 20 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1314 } track_script { chk_nginx } virtual_ipaddress { 172.16.10.16/24 } }
nginx_check.sh脚本内容(/etc/keepalived/nginx_check.sh)
#!/bin/bash A=`ps -C nginx --no-header | wc -l` if [ $A -eq 0 ];then nginx sleep 2 if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then pkill keepalived fi fi
nginx.conf的配置
user nginx; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; include /usr/share/nginx/modules/*.conf; events { worker_connections 51200; use epoll; } http { 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 /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048; include /etc/nginx/mime.types; default_type application/octet-stream; include /etc/nginx/conf.d/*.conf; } FastDFS.conf的配置(/etc/nginx/conf.d/FastDFS.conf) upstream tracker_server { server 172.16.10.17:8000; server 172.16.10.18:8000; } server { listen 80; location /fastdfs { proxy_pass http://tracker_server/; proxy_set_header Host $http_host; proxy_set_header Cookie $http_cookie; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; client_max_body_size 300m; } }
启动Keepalived
systemctl start keepalived
配置开机自启动
systemctl enable nginx systemctl enable keepalived
检查VIP
ip addr
关闭集群中一半相同功能的服务器,集群可以照常运行
如:
组1:172.16.10.11,172.16.10.13,172.16.10.15,172.16.10.18
组2:172.16.10.10,172.16.10.12,172.16.10.14,172.16.10.17
1. 首先启动所有节点的Nginx
2. 再启动Tracker节点
3. 最后启动Storage节点
标签:nginx fastdfs ha keepalived 集群
原文地址:http://blog.51cto.com/270142877/2045450