Keepalived+Nginx+FastDFS实现最简单的文件服务器的高可用
我们用四台服务器做测试,IP分别为
虚拟IP(VIP):192.168.1.210
tracker1:192.168.1.211
tracker2:192.168.1.212
storage1:192.168.1.213
storage2:192.168.1.214
下面是我们的简单的构架图,通过访问虚拟IP192.168.1.210,来实现文件服务器的读写,此方案最大的容灾程度是一台tracker和一台storage同时宕机。
文章图片
我提前在四台电脑上做了RSA的登陆所以SCP不需要密码,如果需要的话可以去查看我的另外一篇博客http://blog.csdn.net/goodmylove/article/details/78182905
这里列一下我们要用到的软件版本,
FastDFS_V5.05.tar.gz
fastdfs-nginx-module_v1.19.zip
libfastcommon-master.zip
nginx-1.13.0.tar.gz
【Keepalived+Nginx+FastDFS实现最简单的文件服务器的高可用】 这几个除了NGINX,别的三个软件是互相对应的,更换其他版本的话可能会出问题,下面是我用的这几个软件的CSDN下载链接,设置了1积分,如果没有积分可以给我留邮箱我发给你。
http://download.csdn.net/download/goodmylove/10012510
我们先创建一个目录专门放软件
mkdir /home/software
cd /home/software
怎么上传软件我就不说了,,各有各的办法,放进去就可以。
[root@localhost software]# ll
total 1416
-rw-r--r-- 1 root root20439 Oct9 15:48 fastdfs-nginx-module_v1.19.zip
-rw-r--r-- 1 root root 336001 Oct9 15:48 FastDFS_V5.05.tar.gz
-rw-r--r-- 1 root root 106203 Oct9 15:48 libfastcommon-master.zip
-rw-r--r-- 1 root root 982592 Oct9 15:48 nginx-1.13.0.tar.gz
[root@localhost software]# scp
将这几个软件复制给其他机器
[root@localhost software]# scp * 192.168.1.212:/home/software/
fastdfs-nginx-module_v1.19.zip100%20KB20.0KB/s00:00
FastDFS_V5.05.tar.gz100%328KB 328.1KB/s00:00
libfastcommon-master.zip100%104KB 103.7KB/s00:00
nginx-1.13.0.tar.gz100%960KB 959.6KB/s00:00
[root@localhost software]# scp * 192.168.1.213:/home/software/
fastdfs-nginx-module_v1.19.zip100%20KB20.0KB/s00:00
FastDFS_V5.05.tar.gz100%328KB 328.1KB/s00:00
libfastcommon-master.zip100%104KB 103.7KB/s00:00
nginx-1.13.0.tar.gz100%960KB 959.6KB/s00:00
[root@localhost software]# scp * 192.168.1.214:/home/software/
fastdfs-nginx-module_v1.19.zip100%20KB20.0KB/s00:00
FastDFS_V5.05.tar.gz100%328KB 328.1KB/s00:00
libfastcommon-master.zip100%104KB 103.7KB/s00:00
nginx-1.13.0.tar.gz100%960KB 959.6KB/s00:00
[root@localhost software]#
四台服务器上都执行
安装依赖环境
yum install make cmake gcc gcc-c++ -y
解压并进入libfastcommon-master
unzip libfastcommon-master.zip
cd libfastcommon-master
编译
./make.sh
编译完成
cc -Wall -D_FILE_OFFSET_BITS=64 -g -DDEBUG_FLAG -c -o fast_timer.o fast_timer.c
cc -Wall -D_FILE_OFFSET_BITS=64 -g -DDEBUG_FLAG -c -o process_ctrl.o process_ctrl.c
cc -Wall -D_FILE_OFFSET_BITS=64 -g -DDEBUG_FLAG -c -o fast_mblock.o fast_mblock.c
cc -Wall -D_FILE_OFFSET_BITS=64 -g -DDEBUG_FLAG -c -o connection_pool.o connection_pool.c
cc -Wall -D_FILE_OFFSET_BITS=64 -g -DDEBUG_FLAG -c -o fast_mpool.o fast_mpool.c
ar rcs libfastcommon.a hash.o chain.o shared_func.o ini_file_reader.o logger.o sockopt.o base64.o sched_thread.o http_func.o md5.o pthread_func.o local_ip_func.o avl_tree.o ioevent.o ioevent_loop.o fast_task_queue.o fast_timer.o process_ctrl.o fast_mblock.o connection_pool.o fast_mpool.o
[root@localhost libfastcommon-master]#
安装
./make.sh install
安装完成
[root@localhost libfastcommon-master]# ./make.sh install
mkdir -p /usr/lib64
install -m 755 libfastcommon.so /usr/lib64
mkdir -p /usr/include/fastcommon
install -m 644 common_define.h hash.h chain.h logger.h base64.h shared_func.h pthread_func.h ini_file_reader.h _os_define.h sockopt.h sched_thread.h http_func.h md5.h local_ip_func.h avl_tree.h ioevent.h ioevent_loop.h fast_task_queue.h fast_timer.h process_ctrl.h fast_mblock.h connection_pool.h fast_mpool.h /usr/include/fastcommon
[root@localhost libfastcommon-master]#
返回上级目录
cd ../
解压fastdfs
tar -zxvf FastDFS_V5.05.tar.gz
进入解压目录
cd fastdfs-5.05
编译和安装
./make.sh
./make.sh install
完成
cp -f ../common/fdfs_define.h ../common/fdfs_global.h ../common/mime_file_parser.h ../common/fdfs_http_shared.h ../tracker/tracker_types.h ../tracker/tracker_proto.h ../tracker/fdfs_shared_func.h ../storage/trunk_mgr/trunk_shared.h tracker_client.h storage_client.h storage_client1.h client_func.h client_global.h fdfs_client.h /usr/include/fastdfs
if [ ! -f /etc/fdfs/client.conf.sample ];
then cp -f ../conf/client.conf /etc/fdfs/client.conf.sample;
fi
[root@localhost fastdfs-5.05]#
添加系统服务
mv /etc/init.d/fdfs_trackerd /etc/init.d/trackerd
mv /etc/init.d/fdfs_storaged /etc/init.d/storaged
修改/etc/init.d/trackerd和storaged
vim /etc/init.d/trackerd
将打开文件中的所有/usr/local/bin替换成/usr/bin,一次性替换的方式为输入冒号: %s+/usr/local/bin+/usr/bin,回车后保存退出。如
文章图片
vim /etc/init.d/storaged
同样 将打开文件中的所有/usr/local/bin替换成/usr/bin,一次性替换的方式为输入冒号: %s+/usr/local/bin+/usr/bin,回车后保存退出
所有服务器同样的配置到此结束。接下来我们单独配置两台tracker
在所有tracker上操作
复制tracker配置文件
cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
修改tracker配置文件
vim /etc/fdfs/tracker.conf
修改如下内容
base_path=/home/fastdfs/tracker
保存退出
增加相应路径
mkdir -p /home/fastdfs/tracker
防火墙放开22122端口
vim /etc/sysconfig/iptables
在-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT下面增加一行
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22122 -j ACCEPT
保存退出,重启iptables
service iptables restart
复制client配置文件
cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
修改
vim /etc/fdfs/client.conf
修改下面配置文件
base_path=/home/fastdfs/tracker
tracker_server=192.168.1.211:22122
tracker_server=192.168.1.212:22122
启动tracker服务
service trackerd start
查看是否存在trackerd进程
ps -ef|grep trackerd
[root@localhost fastdfs-5.05]# ps -ef|grep trackerd
root 3558 1 0 16:17 ? 00:00:00 /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
root 3576 2038 0 16:17 pts/0 00:00:00 grep trackerd
[root@localhost fastdfs-5.05]#
添加trackerd服务开机自启动
chkconfig trackerd on
tracker配置暂时结束,接下来配置storage
在所有storage上操作
复制storage配置文件
cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
修改
vim /etc/fdfs/storage.conf
修改的内容如下
base_path=/home/fastdfs/storage
store_path0=/home/fastdfs/storage
tracker_server=192.168.1.211:22122
tracker_server=192.168.1.212:22122
添加目录
mkdir -p /home/fastdfs/storage
防火墙放开23000和8888端口
vim /etc/sysconfig/iptables
在-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT下面添加
-A INPUT -m state --state NEW -m tcp -p tcp --dport 23000 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8888 -j ACCEPT
保存退出,重启防火墙
service iptables restart
启动storage
service storaged start
查看storaged进程
ps -ef|grep storaged
添加storaged服务开机自启动
chkconfig storaged on
storage配置完成,接下来在所有tracker服务器上重启tracker,
service trackerd restart
如果执行完命令shell串口没退出,直接敲回车就可以。
在所有storage服务器上重启storage
service storaged restart
如果执行完命令shell串口没退出,直接敲回车就可以。
查看一下storage的日志
cat /home/fastdfs/storage/logs/storaged.log
[2017-10-09 16:37:52] INFO - file: storage_func.c, line: 254, tracker_client_ip: 192.168.1.213, my_server_id_str: 192.168.1.213, g_server_id_in_filename: -721311552
[2017-10-09 16:37:52] INFO - local_host_ip_count: 3, 127.0.0.1 192.168.1.213 192.168.122.1
[2017-10-09 16:37:52] INFO - file: tracker_client_thread.c, line: 310, successfully connect to tracker server 192.168.1.211:22122, as a tracker client, my ip is 192.168.1.213
[2017-10-09 16:37:52] INFO - file: tracker_client_thread.c, line: 310, successfully connect to tracker server 192.168.1.212:22122, as a tracker client, my ip is 192.168.1.213
[2017-10-09 16:37:52] INFO - file: tracker_client_thread.c, line: 1235, tracker server 192.168.1.212:22122, set tracker leader: 192.168.1.212:22122
[2017-10-09 16:37:52] INFO - file: storage_sync.c, line: 2698, successfully connect to storage server 192.168.1.214:23000
从日志可以第三四行可以看出,这台storage成功连接了两台tracker192.168.1.211和192.168.1.212.从第五行可以看出,在两个tracker的选举中192.168.1.212被选举为leader.从第六行可以看出,这台storage已经成功连接上了另外一台storage192.168.1.214。
接下来我们尝试关闭掉192.168.1.212现在的leader,看192.168.1.211能不能成为新的leader
在被选举为leader的192.168.1.212上执行
service trackerd stop
然后继续查看这台storage的日志
[2017-10-09 16:45:22] ERROR - file: tracker_client_thread.c, line: 1120, tracker server 192.168.1.212:22122, recv data fail, errno: 107, error info: Transport endpoint is not connected.
[2017-10-09 16:45:22] INFO - file: tracker_client_thread.c, line: 1235, tracker server 192.168.1.211:22122, set tracker leader: 192.168.1.211:22122
[2017-10-09 16:45:22] ERROR - file: connection_pool.c, line: 110, connect to 192.168.1.212:22122 fail, errno: 111, error info: Connection refused
[2017-10-09 16:45:23] ERROR - file: tracker_client_thread.c, line: 277, connect to tracker server 192.168.1.212:22122 fail, errno: 111, error info: Connection refused
[root@localhost logs]#
第一行信息表示storage失去了与原来的leader192.168.1.212的连接,第二行表示leader被重新选举为了192.168.1.211。
第三行表示这台storage不能与tracker192.168.1.212连接,因为这台tracker被我们停掉了
现在我们重新恢复192.168.1.212这台tracker
在192.168.1.212上执行
service trackerd start
再次查看这台storage的日志
[2017-10-09 16:45:23] ERROR - file: tracker_client_thread.c, line: 277, connect to tracker server 192.168.1.212:22122 fail, errno: 111, error info: Connection refused
[2017-10-09 16:51:23] INFO - file: tracker_client_thread.c, line: 310, successfully connect to tracker server 192.168.1.212:22122, continuous fail count: 12, as a tracker client, my ip is 192.168.1.213
[root@localhost logs]#
最后一句已经显示,成功的连接到了192.168.1.212这台tracker,不过根据fastdfs的规则,新恢复的tracker不会抢占原有leader。
接下来我们测试上传文件
在所有tracker上操作
我们在两台tracker的/home目录下放一张ht.jpg的图片,我们测试将这张图片上传到storage上面,通过如下命令上传
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /home/ht.jpg
我们查看两个tracker的返回
tracker1192.168.1.211
[root@localhost home]# /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /home/ht.jpg
group1/M00/00/00/wKgB1lnbObeAOljuAATBl8xofxY969.jpg
[root@localhost home]#
tracker2192.168.1.212
[root@localhost home]# /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /home/ht.jpg
group1/M00/00/00/wKgB1VnbObeAek4HAATBl8xofxY816.jpg
[root@localhost home]#
从返回可以看出两台tracker各自执行了一次上传操作,并得到了storage返回的存储路径+文件名
group1/M00/00/00/wKgB1lnbObeAOljuAATBl8xofxY969.jpg
group1/M00/00/00/wKgB1VnbObeAek4HAATBl8xofxY816.jpg
现在我们去storage上查看是否有这两个图片
在所有storage上操作
ll /home/fastdfs/storage/data/00/00
storage1
[root@localhost 00]# ll /home/fastdfs/storage/data/00/00
total 616
-rw-r--r-- 1 root root 311703 Oct 9 16:56 wKgB1lnbObeAOljuAATBl8xofxY969.jpg
-rw-r--r-- 1 root root 311703 Oct 9 16:56 wKgB1VnbObeAek4HAATBl8xofxY816.jpg
[root@localhost 00]#
storaged2
[root@localhost logs]# ll /home/fastdfs/storage/data/00/00
total 616
-rw-r--r-- 1 root root 311703 Oct 9 16:56 wKgB1lnbObeAOljuAATBl8xofxY969.jpg
-rw-r--r-- 1 root root 311703 Oct 9 16:56 wKgB1VnbObeAek4HAATBl8xofxY816.jpg
[root@localhost logs]#
从这个可以看出,两台tracker上传的文件,分别存到了两台storage上,并且两台storage会自动实现文件同步。
因为篇幅有限,我们下一篇介绍在storage上加载nginx模块,让storage上的图片支持通过HTTP访问。
推荐阅读
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- MybatisPlus使用queryWrapper如何实现复杂查询
- python学习之|python学习之 实现QQ自动发送消息
- 孩子不是实现父母欲望的工具——林哈夫
- opencv|opencv C++模板匹配的简单实现
- Node.js中readline模块实现终端输入
- java中如何实现重建二叉树
- 人脸识别|【人脸识别系列】| 实现自动化妆
- paddle|动手从头实现LSTM
- pytorch|使用pytorch从头实现多层LSTM