在Debian Squeeze上设置两个服务器之间的统一文件同步
本教程将介绍如何使用Unison在两台Debian Squeeze服务器之间设置文件同步。 Unison是一个类似于rsync的文件同步工具,但最大的区别在于它会跟踪/同步两个方向的更改,即在server1上更改的文件将被复制到server2,反之亦然。
我不会保证这将为您工作!
1初步说明
在本教程中,我使用以下两个Debian Squeeze服务器:
-
server1.example.com
,IP地址为192.168.0.100
-
server2.example.com
,IP地址为192.168.0.101
我想同步两个服务器之间的目录/ var / www
。 我将在本教程中以root用户身份运行Unison,以便Unison具有足够的权限来同步用户和组权限。
2安装Unison
server1 / server2:
Unison必须安装在server1
和server2上
; 因为我们使用SSH从server1
连接到server2
,我们还需要SSH包。 这可以实现如下:
apt-get install unison openssh-server ssh
3在服务器1上创建私钥/公钥对
server1:
现在我们在server1.example.com
上创建一个私钥/公钥对:
ssh-keygen -t dsa
root @ server1:〜#ssh-keygen -t dsa
生成公共/私有dsa密钥对。
输入要保存密钥的文件(/root/.ssh/id_dsa):
< - ENTER
创建目录“/root/.ssh”。
输入密码(无密码为空):
< - ENTER
再次输入相同的密码:
< - ENTER
您的身份已保存在/root/.ssh/id_dsa中。
您的公钥已保存在/root/.ssh/id_dsa.pub中。
关键指纹是:
1b:95:bc:4a:f4:9f:d8:ea:24:31:0f:c9:72:d5:a7:80 root@server1.example.com
关键的randomart形象是:
+ - [DSA 1024] ---- +
|
|
|
o o |
|
E *。
。
|
|
o = o o |
|
。
S o。
|
|
+ O +。
|
|
+ + + |
|
o。
|
|
.o |
+ ----------------- +
root @ server1:〜#
重要的是,您不要输入密码,否则在没有人工交互的情况下镜像将无法正常工作,因此只需按ENTER键
!
接下来,我们将公钥复制到server2.example.com
:
ssh-copy-id -i $HOME/.ssh/id_dsa.pub root@192.168.0.101
root @ server1:〜#ssh-copy-id -i $ HOME / .ssh / id_dsa.pub root@192.168.0.101
主机'192.168.0.101(192.168.0.101)'的真实性无法建立。
RSA钥匙指纹为25:d8:7a:ee:c2:4b:1d:92:a7:3d:16:26:95:56:62:4e。
您确定要继续连接(是/否)?
< - 是(只有这是您第一次连接到server2时才会看到)
警告:将“192.168.0.101”(RSA)永久添加到已知主机列表中。
root@192.168.0.101的密码:
< - server2 root password
现在尝试使用“ssh”root@192.168.0.101“登录机器,并签入:
.ssh / authorized_keys
以确保我们没有添加您不期望的额外密钥。
root @ server1:〜#
现在检查server2的
server1
的公钥是否正确传输:
server2:
cat $HOME/.ssh/authorized_keys
ssh-dss AAAAB3NzaC1kc3MAAACBAPhiAexgEBexnw0rFG8lXwAuIsca/V+lhmv5lhF3BqUfAbL7e2sWlQlGhxZ8I2UnzZK8Ypffq6Ks+lp46yOs7MMXLqb7JBP9gkgqxyEWqOoUSt5hTE9ghupcCvE7rRMhefY5shLUnRkVH6hnCWe6yXSnH+Z8lHbcfp864GHkLDK1AAAAFQDddQckbfRG4C6LOQXTzRBpIiXzoQAAAIEAleevPHwi+a3fTDM2+Vm6EVqR5DkSLwDM7KVVNtFSkAY4GVCfhLFREsfuMkcBD9Bv2DrKF2Ay3OOh39269Z1rgYVk+/MFC6sYgB6apirMlHj3l4RR1g09LaM1OpRz7pc/GqIGsDt74D1ES2j0zrq5kslnX8wEWSHapPR0tziin6UAAACBAJHxgr+GKxAdWpxV5MkF+FTaKcxA2tWHJegjGFrYGU8BpzZ4VDFMiObuzBjZ+LrUs57BiwTGB/MQl9FKQEyEV4J+AgZCBxvg6n57YlVn6OEA0ukeJa29aFOcc0inEFfNhw2jAXt5LRyvuHD/C2gG78lwb6CxV02Z3sbTBdc43J6y root@server1.example.com |
4跑步统一
server1:
我们现在可以首次运行Unison来同步两个服务器上的/ var / www
目录。 在server1上
运行:
unison /var/www ssh://192.168.0.101//var/www
输出将类似于这一个 - 您可能必须回答几个问题,因为这是第一次Unison正在运行:
root @ server1:〜#unison / var / www ssh://192.168.0.101//var/www
联系服务器...
已连接[//server1.example.com//var/www - > //server2.example.com//var/www]
寻找变化
警告:没有找到这些根的归档文件,其规范名称是:
/ var / www
//server2.example.com//var/www
这也可能发生
因为这是你第一次同步这些根,
或者因为您将Unison升级到具有其他版本的新版本
存档格式。
如果副本是,更新检测可能需要一段时间
大。
Unison会假设这两个副本的“最后同步状态”
完全是空的
这意味着任何不同的文件
将被报告为冲突,以及只存在于一个的任何文件
复制品将被判断为新的,并被传播到另一个副本。
如果两个副本相同,则不会有任何更改。
如果您重复看到此消息,可能是因为您的一台机器
正在从DHCP获取其地址,这导致其主机名更改
在同步之间。
请参阅UNISONLOCALHOSTNAME的文档
环境变量,建议如何纠正这一点。
非常感谢对Unison项目的捐款:
http://www.cis.upenn.edu/~bcpierce/unison
等待服务器的更改|
webalizer
协调变更
本地server2.e ...
dir ----> apps [f]
file ----> index.html [f]
链接----> ispconfig [f]
dir ----> php-fcgi-scripts / apps [f]
dir ----> webalizer [f]
链接----> webmail [f]
继续传播更新?
[]
< - y
传播更新
UNISON 2.32.52于2011年7月26日14:25:02开始传播变更
[BGN]将应用从/ var / www复制到//server2.example.com //var/www
[BGN]将index.html从/ var / www复制到//server2.example.com //var/www
[BGN]将ispconfig从/ var / www复制到//server2.example.com//var/www
[BGN]将php-fcgi-scripts / apps从/ var / www复制到//server2.example.com //var/www
[BGN]将webalizer从/ var / www复制到//server2.example.com //var/www
[BGN]将webmail从/ var / www复制到//server2.example.com //var/www
[END]复制ispconfig
[END]复制网页邮件
[END]复制应用程式
[END]复制webalizer
[END]复制index.html
[END]复制php-fcgi-scripts / apps
UNISON 2.32.52于2011年7月26日14:25:03完成传播变更
保存同步器状态
同步在14:25:03完成(传送6个项目,0跳过0个失败)
root @ server1:〜#
现在检查server1
和server2
上的/ var / www
目录,你应该会发现它们现在在同步。
当然,我们不想以交互方式运行Unison,因此我们可以创建一个首选项文件( /root/.unison/default.prf
),其中包含我们在命令行上必须指定的所有设置:
vi /root/.unison/default.prf
# Roots of the synchronization root = /var/www root = ssh://192.168.0.101//var/www # Paths to synchronize #path = current #path = common #path = .netscape/bookmarks.html # Some regexps specifying names and paths to ignore #ignore = Path stats ## ignores /var/www/stats #ignore = Path stats/* ## ignores /var/www/stats/* #ignore = Path */stats ## ignores /var/www/somedir/stats, but not /var/www/a/b/c/stats #ignore = Name *stats ## ignores all files/directories that end with "stats" #ignore = Name stats* ## ignores all files/directories that begin with "stats" #ignore = Name *.tmp ## ignores all files with the extension .tmp # When set to true, this flag causes the user interface to skip # asking for confirmations on non-conflicting changes. (More # precisely, when the user interface is done setting the # propagation direction for one entry and is about to move to the # next, it will skip over all non-conflicting entries and go # directly to the next conflict.) auto=true # When this is set to true, the user interface will ask no # questions at all. Non-conflicting changes will be propagated; # conflicts will be skipped. batch=true # !When this is set to true, Unison will request an extra # confirmation if it appears that the entire replica has been # deleted, before propagating the change. If the batch flag is # also set, synchronization will be aborted. When the path # preference is used, the same confirmation will be requested for # top-level paths. (At the moment, this flag only affects the # text user interface.) See also the mountpoint preference. confirmbigdel=true # When this preference is set to true, Unison will use the # modification time and length of a file as a `pseudo inode # number' when scanning replicas for updates, instead of reading # the full contents of every file. Under Windows, this may cause # Unison to miss propagating an update if the modification time # and length of the file are both unchanged by the update. # However, Unison will never overwrite such an update with a # change from the other replica, since it always does a safe # check for updates just before propagating a change. Thus, it is # reasonable to use this switch under Windows most of the time # and occasionally run Unison once with fastcheck set to false, # if you are worried that Unison may have overlooked an update. # The default value of the preference is auto, which causes # Unison to use fast checking on Unix replicas (where it is safe) # and slow checking on Windows replicas. For backward # compatibility, yes, no, and default can be used in place of # true, false, and auto. See the section "Fast Checking" for more # information. fastcheck=true # When this flag is set to true, the group attributes of the # files are synchronized. Whether the group names or the group # identifiers are synchronizeddepends on the preference numerids. group=true # When this flag is set to true, the owner attributes of the # files are synchronized. Whether the owner names or the owner # identifiers are synchronizeddepends on the preference # extttnumerids. owner=true # Including the preference -prefer root causes Unison always to # resolve conflicts in favor of root, rather than asking for # guidance from the user. (The syntax of root is the same as for # the root preference, plus the special values newer and older.) # This preference is overridden by the preferpartial preference. # This preference should be used only if you are sure you know # what you are doing! prefer=newer # When this preference is set to true, the textual user interface # will print nothing at all, except in the case of errors. # Setting silent to true automatically sets the batch preference # to true. silent=true # When this flag is set to true, file modification times (but not # directory modtimes) are propagated. times=true |
评论应该使文件自我解释,除了路径
指令。 如果不指定路径
指令,则根
指令中的目录
将被同步。 如果指定路径
指令,则路径是相对于根
路径(例如, root = / var / www
和path = current
转换为/ var / www / current
),只有这些子目录将被同步,而不是指定的整个目录在根
指令中。
通过查看Unison的手册页,可以找到有关可用选项的更多信息:
man unison
现在我们把所有的设置放在一个首选项文件(特别是root
(和可选的路径
)指令)中,我们可以运行Unison而不用任何参数:
unison
5创建Cron作业
server1:
我们希望自动化同步,这就是为什么我们在server1.example.com
上创建一个cron作业的原因
:
crontab -e
*/5 * * * * /usr/bin/unison &> /dev/null |
这将每5分钟运行一次; 根据您的需要进行调整(见
man 5 crontab
)。 我在这里使用完整的路径( / usr / bin / unison
),以确保cron知道在哪里找到一致
。 您的一致
位置可能不同。 跑
which unison
找出你的位置。
6链接
- Unison: http : //www.cis.upenn.edu/~bcpierce/unison/
- Debian: http : //www.debian.org/