博客
关于我
实现sftp高可用
阅读量:506 次
发布时间:2019-03-06

本文共 9272 字,大约阅读时间需要 30 分钟。

Keepalived+rsync+ZK实现sftp高可用方案

文章目录


前言

想搞过一个sftp 服务的高可用,然后rsync能实现相互通信,以保证数据有序同步。

一、配置SFTP

先创建个用户

1.2 配置SFTP

#用户名hsi_ftp可以改groupadd sftp[root@localhost ~]# groupadd sftp[root@localhost ~]# useradd -g sftp -s /sbin/nologin -M sftpuser[root@localhost ~]# passwd sftpuserChanging password for user sftpuser.New password: BAD PASSWORD: The password is shorter than 8 charactersRetype new password: passwd: all authentication tokens updated successfully.

1.2 创建SFTP用户专属的目录

[root@localhost ~]# mkdir -p /data/sftp/sftpuser[root@localhost ~]# usermod -d /data/sftp/ sftpuser[root@localhost ~]# chown root:sftp /data/sftp/[root@localhost ~]# chown sftpuser:sftp /data/sftp/sftpuser/

1.3 配置SFTP配置文件

[root@localhost ~]# vim /etc/ssh/sshd_config#Subsystem      sftp    /usr/libexec/openssh/sftp-serverSubsystem       sftp    internal-sftpMatch Group sftpChrootDirectory /data/sftpForceCommand    internal-sftpAllowTcpForwarding no X11Forwarding no

1.4重启服务

[root@localhost ~]# systemctl restart sshd

1.5如法炮制

另选一台也如上面的方式创建用户与配置服务,如果有需要还需要在

1.6测试

C:\Users\cheng>sftp sftpuser@192.168.5.5sftpuser@192.168.5.5's password:Connected to sftpuser@192.168.5.5.sftp> lstestsftp>

二.Keepalived

2.1安装

yum install -y keepalived

2.2backup1的配置

选其中的一个节点node1

[root@hadoop05 /]# cat /etc/keepalived/keepalived.conf! Configuration File for keepalivedglobal_defs {      notification_email {        xxx@xxx.com   }   notification_email_from xxx@xxx.com   smtp_server smtp.xxx.com   smtp_connect_timeout 30   router_id LVS_DEVEL   vrrp_skip_check_adv_addr  # vrrp_strict   vrrp_garp_interval 0   vrrp_gna_interval 0}vrrp_instance VI_1 {       state BACKUP    interface ens33    virtual_router_id 53    priority 100    nopreempt    advert_int 1    authentication {           auth_type PASS        auth_pass 1111    }    virtual_ipaddress {           192.168.5.16    }}

2.2 backup2的配置

选其中的一个节点node2

[root@hadoop03 /]# cat /etc/keepalived/keepalived.conf ! Configuration File for keepalivedglobal_defs {      notification_email {        xxx@xxx.com   }   notification_email_from xxx@xxx.com   smtp_server smtp.xxx.com   smtp_connect_timeout 30   router_id LVS_DEVEL   vrrp_skip_check_adv_addr  # vrrp_strict   vrrp_garp_interval 0   vrrp_gna_interval 0}vrrp_instance VI_1 {       state BACKUP    interface ens33    virtual_router_id 53    priority 100    nopreempt    advert_int 1    authentication {           auth_type PASS        auth_pass 1111    }    virtual_ipaddress {           192.168.5.16    }}

启动keepalived

systemctl start keepalivedsystemctl enable keepalived

三.rsync

3.1配置rsync

两台服务器都得配置

[root@hadoop03 /]# cat  /etc/rsyncd.conf # /etc/rsyncd: configuration file for rsync daemon mode# See rsyncd.conf man page for more options.# configuration example:# uid = nobody# gid = nobody# use chroot = yes# max connections = 4pid file = /var/run/rsyncd.pid# exclude = lost+found/# transfer logging = yes# timeout = 900# ignore nonreadable = yes# dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2# [ftp]#        path = /home/ftp#        comment = ftp export area#[webgis]path=/data/sftp/sftpuseruid=sftpusergid=sftpread only= false

3.2配置用户文件

将用户的密码与名字写到指定的位置

[root@hadoop03 ~]# cat  sftppassword/sftppasswordsftpuser:123456

3.3启动服务

[root@hadoop03 ~]# systemctl  start rsyncd[root@hadoop03 ~]# systemctl  enable  rsyncd

3.4查看与测试

[root@hadoop03 ~]# systemctl status rsyncd[root@hadoop03 ~]# rsync -auz   /data/sftp/sftpuser/*  sftpuser@192.168.5.5::webgis    --password-file=sftppassword/sftppassword

四.单向同步脚本

恰好集群有zookeeper组件,再在两台机器上各装一个客户端就好。

(1)主要利用了ZK让rsync做到半双工通信的方式。(听说两边同时同步容易导致文件损坏,没测试,反正我还是喜欢有序地同步数据
(2) 利用ZK禁止在定时调度的时候不能被多个进程同时调用rsync服务。

4.1backup2脚本

要保证rsync_signal目录不为空,起码有一个${curNode}_node_sync_finished数据

[root@hadoop03 hsi_ftp]# cat /sftp_data_rsync.sh #!/bin/bash## 这个脚本用来同步数据。# (1)然后需要手动在ZK上创建一个节点/keepalived/rsync_signal。# (2)还需要创建节点/keepalived/backup1# (3)还需要创建节点/keepalived/backup2#. /etc/profile. /root/.bash_profile## curNode=backup2anoNode=backup1zkClient=/opt/apache-zookeeper-3.6.2-bin/bin/zkCli.shvip=192.168.5.16user=sftpusersrcPath=/data/sftp/$user/destIp=192.168.5.5module=webgispwdFile=/root/sftppassword/sftppasswordsignalPath=/keepalived/rsync_signalsignal=$(bash $zkClient  get $signalPath )#可以确定当前是哪个KL对外提供服务services2user=$(ip addr|grep $vip |wc -l)#master每同步10次就礼让给slave同步一次nodePath=/keepalived/$curNodemaxTimes=10getCurrentSyncTimes(){   preffixNum=1373736  startNum=1373736000   maxNum=$(( $startNum + $maxTimes ))rsyncTimes=$(bash $zkClient  get $nodePath |grep $preffixNum )if [[ $rsyncTimes == "" ]];then   bash $zkClient  set  $nodePath  $startNum >/dev/null 2>&1elif [[ $rsyncTimes -ge $maxNum  ]];then   bash $zkClient  set  $nodePath  $startNum >/dev/null 2>&1else  rsyncTimes=$(( rsyncTimes + 1 ))  bash $zkClient  set  $nodePath  $rsyncTimes >/dev/null 2>&1fitotalTimes=$(($rsyncTimes - $startNum))echo $totalTimes}#main   #说明当前服务已经停止了,所以需要将后续没有同步的数据进行同步到backup节点上。if [[  $services2user -eq 0   ]]; then	if [[  $signal =~ $curNode ||$signal =~ "${anoNode}_node_stop" ]]; then            	echo "停止前最后一次发送数据, $signal"       	    	rsync -auz   $srcPath  $user@$destIp::$module    --password-file=$pwdFile        	#通知另一个节点可以同步数据了        	bash $zkClient  set $signalPath "${curNode}_node_stop" >/dev/null 2>&1        fielse          echo "正在发送数据 $signal"                 #isEmpty=$(echo  $signal | grep $anoNode)             	if [[ $signal =~ "${curNode}_node_sync_finished" || $signal =~ "${anoNode}_node_stop"  ]];then                echo "正在发送数据"         	bash $zkClient  set $signalPath "${curNode}_node_synchronizing" >/dev/null 2>&1         	rsync -auz   $srcPath  $user@$destIp::$module    --password-file=$pwdFile        	 curTotalTimes=$(getCurrentSyncTimes)                echo "第$curTotalTimes次发送"                if [[ $curTotalTimes -ge $maxTimes ]];then                      echo  "让另一个节点执行一次"                        bash $zkClient  set $signalPath "${curNode}_node_stop" >/dev/null 2>&1                else                        bash $zkClient  set $signalPath "${curNode}_node_sync_finished" >/dev/null 2>&1                fi    	        fifi

4.2 backup1配置

[root@hadoop05 hsi_ftp]# cat /sftp_data_rsync.sh#!/bin/bash## 这个脚本用来同步数据。# (1)然后需要手动在ZK上创建一个节点/keepalived/rsync_signal。# (2)还需要创建节点/keepalived/backup1# (3)还需要创建节点/keepalived/backup2#. /etc/profile. /root/.bash_profile## curNode=backup1anoNode=backup2zkClient=/opt/apache-zookeeper-3.6.2-bin/bin/zkCli.shvip=192.168.5.16user=sftpusersrcPath=/data/sftp/$user/destIp=192.168.5.3module=webgispwdFile=/root/sftppassword/sftppasswordsignalPath=/keepalived/rsync_signal#用于解决哪怕定时器到了也只能有一个脚本同步数据signal=$(bash $zkClient  get $signalPath )#可以确定当前是哪个KL对外提供服务services2user=$(ip addr|grep $vip |wc -l)nodePath=/keepalived/$curNode#master每同步10次就礼让给slave同步一次maxTimes=10getCurrentSyncTimes(){   preffixNum=1373736  startNum=1373736000   maxNum=$(( $startNum + $maxTimes ))rsyncTimes=$(bash $zkClient  get $nodePath |grep $preffixNum )if [[ $rsyncTimes == "" ]];then   bash $zkClient  set  $nodePath  $startNum >/dev/null 2>&1elif [[ $rsyncTimes -ge $maxNum  ]];then   bash $zkClient  set  $nodePath  $startNum >/dev/null 2>&1else  rsyncTimes=$(( rsyncTimes + 1 ))  bash $zkClient  set  $nodePath  $rsyncTimes >/dev/null 2>&1fitotalTimes=$(($rsyncTimes - $startNum))echo $totalTimes}#main#说明当前服务已经停止了,所以需要将后续没有同步的数据进行同步到另一个backup节点上。if [[  $services2user -eq 0   ]]; then	if [[  $signal =~ $curNode ||$signal =~ "${anoNode}_node_stop" ]]; then                echo "停止前最后一次发送数据, $signal"                rsync -auz   $srcPath  $user@$destIp::$module    --password-file=$pwdFile                #通知另一个节点可以同步数据了                bash $zkClient  set $signalPath "${curNode}_node_stop" >/dev/null 2>&1        fielse                       echo "正在发送数据 ,当前信号--$signal"      	if [[ $signal =~ "${curNode}_node_sync_finished" || $signal =~ "${anoNode}_node_stop"  ]];then                        	bash $zkClient  set $signalPath "${curNode}_node_synchronizing" >/dev/null 2>&1         	rsync -auz   $srcPath  $user@$destIp::$module    --password-file=$pwdFile                curTotalTimes=$(getCurrentSyncTimes)                                echo "第$curTotalTimes次发送"                if [[ $curTotalTimes -ge $maxTimes ]];then                      echo  "让另一个节点执行一次"                      	bash $zkClient  set $signalPath "${curNode}_node_stop" >/dev/null 2>&1                else                       	bash $zkClient  set $signalPath "${curNode}_node_sync_finished" >/dev/null 2>&1                fi        fifi

4.3定时调用

[root@hadoop03 /]# crontab -e  *  *  *  *  *  sh /sftp_data_rsync.sh>>/tmp/synclog.log  *  *  *  *  *  sleep 10 ; sh /sftp_data_rsync.sh>>/tmp/synclog.log  *  *  *  *  *  sleep 20 ; sh /sftp_data_rsync.sh>>/tmp/synclog.log  *  *  *  *  *  sleep 30 ; sh /sftp_data_rsync.sh>>/tmp/synclog.log  *  *  *  *  *  sleep 40 ; sh /sftp_data_rsync.sh>>/tmp/synclog.log  *  *  *  *  *  sleep 50 ; sh /sftp_data_rsync.sh>>/tmp/synclog.log

4.看日志

查看节点信息

[root@hadoop05 hsi_ftp]# tail  -n 400  /tmp/synclog.log |grep backupbackup1_node_stopbackup2_node_stopbackup1_node_sync_finishedbackup1_node_sync_finishedbackup1_node_sync_finishedbackup1_node_sync_finishedbackup1_node_sync_finishedbackup1_node_sync_finishedbackup1_node_sync_finishedbackup1_node_sync_finishedbackup1_node_sync_finishedbackup1_node_stop

转载地址:http://mvqdz.baihongyu.com/

你可能感兴趣的文章
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_插入修改删除增量数据实时同步_通过分页解决变更记录过大问题_01----大数据之Nifi工作笔记0053
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表或全表增量同步_实现指定整库同步_或指定数据表同步配置_04---大数据之Nifi工作笔记0056
查看>>
NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现update数据实时同步_实际操作05---大数据之Nifi工作笔记0044
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_生成插入Sql语句_实际操作02---大数据之Nifi工作笔记0041
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_不带分页处理_01_QueryDatabaseTable获取数据_原0036---大数据之Nifi工作笔记0064
查看>>
NIFI从MySql中离线读取数据再导入到MySql中_无分页功能_02_转换数据_分割数据_提取JSON数据_替换拼接SQL_添加分页---大数据之Nifi工作笔记0037
查看>>
NIFI从Oracle11G同步数据到Mysql_亲测可用_解决数据重复_数据跟源表不一致的问题---大数据之Nifi工作笔记0065
查看>>
NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
查看>>
nifi使用过程-常见问题-以及入门总结---大数据之Nifi工作笔记0012
查看>>
NIFI分页获取Mysql数据_导入到Hbase中_并可通过phoenix客户端查询_含金量很高的一篇_搞了好久_实际操作05---大数据之Nifi工作笔记0045
查看>>
NIFI分页获取Postgresql数据到Hbase中_实际操作---大数据之Nifi工作笔记0049
查看>>
NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
查看>>
NIFI同步MySql数据源数据_到原始库hbase_同时对数据进行实时分析处理_同步到清洗库_实际操作06---大数据之Nifi工作笔记0046
查看>>
Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
查看>>
NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
查看>>