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同时宕机。
Keepalived+Nginx+FastDFS实现最简单的文件服务器的高可用
文章图片

我提前在四台电脑上做了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,回车后保存退出。如Keepalived+Nginx+FastDFS实现最简单的文件服务器的高可用
文章图片



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访问。

    推荐阅读