欢迎光临
我们一直在努力

MySQL 之XtraBackup全量增量热备实践

u22e阅读(1606)

一、前言

在日常的linux运维工作中,大数据量备份与还原,始终是个难点。关于mysql的备份和恢复,比较传统的是用mysqldump工具,今天推荐另一个备份工具innobackupex。

innobackupex和mysqldump都可以对mysql进行热备份的,mysqldump对mysql的innodb的备份可以使用single-transaction参数来开启一个事务,利用innodb的mvcc来不进行锁表进行热备份,mysqldump备份是逻辑备份,备份出来的文件是sql语句,所以备份和恢复的时候很慢,但是备份和恢复时候很清楚。当MYSQL数据超过10G时,用mysqldump来导出备份就比较慢了,此种情况下用innobackupex这个工具就比mysqldump要快很多。利用它对mysql做全量和增量备份.

Percona XtraBackup可以说是一个相对完美的免费开源数据备份工具,是使用perl语言完成的脚本工具,能够非常快速地备份与恢复mysql数据库,且支持在线热备份(备份时不影响数据读写),此工具调用xtrabackup和tar4ibd工具,实现很多对性能要求并不高的任务和备份逻辑,可以说它是innodb热备工具ibbackup的一个开源替代品。

XtraBackup是目前首选的备份方案之一

二、原理

1、MySQL主从同步原理

MySQL主从同步是在MySQL主从复制(Master-Slave Replication)基础上实现的,通过设置在Master MySQL上的binlog(使其处于打开状态),Slave MySQL上通过一个I/O线程从Master MySQL上读取binlog,然后传输到Slave MySQL的中继日志中,然后Slave MySQL的SQL线程从中继日志中读取中继日志,然后应用到Slave MySQL的数据库中。这样实现了主从数据同步功能。

2、XtraBackup备份原理

innobackupex在后台线程不断追踪InnoDB的日志文件,然后复制InnoDB的数据文件。数据文件复制完成之后,日志的复制线程也会结束。这样就得到了不在同一时间点的数据副本和开始备份以后的事务日志。完成上面的步骤之后,就可以使用InnoDB崩溃恢复代码执行事务日志(redo log),以达到数据的一致性。

3、备份的两个过程

backup,备份阶段,追踪事务日志和复制数据文件(物理备份)。

preparing,重放事务日志,使所有的数据处于同一个时间点,达到一致性状态。

4、XtraBackup的优点

1、可以快速可靠的完成数据备份(复制数据文件和追踪事务日志)

2、数据备份过程中不会中断事务的处理(热备份)

3、节约磁盘空间和网络带宽

4、自动完成备份鉴定

5、因更快的恢复时间而提高在线时间

5、Xtrabackup的两个工具

1)xtrabackup :只能用于热备份innodb,xtradb两种数据引擎表的工具,不能备份其他表。

2)innobackupex:是一个对xtrabackup封装的perl脚本,提供了用于myisam(会锁表)和innodb引擎,及混合使用引擎备份的能力。主要是为了方便同时备份InnoDB和MyISAM引擎的表,但在处理myisam时需要加一个读锁。并且加入了一些使用的选项。如slave-info可以记录备份恢 复后,作为slave需要的一些信息,根据这些信息,可以很方便的利用备份来重做slave。 innobackupex比xtarbackup有更强的功能,它整合了xtrabackup和其他的一些功能,它不但可以全量备份/恢复,还可以基于时间的增量备份与恢复。innobackupex同时支持innodb,myisam。

6、Xtrabackup可以做什么

1)在线(热)备份整个库的InnoDB, XtraDB表

2)在xtrabackup的上一次整库备份基础上做增量备份(innodb only)

3)以流的形式产生备份,可以直接保存到远程机器上(本机硬盘空间不足时很有用)

MySQL数据库本身提供的工具并不支持真正的增量备份,二进制日志恢复是point-in-time(时间点)的恢复而不是增量备份。

7、Xtrabackup工具工作原理

支持对InnoDB存储引擎的增量备份

1)首先完成一个完全备份,并记录下此时检查点的LSN(Log Sequence Number)。

2)在进行增量备份时,比较表空间中每个页的LSN是否大于上次备份时的LSN,如果是,则备份该页,同时记录当前检查点的LSN。首先,在logfile中找到并记录最后一个checkpoint(“last checkpoint LSN”),然后开始从LSN的位置开始拷贝InnoDB的logfile到xtrabackup_logfile;接着,开始拷贝全部的数据文件.ibd;在拷贝全部数据文件结束之后,才停止拷贝logfile。因为logfile里面记录全部的数据修改情况,所以,即时在备份过程中数据文件被修改过了,恢复时仍然能够通过解析xtrabackup_logfile保持数据的一致。

8、innobackupex备份mysql数据的流程

innobackupex首先调用xtrabackup来备份innodb数据文件,当xtrabackup完成后,innobackupex就查看文件xtrabackup_suspended ;然后执行“FLUSH TABLES WITH READ LOCK”来备份其他的文件。

9、innobackupex恢复mysql数据的流程

innobackupex首先读取my.cnf,查看变量(datadir,innodb_data_home_dir,innodb_data_file_path,innodb_log_group_home_dir)对应的目录是存在,确定相关目录存在后,然后先copy myisam表和索引,然后在copy innodb的表、索引和日志。

10、innobackupex备份和恢复的工作原理

(1)备份的工作原理

如果在程序启动阶段未指定模式,innobackupex将会默认以备份模式启动。默认情况下,此脚本以–suspend-at-end选项启动xtrabackup,然后xtrabackup程序开始拷贝InnoDB数据文件。当xtrabackup程序执行结束,innobackupex将会发现xtrabackup创建了xtrabackup_suspended_2文件,然后执行FLUSH TABLES WITH READ LOCK,此语句对所有的数据库表加读锁。然后开始拷贝其他类型的文件。

如果–ibbackup未指定,innobackupex将会自行尝试确定使用的xtrabackup的binary。其确定binary的逻辑如下:首先判断备份目录中xtrabackup_binary文件是否存在,如果存在,此脚本将会依据此文件确定使用的xtrabackup binary。否则,脚本将会尝试连接database server,通过server版本确定binary。 如果连接无法建立,xtrabackup将会失败,需要自行指定binary文件。

在binary被确定后,将会检查到数据库server的连接是否可以建立。其执行逻辑是:建立连接、执行query、关闭连接。若一切正常,xtrabackup将以子进程的方式启动。

FLUSH TABLES WITH READ LOCK是为了备份MyISAM和其他非InnoDB类型的表,此语句在xtrabackup已经备份InnoDB数据和日志文件后执行。在这之后,将会备份 .frm, .MRG, .MYD, .MYI, .TRG, .TRN, .ARM, .ARZ, .CSM, .CSV, .par, and .opt 类型的文件。

当所有上述文件备份完成后,innobackupex脚本将会恢复xtrabackup的执行,等待其备份上述逻辑执行过程中生成的事务日志文件。接下来,表被解锁,slave被启动,到server的连接被关闭。接下来,脚本会删掉xtrabackup_suspended_2文件,允许xtrabackup进程退出。

(2)恢复的工作原理 为了恢复一个备份,innobackupex需要以–copy-back选项启动。

innobackupex将会首先通过my.cnf文件读取如下变量:datadir, innodb_data_home_dir, innodb_data_file_path, innodb_log_group_home_dir,并确定这些目录存在。

接下来,此脚本将会首先拷贝MyISAM表、索引文件、其他类型的文件(如:.frm, .MRG, .MYD, .MYI, .TRG, .TRN, .ARM, .ARZ, .CSM, .CSV, par and .opt files),接下来拷贝InnoDB表数据文件,最后拷贝日志文件。

拷贝执行时将会保留文件属性,在使用备份文件启动MySQL前,可能需要更改文件的owener(如从拷贝文件的user更改到mysql用户)。

三、配置

1、准备工作

#系统环境

[root@master tools]# cat /etc/redhat-release 
CentOS release 6.8 (Final)
[root@master tools]# uname -r
2.6.32-642.el6.x86_64

#主数据库版本

[root@master ~]# mysql -V
mysql  Ver 14.14 Distrib 5.5.32, for Linux (x86_64) using readline 5.1

#检查数据库引擎

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
8 rows in set (0.00 sec)

#主从数据库同步注意点 [mysqld]

#主从之间的id不能相同 server-id

#启用二进制日志 log-bin

#一般在从库开启(可选) read_only #推荐使用InnoDB并做好相关配置

#检查主从数据库状态

[root@master ~]# mysql -e "show global variables like 'server_id';"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 241   |
+---------------+-------+
[root@slave01 ~]# mysql -e "show global variables like 'server_id';"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 242   |
+---------------+-------+

2、安装percona-xtrabackup

官网安装包地址 – https://www.percona.com/downloads/XtraBackup/LATEST/

1)源码安装Xtrabackup

将源码包下载到/usr/local/src下

源码包下载

cd /usr/local/src

yum -y install cmake gcc gcc-c++ libaio libaio-devel automake autoconf bzr bison libtool  zlib-devel libgcrypt-devel  libcurl-devel  crypt*  libgcrypt* python-sphinx openssl   imake libxml2-devel expat-devel   ncurses5-devel ncurses-devle   vim-common  libgpg-error-devel   libidn-devel perl-DBI  perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL 

wget http://www.percona.com/downloads/XtraBackup/XtraBackup-2.1.9/source/percona-xtrabackup-2.1.9.tar.gz

tar -zvxf percona-xtrabackup-2.1.9.tar.gz

cd percona-xtrabackup-2.1.9


[root@master percona-xtrabackup-2.1.9]# ./utils/build.sh     //执行该安装脚本,会出现下面信息
Build an xtrabackup binary against the specified InnoDB flavor.

Usage: build.sh CODEBASE
where CODEBASE can be one of the following values or aliases:
  innodb51         | plugin                build against InnoDB plugin in MySQL 5.1
  innodb55         | 5.5                   build against InnoDB in MySQL 5.5
  innodb56         | 5.6,xtradb56,         build against InnoDB in MySQL 5.6
                   | mariadb100,galera56
  xtradb51         | xtradb,mariadb51      build against Percona Server with XtraDB 5.1
                   | mariadb52,mariadb53
  xtradb55         | galera55,mariadb55    build against Percona Server with XtraDB 5.5

根据上面提示和你使用的存储引擎及版本,选择相应的参数即可。因为我用的是MySQL 5.5版本,所以执行如下语句安装:

[root@master percona-xtrabackup-2.1.9]# ./utils/build.sh innodb55

以上语句执行成功后,表示安装完成。

最后,把生成的二进制文件拷贝到一个自定义目录下(本例中为/home/mysql/admin/bin/percona-xtrabackup-2.1.9),并把该目录放到环境变量PATH中。

mkdir -p /home/mysql/admin/bin/percona-xtrabackup-2.1.9/
cp ./innobackupex /home/mysql/admin/bin/percona-xtrabackup-2.1.9/
mv /usr/local/src/percona-xtrabackup-2.1.9/src/xtrabackup_innodb55 xtrabackup_55 
cp /usr/local/src/percona-xtrabackup-2.1.9/src/xtrabackup_55 /usr/local/src/percona-xtrabackup-2.1.9/src/xbstream  /home/mysql/admin/bin/percona-xtrabackup-2.1.9/

vim /etc/profile

export PATH=$PATH:/home/mysql/admin/bin/percona-xtrabackup-2.1.9/

刷新profile并测试下innobackupex是否正常使用

source /etc/profile

测试下innobackupex是否正常使用

innobackupex --help

3、全量备份和恢复

1)全量备份操作

执行下面语句进行全备: mysql的安装目录是/application/mysql/ mysql的配置文件路径/etc/my.cnf 全量备份后的数据存放目录是/backup/mysql/data

mkdir -p /backup/mysql/data/
innobackupex --defaults-file=/etc/my.cnf --user=root /backup/mysql/data/
170404 12:46:29  innobackupex: Waiting for log copying to finish

xtrabackup: The latest check point (for incremental): '1639325'
xtrabackup: Stopping log copying thread.
.>> log scanned up to (1639325)

xtrabackup: Creating suspend file '/backup/mysql/data/2017-04-04_12-46-24/xtrabackup_log_copied' with pid '21223'
xtrabackup: Transaction log of lsn (1639325) to (1639325) was copied.
170404 12:46:30  innobackupex: All tables unlocked

innobackupex: Backup created in directory '/backup/mysql/data/2017-04-04_12-46-24'
innobackupex: MySQL binlog position: filename 'mysql-bin.000019', position 967
170404 12:46:30  innobackupex: Connection to database server closed
170404 12:46:30  innobackupex: completed OK!

出现上面的信息,表示备份已经ok。

上面执行的备份语句会将mysql数据文件(即由my.cnf里的变量datadir指定)拷贝至备份目录下(/backup/mysql/data)

注意:如果不指定–defaults-file,默认值为/etc/my.cnf。 备份成功后,将在备份目录下创建一个时间戳目录(本例创建的目录为/backup/mysql/data/2017-04-04_12-46-24),在该目录下存放备份文件。

[root@master data]# ll /backup/mysql/data/
总用量 4
drwxr-xr-x 6 root root 4096 44 16:56 2017-04-04_16-56-35
[root@master data]# ll 2017-04-04_16-56-35/
总用量 18468
-rw-r--r-- 1 root root      188 44 16:56 backup-my.cnf
-rw-r----- 1 root root 18874368 44 16:56 ibdata1
drwxr-xr-x 2 root root     4096 44 16:56 mysql
drwxr-xr-x 2 root root     4096 44 16:56 performance_schema
drwxr-xr-x 2 root root     4096 44 16:56 test
-rw-r--r-- 1 root root       13 44 16:56 xtrabackup_binary
-rw-r--r-- 1 root root       23 44 16:56 xtrabackup_binlog_info
-rw-r----- 1 root root       89 44 16:56 xtrabackup_checkpoints
-rw-r----- 1 root root     2560 44 16:56 xtrabackup_logfile
drwxr-xr-x 2 root root     4096 44 16:56 xtra_test

还可以在远程进行全量备份,命令如下:

innobackupex --defaults-file=/etc/my.cnf --user=root  --host=127.0.0.1 --parallel=2 --throttle=200 /backup/mysql/data 2>/backup/mysql/data/bak.log 1>/backup/mysql/data/`data +%Y-%m-%d_%H-%M%S`

参数解释:

--user=root             备份操作用户名,一般都是root用户 

--host=127.0.0.1            主机ip,本地可以不加(适用于远程备份)。注意要提前在mysql中授予连接的权限,最好备份前先测试用命令中的用户名、密码和host能否正常连接mysql。

--parallel=2 --throttle=200      并行个数,根据主机配置选择合适的,默认是1个,多个可以加快备份速度。

/backup/mysql/data            备份存放的目录

2>/backup/mysql/data/bak.log       备份日志,将备份过程中的输出信息重定向到bak.log

这种备份跟上面相比,备份成功后,不会自动在备份目录下创建一个时间戳目录,需要如上命令中自己定义。
[root@master src]# ll /backup/mysql/data/
总用量 8
drwxr-xr-x 6 root root 4096 44 12:46 2017-04-04_12-46-24
-rw-r--r-- 1 root root  106 44 12:57 bak.log    //备份信息都记录在这个日志里,如果备份失败,可以到这里日志里查询

2)全量备份后的恢复操作

[root@master data]# mysql

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| xtra_test          |
+--------------------+
5 rows in set (0.09 sec)

mysql> use xtra_test;
Database changed
mysql> show tables;
+---------------------+
| Tables_in_xtra_test |
+---------------------+
| I                   |
| M                   |
+---------------------+
2 rows in set (0.04 sec)


mysql> drop database xtra_test;
Query OK, 2 rows affected (0.34 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.00 sec)

注意:恢复之前

1)要先关闭数据库

2)要删除数据文件和日志文件(也可以mv移到别的地方,只要确保清空mysql数据存放目录就行)

[root@master data]# ps -ef|grep mysqld
root     10929     1  0 10:32 pts/0    00:00:00 /bin/sh /application/mysql/bin/mysqld_safe --datadir=/application/mysql/data --pid-file=/application/mysql/data/master.pid
mysql    11227 10929  0 10:32 pts/0    00:00:14 /application/mysql/bin/mysqld --basedir=/application/mysql --datadir=/application/mysql/data --plugin-dir=/application/mysql/lib/plugin --user=mysql --log-error=/application/mysql/data/master.err --pid-file=/application/mysql/data/master.pid --port=3306
root     21514  1896  0 13:55 pts/0    00:00:00 grep mysqld

由上面可以看出mysql的数据和日志存放目录是/application/mysql/data

[root@master data]# service mysqld stop
Shutting down MySQL.... SUCCESS!

[root@master data]# mv  /application/mysql/data/* /tmp/

[root@master data]# ls /application/mysql/data/
[root@master data]#
[root@master data]# innobackupex --defaults-file=/etc/my.cnf --user=root --use-memory=1G --apply-log /backup/mysql/data/2017-04-04_13-04-05/

[root@master data]# innobackupex --defaults-file=/etc/my.cnf --user=root --copy-back /backup/mysql/data/2017-04-04_13-04-05/

[root@master ~]# chown -R mysql.mysql /application/mysql/data/

可能报错:

sh: xtrabackup: command not found
innobackupex: Error: no 'mysqld' group in MySQL options at /home/mysql/admin/bin/percona-xtrabackup-2.1.9/innobackupex line 4350.

解决:将xtrabackup_55复制成xtrabackup即可

[root@master src]# ls /home/mysql/admin/bin/percona-xtrabackup-2.1.9/
innobackupex  xbstream  xtrabackup_55  xtrabackup_innodb55

[root@master src]# cd /home/mysql/admin/bin/percona-xtrabackup-2.1.9/

[root@master percona-xtrabackup-2.1.9]# cp xtrabackup_55 xtrabackup

[root@master percona-xtrabackup-2.1.9]# ls
innobackupex  xbstream  xtrabackup  xtrabackup_55  xtrabackup_innodb55

检验:执行之后就OK了

[root@master percona-xtrabackup-2.1.9]# innobackupex --defaults-file=/etc/my.cnf --user=root --copy-back /backup/mysql/data/2017-04-04_13-04-05/


innobackupex: Copying '/backup/mysql/data/2017-04-04_13-04-05/ib_logfile1' to '/application/mysql/data/ib_logfile1'
innobackupex: Copying '/backup/mysql/data/2017-04-04_13-04-05/ib_logfile0' to '/application/mysql/data/ib_logfile0'
innobackupex: Finished copying back files.

170404 14:24:07  innobackupex: completed OK!

出现上面的信息,说明数据恢复成功了!!

从上面的恢复操作可以看出,执行恢复分为两个步骤:

1)第一步恢复步骤是应用日志(apply-log),为了加快速度,一般建议设置–use-memory(如果系统内存充足,可以使用加大内存进行备份 ),这个步骤完成之后,目录/backup/mysql/data/2017-04-04_13-04-05/下的备份文件已经准备就绪。

2)第二步恢复步骤是拷贝文件(copy-back),即把备份文件拷贝至原数据目录下。

最后,启动mysql,查看数据是否恢复回来了

[root@master ~]# /etc/init.d/mysqld start
Starting MySQL.. SUCCESS! 

[root@master ~]# mysql

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| xtra_test          |
+--------------------+
5 rows in set (0.00 sec)

mysql> use xtra_test;
Database changed
mysql> show tables;
+---------------------+
| Tables_in_xtra_test |
+---------------------+
| I                   |
| M                   |
+---------------------+
2 rows in set (0.00 sec)

4、增量备份和恢复

特别注意:

innobackupex 增量备份仅针对InnoDB这类支持事务的引擎,对于MyISAM等引擎,则仍然是全备。

1)增量备份操作

增量备份需要基于全量备份

先假设我们已经有了一个全量备份(如上面的/backup/mysql/data/2017-04-04_16-56-35),我们需要在该全量备份的基础上做第一次增量备份。

[root@master ~]# innobackupex --defaults-file=/etc/my.cnf --user=root  --incremental-basedir=/backup/mysql/data/2017-04-04_16-56-35/ --incremental /backup/mysql/data

其中:

–incremental-basedir 指向全量备份目录 –incremental 指向增量备份的目录

上面语句执行成功之后,会在–incremental执行的目录下创建一个时间戳子目录(本例中为:/backup/mysql/data/2017-04-04_14-37-24),在该目录下存放着增量备份的所有文件。

[root@master data]# ll
总用量 8
drwxr-xr-x 6 root root 4096 44 16:56 2017-04-04_16-56-35   //全量备份目录
drwxr-xr-x 6 root root 4096 44 16:59 2017-04-04_16-58-58  //增量备份目录

在备份目录下,有一个文件xtrabackup_checkpoints记录着备份信息,其中可以查出

1)全量备份的信息如下:

[root@master data]# cd /backup/mysql/data/2017-04-04_16-56-35/
[root@master 2017-04-04_16-56-35]# cat xtrabackup_checkpoints 
backup_type = full-backuped
from_lsn = 0
to_lsn = 1639436
last_lsn = 1639436
compact = 0

2)基于以上全量备份的增量备份的信息如下:

[root@master data]# cd /backup/mysql/data/2017-04-04_16-58-58/
[root@master 2017-04-04_16-58-58]# cat xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 1639436
to_lsn = 1639436
last_lsn = 1639436
compact = 0

从上面可以看出,增量备份的from_lsn正好等于全备的to_lsn。

那么,我们是否可以在增量备份的基础上再做增量备份呢?

答案是肯定的,只要把–incremental-basedir执行上一次增量备份的目录即可,如下所示:

[root@master data]# innobackupex --defaults-file=/etc/my.cnf --user=root --incremental-basedir=/backup/mysql/data/2017-04-04_16-58-58/ --incremental /backup/mysql/data 

[root@master ~]# ll /backup/mysql/data/
总用量 12
drwxr-xr-x 6 root root 4096 44 16:56 2017-04-04_16-56-35    //全量备份目录
drwxr-xr-x 6 root root 4096 44 16:59 2017-04-04_16-58-58    //增量备份目录1
drwxr-xr-x 6 root root 4096 44 17:02 2017-04-04_17-02-35  //增量备份目录2

它的trabackup_checkpoints记录着备份信息如下:

[root@master ~]# cd /backup/mysql/data/2017-04-04_17-02-35/
[root@master 2017-04-04_17-02-35]# cat xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 1639436
to_lsn = 1639436
last_lsn = 1639436
compact = 0

可以看到,第二次增量备份的from_lsn是从上一次增量备份的to_lsn开始的

2)增量备份后的恢复操作

增量备份的恢复要比全量备份复杂很多,增量备份与全量备份有着一些不同,尤其要注意的是:

1)需要在每个备份(包括完全和各个增量备份)上,将已经提交的事务进行“重放”。“重放”之后,所有的备份数据将合并到完全备份上。

2)基于所有的备份将未提交的事务进行“回滚”。于是,操作就变成了:不能回滚,因为有可能第一次备份时候没提交,在增量中已经成功提交

第一步是在所有备份目录下重做已提交的日志(注意备份目录路径要跟全路径)

其中:

一定要全路径

BASE-DIR 是指全量备份的目录

INCREMENTAL-DIR-1 是指第一次增量备份的目录

INCREMENTAL-DIR-2 是指第二次增量备份的目录,以此类推。

这里要注意的是:

1)最后一步的增量备份并没有–redo-only选项!回滚进行崩溃恢复过程

2)可以使用–use_memory提高性能。

以上语句执行成功之后,最终数据在BASE-DIR(即全量目录)下,其实增量备份就是把增量目录下的数据,整合到全变量目录下,然后在进行,全数据量的还原。

第一步完成之后,我们开始下面关键的第二步,即拷贝文件,进行全部还原!注意:必须先停止mysql数据库,然后清空数据库目录(这里是指/data/mysql/data)下的文件。

4)innobackupex –copy-back BASE-DIR

同样地,拷贝结束之后,记得检查下数据目录(这里指/data/mysql/data)的权限是否正确(修改成mysql:mysql),然后再重启mysql。

接下来进行案例说明:

假设我们已经有了一个全量备份2017-04-04_16-56-35 删除在上面测试创建的两个增量备份

[root@master ~]# cd /backup/mysql/data/

[root@master data]# ll
drwxr-xr-x 6 root root 4096 44 17:08 2017-04-04_16-56-35
drwxr-xr-x 6 root root 4096 44 17:08 2017-04-04_16-58-58
drwxr-xr-x 6 root root 4096 44 17:08 2017-04-04_17-02-35

[root@master data]# rm -fr 2017-04-04_16-58-58 2017-04-04_17-02-35


[root@master data]# ll
drwxr-xr-x 6 root root 4096 44 17:08 2017-04-04_16-56-35

假设在全量备份后,mysql数据库中又有新数据写入

[root@master data]# mysql

mysql> create database ceshi;
Query OK, 1 row affected (0.00 sec)

mysql> use ceshi
Database changed
mysql> create table test1(
    -> id int3,
    -> name varchar(20)
    -> );
Query OK, 0 rows affected (0.26 sec)

mysql> insert into test1 values(1,"chenbaojia");
Query OK, 1 row affected (0.05 sec)

mysql> select * from test1;
+------+------------+
| id   | name       |
+------+------------+
|    1 | chenbaojia |
+------+------------+
1 row in set (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| ceshi              |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

然后进行一次增量备份:

[root@master data]# innobackupex --defaults-file=/etc/my.cnf --user=root --incremental-basedir=/backup/mysql/data/2017-04-04_16-56-35/ --incremental /backup/mysql/data/


[root@master data]# ll
总用量 8
drwxr-xr-x 6 root root 4096 44 17:08 2017-04-04_16-56-35       //全量备份目录
drwxr-xr-x 6 root root 4096 44 17:28 2017-04-04_17-28-14        //增量备份目录

接着再在mysql数据库中写入新数据

[root@master data]# mysql

mysql> use ceshi;
Database changed

mysql> insert into test1  values(2,"pelosi");
Query OK, 1 row affected (0.11 sec)

mysql> insert into test1 values(3,"hiofo");
Query OK, 1 row affected (0.06 sec)

mysql> insert into test1 values(4,"mac");
Query OK, 1 row affected (0.09 sec)

mysql> select * from test1;
+------+------------+
| id   | name       |
+------+------------+
|    1 | chenbaojia |
|    2 | pelosi     |
|    3 | hiofo      |
|    4 | mac        |
+------+------------+
4 rows in set (0.00 sec)

接着在增量的基础上再进行一次增量备份

–incremental-basedi 要写上次最后增量备份的目录

[root@master ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --incremental-basedir=/backup/mysql/data/2017-04-04_17-28-14/ --incremental /backup/mysql/data

[root@master ~]# ll /backup/mysql/data/
总用量 12
drwxr-xr-x 6 root root 4096 44 17:08 2017-04-04_16-56-35      //全量备份目录
drwxr-xr-x 6 root root 4096 44 17:28 2017-04-04_17-28-14      //全量备份目录
drwxr-xr-x 6 root root 4096 44 17:38 2017-04-04_17-37-58      //全量备份目录

现在删除数据库ceshi 、 test

[root@master ~]# mysql


mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| ceshi              |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

mysql> drop  database ceshi;
Query OK, 1 row affected (0.07 sec)

mysql> drop database test;
Query OK, 0 rows affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)

接下来就开始进行数据恢复操作:

先恢复应用日志(注意最后一个不需要加–redo-only参数)

[root@master ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log --redo-only /backup/mysql/data/2017-04-04_16-56-35/

[root@master ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log --redo-only /backup/mysql/data/2017-04-04_16-56-35/ --incremental-dir=/backup/mysql/data/2017-04-04_17-28-14/

[root@master ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log /backup/mysql/data/2017-04-04_16-56-35/ --incremental-dir=/backup/mysql/data/2017-04-04_17-37-58/

到此,恢复数据工作还没有结束!还有最重要的一个环节,就是把增量目录下的数据整合到全量备份目录下,然后再进行一次全量还原。

停止mysql数据库,并清空数据目录

[root@master ~]# /etc/init.d/mysqld stop
Shutting down MySQL. SUCCESS! 
[root@master ~]# rm -fr /application/mysql/data/*

最后拷贝文件,并验证数据目录的权限

[root@master ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --copy-back /backup/mysql/data/2017-04-04_16-56-35/

[root@master ~]# chown -R mysql.mysql /application/mysql/data/*

[root@master ~]# /etc/init.d/mysqld start
Starting MySQL.. SUCCESS!
[root@master ~]# mysql

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| ceshi              |
| mysql              |
| performance_schema |
| test               |
| xtra_test          |
+--------------------+
6 rows in set (0.00 sec)

mysql> select * from  ceshi.test1;
+------+------------+
| id   | name       |
+------+------------+
|    1 | chenbaojia |
|    2 | pelosi     |
|    3 | hiofo      |
|    4 | mac        |
+------+------------+
4 rows in set (0.00 sec)

另外注意: 上面在做备份的时候,将备份目录和增量目录都放在了同一个目录路径下,其实推荐放在不同的路径下,方便管理!比如:

/backup/mysql/data/full 存放全量备份目录

/backup/mysql/data/daily1 存放第一次增量备份目录

/backup/mysql/data/daily2 存放第二次增量目录

以此类推

在恢复的时候,注意命令中的路径要跟对!

5、innobackupex 参数

xtrabackup命令只备份数据文件,并不备份数据表结构(.frm),所以使用xtrabackup恢复的时候必须有对应表结构文件(.frm)。用innobackupex命令,此命令相当于冷备份,复制数据目录的索引,数据,结构文件,但会有短暂的锁表(时间依赖于MyISAM大小)。

innobackupex 常用参数说明 –defaults-file 同xtrabackup的–defaults-file参数

–apply-log 对xtrabackup的–prepare参数的封装

–copy-back 做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir ;

–remote-host=HOSTNAME 通过ssh将备份数据存储到进程服务器上;

–stream=[tar] 备 份文件输出格式, tar时使用tar4ibd , 该文件可在XtarBackup binary文件中获得.如果备份时有指定–stream=tar, 则tar4ibd文件所处目录一定要在$PATH中(因为使用的是tar4ibd去压缩, 在XtraBackup的binary包中可获得该文件)。 在 使用参数stream=tar备份的时候,你的xtrabackup_logfile可能会临时放在/tmp目录下,如果你备份的时候并发写入较大的话 xtrabackup_logfile可能会很大(5G+),很可能会撑满你的/tmp目录,可以通过参数–tmpdir指定目录来解决这个问题。

–tmpdir=DIRECTORY 当有指定–remote-host or –stream时, 事务日志临时存储的目录, 默认采用MySQL配置文件中所指定的临时目录tmpdir

–redo-only –apply-log组, 强制备份日志时只redo ,跳过rollback。这在做增量备份时非常必要。

–use-memory=# 该参数在prepare的时候使用,控制prepare时innodb实例使用的内存量

–throttle=IOS 同xtrabackup的–throttle参数

–sleep=是给ibbackup使用的,指定每备份1M数据,过程停止拷贝多少毫秒,也是为了在备份时尽量减小对正常业务的影响,具体可以查看ibbackup的手册 ;

–compress[=LEVEL] 对备份数据迚行压缩,仅支持ibbackup,xtrabackup还没有实现;

–include=REGEXP 对 xtrabackup参数–tables的封装,也支持ibbackup。备份包含的库表,例如:–include=”test.“,意思是要备份 test库中所有的表。如果需要全备份,则省略这个参数;如果需要备份test库下的2个表:test1和test2,则写 成:–include=”test.test1|test.test2″。也可以使用通配符,如:–include=”test.test“。

–databases=LIST 列出需要备份的databases,如果没有指定该参数,所有包含MyISAM和InnoDB表的database都会被备份;

–uncompress 解压备份的数据文件,支持ibbackup,xtrabackup还没有实现该功能;

–slave-info, 备 份从库, 加上–slave-info备份目录下会多生成一个xtrabackup_slave_info 文件, 这里会保存主日志文件以及偏移, 文件内容类似于:CHANGE MASTER TO MASTER_LOG_FILE=”, MASTER_LOG_POS=0

–socket=SOCKET 指定mysql.sock所在位置,以便备份进程登录mysql.

更多参数见:http://www.percona.com/doc/percona-xtrabackup/2.1/innobackupex/innobackupex_option_reference.html

三、innobackupex全量、增量备份脚本

可以根据自己线上数据库情况,编写全量和增量备份脚本,然后结合crontab设置计划执行。

比如:每周日的1:00进行全量备份,每周1-6的1:00进行增量备份。

还可以在脚本里编写邮件通知信息(可以用mail或sendemail)

四、FAQ

1、可能报错1

Can't locate Time/HiRes.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /home/mysql/admin/bin/percona-xtrabackup-2.1.9/innobackupex line 23.
BEGIN failed--compilation aborted at /home/mysql/admin/bin/percona-xtrabackup-2.1.9/innobackupex line 23.

解决方案:

.pm实际上是Perl的包,只需安装perl-Time-HiRes即可:

[root@test-huanqiu percona-xtrabackup-2.1.9]# yum install -y perl-Time-HiRes

2、可能报错2

Can't locate DBI.pm in @INC (@INC contains: /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl /usr/lib64/perl5/5.8.8/x86_64-linux-thread-multi /usr/lib/perl5/5.8.8 .) at /usr/local/webserver/mysql5.1.57/bin/mysqlhotcopy line 25. 
BEGIN failed--compilation aborted at /usr/local/webserver/mysql5.1.57/bin/mysqlhotcopy line 25.

报错原因:系统没有按安装DBI组件。

DBI(Database Interface)是perl连接数据库的接口。其是perl连接数据库的最优秀方法,他支持包括Orcal,Sybase,mysql,db2等绝大多数的数据库。

解决办法:

安装DBI组件(Can’t locate DBI.pm in @INC-mysql接口)

或者单独装DBI、Data-ShowTable、DBD-mysql 三个组件

[root@test-huanqiu percona-xtrabackup-2.1.9]# yum -y install perl-DBD-MySQL

接着使用innobackupex命令测试是否正常

[root@test-huanqiu percona-xtrabackup-2.1.9]# innobackupex --help
Options:
--apply-log
Prepare a backup in BACKUP-DIR by applying the transaction log file
named "xtrabackup_logfile" located in the same directory. Also,
create new transaction logs. The InnoDB configuration is read from
the file "backup-my.cnf".

--compact
Create a compact backup with all secondary index pages omitted. This
option is passed directly to xtrabackup. See xtrabackup
documentation for details.

--compress
This option instructs xtrabackup to compress backup copies of InnoDB
data files. It is passed directly to the xtrabackup child process.
Try 'xtrabackup --help' for more details.

3、可能报错3

161130 05:56:48 innobackupex: Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_file=/usr/local/mysql/my.cnf;mysql_read_default_group=xtrabackup' as 'root' (using password: YES).
innobackupex: Error: Failed to connect to MySQL server as DBD::mysql module is not installed at /home/mysql/admin/bin/percona-xtrabackup-2.1.9/innobackupex line 2956.

解决办法:

[root@test-huanqiu ~]# yum -y install perl-DBD-MySQL.x86_64 
......
Package perl-DBD-MySQL-4.013-3.el6.x86_64 already installed and latest version                //发现本机已经安装了

[root@test-huanqiu ~]# rpm -qa|grep perl-DBD-MySQL
perl-DBD-MySQL-4.013-3.el6.x86_64

发现本机已经安装了最新版的perl-DBD-MYSQL了,但是仍然报出上面的错误!! 莫慌~~继续下面的操作进行问题的解决

查看mysql.so依赖的lib库

[root@test-huanqiu ~]# ldd /usr/lib64/perl5/auto/DBD/mysql/mysql.so
linux-vdso.so.1 => (0x00007ffd291fc000)
libmysqlclient.so.16 => not found                                                   //这一项为通过检查,缺失libmysqlclient.so.16库导致
libz.so.1 => /lib64/libz.so.1 (0x00007f78ff9de000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f78ff7a7000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f78ff58e000)
libm.so.6 => /lib64/libm.so.6 (0x00007f78ff309000)
libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f78ff09d000)
libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f78fecb9000)
libc.so.6 => /lib64/libc.so.6 (0x00007f78fe924000)
libfreebl3.so => /lib64/libfreebl3.so (0x00007f78fe721000)
libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f78fe4dd000)
libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f78fe1f5000)
libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f78fdff1000)
libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f78fddc5000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f78fdbc0000)
/lib64/ld-linux-x86-64.so.2 (0x00007f78ffe1d000)
libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f78fd9b5000)
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f78fd7b2000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f78fd597000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f78fd37a000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f78fd15a000)

以上结果说明缺少libmysqlclient.so.16这个二进制包,找个官方原版的mysql的libmysqlclient.so.16替换了即可!

[root@test-huanqiu~]# find / -name libmysqlclient.so.16                                   //查看本机并没有libmysqlclient.so.16库文件

查看mysql/lib下的libmysqlclinet.so库文件

[root@test-huanqiu~]# ll /usr/local/mysql/lib/
total 234596
-rw-r--r--. 1 mysql mysql 19520800 Nov 29 12:27 libmysqlclient.a
lrwxrwxrwx. 1 mysql mysql 16 Nov 29 12:34 libmysqlclient_r.a -> libmysqlclient.a
lrwxrwxrwx. 1 mysql mysql 17 Nov 29 12:34 libmysqlclient_r.so -> libmysqlclient.so
lrwxrwxrwx. 1 mysql mysql 20 Nov 29 12:34 libmysqlclient_r.so.18 -> libmysqlclient.so.18
lrwxrwxrwx. 1 mysql mysql 24 Nov 29 12:34 libmysqlclient_r.so.18.1.0 -> libmysqlclient.so.18.1.0
lrwxrwxrwx. 1 mysql mysql 20 Nov 29 12:34 libmysqlclient.so -> libmysqlclient.so.18
lrwxrwxrwx. 1 mysql mysql 24 Nov 29 12:34 libmysqlclient.so.18 -> libmysqlclient.so.18.1.0
-rwxr-xr-x. 1 mysql mysql 8858235 Nov 29 12:27 libmysqlclient.so.18.1.0
-rw-r--r--. 1 mysql mysql 211822074 Nov 29 12:34 libmysqld.a
-rw-r--r--. 1 mysql mysql 14270 Nov 29 12:27 libmysqlservices.a
drwxr-xr-x. 3 mysql mysql 4096 Nov 29 12:34 plugin

将mysql/lib/libmysqlclient.so.18.1.0库文件拷贝到/lib64下,拷贝后命名为libmysqlclient.so.16

[root@test-huanqiu~]# cp /usr/local/mysql/lib/libmysqlclient.so.18.1.0 /lib64/libmysqlclient.so.16

[root@test-huanqiu~]# cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
/usr/local/mysql/lib/ 
/lib64/
[root@test-huanqiu~]# ldconfig

最后卸载perl-DBD-MySQL,并重新安装perl-DBD-MySQL
[root@test-huanqiu~]# rpm -qa|grep perl-DBD-MySQL
perl-DBD-MySQL-4.013-3.el6.x86_64
[root@test-huanqiu~]# rpm -e --nodeps perl-DBD-MySQL 
[root@test-huanqiu~]# rpm -qa|grep perl-DBD-MySQL
[root@test-huanqiu~]# yum -y install perl-DBD-MySQL

待重新安装后,再次重新检查mysql.so依赖的lib库,发现已经都通过了

[root@test-huanqiu~]# ldd /usr/lib64/perl5/auto/DBD/mysql/mysql.so
linux-vdso.so.1 => (0x00007ffe3669b000)
libmysqlclient.so.16 => /usr/lib64/mysql/libmysqlclient.so.16 (0x00007f4af5c25000)
libz.so.1 => /lib64/libz.so.1 (0x00007f4af5a0f000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f4af57d7000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f4af55be000)
libm.so.6 => /lib64/libm.so.6 (0x00007f4af533a000)
libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f4af50cd000)
libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00007f4af4ce9000)
libc.so.6 => /lib64/libc.so.6 (0x00007f4af4955000)
libfreebl3.so => /lib64/libfreebl3.so (0x00007f4af4751000)
libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f4af450d000)
libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f4af4226000)
libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f4af4021000)
libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f4af3df5000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f4af3bf1000)
/lib64/ld-linux-x86-64.so.2 (0x00007f4af61d1000)
libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f4af39e5000)
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f4af37e2000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f4af35c8000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f4af33aa000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f4af318b000)

4、可能报错4

sh: xtrabackup_56: command not found
innobackupex: Error: no 'mysqld' group in MySQL options at /home/mysql/admin/bin/percona-xtrabackup-2.1.9/innobackupex line 4350.

有可能是percona-xtrabackup编译安装后,在编译目录的src下存在xtrabackup_innodb55,只需要其更名为xtrabackup_55,然后拷贝到上面的/home/mysql/admin/bin/percona-xtrabackup-2.1.9/下即可!

使用CentOS DVD作为默认yum源

u22e阅读(4286)

环境:CentOS 7.2

默认的yum是以网络来安装的,在没有网络或者网速不佳的情况下,通过yum来安装软件是意见非常痛苦的事情。其实对于CentOS DVD来说,里面提供的软件就足以满足我们的需要了,而且DVD里的软件版本都是稳定版,下载速度还快,对于学习CentOS来说,将CentOS DVD作为默认yum源可以大大提高学习效率。

1、为DVD创建一个挂载目录

[root@localhost ~]# mkdir /media/CentOS

2、在Linux下挂载CentOS DVD(虚拟机挂载DVD不说了,应该都会)

[root@localhost ~]# mount -t auto /dev/cdrom /media/CentOS

3、查看相关配置文件,目录为

[root@localhost ~]# ls -l /etc/yum.repos.d/
-rw-r–r–. 1 root root 1926  7月  3 10:15 CentOS-Base.repo
-rw-r–r–. 1 root root  637  7月  3 10:15 CentOS-Debuginfo.repo
-rw-r–r–. 1 root root  626  7月  3 10:15 CentOS-Media.repo

4、禁用yum的网络更新方式,简单地将默认首选的CentOS-Base.repo改名为CentOS-Base.repo.bak即可

[root@localhost yum.repos.d]# mv CentOS-Base.repo CentOS-Base.repo.bak

5、配置本地yum源

[root@localhost ~]# vim /etc/yum.repos.d/CentOS-Media.repo

[c6-media]
name=CentOS-$releasever – Media
baseurl=file:///media/CentOS/
file:///media/cdrom/
file:///media/cdrecorder/
gpgcheck=1
enabled=0

修改为

[c6-media]
name=CentOS-$releasever – Media
baseurl=file:///media/CentOS/
gpgcheck=1
enabled=1

其中baseurl修改为DVD的挂载目录,enabled=1开启本地更新模式

:wq 保存退出

6、清除原有的yum信息

[root@localhost ~]# yum clean all
Loaded plugins: fastestmirror
Cleaning up Everything

7、检查DVD软件列表

[root@localhost yum.repos.d]# yum list
Loaded plugins: fastestmirror
Determining fastest mirrors
c6-media                                                 | 3.7 kB     00:00 …
c6-media/primary_db                                      | 3.3 MB     00:00 …

这样以后就默认使用DVD安装软件了,如果想恢复网络安装模式,将 CentOS-Base.repo.bak 更名还原即可。

PS.每次重启系统后需要手工挂载DVD到/media/CentOS/,如果嫌麻烦可以自己写脚本自动挂载。

Nginx开启Gzip压缩大幅提高页面加载速度

u22e阅读(4145)

刚刚给博客加了一个缓存插件,由于主题引入了很多js文件和css文件,页面一下子看起来非常臃肿,所以还是把Gzip打开了。

环境:Centos

1、Vim打开Nginx配置文件

vim /usr/local/nginx/conf/nginx.conf

2、找到如下一段,进行修改

gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
#gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary off;
gzip_disable “MSIE [1-6]\.”;

3、解释一下

第1行:开启Gzip

第2行:不压缩临界值,大于1K的才压缩,一般不用改

第3行:buffer,就是,嗯,算了不解释了,不用改

第4行:用了反向代理的话,末端通信是HTTP/1.0,有需求的应该也不用看我这科普文了;有这句的话注释了就行了,默认是HTTP/1.1

第5行:压缩级别,1-10,数字越大压缩的越好,时间也越长,看心情随便改吧

第6行:进行压缩的文件类型,缺啥补啥就行了,JavaScript有两种写法,最好都写上吧,总有人抱怨js文件没有压缩,其实多写一种格式就行了

第7行:跟Squid等缓存服务有关,on的话会在Header里增加”Vary: Accept-Encoding”,我不需要这玩意,自己对照情况看着办吧

第8行:IE6对Gzip不怎么友好,不给它Gzip了

 

4、:wq保存退出,重新加载Nginx

/usr/local/nginx/sbin/nginx -s reload

 

5、用curl测试Gzip是否成功开启

curl -I -H “Accept-Encoding: gzip, deflate” “https://www.u22e.com/”

HTTP/1.1 200 OK
Server: nginx
Date: Mon, 10 Apr 2017 08:57:33 GMT
Content-Type: text/html
Connection: keep-alive
Vary: Accept-Encoding
Content-Encoding: gzip

页面成功压缩

 

curl -I -H “Accept-Encoding: gzip, deflate” “https://www.u22e.com/blog/wp-content/plugins/photonic/include/css/photonic.css”

HTTP/1.1 200 OK
Server: nginx/1.0.15
Date: Sun, 26 Aug 2012 18:21:25 GMT
Content-Type: text/css
Last-Modified: Sun, 26 Aug 2012 15:17:07 GMT
Connection: keep-alive
Expires: Mon, 27 Aug 2012 06:21:25 GMT
Cache-Control: max-age=43200
Content-Encoding: gzip

css文件成功压缩

curl -I -H “Accept-Encoding: gzip, deflate” “https://www.u22e.com/blog/wp-includes/js/jquery/jquery.js”

HTTP/1.1 200 OK
Server: nginx/1.0.15
Date: Sun, 26 Aug 2012 18:21:38 GMT
Content-Type: application/x-javascript
Last-Modified: Thu, 12 Jul 2012 17:42:45 GMT
Connection: keep-alive
Expires: Mon, 27 Aug 2012 06:21:38 GMT
Cache-Control: max-age=43200
Content-Encoding: gzip

js文件成功压缩

curl -I -H “Accept-Encoding: gzip, deflate” “http://www.slyar.com/blog/wp-content/uploads/2012/08/2012-08-23_203542.png”

HTTP/1.1 200 OK
Server: nginx/1.0.15
Date: Sun, 26 Aug 2012 18:22:45 GMT
Content-Type: image/png
Last-Modified: Thu, 23 Aug 2012 13:50:53 GMT
Connection: keep-alive
Expires: Tue, 25 Sep 2012 18:22:45 GMT
Cache-Control: max-age=2592000
Content-Encoding: gzip

图片成功压缩

curl -I -H “Accept-Encoding: gzip, deflate” “https://www.u22e.com/blog/wp-content/plugins/wp-multicollinks/wp-multicollinks.css”

HTTP/1.1 200 OK
Server: nginx/1.0.15
Date: Sun, 26 Aug 2012 18:23:27 GMT
Content-Type: text/css
Content-Length: 180
Last-Modified: Sat, 02 May 2009 08:46:15 GMT
Connection: keep-alive
Expires: Mon, 27 Aug 2012 06:23:27 GMT
Cache-Control: max-age=43200
Accept-Ranges: bytes

最后来个不到1K的文件,由于我的阈值是1K,所以没压缩

docker 镜像如何设置时区

u22e阅读(2975)

修改docker镜像时区的方法和修改普通Linux系统时区的方法一致。具体方法要看使用的是什么发行版。比如我使用的alpine方法如下:

apk add tzdata
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo "Asia/Shanghai" > /etc/timezone

写到Dockerfile里就是:

RUN apk update && apk add ca-certificates && \
    apk add tzdata && \
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo "Asia/Shanghai" > /etc/timezone

 

结合Docker快速搭建ELK日志收集分析平台

u22e阅读(2808)

ELK Stack

ELK (Elasticsearch + Logstash + Kibana),是一个开源的日志收集平台,用于收集各种客户端日志文件在同一个平台上面做数据分析。

Introduction

Elasticsearch, 基于json分析搜索引擎
Logstash, 动态数据收集管道
Kibana, 可视化视图将elasticsearh所收集的data通过视图展现

工作流程

Background

起初我们搭建ELK platform都是通过rpm包或者repo的形式直接setup在服务器机器上面,这给运维后期带来的一个问题就是,每起一个新的ELK platform都需要重新setup在新的机器上面,而从运维的角度去减少这样的重复性effort变得异常突出,下面是根据我自身的经验来介绍如何通过docker solution去快速启动一个新的ELK platform,而无需重新setup。

Prerequisite

1.Clone GIT folder到本地,branch: master

建议放在user HOME下面,eg:/home/user1/

2.根据你的需求选择配置环境变量
a. Elasticsearch + Logstash + Kibana 运行在同一个机器下面,相关配置文件 : ~/elasticstack/.env

b. Elasticsearch + Logstash + Kibana 分别分开运行在不同的机器下面,各自相关的配置文件如下:

  • Elasticsearch: ~/elasticstack/elasticsearch/.env

  • Logstash: ~/elasticstack/logstash/.env

  • Kibana: ~/elasticstack/kibana/.env

上述配置文件包含的配置属性均属于基本配置属性,为了可以更方便的修改配置文件,结合docker-compose自动搜索并加载.env的特性,将ELK所需要的基本配置抽离出来作为单个.env文件来修改配置,而不需要通过逐个配置文件进行修改,下面对上述基本属性简单描述:

  • environment: 用来区分ELK platform的当前环境,通常有qa/prod,你也可以根据自己的情况指定为自己想要的value
  • E_LOCAL_DATA_PATH: 设置elasticsearch data存储在宿主机的相对路劲或者绝对路径,默认为/usr/data/
  • L_ELASTICSEARCH_HOST_ENV: 由于docker-compose里边设置了network_mode等于host,使得方便同一台机器上面方便logstash和elasticsearch通信,所以如果logstash和elasticsearch跑在同一台机器上面(a),可以直接使用localhost来指定连接elasticsearch host;如果logstash和elasticsearch在不同机器上(b),则需要指定对应elasticsearch所在机器的hostname
  • K_ELASTICSEARCH_HOST_IP: 和L_ELASTICSEARCH_HOST_ENV一样由于network_mode等于host,如果kibana和elasticsearch在同一台机器上,只需要指定0.0.0.0 or 127.0.0.1(经过多次试验,由于kibana自身加载yaml配置文件的方式貌似无法通过$获取环境变量,而是单纯获取对应properties的string,所以这里通过extra_link的方式在kibana的container里边添加了一个DNS record,所以需要使用IP而不是hostname);相应的如果处于不同的机器(b),需指定elasticsearch所在机器的IP。
    以上配置属性都是启动ELK所需要的基本配置,如果有需要更多的配置,可以手动修改相应的配置文件或者联系微信lexmay 或email: eason.lau02@hotmail.com

3.配置完成后,使用docker-compose启动ELK service
关于docker-compose文件,通常不需要改动,你也可以根据自己的需求添加container的properties,你可以在docker-compose文件里看到上面配置的属性都当成环境变量传递进去,eg: ~/elasticstack/docker-compose.yml:

以上所用到的image都是自己构建然后放在hub.docker.com官网repository,相应Dockerfile构建如下 :

  • elasticsearh: ~/elasticstack/elasticsearch/Dockerfile
  • logstash: ~/elasticstack/logstash/Dockerfile
  • kibana: ~/elasticstack/kibana/Dockerfile

a. 运行在同一个机器,相关compose文件: ~/elasticstack/docker-compose.yml

b. 分开运行不同机器,相关compose文件:
Elasticsearch: ~/elasticstack/elasticsearch/docker-compose.yml
Logstash: ~/elasticstack/logstash/docker-compose.yml
Kibana: ~/elasticstack/kibana/docker-compose.yml

  • eg:

Elasticsearch in host1:

Logstash in host2:

Kibana in host3:

4.通过kibana host+5601端口访问查看启动效果,<kibana host>:5601

成功启动

如果看到上述界面,说明配置启动成功,你可以看到Unable to fetch mapping. Do you have indices match…,是因为还没有使用beats plugin将log发送到logstash或者elasticsearch,所以不能建立index。

** 文章所有步骤都是经过实践检验并可行,若有问题,下方请评论。

Linux十大企业级服务器安全防护要点

u22e阅读(2525)

随着开源系统Linux的盛行,其在大中型企业的应用也在逐渐普及,很多企业的应用服务都是构筑在其之上,例如Web服务、数据库服务、集群服务等等。

因此,Linux的安全性就成为了企业构筑安全应用的一个基础,是重中之重,如何对其进行安全防护是企业需要解决的一个基础性问题,基于此,本文将给出十大企业级Linux服务器安全防护的要点。

1、强化:密码管理

设定登录密码是一项非常重要的安全措施,如果用户的密码设定不合适,就很容易被破译,尤其是拥有超级用户使用权限的用户,如果没有良好的密码,将给系统造成很大的安全漏洞。

目前密码破解程序大多采用字典攻击以及暴力攻击手段,而其中用户密码设定不当,则极易受到字典攻击的威胁。很多用户喜欢用自己的英文名、生日或者账户等信息来设定密码,这样,黑客可能通过字典攻击或者是社会工程的手段来破解密码。所以建议用户在设定密码的过程中,应尽量使用非字典中出现的组合字符,并且采用数字与字符相结合、大小写相结合的密码设置方式,增加密码被黑客破解的难度。而且,也可以使用定期修改密码、使密码定期作废的方式,来保护自己的登录密码。

在多用户系统中,如果强迫每个用户选择不易猜出的密码,将大大提高系统的安全性。但如果passwd程序无法强迫每个上机用户使用恰当的密码,要确保密码的安全度,就只能依靠密码破解程序了。实际上,密码破解程序是黑客工具箱中的一种工具,它将常用的密码或者是英文字典中所有可能用来作密码的字都用程序加密成密码字,然后将其与Linux系统的/etc/passwd密码文件或/etc/shadow影子文件相比较,如果发现有吻合的密码,就可以求得明码了。在网络上可以找到很多密码破解程序,比较有名的程序是crack和john the ripper.用户可以自己先执行密码破解程序,找出容易被黑客破解的密码,先行改正总比被黑客破解要有利。

2、限定:网络服务管理

早期的Linux版本中,每一个不同的网络服务都有一个服务程序(守护进程,Daemon)在后台运行,后来的版本用统一的/etc/inetd服务器程序担此重任。Inetd是Internetdaemon的缩写,它同时监视多个网络端口,一旦接收到外界传来的连接信息,就执行相应的TCP或UDP网络服务。由于受inetd的统一指挥,因此Linux中的大部分TCP或UDP服务都是在/etc/inetd.conf文件中设定。所以取消不必要服务的第一步就是检查/etc/inetd.conf文件,在不要的服务前加上“#”号。

一般来说,除了http、smtp、telnet和ftp之外,其他服务都应该取消,诸如简单文件传输协议tftp、网络邮件存储及接收所用的imap/ipop传输协议、寻找和搜索资料用的gopher以及用于时间同步的daytime和time等。还有一些报告系统状态的服务,如finger、efinger、systat和netstat等,虽然对系统查错和寻找用户非常有用,但也给黑客提供了方便之门。例如,黑客可以利用finger服务查找用户的电话、使用目录以及其他重要信息。因此,很多Linux系统将这些服务全部取消或部分取消,以增强系统的安全性。Inetd除了利用/etc/inetd.conf设置系统服务项之外,还利用/etc/services文件查找各项服务所使用的端口。因此,用户必须仔细检查该文件中各端口的设定,以免有安全上的漏洞。

在后继的Linux版本中(比如Red Hat Linux7.2之后),取而代之的是采用xinetd进行网络服务的管理。

当然,具体取消哪些服务不能一概而论,需要根据实际的应用情况来定,但是系统管理员需要做到心中有数,因为一旦系统出现安全问题,才能做到有步骤、有条不紊地进行查漏和补救工作,这点比较重要。

3、严格审计:系统登录用户管理

在进入Linux系统之前,所有用户都需要登录,也就是说,用户需要输入用户账号和密码,只有它们通过系统验证之后,用户才能进入系统。

与其他Unix操作系统一样,Linux一般将密码加密之后,存放在/etc/passwd文件中。Linux系统上的所有用户都可以读到/etc/passwd文件,虽然文件中保存的密码已经经过加密,但仍然不太安全。因为一般的用户可以利用现成的密码破译工具,以穷举法猜测出密码。比较安全的方法是设定影子文件/etc/shadow,只允许有特殊权限的用户阅读该文件。

在Linux系统中,如果要采用影子文件,必须将所有的公用程序重新编译,才能支持影子文件。这种方法比较麻烦,比较简便的方法是采用插入式验证模块(PAM)。很多Linux系统都带有Linux的工具程序PAM,它是一种身份验证机制,可以用来动态地改变身份验证的方法和要求,而不要求重新编译其他公用程序。这是因为PAM采用封闭包的方式,将所有与身份验证有关的逻辑全部隐藏在模块内,因此它是采用影子档案的最佳帮手。

此外,PAM还有很多安全功能:它可以将传统的DES加密方法改写为其他功能更强的加密方法,以确保用户密码不会轻易地遭人破译;它可以设定每个用户使用电脑资源的上限;它甚至可以设定用户的上机时间和地点。

Linux系统管理人员只需花费几小时去安装和设定PAM,就能大大提高Linux系统的安全性,把很多攻击阻挡在系统之外。

4、设定:用户账号安全等级管理

除密码之外,用户账号也有安全等级,这是因为在Linux上每个账号可以被赋予不同的权限,因此在建立一个新用户ID时,系统管理员应该根据需要赋予该账号不同的权限,并且归并到不同的用户组中。

在Linux系统中的部分文件中,可以设定允许上机和不允许上机人员的名单。其中,允许上机人员名单在/etc/hosts.allow中设置,不允许上机人员名单在/etc/hosts.deny中设置。此外,Linux将自动把允许进入或不允许进入的结果记录到/var/log/secure文件中,系统管理员可以据此查出可疑的进入记录。

每个账号ID应该有专人负责。在企业中,如果负责某个ID的职员离职,管理员应立即从系统中删除该账号。很多入侵事件都是借用了那些很久不用的账号。

在用户账号之中,黑客最喜欢具有root权限的账号,这种超级用户有权修改或删除各种系统设置,可以在系统中畅行无阻。因此,在给任何账号赋予root权限之前,都必须仔细考虑。

Linux系统中的/etc/securetty文件包含了一组能够以root账号登录的终端机名称。例如,在RedHatLinux系统中,该文件的初始值仅允许本地虚拟控制台(rtys)以root权限登录,而不允许远程用户以root权限登录。最好不要修改该文件,如果一定要从远程登录为root权限,最好是先以普通账号登录,然后利用su命令升级为超级用户。

5、谨慎使用:“r系列”远程程序管理

在Linux系统中有一系列r字头的公用程序,比如rlogin,rcp等等。它们非常容易被黑客用来入侵我们的系统,因而非常危险,因此绝对不要将root账号开放给这些公用程序。由于这些公用程序都是用。rhosts文件或者hosts.equiv文件核准进入的,因此一定要确保root账号不包括在这些文件之内。

由于r等远程指令是黑客们用来攻击系统的较好途径,因此很多安全工具都是针对这一安全漏洞而设计的。例如,PAM工具就可以用来将r字头公用程序有效地禁止掉,它在/etc/pam.d/rlogin文件中加上登录必须先核准的指令,使整个系统的用户都不能使用自己home目录下的。rhosts文件。

6、限制:root用户权限管理

Root一直是Linux保护的重点,由于它权力无限,因此最好不要轻易将超级用户授权出去。但是,有些程序的安装和维护工作必须要求有超级用户的权限,在这种情况下,可以利用其他工具让这类用户有部分超级用户的权限。sudo就是这样的工具。

sudo程序允许一般用户经过组态设定后,以用户自己的密码再登录一次,取得超级用户的权限,但只能执行有限的几个指令。例如,应用sudo后,可以让管理磁带备份的管理人员每天按时登录到系统中,取得超级用户权限去执行文档备份工作,但却没有特权去作其他只有超级用户才能作的工作。

sudo不但限制了用户的权限,而且还将每次使用sudo所执行的指令记录下来,不管该指令的执行是成功还是失败。在大型企业中,有时候有许多人同时管理Linux系统的各个不同部分,每个管理人员都有用sudo授权给某些用户超级用户权限的能力,从sudo的日志中,可以追踪到谁做了什么以及改动了系统的哪些部分。

值得注意的是,sudo并不能限制所有的用户行为,尤其是当某些简单的指令没有设置限定时,就有可能被黑客滥用。例如,一般用来显示文件内容的/etc/cat指令,如果有了超级用户的权限,黑客就可以用它修改或删除一些重要的文件。

7、追踪黑客踪迹:日志管理

当用户仔细设定了各种与Linux相关的配置(最常用日志管理选项),并且安装了必要的安全防护工具之后,Linux操作系统的安全性的确大为提高,但是却并不能保证防止那些比较熟练的网络黑客的入侵。

在平时,网络管理人员要经常提高警惕,随时注意各种可疑状况,并且按时检查各种系统日志文件,包括一般信息日志、网络连接日志、文件传输日志以及用户登录日志等。在检查这些日志时,要注意是否有不合常理的时间记载。例如:

正常用户在半夜三更登录;

不正常的日志记录,比如日志只记录了一半就切断了,或者整个日志文件被删除了;

用户从陌生的网址进入系统;

因密码错误或用户账号错误被摈弃在外的日志记录,尤其是那些一再连续尝试进入失败,但却有一定模式的试错法;

非法使用或不正当使用超级用户权限su的指令;

重新开机或重新启动各项服务的记录。

上述这些问题都需要系统管理员随时留意系统登录的用户状况以及查看相应日志文件,许多背离正常行为的蛛丝马迹都应当引起高度注意。

8、横向扩展:综合防御管理

防火墙、IDS等防护技术已经成功地应用到网络安全的各个领域,而且都有非常成熟的产品。

在Linux系统来说,有一个自带的Netfilter/Iptables防火墙框架,通过合理地配置其也能起到主机防火墙的功效。在Linux系统中也有相应的轻量级的网络入侵检测系统Snort以及主机入侵检测系统LIDS(Linux Intrusion Detection System),使用它们可以快速、高效地进行防护。

需要提醒注意的是:在大多数的应用情境下,我们需要综合使用这两项技术,因为防火墙相当于安全防护的第一层,它仅仅通过简单地比较IP地址/端口对来过滤网络流量,而IDS更加具体,它需要通过具体的数据包(部分或者全部)来过滤网络流量,是安全防护的第二层。综合使用它们,能够做到互补,并且发挥各自的优势,最终实现综合防御。

9、评测:漏洞追踪及管理

Linux作为一种优秀的开源软件,其自身的发展也日新月异,同时,其存在的问题也会在日后的应用中慢慢暴露出来。黑客对新技术的关注从一定程度上来说要高于我们防护人员,所以要想在网络攻防的战争中处于有利地位,保护Linux系统的安全,就要求我们要保持高度的警惕性和对新技术的高度关注。用户特别是使用Linux作为关键业务系统的系统管理员们,需要通过Linux的一些权威网站和论坛上尽快地获取有关该系统的一些新技术以及一些新的系统漏洞的信息,进行漏洞扫描、渗透测试等系统化的相关配套工作,做到防范于未然,提早行动,在漏洞出现后甚至是出现前的最短时间内封堵系统的漏洞,并且在实践中不断地提高安全防护的技能,这样才是一个比较的解决办法和出路。

10、保持更新:补丁管理

Linux作为一种优秀的开源软件,其稳定性、安全性和可用性有极为可靠的保证,世界上的Linux高手共同维护着个优秀的产品,因而起流通渠道很多,而且经常有更新的程序和系统补丁出现,因此,为了加强系统安全,一定要经常更新系统内核。

Kernel是Linux操作系统的核心,它常驻内存,用于加载操作系统的其他部分,并实现操作系统的基本功能。由于Kernel控制计算机和网络的各种功能,因此,它的安全性对整个系统安全至关重要。早期的Kernel版本存在许多众所周知的安全漏洞,而且也不太稳定,只有2.0.x以上的版本才比较稳定和安全(一般说来,内核版本号为偶数的相对稳定,而为奇数的则一般为测试版本,用户们使用时要多留意),新版本的运行效率也有很大改观。在设定Kernel的功能时,只选择必要的功能,千万不要所有功能照单全收,否则会使Kernel变得很大,既占用系统资源,也给黑客留下可乘之机。

在Internet上常常有最新的安全修补程序,Linux系统管理员应该消息灵通,经常光顾安全新闻组,查阅新的修补程序。

Linux文件清空的几种方法

u22e阅读(6270)

1、使用重定向的方法

[root@centos7 ~]# du -h test.txt 
4.0K    test.txt
[root@centos7 ~]# > test.txt 
[root@centos7 ~]# du -h test.txt 
0    test.txt

2、使用true命令重定向清空文件

[root@centos7 ~]# du -h test.txt 
4.0K    test.txt
[root@centos7 ~]# true > test.txt 
[root@centos7 ~]# du -h test.txt 
0    test.txt

3、使用cat/cp/dd命令及/dev/null设备来清空文件

[root@centos7 ~]# du -h test.txt 
4.0K    test.txt
[root@centos7 ~]# cat /dev/null >  test.txt 
[root@centos7 ~]# du -h test.txt 
0    test.txt
###################################################
[root@centos7 ~]# echo "Hello World" > test.txt 
[root@centos7 ~]# du -h test.txt 
4.0K    test.txt
[root@centos7 ~]# cp /dev/null test.txt 
cp:是否覆盖"test.txt"? y
[root@centos7 ~]# du -h test.txt 
0    test.txt
##################################################
[root@centos7 ~]# echo "Hello World" > test.txt 
[root@centos7 ~]# du -h test.txt 
4.0K    test.txt
[root@centos7 ~]# dd if=/dev/null of=test.txt 
记录了0+0 的读入
记录了0+0 的写出
0字节(0 B)已复制,0.000266781 秒,0.0 kB/秒
[root@centos7 ~]# du -h test.txt 
0    test.txt

4、使用echo命令清空文件

[root@centos7 ~]# echo "Hello World" > test.txt 
[root@centos7 ~]# du -h test.txt 
4.0K    test.txt
[root@centos7 ~]# echo -n "" > test.txt    ==>要加上"-n"参数,默认情况下会"\n",也就是回车符
[root@centos7 ~]# du -h test.txt  
0    test.txt

5、使用truncate命令清空文件

[root@centos7 ~]# du -h test.txt 
4.0K    test.txt
[root@centos7 ~]# truncate -s 0 test.txt   -s参数用来设定文件的大小,清空文件,就设定为0;
[root@centos7 ~]# du -h test.txt 
0    test.txt

 

计算机起源与Linux简述

u22e阅读(2139)

什么是计算机?

计算机(computer)俗称电脑,是一种用于高速计算的电子计算机器,可以进行数值计算,又可以进行逻辑计算,还具有存储记忆功能。是能够按照程序运行,自动、高速处理海量数据的现代化智能电子设备。
它由硬件系统和软件系统组成,没有安装任何软件的计算机被称为裸机。硬件系统由运算器,控制器,存储器,输入设备,输出设备几部分组成;软件系统则分为系统软件和应用软件。计算机按照规模又可分为巨型计算机、大型计算机、小型计算机、微型计算机。
世界上第一台计算机
ENIAC(埃尼阿克),是电子数值积分计算机(The Electronic Numberical Intergrator and Computer)的缩写,它是世界上第一台计算机,于1946年2月15日在美国宾夕法尼亚大学诞生并投入使用,是美国伯丁武器试验场为了满足计算弹道需要而研制成的。它使用了17468个真空电子管,耗电174千瓦,占地170平方米,重达30吨,每秒钟可进行5000次加法运算。
ENIAC诞生后,数学家冯•诺依曼提出了重大的改进理论,主要有两点:其一是电子计算机应该以二进制为运算基础,其二是电子计算机应采用存储程序方式工作,并且进一步明确指出了整个计算机的结构应由五个部分组成:运算器、控制器、存储器、输入装置和输出装置。冯•诺依曼的这些理论的提出,解决了计算机的运算自动化的问题和速度配合问题,对后来计算机的发展起到了决定性的作用。直至今天,绝大部分的计算机还是采用冯•诺依曼方式工作。

服务器

服务器(Server)指一个管理资源并为用户提供服务的计算机,通常分为文件服务器、数据库服务器和应用程序服务器。运行以上软件的计算机或计算机系统也被称为服务器。相对于普通PC来说,服务器在稳定性、安全性、性能等方面都要求更高,因此CPU、芯片组、内存、磁盘系统、网络等硬件和普通PC有所不同。
服务器按应用功能可分为:Web服务器、数据库服务器、邮件服务器、文件服务器、中间件应用服务器、日志服务器、监控服务器,程序版本控制服务器、虚拟
机服务器、打印服务器、域控制服务器、多媒体服务器、通讯服务器、ERP服务器等。

按外形分类:塔式服务器、机架式服务器、刀片式服务器

塔式服务器

机架式服务器
刀片式服务器

服务器硬件组成:

CPU:Central Processing Unit的缩写,即中央处理器。由控制器和运算器构成,是整个计算机系统中最重要的部分。

服务器按照CPU体系架构来区分,主要分为两类:

非x86服务器:使用RISC(精简指令集)或EPIC(并行指令代码) 处理器,并且主要采用UNIX和其它专用操作系统的服务器,指令系统相对简单,它只要求硬件执行很有限且最常用的那部分指令。这种服务器价格昂贵,体系封闭,但是稳定性好,性能强,主要用在金融、电信等大型企业的核心系统。x86服务器:又称CISC(复杂指令集)架构服务器,即通常所讲的PC服务器,它是基于PC机体系结构,使用Intel或其它兼容x86指令集的处理器芯片的服务器。这种服务器价格相对便宜、兼容性好但稳定性较差、安全性不算太高。

按CPU个数来分:
4核及4核以上服务器(企业级服务器)
2核服务器(部门级服务器)
1核服务器(入门级服务器)

主板:主板mainboard、系统板systemboard或母板(motherboard)它安装在机箱内,是计算机最基本的也是最重要的部件之一。主板一般为矩形电路板,上面安装了组成计算机的主要电路系统,一般有BIOS芯片、I/O控制芯片、键盘和面板控制开关接口、指示灯插接件、扩充插槽、主板及插卡的直流电源
供电接插件等元件。

内存:内存是介于CPU 和外部存储之间,是CPU 对外部存储中程序与数据进行高速运算时存放程序指令、数据和中间结果的临时场所,它的物理实质就是一组具备数据输入输出和数据存储功能的高速集成电路。 内存是CPU能直接寻址的存储空间,由半导体器件制成。内存的特点是存取速度快。计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大。
容量即该内存的存储容量,单位一般为MB或GB。

硬盘:由存储介质(Media)—盘片、读写头(Read Write Head)—磁头、马达( Spindle Motor & Voice Coil Motor )组成。

硬盘基本参数

容量:是硬盘最主要的参数。单位有MB、GB、TB。

转速:转速是指硬盘盘片每分钟转动的圈数,单位为rpm。现在硬盘的转速已经达到10000rpm,15000rpm。

传输速率:硬盘的数据传输率是指硬盘读写数据的速度,单位为兆字节每秒(MB/s)
缓存:硬盘缓存的目的是为了解决系统前后级读写速度不匹配的问题,以提高硬盘的读写速度.
目前主流的硬盘接口为SATA何SAS接口,因此硬盘按接口类型可分为SATA硬盘和SAS硬盘。

阵列卡(Raid卡):用来实现RAID的建立和重建,检测和修复多位错误,错误磁盘自动检测等功能。RAID芯片使CPU的资源得以释放。

电源:支持服务器的电力负载;支持冗余,防止电源故障;故障预警和防止; 故障之前的预防性维护;保证服务器持续运行。

显卡:服务器都在主板上集成了显卡,但是显存容量不高,一般为16M或32M。

网卡:服务器都在主板上集成了网卡,传输速率为1Gbps,即千兆网卡,特殊应用需要高端网卡,如光纤网卡,Infiniband网卡等,传输速率能达到10Gbps、20Gbps,即万兆网卡。

热插拔技术:又称热交换技术(HotSwap),允许在不关机的状态下更换故障热插拔设备。常见的热插拔设备:硬盘,电源,PCI设备,风扇等。热插拔硬盘技术与RAID技术配合起来,可以使服务器在不关机的状态下恢复故障硬盘上的数据,同时并不影响网络用户对数据的使用。

机柜:服务器放置的地方。

存储网络
DAS—–直接连接存储(Direct Attached Storage)
NAS—–网络连接存储(Network Attached Storage)
SAN—–存储区域网络(Storage Area Networks

操作系统

操作系统简称OS(Operating System)是计算机系统中的一个系统软件,是一些程序模块的集合——它们能以尽量有效、合理的方式组织和管理计算机的软硬件资源,合理的组织计算机的工作流程,控制程序的执行并向用户提供各种服务功能,使得用户能够灵活、方便、有效的使用计算机,使整个计算机系统能高效、顺畅的运行。

UNIX

UNIX操作系统(尤尼斯),是一个强大的多用户、多任务操作系统,支持多种处理器架构,按照操作系统的分类,属于分时操作系统,最早由KenThompson、Dennis Ritchie和Douglas McIlroy于1969年在AT&T的贝尔实验室开发。目前它的商标权由国际开放标准组织所拥有,只有符合单一UNIX规范的UNIX系统才能使用UNIX这个名称,否则只能称为类UNIX(UNIX-like)。

UNIX的哲学思想
编写的程序只做一件事,且把这件事做好;
编写的程序要能一起工作;
编写的程序以一个统一接口来处理字符流。

1965前后 Multics
Multics是1964年由贝尔实验室、麻省理工学院及美国通用电气公司所共同参与研发的,是一套安装在大型主机上多人多任务的操作系统。Multics其目的是想要让大型主机可以达成提供300个以上的终端机连线使用,后来因计划进度落后,资金短缺,宣告失败。

1969 Unix雏形

1969年,因MULTICS计划的工作进度过于缓慢,最后终究遭裁撤的命运,贝尔实验室退出此计划。当时,Ken Thompson撰写一个称为”星际旅行”(Space Travel)的游戏程序。Multics 计划停止后,由贝尔实验室的两位软件工程师 Thompson 与 Ritchie 以C语言为基础而发展出UNIX。

1973 Unix
Unix 成熟期。“管道”,一个可以在两个程序中共享信息的机制问世,这项技术影响了操作系统几十年。这个技术被加入到了Unix中。同年,Unix被用C语言重写,正式命名为Unix 并可移植性开放。

1977 BSD(Berkeley Software Distribution)
BSD (Berkeley Software Distribution,伯克利软件套件)是Unix的衍生系统,1970年代由加州大学伯克利分校开创。BSD用来代表由此派生出的各种套件集合。
BSD常被当作工作站级别的Unix系统,这得归功于BSD License非常地宽松,许多1980年代成立的计算机公司,不少都从BSD中获益,比较着名的例子如DEC的Ultrix,以及Sun公司的SunOS。1990年代,BSD很大程度上被System V4.x版以及OSF/1系统所取代,但其开源版本被采用,促进了因特网的开发。

1979 System V架构 版权声明
因为AT&T由于商业的考虑,以及在当时现实环境下的思考,于是想将UNIX的版权收回去。因此,AT&T在1979年发行的第七版UNIX中,特别提到了”不可对学生提供源码”的严格限制。同时,也造成UNIX业界之间的紧张气氛,并且也引发了很多的商业纠纷。
目前被称为纯种的UNIX指的就是System V以及BSD这两套。

1984年 Minix操作系统
关于1979年的版权声明中,影响最大的当然就是学校里教导UNIX内核源码相关学问的教授了。想一想,如果没有内核源码,那么如何教导学生认识UNIX呢?这问题对于AndrewTanenbaum(谭宁邦)教授来说,实在是很伤脑筋的。不过,学校的课程还是得继续,那怎么办?
既然1979年的UNIX第七版可以在Intel的x86架构上面进行移植,那么是否意味着可以将UNIX改写并移植到x86上面了呢?在这个想法上,谭宁邦教授于是自己动手写了Minix这个UNIX Like的内核程序!在编写的过程中,为了避免版权纠纷,谭宁邦完全不看UNIX内核源码!并且强调他的Minix必须能够与UNIX兼容才行!谭宁邦在1984年开始编写内核程序,到了1986年终于完成,并于次年出版Minix相关书籍,同时与新闻组(BBS及News)相结合。
之所以称为Minix的原因,是因为他是个Mini的UNIX系统。
(荷兰阿姆斯特丹自由大学计算机科学系Andrew S. Tanenbaum谭宁邦)

1984年:1984年,Richard Stallman(史托曼)开始GNU项目,这个项目的目的是创建一个自由、开放的UNIX操作系统(Free UNIX)。
创建开源的UNIX实用工具版本
创建通用公共许可证(GPL)
开源软件许可实施原则https://www.gnu.org/
产品:GCC、Emacs、Bash Shell、GLIBC;
倡导“自由软件”;
GNU的软件缺乏一个开放的平台运行,只能在Unix上运行;
自由软件指用户可以对软件做任何修改,甚至再发行,但是始终要挂着GPL的版权;
自由软件是可以卖的,但是不能只卖软件,而是卖服务、手册等;

1991年:芬兰大学生Linus Torvalds
到了1991年,芬兰的赫尔辛基大学的Linus Torvalds在BBS上面贴了一则消息,宣称他以bash, gcc等工具写了一个小小的内核程序,这个内核程序可以在Intel的386机器上面运行,让很多人很感兴趣,从此开始了Linux不平凡的旅程!
bash GCC等小工具写了一个小的内核程序下载:www.kernel.org

Linux

1991 年的10 月5 日,林纳斯·托瓦兹在comp.os.minix 新闻组上发布消息,正式向外宣布Linux 内核系统的诞生(Free minix-like kernel sources for 386-AT)。

Linux操作系统
Linux内核+ GNU工具=完整的类UNIX

操作系统 
如:CentOS,Ubuntu,Android
Linux发行版
slackware:SUSE Linux Enterprise Server (SLES)
opensuse桌面
debian: ubuntu,mint
redhat: rhel: redhat enterprise linux
每18个月发行一个新版本
CentOS:兼容rhel的格式
中标麒麟:中标软件
fedora:每6个月发行一个新版本
ArchLinux:轻量简洁
Gentoo:极致性能,不提供传统意义的安装程序
LFS: Linux From scratch 自制Linux
Android: kernel+busybox(工具集)+java虚拟机

Linux分支参考网站:http://futurist.se/gldt/

开源open source

开源: Open Source ,是指将软件和源代码提供给所有人
自由分发软件和源代码
能够修改和创建衍生作品

软件分类:商业、共享、自由 free

开源协议
世界上的开源许可证,大概有上百种
GPLv2, GPLv3, LGPL(lesser) :copyleft,WordPress
Apache: apache
BSD: bsd
Mozilla
Apache
MIT

Linux哲学思想

一切都是一个文件(包括硬件)
小型,单一用途的程序
链接程序,共同完成复杂的任务
避免令人困惑的用户界面
配置数据存储在文本中

Linux的文件系统

普通文件(regular file):就是一般存取的文件,由ls -al显示出来的属性中,第一个属性为 [-],例如 [-rwxrwxrwx]。另外,依照文件的内容,又大致可以分为:

1、纯文本文件(ASCII):这是Unix系统中最多的一种文件类型,之所以称为纯文本文件,是因为内容可以直接读到的数据,例如数字、字母等等。设 置文件几乎都属于这种文件类型。举例来说,使用命令“cat ~/.bashrc”就可以看到该文件的内容(cat是将文件内容读出来)。

2、二进制文件(binary):系统其实仅认识且可以执行二进制文件(binary file)。Linux中的可执行文件(脚本,文本方式的批处理文件不算)就是这种格式的。举例来说,命令cat就是一个二进制文件。

3、数据格式的文件(data):有些程序在运行过程中,会读取某些特定格式的文件,那些特定格式的文件可以称为数据文件(data file)。举例来说,Linux在用户登入时,都会将登录数据记录在 /var/log/wtmp文件内,该文件是一个数据文件,它能通过last命令读出来。但使用cat时,会读出乱码。因为它是属于一种特殊格式的文件。

目录文件(directory):就是目录,第一个属性为 [d],例如 [drwxrwxrwx]。

连接文件(link):类似Windows下面的快捷方式。第一个属性为 [l],例如 [lrwxrwxrwx]。

设备与设备文件(device):与系统外设及存储等相关的一些文件,通常都集中在 /dev目录。通常又分为两种:

块设备文件:就是存储数据以供系统存取的接口设备,简单而言就是硬盘。例如一号硬盘的代码是 /dev/hda1等文件。第一个属性为 。

字符设备文件:即串行端口的接口设备,例如键盘、鼠标等等。第一个属性为 [c]。

套接字(sockets):这类文件通常用在网络数据连接。可以启动一个程序来监听客户端的要求,客户端就可以通过套接字来进行数据通信。第一个属性为 [s],最常在 /var/run目录中看到这种文件类型。

管道(FIFO,pipe):FIFO也是一种特殊的文件类型,它主要的目的是,解决多个程序同时存取一个文件所造成的错误。FIFO是first-in-first-out(先进先出)的缩写。

文件结构

/:根目录,所有的目录、文件、设备都在/之下,/就是Linux文件系统的组织者,也是最上级的领导者。

/bin:bin 就是二进制(binary)英文缩写。在一般的系统当中,都可以在这个目录下找到linux常用的命令。系统所需要的那些命令位于此目录。

/boot:Linux的内核及引导系统程序所需要的文件目录,比如 vmlinuz initrd.img 文件都位于这个目录中。在一般情况下,GRUB或LILO系统引导管理器也位于这个目录。

/cdrom:这个目录在刚刚安装系统的时候是空的。可以将光驱文件系统挂在这个目录下。例如:mount /dev/cdrom /cdrom

/dev:dev 是设备(device)的英文缩写。这个目录对所有的用户都十分重要。因为在这个目录中包含了所有linux系统中使用的外部设备。但是这里并不是放的外部设备的驱动程序。这一点和常用的windows,dos操作系统不一样。它实际上是一个访问这些外部设备的端口。可以非常方便地去访问这些外部设备,和访问一个文件,一个目录没有任何区别。

/etc:etc这个目录是linux系统中最重要的目录之一。在这个目录下存放了系统管理时要用到的各种配置文件和子目录。要用到的网络配置文件,文件系统,x系统配置文件,设备配置信息,设置用户信息等都在这个目录下。

/home:如果建立一个用户,用户名是”xx”,那么在/home目录下就有一个对应的/home/xx路径,用来存放用户的主目录。

/lib:lib是库(library)英文缩写。这个目录是用来存放系统动态连接共享库的。几乎所有的应用程序都会用到这个目录下的共享库。因此,千万不要轻易对这个目录进行什么操作,一旦发生问题,系统就不能工作了。

/lost+found:在ext2或ext3文件系统中,当系统意外崩溃或机器意外关机,而产生一些文件碎片放在这里。当系统启动的过程中fsck工具会检查这里,并修复已经损坏的文件系统。有时系统发生问题,有很多的文件被移到这个目录中,可能会用手工的方式来修复,或移到文件到原来的位置上。

/mnt:这个目录一般是用于存放挂载储存设备的挂载目录的,比如有cdrom等目录。可以参看/etc/fstab的定义。

/media:有些linux的发行版使用这个目录来挂载那些usb接口的移动硬盘(包括U盘)、CD/DVD驱动器等等。

/opt:这里主要存放那些可选的程序。

/proc:可以在这个目录下获取系统信息。这些信息是在内存中,由系统自己产生的。

/root:Linux超级权限用户root的家目录。

/sbin:这个目录是用来存放系统管理员的系统管理程序。大多是涉及系统管理的命令的存放,是超级权限用户root的可执行命令存放地,普通用户无权限执行这个目录下的命令,这个目录和/usr/sbin; /usr/X11R6/sbin或/usr/local/sbin目录是相似的,凡是目录sbin中包含的都是root权限才能执行的。

/selinux :对SElinux的一些配置文件目录,SElinux可以让linux更加安全。

/srv 服务启动后,所需访问的数据目录,举个例子来说,www服务启动读取的网页数据就可以放在/srv/www中

/tmp:临时文件目录,用来存放不同程序执行时产生的临时文件。有时用户运行程序的时候,会产生临时文件。/tmp就用来存放临时文件的。/var/tmp目录和这个目录相似。

/usr

这是linux系统中占用硬盘空间最大的目录。用户的很多应用程序和文件都存放在这个目录下。在这个目录下,可以找到那些不适合放在/bin或/etc目录下的额外的工具

/usr/local:这里主要存放那些手动安装的软件,即不是通过“新立得”或apt-get安装的软件。它和/usr目录具有相类似的目录结构。让软件包管理器来管理/usr目录,而把自定义的脚本(scripts)放到/usr/local目录下面、。

/usr/share :系统共用的东西存放地,比如 /usr/share/fonts 是字体目录,/usr/share/doc和/usr/share/man帮助文件。

/var:这个目录的内容是经常变动的,看名字就知道,可以理解为vary的缩写,/var下有/var/log 这是用来存放系统日志的目录。/var/ www目录是定义Apache服务器站点存放目录;/var/lib 用来存放一些库文件,比如MySQL的,以及MySQL数据库的的存放地。

linux操作系统安全加固建议

u22e阅读(2415)

1.为什么要进行安全加固?

安全加固的重要性不言而喻。我这里把操作系统同马斯洛需求层次做了个类比,如有不恰当之处,还请指教。同人一样,操作系统也有自己的生理需求,对于人来说生理需求无非吃喝拉撒等,而对于操作系统来说它的生理需求又是什么了?我个人认为应该是底层硬件的配置,内核的驱动,操作系统基本配置以及设备加电。那么机器加了电,读取硬件信息,驱动内核,启动操作系统后,随之而来最重要事当然是安全需求。人类的安全需求主要包括人身安全,生活稳定以及心灵上追求的安全感等,对于操作系统而言,它的安全需求则需要通过配置合理的权限、参数以及防火墙,关闭不必要的端口,及时修补漏洞等等技术来增加系统的安全性。由此,我整理了一篇简短的linux加固文章,仅适用于linux初学者,希望能够对大家有所帮助。网络安全一直是互联网中最重要、缺口最大的领域,保障网民上网的安全刻不容缓。

2.操作系统安全加固是什么?

操作系统安全加固就是使操作系统安全稳定的各种技术以及各种方案。安全加固可从操作系统内外来看,对内就是是操作系统配置以及内核参数的调整,这就和人类习武习文是一个道理,自身强大了,别人也就不敢欺负你了。对外,操作系统可以通过建立防火墙,关闭不必要开放的端口,开启漏洞扫描技术等等,建立一座抵御外网攻击的长城。安装操作系统以及应用程序的安全补丁、安全配置,风险防范,风险预测,安全防范规划都属于操作系统安全加固的内容,保证业务的安全稳定离不开操作系统的安全加固。

3.如何实现linux操作系统的安全加固?

第一点:用户权限管理

合理分配用户账号以及用户权限。根据用户的业务需求配置其最小的用户权限。对于一些重要的文件应该设置合理的权限,避免没有经验的管理员执行误操作而造成巨大的损失。对于用户的密码应该设置复杂,长度至少大于8位。以下是有关用户权限管理以及密码策略的一些命令和配置文件,可根据实际情况作出相应的更改。

参考命令:
    useradd username
    passwd username
    chmod 750 directory (权限可根据具体情况设置)
    userdel username
    usermod -L username
    usermod -U username
    groupdel username
参考配置文件:
    /etc/login.defs 
    /etc/pam.d/system-auth
    /etc/pam.d/su
    /etc/ssh/sshd_config
第二点:日志分析

启用日志记录功能,记录系统安全事件,方便管理员分析日志文件及及时处理系统故障。

参考配置文件:
    /etc/rsyslog.conf 
    /etc/syslog.conf 
    /var/log/message
    /var/log/boot.log
    /var/log/dmesg
第三点:端口管理:关闭不必要的端口
参考命令:
    netstat
第四点:日常巡检
定期对操作系统基础运行情况进行巡检,有助于了解
设备的运行情况以及发现故障隐患。
    参考命令及操作:
        top 
        检查cpu、内存、swap利用率
        df -h 
        检查磁盘空间的利用率
        w 
        系统运行时长及负载情况
        service iptables status 
        防火墙状态       
        cat /etc/passwd     
        cat /etc/shadow 
        检查异常账号
        ifconfig
        ethtool  XXX
        检查网络连接
        dmesg   
        系统硬件日志文件
        lastlog 
        last
        lastb 
        检查登陆情况      
        more /var/log/messages
        系统日志
        who
        当前登录用户

网络分享的25段shell脚本代码,日常工作基本够用

u22e阅读(6743)

引言

自己写了一下小的shell实例,虽然很小,但所有的大的程序都是由小的模块堆积起来的。
程序员一定要懂得一种脚本的书写,而我,只会在linux下工作,所以就只能写linux的shell脚本了。

代码

1.模拟linnux登录shell

2.比较两个数大小

3.查找/root/目录下是否存在该文件

4.for循环的使用

5.命令行输入

6.删除当前目录下大小为0的文件

7.如果/export/um_lpp_source下有文件,那么将其文件系统大小改为3G

8.测试IP地址

9.如果test.log的大小大于0,那么将/opt目录下的*.tar.gz文件

10.打印读取的内容,为下面的例子做准备

11.从0.sh中读取内容并打印

12.读取a.c中的内容并做加1运算

13.普通无参数函数

14.给函数传递参数

15.创建文件夹

16.获取本机IP地址

17.查找最大文件

18.查找当前网段内IP用户,重定向到ip.txt文件中

19.打印当前用户

20.case语句练习

21.yes/no返回不同的结构

22.杀进程

 23.内置命令的使用

24.打印无密码用户

25.检查端口号是否已启动

总结

所有大程序都是由小模块堆积起来的,希望这些例子能给你启发,让你的工作更加顺利!

原文出处:马哥Linux运维