关于 十一月, 2011 的文章

利用Shell脚本实现自动备份VPS数据到Dropbox

之前发生过几次VPS宕机的故障,经询问托管商,解释是宿主机硬盘出问题,好在数据都在存储上,没有大碍。但却给自己敲了一个警钟,那就是得自己做好VPS的数据备份,尤其是Blog的目录和数据库。
但是VPS远在美国,手动下载备份文件速度会非常慢,于是我想到了Dropbox,它是目前美国名气最大的免费网络硬盘站点,在经过了一系列的搜索和失败的尝试之后,我终于发现了一个Shell脚本,无需安装任何Dropbox客户端程序,就可以实现自动备份VPS数据到Dropbox的功能。

相关截图如下
执行脚本后的显示:

在Dropbox中成功备份:

以下便是脚本的相关内容:
# vim DropboxBackup.sh

#!/bin/bash
# Settings
DROPBOX_DIR="/Backups" #Dropbox中的文件夹名称
BACKUP_SRC="/blog/rainbow" #需要备份的文件夹路径,可以同时指定多个
BACKUP_DST="/home/rainbow/backup" #用来存放备份的文件夹路径
MYSQL_SERVER="127.0.0.1" #连接本地MySQL
MYSQL_USER="root" #本地MySQL的用户
MYSQL_PASS="123456" #本地MySQL的密码

# Stop editing here
NOW=$(date +"%Y.%m.%d")
DESTFILE="$BACKUP_DST/$NOW.tgz"
LAST=$(date -d "2 months ago" +"%Y.%m.%d") #这里的时间可以根据需要进行修改,如"3 months ago"

# Backup files
ps -e | grep -c mysql
if [ $? -eq 0 ]; then
  echo "Dumping databases..."
  /web/mysql/bin/mysqldump -u $MYSQL_USER -h $MYSQL_SERVER -p$MYSQL_PASS --all-databases > "$BACKUP_DST/$NOW-Databases.sql" #这里的命令路径可以根据需要进行修改
else
  echo "ERROR. Now exiting..."
  exit 1
fi

if [ $? -eq 0 ]; then
  echo "Packing files..."
  tar -czf "$DESTFILE" $BACKUP_SRC "$BACKUP_DST/$NOW-Databases.sql"
else
  echo "ERROR. Now exiting..."
  exit 1
fi

if [ $? -eq 0 ]; then
  /home/rainbow/dropbox_uploader.sh upload "$DESTFILE" "$DROPBOX_DIR/$NOW.tgz" #这里的脚本路径可以根据需要进行修改
else
  echo "ERROR. Now exiting..."
  exit 1
fi

# Delete old files
if [ $? -eq 0 ]; then
  /home/rainbow/dropbox_uploader.sh delete "$DROPBOX_DIR/$LAST.tgz" #这里的脚本路径可以根据需要进行修改
else
  echo "ERROR. Now exiting..."
  exit 1
fi

if [ $? -eq 0 ]; then
  echo "Cleaning the backups..."
  rm -f "$BACKUP_DST/$NOW-Databases.sql"
  rm -f "$BACKUP_DST/$LAST.tgz"
else
  echo "ERROR. Now exiting..."
  exit 1
fi

# chmod +x DropboxBackup.sh
# crontab -e //设置为每个月执行一次备份,具体时间可以根据需要进行修改

00 02 1 * * /bin/bash  /home/rainbow/DropboxBackup.sh #这里的脚本路径可以根据需要进行修改

下载用于上传文件的dropbox_uploader.sh脚本,由http://www.andreafabrizi.it/?dropbox_uploader提供并维护。
# yum install git
# git clone http://github.com/andreafabrizi/Dropbox-Uploader.git
# cd Dropbox-Uploader
# chmod +x dropbox_uploader.sh
# mv dropbox_uploader.sh /home/rainbow/

初始化脚本,并按照脚本中的提示到对应的Dropbox的网页中创建API,在脚本的交互界面中输入生成的Key
# ./dropbox_uploader.sh

初始化完成以后,便可以立即执行一次DropboxBackup.sh脚本进行备份了
# /home/rainbow/DropboxBackup.sh

21 Comments

如何查看Linux下进程的IO活动状况

前段时间,几台测试服务器的Web应用响应速度非常慢,系统负载也比较高,> 10, 但CPU和内存却很闲,于是怀疑是磁盘的性能瓶颈,通过vmstat和iostat看到IO的读写量非常大,尤其是用iostat -x 1命令可以很直观的看到IO的使用率一直在100%。
但究竟是什么进程导致的高IO呢,由于每台服务器上都有JBoss和MySQL的存在,JBoss会不停的产生很多小的数据文件和生成文本数据库的数据,而MySQL则会不停的从Master同步新的数据。因此我们怀疑是这两个进程导致的高IO,通过停止了JBoss和MySQL之后,IO立刻降为0%. 但我们还是不能确定谁是主因,于是寻找可以查看特定进程IO的方法。

最后,找到了两个方法可以查看进程IO的活动状况。

1. 第一个方法是通过一个python脚本来实现。
方法是将以下内容另存为一个叫io.py的脚本中,然后直接以root身份执行脚本,就可以看到如下图所示的信息(由于我们已经通过升级到SSD硬盘解决了MySQL的IO问题,所以不能提供关于MySQL的截图了),其中出现次数最多,数据最大的进程,就是导致高IO的主因。不过比较遗憾的是这个脚本并不能显示进程在每一秒的准确的IO读写。

# vim io.py
# chmod +x io.py
# ./io.py

#!/usr/bin/python
# Monitoring per-process disk I/O activity
# written by http://www.vpsee.com 

import sys, os, time, signal, re

class DiskIO:
    def __init__(self, pname=None, pid=None, reads=0, writes=0):
        self.pname = pname
        self.pid = pid
        self.reads = 0
        self.writes = 0

def main():
    argc = len(sys.argv)
    if argc != 1:
        print "usage: ./iotop"
        sys.exit(0)

    if os.getuid() != 0:
        print "must be run as root"
        sys.exit(0)

    signal.signal(signal.SIGINT, signal_handler)
    os.system('echo 1 > /proc/sys/vm/block_dump')
    print "TASK              PID       READ      WRITE"
    while True:
        os.system('dmesg -c > /tmp/diskio.log')
        l = []
        f = open('/tmp/diskio.log', 'r')
        line = f.readline()
        while line:
            m = re.match(\
                '^(\S+)\((\d+)\): (READ|WRITE) block (\d+) on (\S+)', line)
            if m != None:
                if not l:
                    l.append(DiskIO(m.group(1), m.group(2)))
                    line = f.readline()
                    continue
                found = False
                for item in l:
                    if item.pid == m.group(2):
                        found = True
                        if m.group(3) == "READ":
                            item.reads = item.reads + 1
                        elif m.group(3) == "WRITE":
                            item.writes = item.writes + 1
                if not found:
                    l.append(DiskIO(m.group(1), m.group(2)))
            line = f.readline()
        time.sleep(1)
        for item in l:
            print "%-10s %10s %10d %10d" % \
                (item.pname, item.pid, item.reads, item.writes)

def signal_handler(signal, frame):
    os.system('echo 0 > /proc/sys/vm/block_dump')
    sys.exit(0)

if __name__=="__main__":
    main()

2. 另一个方法是将Linux的内核升级到 >=2.6.20,然后安装一个iotop软件来实现。
不过这种改动并不适用于生产环境,因为在RHEL5.6和5.7上,内核都在 2.6.20以下。但是它所显示的结果是非常准确的,所以对于新上线的机器以及测试环境,非常值得一试,具体方法如下:
阅读全文 »

3 Comments

关于Oracle专用模式与共享模式的请教

今天无意之中翻到一个Word文档,打开一看居然是我在2010年1月14日,也就是一年多以前和一阵风大哥的聊天记录,是关于向他请教Oracle专用模式与共享模式的区别的,当时正好在做项目的过程中遇到了这个问题,虽然也查找过一些资料,但心里其实还是没底,而经过一阵风大哥的经验分享之后,就放心的把Oracle设置为了专用模式。
在这里,我把当时的聊天记录帖给大家,以供大家参考。

Rainbow  15:03:58
一阵风大哥。
请教你个问题。

一阵风  15:05:08
呵呵 什么问题 彩虹男

Rainbow  15:05:35
一般你Oracle用dbca建库时,是指定的共享模式还是专用模式呢?

一阵风  15:05:51
一般都是专用模式的
也是默认模式

Rainbow  15:06:07
但公司里有个前辈,他说共享模式好。
让我以后都建成共享模式。

一阵风  15:06:25
那看多少并发  还有业务方面了

Rainbow  15:06:30
我不知道它们到底有什么区别。
一般怎么来判断它们哪一种更适合业务?

一阵风  15:07:22
专用模式会为每个连接创建专有的服务进程,会分配专有的PGA 
如果你的pga比较大  专用模式比较有优的
如果并发比较大 短连接的话 共享模式好一点

Rainbow  15:09:15
好一点的话,主要是好在哪里?
速度,还是主机的资源耗用?

一阵风  15:12:21
比如 并发比较高  用专用模式比较耗资源  你可以g一下 网上有这方面说明
在dedicated server里,当你有大量的用户连接(比如,同一时间超过5000个用户连上来),你的系统负担就会相当大。而这种情况shared servers就可以处理的相对好一些,因为加入同时有5000个用户连上来而且我们知道一般只有1%的连接是active,那我们只需要设置50个 shared servers就可以把所有的用户请求处理得很好,并节省了系统资源。

Rainbow  15:16:11
知道啦,谢谢咯

一阵风  15:16:11
共享连接只是把连接SESSION信息放在LARGE POOL,所以LARGE POOL要大一些。而专用连接的SESION信息放在PGA。
不客气

Rainbow  15:16:52
那我用的10g,参数那里还用默认的百分比行不行啊?

一阵风  15:17:41
默认就行 你把SGA设置系统自动分配就行

Rainbow  15:18:02
还有就是我们有一些中间件软件,比如用Tomcat,weblogic这些之后。

一阵风  15:18:07
只设置一个sga最大值就行

Rainbow  15:18:16
是不是用共享模式就不如专用模式?

一阵风  15:18:52
我这边全是专用模式  也是tomcat  目前主要并发不是很大

Rainbow  15:19:34
按你那边的经验,如果并发达到300左右。8G内存的Server性能上如何?

一阵风  15:20:54
就用专用模式  然后把PGA设置大一点比如:5G

Rainbow  15:21:35
太感谢啦。

一阵风  15:21:43
不客气  多多交流

下面是一些总结性的言论:
---------------------------------------------------------------
共享模式适用了一种类似连接池的概念,但实际应用中效果不是很好,不知道在10g中有没有改善。
---------------------------------------------------------------
专用模式和共享模式的本质区别就是: 用户进程对ORACLE内存区里"服务器进程"的专用还是共享。
具体表现在:
1、在共享模式下,多个用户进程共享一个服务器进程,在专用模式下,ORACLE为每一个用户进程准备一个服务器进程。
2、在实际情况中,应用系统与数据库的连接请求总是很多,导致用户进程也很多,如果你的内存和CPU是有限的,同时,用户进程对数据库的操作占用空间不多,那你就把数据库连接模式设置为共享模式,这样,ORACLE内存区的服务器进程只是有限的几个,这几个服务器进程会通过一个调度程序来应付若干用户进程的请求。
3、如果你的硬件资源比较好,就设置成专用模式,每一个用户进程都有一个服务器进程对应,这样,你的用户进程对数据的处理会非常快!
---------------------------------------------------------------
简单的说,连接数少,需要长时间占用数据库的,建议用专有模式,如果连接数众多而系统资源有限,使用共享模式。
---------------------------------------------------------------

No Comments

解决Cisco VPN Client Reason 442: Failed to Enable Virtual Adapter

我发现最近在家里通过Cisco VPN Client 连接到VPN服务器的时候,客户端经常报错。

Reason 442: Failed to Enable Virtual Adapter

折腾很久,国内的国外的网站搜遍了也未能找到原因,终于最后自己偶然发现了解决这个问题的办法,那就是 “开始” – “运行” – “services.msc” – 停止 “Internet Connection Sharing (ICS)”,话说这类问题虽没什么技术含量,但遇到的时候真的很让人郁闷。

13 Comments