分类:前沿技术

放眼未来,关注技术前沿

数据库连接池浅析

数据库连接池浅析

一、前言

前段时间我们学习了JDBC的使用,目前我们使用JDBC仅仅是局限于本地访问,那么,必然会有已下几种情况:

a.一个客户端多次访问同一个数据库;

b.多个客户端访问同一个数据库;

c.多个客户端同时访问同一个数据库(即并发访问);

那么问题来了:我们都知道使用JDBC每次访问数据库就需要重新连接一次,

访问完毕后需要关闭(断开)连接,

每次进行这样的连接就涉及到资源的分配和释放问题,因此,频繁的建立、关闭连接,会极大的减低系统的性能。为了解决这个问题,就需要知道资源共享的相关知识了。对于共享资源,有一个很著名的设计模式:资源池(resource pool)。该模式正是为解决资源频繁分配、释放所造成的问题。数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量 的连接,当需要建立数据库连接时,只需要从缓冲池中取出一个了,使用完毕后再放回去。我们可以通过设定连接池最大数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库连接使用数量,使用情况,为系统开发,测试以及性能调整提供依据。

二、连接池

2.1连接池的工作原理

数据库连接池的基本原理是在内部对象池中维护一定数量的数据库连接,并对外暴露数据库连接获取和返回方法。外部使用者可通过getConnection 方法获取连接,使用完毕后再通过releaseConnection 方法将连接返回,注意此时连接并没有关闭,而是由连接池管理器回收,并为下一次使用做好准备。

连接池工作原理

2.2连接池的优点(摘自网络)

a.资源重用

由于数据库连接得到重用,避免了频繁创建、释放连接引起的大量性能开销。在减少系统消耗的基础上,另一方面也增进了系统运行环境的平稳性(减少内存碎片以及数据库临时进程/线程的数量)。

b.更快的系统响应速度

数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而缩减了系统整体响应时间。

c.新的资源分配手段

对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接的配置,实现数据库连接池技术。某一应用最大可用数据库连接数的限制,避免某一应用独占所有数据库资源。

d.统一的连接管理,避免数据库连接泄漏

在较为完备的数据库连接池实现中,可根据预先的连接占用超时设定,强制收回被占用连接。从而避免了常规数据库连接操作中可能出现的资源泄漏。

2.3常用的数据库连接池技术

目前较为常用的数据库连接池技术主要有C3P0和DBCP。

三、java数据库连接池技术简单使用

下面就C3P0演示java数据库连接池技术的简单使用。

a.下载C3P0的jar包;

这一类技术操作中各种jar包的导入一直是个很重要的问题,包括jar包的版本,路径等等问题,值得引起足够的重视。

b.将jar包导入eclipse;

c.细节处理(其他的直接看源代码即可)

源码分享:

执行结果如下(数据表中只有一条记录):

四、相关文档资料

C3P0连接池的使用详解

 

 

ssh的密钥管理与配置多个git仓库的ssh-key的切换

ssh的密钥管理与配置多个git仓库的ssh-key的切换

一、ssh的密钥管理

SSH的密钥管理主要包括两个方面:生成公钥/私钥对以及公钥(私钥自己保密)的分发。

1.1生成客户端自己的密钥对

使用命令:

Generating public/private rsa key pair.
Enter file in which to save the key (/home/gaohan/.ssh/id_rsa):

(按回车就好)

Enter passphrase (empty for no passphrase):
Enter same passphrase again: (输入密码)

Your identification has been saved in /home/[user]/.ssh/identity.

Your public key has been saved in /home/[user]/.ssh/identity.pub.
2016-07-11 09-15-12屏幕截图

实际使用时我们常用这个命令:

邮箱替换成你的个人邮箱即可。

1.2分发共用密钥

如果一切顺利的话,可以在客户端的家目录里找到.ssh目录,里面有id_rsaid_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥。然后登录git远程仓库,找到ssh-key界面,将文件id_rsa.pub里的内容复制到相应的文本框里即可。

sshkry

二、配置多个git仓库的ssh-key的切换

如果一个主机连接有多个客户端,就需要建立不同的密钥对。通俗一点来讲,比如说,我有两台电脑,一个在实验室,另一个在家里,那么这就像当于两个客户端,我想把它们的代码文件内容都上传到同一个git远程托管服务器,那么就需要两台电脑都生成一个密钥对再与git远程托管服务器连接。相应的就出现了两个ssh-key,我们把它们设定为id_rsa和id_rsa_second,在默认情况下,ssh总是使用id_rsa密钥文件进行链接,这样对于second账号的认证自然是不通过的,接下来就涉及到了它们之间的切换问题。

2.1生成新的ssh-key

首先cd到~/.ssh 使用 ssh-keygen -t -rsa -C ‘second@mail.com’(为你工作账号的邮箱地址) 生成新的SSHkey:id_rsa_second

命令:

2.2添加ssh-key到服务器

生成后将新的ssh public key添加到git远程托管服务器中, 然后在~/.ssh 目录下创建config文件,该文件用于配置私钥对应的服务器。内容如下:

2.3进行连接

执行命令: 收藏代码

时会使用second的id_rsa_second与服务器进行连接.而链接非gitlab.xxx.com服务器时则会使用first的密钥进行链接。

2.4git add、git commit、git remote add、git push

需要说明的一点,在git commit 时需要一次身份验证,正确输入你的用户名和邮箱就可以了。

总结一下:其实建立第二个密钥对的区别就在于对第二密钥对的声明,因此需要在.ssh目录下添加config文件,添加语句dentityFile ~/.ssh/id_rsa_second声明这是第二个密钥对。这条连接命令就体现出来了。

ubuntu常见错误–Could not get lock /var/lib/dpkg/lock解决

ubuntu常见错误–Could not get lock /var/lib/dpkg/lock解决

通过终端安装程序sudo apt-get install xxx 时出错:
E: Could not get lock /var/lib/dpkg/lock – open (11: Resource temporarily unavailable)
E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it
出现这个问题可能是有另外一个程序正在运行,导致资源被锁不可用。而导致资源被锁的原因可能是上次运行安装或更新时没有正常完成,进而出现此状况,解决的办法其实很简单:
在终端中敲入以下两句
sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock
算法的时间与空间复杂度

算法的时间与空间复杂度

Data Structure———Algorithm

算法的时间与空间复杂度

一、算法的时间复杂度

1、算法的执行时间和频度

!* 首先明确一下一些专业术语的概念

* 算法的执行时间 = 所有语句执行时间的总和

* 语句执行时间 = 该语句重复执行次数×该语句每执行一次所需时间

* 频度:一条语句重复执行的次数

!* (!*在本文中代表要注意的知识点)算法实际所需的具体时间与机器的软硬件环境(机器速度、编译程序质量等)相关;因此可以设每条语句执行一次所需时间是单位时间,所以一个算法的执行时间即所有语句频度之和。

2、问题规模和算法时间复杂度

* 规模(有些书中称之为模块):算法求解问题的输入量。通常用n表示。

例:

矩阵的阶数;多项式的项数;排序时数的个数;一个图中的顶点数或边数;集合中的元素个数。

* 数量级‘ O ‘:

数学定义:若Tn)和fn)是定义在整数集合上的两个函数,则Tn=Ofn))表示,存在常数c>0n0,使得当n>n0时都满足0<=T(n)<=cf(n).

* 时间复杂度:一个算法的时间复杂度是该算法的执行时间。记作Tn)(该函数是n的函数)。设一个函数是f(n)(找的这个函数是为了方便我们进行比较),T(n)f(n)是同阶的(此处可联系高数求极限时的同阶无穷小,即两函数相除,当n→∞时,极限为常数c),则可说T(n)f(n)的数量级相同,记作:

T(n)=O(f(n))

T(n)称为算法的渐近时间复杂度,简称时间复杂度。

!* 上面公式可以这样理解:随着模块n的增加,算法执行时间的增长率和fn)的增长率成正比,所以fn)越小,Tn)越小,算法效率越高。

psTn)与fn)都是增长的,当过了某一个点时两个函数的函数值成正比,每点的增长率自然也成正比,不过前提是n→∞,n没有足够大时,是体现不出来的。

例:

Tn=2n^3+3n^2+2n+1

f(n)=n^3

limT(n)/n^3=lim(2n^3+3n^2+2n+1)/n^3=2;

* lim符号下应是n→∞

通过上式便可记为Tn=On^3.

3、时间复杂度计算方法

*步骤

1)、先跟据算法确定它的执行次数(其实只要保证基本语句执行次数中最高次幂正确即可,即频度最大的语句的次数,其实这个可以联系上个例子,其余项的极限为0,所以可以忽略)。

2)、找出Tn)的同数量级,通常有以下函数:

O(1)<O(log2n)<O(n)<O(nlog2n)<O(n^2)<O(n^3)<…<O(n^k)<O(2^n)<O(n!)

!* O(log2n),O(n),O(nlog2n),O(n^2),O(n^3)称为多项式时间,而O(2^n)O(n!)称为指数时间。前者为有效算法,为P类问题,而后者,当n无限大时可以想象其速度增长之快,为NP类问题。

* 求算法的一些计算法则

1、对于一些简单的输出输入算法或算法中不存在循环语句,其时间复杂度就认为是O1)。

2、对于顺序结构,需要依次执行的语句可用求和法则

* 求和法则

若算法的2个部分的时间复杂度分别为T1n=Ofn)),T2n=Ogn))则

T1n+T1n=Omaxfn),gn))

特别的,若T1m=Ofm)),T2n=Ogn)),

T1m+T2n=Ofm+gn))

3、对于选择结构,如if语句,主要时间耗费是在执行thenelse字句,需注意的是,检验条件也需要O1)的时间。

4、循环结构—————乘法法则

* 乘法法则

若算法的2个部分的时间复杂度分别为T1n=Ofn)),T2n=Ogn))则

T1n*T1n=Ofn*gn)

5、对于复杂的算法,可以将它分为几个容易估算的部分,再利用求和或乘法法则求得结果。

还有另外2个运算法则:

1)、gn=Ofn)),则Ofn))+Ogn))=Ofn))

2)、Ocfn=Ofn)),其中c为常数

在此说明一个例子:

1for (i=0;i<n;i++)

2if (a[i]==e) return i+1;

3return 0;

* 分析:若a[0]=e,则Tn=O1);若ea[n-1]或不存在,则Tn=On)。

!* 由上面的例子可以出 Tn)不仅和问题的规模大小有关,与问题数据的初始状态也有关。

*由此便产生最好,最坏以及平均状态下的时间复杂度的概念,人们更关心最坏情况,拿过一个算法来可以讨论分析最坏情况下,算法执行时间的上界。

 

最后附上一道题计算该算法的时间复杂度,检验一下你的掌握情况:

1x=1

2for(i=1;i<n;i++)

3for (j=1;j<i;j++)

4for (k=1;k<j;k++)

5x++;

解析:(:i=1,:n)(:j=1,:i)(:k=1,:j)1=∑(:i=1,:n)∑(:j=1,:i)j=∑(:i=1,:n)ii+1/2=

[n(n+1)(2n+1)/6+n(n+1)/2]/2

T(n)=O(n^3)

二、算法的空间复杂度(Space Complexity

* 空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度,也是规模n的函数,记作:

S(n)=O(f(n))

!* 其中对于输入数据所占的空间取决于问题本身,与算法无关,只需分析该算法在实现使所需要的辅助空间(临时占用的存储空间)即可。

git的基本认识和基本应用

git的基本认识和基本应用

鉴于咱们实验室新加入的同学对于git还不够认识,我的个人水平也有限,就粗略地整理一下我使用git的经验和认识,不要喷才好。哈哈

一、git是什么

1.1 git的基本介绍

Git — The stupid content tracker, 因此又被称为“傻瓜内容跟踪器”。

git(分布式版本控制系统)是一个快速、开源、分布式的版本控制系统,用来保留工程源代码历史状态的命令行工具。

1.2 什么是版本控制系统

官方解释:

一个博客 详细介绍
通俗的解释:

软件开发时,对你写的代码及文档有效进行的管理,将你的代码和开发文档的最新版本每天提交到服务器,第二天再从服务器上下载下这个最新版本,再对其进行维护。免得你本机坏了,代码和文档丢了。其实相当于将你的东西进行一下备份,免得因为各种原因丢失了而不能挽回。(我就误删过代码)

有集中式版本控制系统,分布式版本控制系统。

二、git的安装

我们的ubantu已经为我们配置好了git,如果没有可以自己安装。

2.1 下载网址:http://blog.sina.com.cn/s/blog_6d9a1d1f0101es8d.html

2.2 安装过程:

1.$ tar xzvf git-1.6.5

2.$ cd git-1.6.5

3.$ ./config –prefix=/usr/local

 4.$ make

 5.$ sudo make install

 6.$ git –version

三、工作区、暂存区、版本库

3.1 三者关系

用一个图进行简单解释

Directory:使用Git管理的一个目录,也就是一个仓库,包含我们的工作空间和Git的管理空间。

WorkSpace:需要通过Git进行版本控制的目录和文件,这些目录和文件组成了工作空间。

.git:存放Git管理信息的目录,初始化仓库的时候自动创建。

Index/Stage:暂存区,或者叫待提交更新区,在提交进入repo之前,我们可以把所有的更新放在暂存区。

Local Repo:本地仓库,一个存放在本地的版本库;HEAD会只是当前的开发分支(branch)。

Stash:是一个工作状态保存栈,用于保存/恢复WorkSpace中的临时状态。

3.2 工作区(WorkSpace)

工作区就是你当前所在的目录,你会在这个目录下写代码、调试程序等等工作.例如下图就是我所在的目录也就是我的当前工作区。

file:///home/gaohan/%E6%A1%8C%E9%9D%A2/%E5%B7%A5%E4%BD%9C%E5%8C%BA.png

再看一个更直观的:这就是我当前的工作目录及工作区。

3.3暂存区(Index/Stage)

3.3.1 定义

工作区有一个隐藏目录“.git”,(使用ls -a命令可以查看)这个不算工作区,而是Git的版本库。Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

3.3.2 作用

暂存区相当于一个临时中转站,可以使用git add命令将工作区的文件修改内容的更新暂时提交到缓存区,可以多次提交,最后使用git commit命令一次性提交到版本库的当前分支master。

3.4版本库

3.4.1 本地仓库(Local Repo)

在Git中,我们将需要进行版本控制的文件目录叫做一个仓库(repository),每个仓库可以简单理解成一个目录,这个目录里面的所有文件都通过Git来实现版本管理,Git都能跟踪并记录在该目录中发生的所有更新。及你所有的增加、删除、修改文件的记录都会被记录下来。

3.4.2 远程仓库

远程仓库是指托管在因特网或其他网络中的你的项目的版本库。 你可以有好几个远程仓库,通常有些仓库对你只读,有些则可以读写。 与他人协作涉及管理远程仓库以及根据需要推送或拉取数据。 管理远程仓库包括了解如何添加远程仓库、移除无效的远程仓库、管理不同的远程分支并定义它们是否被跟踪等等。

四、实践操作

4.1 从工作区到缓存区

4.1 .1 图解

4.1.2 创建一个仓库

• 选择一个适当的目录下创建一个新的目录learngit

gaohan@gaohan-Lenovo-G50-70:~$ mkdir learngit

• 进入当前目录

gaohan@gaohan-Lenovo-G50-70:~$ cd learngit

• 查看当前目录下的文件

gaohan@gaohan-Lenovo-G50-70:~/learngit$ ls -a
. ..

• 建立及初始化仓库

gaohan@gaohan-Lenovo-G50-70:~/learngit$ git init
初始化空的 Git 版本库于 /home/gaohan/learngit/.git/

• 再次查看当前目录的内容

gaohan@gaohan-Lenovo-G50-70:~/learngit$ ls -a
. .. .git
你会发现多了一个.git目录,里面的内容很重要,切不可随意修改哟。

4.1.3 命令实现

• 添加文件

下面我们向版本库中增加文件,需要注意的是,在版本库中只能跟踪和管理文本文件,比txt文件、js文件、php文件、java文件等,所有的程序代码都可以的。但是像视频、图片等这些二进制文件,虽然能由git管理,但是只能记录大小,无法跟踪具体修改了什么(其实这个与我们无关,这是百度上的)

现在我新建一个名为readme的文件(没有类型):

gaohan@gaohan-Lenovo-G50-70:~/learngit$ vi readme
gaohan@gaohan-Lenovo-G50-70:~/learngit$ ls
readme
gaohan@gaohan-Lenovo-G50-70:~/learngit$ ls -a
. .. .git readme

• 向文件中写入

gaohan@gaohan-Lenovo-G50-70:~/learngit$ echo “good morning” -> readme
gaohan@gaohan-Lenovo-G50-70:~/learngit$ cat readme
good morning –

这就是所谓的文件的修改、添加(及文件的变化)

• 将文件的变化提交到暂存区

•• 命令实现

gaohan@gaohan-Lenovo-G50-70:~/learngit$ git add readme

查看工作区的状态:

gaohan@gaohan-Lenovo-G50-70:~/learngit$ git status
位于分支 master
要提交的变更:
(使用 “git reset HEAD <文件>…” 撤出暂存区)

修改: readme

•• 命令详解

git add (+) 文件名(你要提交的目标的名字)

git status 查看当前工作区的状态

4.2 从暂存区到本地仓库

现在将暂存在暂存区的文件变化提交到本地仓库

• 提交

gaohan@gaohan-Lenovo-G50-70:~/learngit$ git commit -m “git”
[master 63faf38] git
1 file changed, 1 insertion(+), 1 deletion(-)

• 查看

gaohan@gaohan-Lenovo-G50-70:~/learngit$ git status
位于分支 master
无文件要提交,干净的工作区

“干净的工作区”表示提交成功

• 命令详解

git commit -m “提交的描述信息”

参数-m 的作用很大,尽量不要省略,如果我们这里不用-m参数的话,git将调到一个文本编译器(通常是vim)来让你输入提交的描述信息可能一天下来,你对工作树中的许多文档都进行了更新(文档添加、修改、删除),但是我忘记了它们的名字,此时若将所做的全部更新添加到索引中,比较轻省的做法就是:git commit -a -m “提交的描述信息”git commit 命令的-a 选项可只将所有被修改或者已删除的且已经被git管理的文档提交倒仓库中。如果只是修改或者删除了已被Git 管理的文档,是没必要使用git add 命令的。

4.3 从暂存区到远程仓库

4.3.1 创建远程仓库

远程仓库有Github这个比较有名,自己百度吧,我就不多做解释了。

另一个就是我们实验室老师自己自己开设的远程托管服务器。

另外,这一个具体的操作步骤很多,我已经在之前的博客里写过了,可以去那里查看,就不在这里解释了。

4.3.2 添加远程仓库

• 命令

gaohan@gaohan-Lenovo-G50-70:~/learngit$ git remote add origin git@softlab.sdut.edu.cn:gaoziqiang/learngit.git

• 命令详解

git remote add origin git@softlab.sdut.edu.cn:gaoziqiang/learngit.git

git remote add:远程添加

origin:远程仓库的别名,一般默认为origin。不过我个人建议改成和你的远程仓库的名字一样的,不然以后提交的时候很容易忘记。(我现在建了9个仓库,都快忘了每个仓库的别名了)

git@softlab.sdut.edu.cn:gaoziqiang/learngit.git:远程仓库的SSH

4.3.3 提交到远程仓库

• 命令实现
gaohan@gaohan-Lenovo-G50-70:~/learngit$ git push -u origin master
对象计数中: 6, 完成.
Delta compression using up to 4 threads.
压缩对象中: 100% (2/2), 完成.
写入对象中: 100% (6/6), 408 bytes | 0 bytes/s, 完成.
Total 6 (delta 0), reused 0 (delta 0)
To git@softlab.sdut.edu.cn:gaoziqiang/learngit.git
* [new branch] master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master。

• 命令详解

git push -u origin master

git push:推送的意思

-u:第一次推送加上这个参数,以后就不用了

origin:远程仓库的别名

master:远程仓库的master分支。

分支这一块我就不作详细的解释了,我了解的也不多,容我再研究研究。(哈哈)

五、基本命令总结

5.1 本次涉及到的命令

• git add <file>   将工作文件修改提交到本地暂存区

• git commit -m “描述信息”  将修改提交到本地仓库

• git status 查看当前分支的情况

• git remote add origin 将本地主分支推到远程主分支

• git push -u origin master 将本地主分支推到远程(如无远程主分支则创建,用于初始化远程仓库)

5.2 其他git命令(偷个懒,百度的)

• 查看、添加、提交、删除、找回,重置修改文件:

git help <command> # 显示command的help

git show # 显示某次提交的内容 git show $id

git co — <file> # 抛弃工作区修改

git co . # 抛弃工作区修改

git add <file> # 将工作文件修改提交到本地暂存区

git add . # 将所有修改过的工作文件提交暂存区

git rm <file> # 从版本库中删除文件

git rm <file> –cached # 从版本库中删除文件,但不删除文件

git reset <file> # 从暂存区恢复到工作文件

git reset — . # 从暂存区恢复到工作文件

git reset –hard # 恢复最近一次提交过的状态,即放弃上次提交后的所有本次修改

git ci <file> git ci . git ci -a # 将git add, git rm和git ci等操作都合并在一起做                                    git ci -am “some comments”

git ci –amend # 修改最后一次提交记录

git revert <$id> # 恢复某次提交的状态,恢复动作本身也创建次提交对象

git revert HEAD # 恢复最后一次提交的状态

查看文件diff:

git diff <file> # 比较当前文件和暂存区文件差异 git diff

git diff <id1><

id2> # 比较两次提交之间的差异

git diff <branch1>..<branch2> # 在两个分支之间比较

git diff –staged # 比较暂存区和版本库差异

git diff –cached # 比较暂存区和版本库差异

git diff –stat # 仅仅比较统计信息

查看提交记录

git log git log <file> # 查看该文件每次提交记录

git log -p <file> # 查看每次详细修改内容的diff

git log -p -2 # 查看最近两次详细修改内容的diff

git log –stat #查看提交统计信息

tig

Mac上可以使用tig代替diff和log,brew install tig

• Git 本地分支管理

•• 查看、切换、创建和删除分支

git br -r # 查看远程分支

git br <new_branch> # 创建新的分支

git br -v # 查看各个分支最后提交信息

git br –merged # 查看已经被合并到当前分支的分支

git br –no-merged # 查看尚未被合并到当前分支的分支

git co <branch> # 切换到某个分支

git co -b <new_branch> # 创建新的分支,并且切换过去

git co -b <new_branch> <branch> # 基于branch创建新的new_branch

git co $id # 把某次历史提交记录checkout出来,但无分支信息,切换到其他分支会自动删除

git co $id -b <new_branch> # 把某次历史提交记录checkout出来,创建成一个分支

git br -d <branch> # 删除某个分支

git br -D <branch> # 强制删除某个分支 (未被合并的分支被删除的时候需要强制)

•Git远程分支管理

git pull # 抓取远程仓库所有分支更新并合并到本地

git pull –no-ff # 抓取远程仓库所有分支更新并合并到本地,不要快进合并

git fetch origin # 抓取远程仓库更新

git merge origin/master # 将远程主分支合并到本地当前分支

git co –track origin/branch # 跟踪某个远程分支创建相应的本地分支

git co -b <local_branch> origin/<remote_branch> # 基于远程分支创建本地分支,功能同上

git push # push所有分支

git push origin master # 将本地主分支推到远程主分支

git push -u origin master # 将本地主分支推到远程(如无远程主分支则创建,用于初始化远程仓库)

git push origin <local_branch> # 创建远程分支, origin是远程仓库名

git push origin <local_branch>:<remote_branch> # 创建远程分支

git push origin :<remote_branch> #先删除本地分支(git br -d <branch>),然后再push删除远程分支

• Git远程仓库管理

git remote -v # 查看远程服务器地址和仓库名称

git remote show origin # 查看远程服务器仓库状态

git remote add origin git@ github:robbin/robbin_site.git # 添加远程仓库地址

git remote set-url origin git@ github.com:robbin/robbin_site.git # 设置远程仓库地址(用于修改远程仓库地址) git remote rm <repository> # 删除远程仓库

创建远程仓库

git clone –bare robbin_site robbin_site.git # 用带版本的项目创建纯版本仓库

scp -r my_project.git git@ git.csdn.net:~ # 将纯仓库上传到服务器上

mkdir robbin_site.git && cd robbin_site.git && git –bare init # 在服务器创建纯仓库

git remote add origin git@ github.com:robbin/robbin_site.git # 设置远程仓库地址

git push -u origin master # 客户端首次提交

git push -u origin develop # 首次将本地develop分支提交到远程develop分支,并且track

git remote set-head origin master # 设置远程仓库的HEAD指向master分支

也可以命令设置跟踪远程库和本地库

git branch –set-upstream master origin/master

git branch –set-upstream develop origin/develop

hadoop2.7.2安装部署教程

hadoop2.7.2安装部署教程

1.配置命名服务:hdfs-site.xml
<property>
        <name>dfs.nameservices</name>
        <value>hearain</value>
</property>
<property>
        <name>dfs.ha.namenodes.hearain</name>
        <value>nn1,nn2</value>
</property>
<property>
        <name>dfs.namenode.rpc-address.hearain.nn1</name>
        <value>namenode1的地址:8020</value>
</property>
<property>
        <name>dfs.namenode.rpc-address.hearain.nn2</name>
        <value>namenode1的地址:8020</value>
</property>
<property>
        <name>dfs.namenode.http-address.hearain.nn1</name>
        <value>namenode1的地址:50070</value>
</property>
<property>
        <name>dfs.namenode.http-address.hearain.nn2</name>
        <value>namenode1的地址:50070</value>
</property>
<property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://地址加端口,机器以分号相隔</value>
</property>
<property>
        <name>dfs.client.failover.proxy.provider.hearain</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
        <name>dfs.ha.fencing.methods</name>
        <value>sshfence</value>
</property>
<property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/root/.ssh/id_rsa</value>
</property>
<property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/hadoop/journal/data</value>
</property>
<property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
</property>
2.配置core-site配置文件
<property>

<name>fs.defaultFS</name>

<value>hdfs://hearain(集群名字)</value>

</property>

<property>

<name>ha.zookeeper.quorum</name>

<value>集群地址加端口号,机器之间以逗号分隔node1:2181</value>

</property>

<property>

<name>Hadoop.tmp.dir</name>

<value>/hadoop/tmp/</value>

</property>
3.配置和安装zookeeper

然后在相应的机器上创建myid文件,里面写上server后面带的相应的数字

4.分别在journal机器上启动

启动journalnode:

5.启动后在任意一台namenode机器上执行格式化(bin目录下):
hostname node1
./hdfs namenode -format
6.启动刚格式化的namenode机器

7.在没有格式化的namenode上去执行

./hdfs namenode -bootstrapStandby
8.运行./dfs-stop.sh
9.运行./dfs-start.sh
10.运行jps发现ZKFC没有启动,原因有可能是没有格式化

11.在其中一个namenode上面格式化ZKFC,在bin目录下执行

12.重新执行8和9即可
13.配置mapreduce的配置文件
<property>

<name>mapreduce.framework.name</name>

<value>yarn</value>

</property>

14.配置yarn的配置文件

<property>

<name>yarn.resourcemanager.hostname</name>

<value>node1</value>

</property>

<property>

<name>yarn.nodemanager.aux-services</name>

<value>mapreduce_shuffle</value>

</property>

<property>

<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>

<value>org.apache.hadoop.mapred.ShuffleHandler</value>

</property>

15.开启resourcemanager和nodemanager命令:

jps查看是否都运行成功:如果其中一个进程运行失败,则去logs里面去查看详细日志

node1:

node2:

node3:

开源实时日志分析ELK平台部署

开源实时日志分析ELK平台部署

参考日志:http://www.tuicool.com/articles/QFvARfr

由于图片不能直接复制,所以附上:有道云笔记链接

开源实时日志分析ELK平台部署

版本:elasticsearch-2.3.2

logstash-2.3.2

kibana-4.5.0

日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。

通常,日志被分散的储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。当务之急我们使用集中化的日志管理,例如:开源的 syslog ,将所有服务器上的日志收集汇总。

集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用grep 、 awk 和 wc 等 Linux 命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。

开源实时日志分析 ELK 平台能够完美的解决我们上述的问题, ELK 由ElasticSearch 、 Logstash 和 Kiabana 三个开源工具组成。官方网站:https://www.elastic.co/products

l   Elasticsearch 是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制, restful 风格接口,多数据源,自动搜索负载等。

l   Logstash 是一个完全开源的工具,他可以对你的日志进行收集、分析,并将其存储供以后使用(如,搜索)。

l   kibana 也是一个开源和免费的工具,他 Kibana 可以为 Logstash 和ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。

工作原理如下如所示:

在需要收集日志的所有服务上部署 logstash ,作为 logstash agent ( logstash shipper )用于监控并过滤收集日志,将过滤后的内容发送到 logstash indexer ,logstash indexer 将日志收集在一起交给全文搜索服务 ElasticSearch ,可以用ElasticSearch 进行自定义搜索通过 Kibana 来结合自定义搜索进行页面展示。

开源实时日志分析ELK平台部署流程:

( 1 )安装 Logstash 依赖包 JDK

Logstash 的运行依赖于 Java 运行环境, Logstash 1.5 以上版本不低于 java 7 推荐使用最新版本的 Java 。由于我们只是运行 Java 程序,而不是开发,下载 JRE 即可。首先,在 Oracle 官方下载新版 jre ,下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html

可以看到提供了多种版本,下载时,选择适合自己机器运行环境的版本,我使用的是 RHEL6.5 x86_64 的操作系统,所以,下载 linux-64 的版本。如果使用 Linux 下载执行如下命令下载即可。

JDK 的安装方式比较简单,只需将下载回来的程序包解压到相应的目录即可。

设置 JDK 的环境变量,如下:

在 Shell 提示符中执行 java �version 命令,显示如下结果,说明安装成功:

( 2 )安装 Logstash

下载并安装 Logstash ,安装 logstash 只需将它解压的对应目录即可,例如:/usr/local 下:

安装完成后运行如下命令:

我们可以看到,我们输入什么内容logstash按照某种格式输出,其中-e参数参数允许Logstash直接通过命令行接受设置。这点尤其快速的帮助我们反复的测试配置是否正确而不用写配置文件。使用CTRL-C命令可以退出之前运行的Logstash。

使用-e参数在命令行中指定配置是很常用的方式,不过如果需要配置更多设置则需要很长的内容。这种情况,我们首先创建一个简单的配置文件,并且指定logstash使用这个配置文件。 例如:在 logstash 安装目录下创建一个“基本配置”测试文件 logstash-test.conf, 文件内容如下:

Logstash 使用 input 和 output 定义收集日志时的输入和输出的相关配置,本例中input 定义了一个叫 “stdin” 的 input , output 定义一个叫 “stdout” 的 output 。无论我们输入什么字符, Logstash 都会按照某种格式来返回我们输入的字符,其中 output被定义为 “stdout” 并使用了 codec 参数来指定 logstash 输出格式。

使用logstash的-f参数来读取配置文件,执行如下开始进行测试:

( 3 )安装 Elasticsearch

下载 Elasticsearch 后,解压到对应的目录就完成 Elasticsearch 的安装。

启动 Elasticsearch

如果使用远程连接的 Linux 的方式并想后台运行 elasticsearch 执行如下命令:

./elasticsearch -Des.insecure.allow.root=true > nohup &

确认 elasticsearch 的 9200 端口已监听,说明 elasticsearch 已成功运行

启动elasticsearch后,发现只能在虚拟机上访问,在其他电脑上不能访问,解决办法是配置elasticsearch.yml的配置文件

然后重新启动elasticsearch:

./elasticsearch -Des.insecure.allow.root=true > nohup &

接下来我们在 logstash 安装目录下创建一个用于测试 logstash 使用 elasticsearch作为 logstash 的后端的测试文件 logstash-es-simple.conf,该文件中定义了stdout和elasticsearch作为output,这样的“多重输出”即保证输出结果显示到屏幕上,同时也输出到elastisearch中。

执行如下命令

这里可能会报错,新版本的不是host,而是hosts

我们可以使用 curl 命令发送请求来查看 ES 是否接收到了数据:

至此,你已经成功利用 Elasticsearch 和 Logstash 来收集日志数据了。

( 4 )安装 elasticsearch 插件

Elasticsearch-kopf 插件可以查询 Elasticsearch 中的数据,安装 elasticsearch-kopf,只要在你安装 Elasticsearch 的目录中执行以下命令即可:

安装完成后在 plugins 目录下可以看到 kopf

在浏览器访问 http://10.1.1.188:9200/_plugin/kopf 浏览保存在 Elasticsearch 中的数据,如下所示:

( 5 )安装 Kibana

下载 kibana 后,解压到对应的目录就完成 kibana 的安装

启动 kibana

使用 http://kibanaServerIP : 5601 访问 Kibana ,登录后,首先,配置一个索引,默认, Kibana 的数据被指向 Elasticsearch ,使用默认的 logstash-* 的索引名称,并且是基于时间的,点击“ Create ”即可。

看到如下界面说明索引创建完成。

点击“ Discover ”,可以搜索和浏览 Elasticsearch 中的数据,默认搜索的是最近 15分钟的数据。可以自定义选择时间。

到此,说明你的 ELK 平台安装部署完成。

( 6 )配置 logstash 作为 Indexer

将 logstash 配置为索引器,并将 logstash 的日志数据存储到 Elasticsearch ,本范例主要是索引本地系统日志。

使用 echo 命令模拟写入日志,命令执行后看到如下图的信息

刷新 kibana ,发现最新的测试数据显示到浏览器中,如下图所示:

到此, ELK 平台部署和基本的测试已完成。

跳至工具栏