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

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

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

前言

想要搭建一个高可用的SFTP服务,并通过rsync实现数据有序同步,同时利用ZK(Zookeeper)管理同步状态,确保数据传输的有序性和高可用性。这是一个结合多种技术的优化方案,既能保证数据的安全性,又能实现负载均衡和自动化同步。

一、配置SFTP服务

1.2 配置SFTP用户

groupadd sftpuseradd -g sftp -s /sbin/nologin -M sftpuserpasswd sftpuser

创建专属目录:

mkdir -p /data/sftp/sftpuserchown root:sftp /data/sftp/chown sftpuser:sftp /data/sftp/sftpuser

1.3 配置SFTP服务器

编辑/etc/ssh/sshd_config

Subsystem sftp /usr/libexec/openssh/sftp-serverMatch Group sftpChrootDirectory /data/sftpForceCommand internal-sftpAllowTcpForwarding noX11Forwarding no

启动服务:

systemctl restart sshd

在另一台服务器执行相同配置并重启服务。

1.6 测试连接

sftp sftpuser@192.168.5.5

二、Keepalived配置

2.1 安装

yum install -y keepalived

2.2 配置备份节点

编辑keepalived.conf

global_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_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    }}

启动服务:

systemctl start keepalivedsystemctl enable keepalived

三、rsync配置

3.1 rsync配置

编辑rsyncd.conf

uid = sftpusergid = sftpuse chroot = yesmax connections = 4pid file = /var/run/rsyncd.pidexclude = lost+foundtransfer logging = yestimeout = 900ignore nonreadable = yesdont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2

3.2 启动服务

systemctl start rsyncdsystemctl enable rsyncd

3.4 测试同步

rsync -auz /data/sftp/sftpuser/* sftpuser@192.168.5.5::webgis --password-file=/root/sftppassword/sftppassword

四、单向同步脚本

结合ZK实现有序同步,确保数据传输的高可用性和有序性。以下为两个备份节点的脚本配置。

4.1 backup2脚本

#!/bin/bashcurNode=backup2anoNode=backup1zkClient=/opt/apache-zookeeper-3.6.2-bin/bin/zkCli.shvip=192.168.5.16user=sftpusersrcPath=/data/sftp/sftpuserdestIp=192.168.5.5module=webgispwdFile=/root/sftppassword/sftppasswordsignalPath=/keepalived/rsync_signalnodePath=/keepalived/$curNodegetCurrentSyncTimes() {    prefixNum=1373736    startNum=1373736000    maxNum=$(( $startNum + 10 ))    rsyncTimes=$(zkClient get $nodePath | grep $prefixNum )    if [[ $rsyncTimes == "" ]]; then        zkClient set $nodePath $startNum > /dev/null 2>&1    elif [[ $rsyncTimes -ge $maxNum ]]; then        zkClient set $nodePath $startNum > /dev/null 2>&1    else        rsyncTimes=$(( rsyncTimes + 1 ))        zkClient set $nodePath $rsyncTimes > /dev/null 2>&1    fi    totalTimes=$(( $rsyncTimes - $startNum ))    echo $totalTimes}if [[ $services2user -eq 0 ]]; then    if [[ $signal =~ $curNode || $signal =~ $anoNode\_node\_stop ]]; then        echo "停止前最后一次发送数据,$signal"        rsync -auz $srcPath $user@$destIp::$module --password-file=$pwdFile        zkClient set $signalPath "$curNode\_node\_stop" > /dev/null 2>&1    fielse    echo "正在发送数据,$signal"    if [[ $signal =~ $curNode\_node\_sync\_finished || $signal =~ $anoNode\_node\_stop ]]; then        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 "让另一个节点执行一次"            zkClient set $signalPath "$curNode\_node\_stop" > /dev/null 2>&1        else            zkClient set $signalPath "$curNode\_node\_sync\_finished" > /dev/null 2>&1        fi    fifi

4.2 backup1脚本

#!/bin/bashcurNode=backup1anoNode=backup2zkClient=/opt/apache-zookeeper-3.6.2-bin/bin/zkCli.shvip=192.168.5.16user=sftpusersrcPath=/data/sftp/sftpuserdestIp=192.168.5.3module=webgispwdFile=/root/sftppassword/sftppasswordsignalPath=/keepalived/rsync_signalnodePath=/keepalived/$curNodegetCurrentSyncTimes() {    prefixNum=1373736    startNum=1373736000    maxNum=$(( $startNum + 10 ))    rsyncTimes=$(zkClient get $nodePath | grep $prefixNum )    if [[ $rsyncTimes == "" ]]; then        zkClient set $nodePath $startNum > /dev/null 2>&1    elif [[ $rsyncTimes -ge $maxNum ]]; then        zkClient set $nodePath $startNum > /dev/null 2>&1    else        rsyncTimes=$(( rsyncTimes + 1 ))        zkClient set $nodePath $rsyncTimes > /dev/null 2>&1    fi    totalTimes=$(( $rsyncTimes - $startNum ))    echo $totalTimes}if [[ $services2user -eq 0 ]]; then    if [[ $signal =~ $curNode || $signal =~ $anoNode\_node\_stop ]]; then        echo "停止前最后一次发送数据,$signal"        rsync -auz $srcPath $user@$destIp::$module --password-file=$pwdFile        zkClient set $signalPath "$curNode\_node\_stop" > /dev/null 2>&1    fielse    echo "正在发送数据,$signal"    if [[ $signal =~ $curNode\_node\_sync\_finished || $signal =~ $anoNode\_node\_stop ]]; then        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 "让另一个节点执行一次"            zkClient set $signalPath "$curNode\_node\_stop" > /dev/null 2>&1        else            zkClient set $signalPath "$curNode\_node\_sync\_finished" > /dev/null 2>&1        fi    fifi

4.3 定时调用

在每个节点上添加 cron 表达式:

crontab -e* * * * * sh /sftp_data_rsync.sh > /tmp/synclog.log

五、日志查看

查看同步日志:

tail -n 400 /tmp/synclog.log | grep backup

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

你可能感兴趣的文章
NYOJ127星际之门(一)
查看>>
nyoj58 最少步数
查看>>
N皇后问题
查看>>
N皇后问题
查看>>
n种方式教你用python读写excel等数据文件
查看>>
OAuth 2.0 MAC Tokens
查看>>
OAuth 及 移动端鉴权调研
查看>>
OAuth2 + Gateway统一认证一步步实现(公司项目能直接使用),密码模式&授权码模式
查看>>
OAuth2 Provider 项目常见问题解决方案
查看>>
OAuth2 vs JWT,到底怎么选?
查看>>
Vue.js 学习总结(14)—— Vue3 为什么推荐使用 ref 而不是 reactive
查看>>
oauth2-shiro 添加 redis 实现版本
查看>>
OAuth2.0_JWT令牌-生成令牌和校验令牌_Spring Security OAuth2.0认证授权---springcloud工作笔记148
查看>>
OAuth2.0_JWT令牌介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记147
查看>>
OAuth2.0_介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记137
查看>>
OAuth2.0_完善环境配置_把资源微服务客户端信息_授权码存入到数据库_Spring Security OAuth2.0认证授权---springcloud工作笔记149
查看>>
OAuth2.0_授权服务配置_Spring Security OAuth2.0认证授权---springcloud工作笔记140
查看>>
OAuth2.0_授权服务配置_三项内容_Spring Security OAuth2.0认证授权---springcloud工作笔记141
查看>>
OAuth2.0_授权服务配置_令牌服务和令牌端点配置_Spring Security OAuth2.0认证授权---springcloud工作笔记143
查看>>
OAuth2.0_授权服务配置_客户端详情配置_Spring Security OAuth2.0认证授权---springcloud工作笔记142
查看>>