搭建SVN服务及实现备份
# 场景
某公司承接了两个开发项目,准备为开发项目组建立svn服务,收集开发人员一天开发的代码,要求有三点
- 1、 可以实现开发人员使用svn客户端连接使用
- 2、 需要实现代码的实施备份一遍灾难恢复
- 3、 开发人员可以执行上传下载操作
# 实现思路
- 1、 搭建svn版本控制,创建多个项目,客户端成功使用
- 2、 实现svn服务端与备份机的无登录交互
- 3、 结合ssh同步源实现代码同步
- 4、 测试增删改到备份机,数据是否一致
# 物理拓扑
在开始之前需要检查以下几点:
1、 主机名是否更改
2、 Hosts文件双方是否能够解析
3、 双方是否可以正常物理通信
4、 系统为最小化安装,并配置yum源安装了gcc编辑器以及Development tools
5、 确定好svn版本库树形结构
6、 关闭SELINUX
Svn版本库结构主要是分为了一个大的总版本库,版本库下面有两个分支,分别代表了一个项目,每个项目下面分别有骨干、分支、合并等,能够确定以上三点就可以实施了
# 部署svnserver
由于很多公司的svn是采用rpm的方式进行安装的,今天我这里也是一样,采用rpm的方式安装
检查系统是否已经默认安装了subversion,如果未安装执行
rpm -qa subversion
subversion-1.6.11-7.el6.x86_64
2
如果未安装请执行yum -y install subversion安装即可
按照版本库创建版本库,按照规范进行操作,在根目录下创建一个目录名为development,在development目录下面我们建立svn总版本库名为svndata
mkdir /development
svnadmin create /development/svndata
2
其中svnadmin 是svn的管理命令 可以使用 svnadmin –help查看相关帮助,create创建版本库的选项,想查看create后面的参数请使用 svnadmin help create 查看相关帮助。
在根目录下svnroot目录并在这个目录下创建两个大版本库分别为北京项目、天津项目,在这两个项目下建立分支,由于项目名称不能使用中文,请使用project1代表北京项目,使用project2代表天津项目
mkdir /svnroot
mkdir /svnroot/project1/trunk -p
mkdir /svnroot/project1/branch
mkdir /svnroot/project1/age
mkdir /svnroot/project2
mkdir /svnroot/project2/trunk -p
mkdir /svnroot/project2/branch
mkdir /svnroot/project2/age
ls /svnroot/
总用量 8
drwxr-xr-x 2 root root 4096 6月 5 17:58 project1
drwxr-xr-x 2 root root 4096 6月 5 17:58 project2
2
3
4
5
6
7
8
9
10
11
12
13
将这两个大版本库导入到svndata版本库下
svn import /svnroot/ file:///development/svndata/ -m "import svndata"
增加 /svnroot/project1
增加 /svnroot/project1/trunk
增加 /svnroot/project1/age
增加 /svnroot/project1/branch
增加 /svnroot/project2
增加 /svnroot/project2/trunk
增加 /svnroot/project2/age
增加 /svnroot/project2/branch
2
3
4
5
6
7
8
9
提交后的版本为 1。
解释一下以上命令的含义
Import 为导入命令,将/svnroot目录下的目录导入到svndata版本库下 -m输入日志信息
Import的其他用法请使用 svn help import查看具体帮助
官网查看http://subversion.apache.org/
先进入到svndata目录下有一个conf目录,里面存放了svndata版本库的配置文件
cd /development/svndata/conf/
/development/svndata/conf
ls -l
总用量 12
-rw-r--r-- 1 root root 1080 6月 5 17:50 authz
-rw-r--r-- 1 root root 309 6月 5 17:50 passwd
-rw-r--r-- 1 root root 2279 6月 5 17:50 svnserve.conf
2
3
4
5
6
7
其中svnserver.conf是svn版本库的配置文件,里面包含了认证文件的路径以及匿名用户是否拥有读取权限等操作
- passwd文件指定了用户的登录名以及对应的密码信息
- authz文件指定了passwd文件中用户的权限
为了便于管理,我习惯在/development目录下建立一个存放认证文件的目录名为svnpasswd
mkdir /development/svnpasswd
修改svnserve.conf文件,在修改之前先备份,备份的目的有两个,一个是便于操作失误能够进行快速还原,另外一个就是改完之后可以对比文件修改了那些地方
cp svnserve.conf svnserve.conf.backup
// 开始编辑,过程略,直接看编辑完成之后的结果,此文件的修改配置项必须定格,否则配置错误
diff svnserve.conf.backup svnserve.conf
12,13c12,13
< # anon-access = read
< # auth-access = write
\---
\> anon-access = none
\> auth-access = write
20c20
< # password-db = passwd
\---
\> password-db = /development/svnpasswd/passwd
27c27
< # authz-db = authz
\---
\> authz-db = /devdelopment/svnpasswd/authz
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
以<开头的是修改之前的配置项信息
以>开头的是修改之后的配置项信息
将authz passwd 文件复制到/development/svnpasswd目录下请切换到该目录
cp authz passwd /development/svnpasswd/
cd /development/svnpasswd/
pwd
/development/svnpasswd
// 编辑passwd文件定义用户属性,这里的用户分为两个项目组的用户,其中zhangsan、lisi为project1组的成员,有读写权限、liutao、gaoyuanyaun、chenglong为project2组的成员拥有读写权限,admin作为管理员对svndata总版本库拥有rw权限,Passwd文件主要定义有哪些用户,格式为 用户名 = 密码 #注意等号两边的空格以及书写必须顶格
[users] #存在
\# harry = harryssecret
\# sally = sallyssecret
zhangsan = 123456 #从这里之后都是添加,前面是用户名,后面是密码
lisi = 123456
liutao = 123456
gaoyuanyuan = 123456
chenglong = 123456
admin = 123456
2
3
4
5
6
7
8
9
10
11
12
13
14
定义authz文件,定义这些用户的权限,之中这里面有组的概念,可以将多个用户定义一个组,为组定义权限,组内的用户共享这个权限
此文件格式定义组的格式为:
[group] 存在
组名 = 用户 多个用户使用逗号进行分隔
版本库授权的格式为
[版本库根目录]
@组名 = 权限
用户名 = 权限
[版本库根目录:/项目目录]
@组名 = 权限
用户名 = 权限
[groups]
project1 = zhangsan,lisi
project2 = liutao,gaoyuanyuan,chenlong
[/]
admin = rw
[/project1]
@project1 = rw
[/project2]
@project2 = rw
\* =
2
3
4
5
6
7
8
9
10
启动svn服务
svnserve -d -r /development/svndata/
检查启动结果,端口号为3690,如果防火墙开启了请建立相关规则
svnserve -d -r /development/svndata/
netstat -anptlu | grep svn
tcp 0 0 0.0.0.0:3690 0.0.0.0:* LISTEN 34834/svnserve
iptables -I INPUT -p tcp --dport 3690 -j ACCEPT
service iptables save
2
3
4
5
6
7
# 客户端操作
安装客户端软件,软件下载地址http://pan.baidu.com/s/1c0YZJC,里面有汉化包,下载完成之后,直接双击安装即可
安装完成之后,在任意地点创建文件夹名字任意,我在桌面上创建一个文件夹为svndata
点击右键会出现一个SVN检出的选项点击一下
这里输入svn的路径即可点击确定,之后输入admin的用户信息,否则其他用户不能验证成功,
这里介绍一下svn客户端的三种登录方式
svn://ip地址 这种是svn默认的登录方式
http://ip地址 这种是结合了apache实现的 web登录方式
https://ip地址 这种是结合了apache+openssl实现的安全登录方式,.常用于外网svn
file:/// 本地的登录方式,一般在svn服务端本地操作时会用到
再创建两个文件夹,一个为peoject1,,一个为project2分别使用这两个项目组的用户登录
这是你登录进去就会发现属于project1组的项目就会出现在project1的文件夹中
同样project2也是一样
# svn实施同步
备份思路:
利用svn自带的 svnadmin dump命令进行全库备份以及增量备份,之后上传到备份服务器上
在备份机上操作
useradd rput && passwd rput
service sshd restart
ntpdate time.nist.gov
mkdir /backup
setfacl -R -m user:rput:rwx /backup/
setfacl -R -m default:user:rput:rwx /back
2
3
4
5
6
7
8
9
10
11
在服务器端操作
ntpdate time.nist.gov
mkdir /backup
mkdir /data
ssh-keygen -t rsa #后面一路回车即可
ssh-copy-id -I /root/.ssh/id_rsa.pub rput@192.168.1.67
2
3
4
5
6
7
8
9
建立全量,增量脚本
以下为两个脚本:
1、 全库备份
#!/bin/sh
SVN_DIR=/development/svndata/ #定义SVN库目录变量
SVN_BAK_DIR=/backup/ #定义备份文件存放目录变量
NUM1=$(cat /data/jsb_svn_id) #取初始化版本号
NUM2=$(svnlook youngest $SVN_DIR) #取当前最新的版本号
\#开始备份
svnadmin dump $SVN_DIR -r $NUM1:$NUM2 --incremental > $SVN_B
AK_DIR/whole_bak_$DATE
\#判断备份是否成功,若成功,则记录当前最新的版本号到临时文件中,
用于下次增量备份使用
if [ $? -eq 0 ];
then
echo $NUM2 > /data/jsb_svn_id
else
echo "backup fail...."
fi
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2、 增量备份
#!/bin/sh
SVN_DIR=/development/svndata/ #定义SVN库目录变量
SVN_BAK_DIR=/backup/ #定义备份文件存放目录变量
NUM1=$(cat /data/jsb_svn_id) #取初始化版本号
NUM2=$(svnlook youngest $SVN_DIR) #取当前最新的版本号
\#开始备份
svnadmin dump $SVN_DIR -r $NUM1:$NUM2 --incremental > $SVN_B
AK_DIR/ increment_bak_$DATE
\#判断备份是否成功,若成功,则记录当前最新的版本号到临时文件中,
用于下次增量备份使用
if [ $? -eq 0 ];
then
echo $NUM2 > /data/jsb_svn_id
else
echo "backup fail...."
fi
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
在配置计划任务之前请手动执行一次这两个脚本
建立计划任务,实现每周日凌晨1点进行一次全库备份,凌晨2点进行增量备份
最后利用rsync进行同步
rsync -azH /backup rput@192.168.1.67:/backup
crontab -e
00 1 * * 7 /bin/sh whole.sh
00 2 1 * * /bin/sh increment.sh
00 3 1 * * /usr/bin/rsync -azH /backup rput@192.168.1.67:/backup
2
3
4
5
6
7
8
9
恢复思路:
1、 建立全新的svn库
2、 使用最近一次的全库备份进行恢复,在进行每天的增量恢复
3、 进行结果查看
恢复命令
svnadmin load 要恢复的svn库 < 备份全路径