Centos 6.5搭建SVN服务器

鉴于在搭建时,参考网上很多资料,网上资料在有用的同时,也坑了很多人

本文的目的,也就是想让后继之人在搭建svn服务器时不再犯错,不再被网上漫天的坑爹作品所坑害,故此总结

/******开始*********/

系统环境:Centos 6.5

第一步:通过yum命令安装svnserve,命令如下:

>yum -y install subversion

此命令会全自动安装svn服务器相关服务和依赖,安装完成会自动停止命令运行

若需查看svn安装位置,可以用以下命令:

>rpm -ql subversion

第二步:创建版本库目录(此仅为目录,为后面创建版本库提供存放位置)

选择在var路径下创建版本库,当前处于根目录下,一次性创建如下:

>mkdir /var/svn/svnrepos

第三步:创建svn版本库

在第二步建立的路径基础上,创建版本库,命令如下:

>svnadmin create /var/svn/svnrepos/xxxx   (xxxx为你预期的版本库名称,可自定义)

创建成功后,进入xxx目录下

>cd /var/svn/svnrepos/xxxx

进入目录,可以看见如下文件信息:

未分类

第四步:配置修改

进入已经创建好的版本库目录下,也就是前文说创建的xxxx

进入conf

>cd /var/svn/svnrepos/xxxx/conf

conf目录下,一共存放三份重要的配置文件,如下:

未分类

  • authz:负责账号权限的管理,控制账号是否读写权限

  • passwd:负责账号和密码的用户名单管理

  • svnserve.conf:svn服务器配置文件

细节修改如下:(希望大家严格按照以下信息,不用参考网络上其他资料)

修改authz文件信息,如下:

>vi authz

在文件内容的末尾,添加如下:

未分类

只需在末尾添加,无需在文件其他部分修改和添加任何东西(请忽略groups被我马赛克的地方,那其实也是条无用的记录,我忘记删掉而已),末尾内容如下:

[]

账号1 = rw

账号2 = rw

。。。。。

rw表示赋予此账号可读写的权限,请注意[]中的斜杠,一定是反斜杠,有些教程说,需添加版本库名称在括号内,我直接建议就这写,这样写允许访问的权限更大,避免一些错误

修改passwd文件信息

>vi passwd

账号密码文件无需做修改,也是直接将账号和密码信息追加到文件中即可,注意格式为:

  • 账号 = 密码

  • 例如:admin = 123456

  • 修改svnserve.conf(重要)

  • vi svnserve.conf

原始文件内容,都被注释掉的,我们只需要去掉4条指定内容前注释即可,如下:

未分类

大多数网络资料,都会让大家将authz-db = authz这条给去掉注释,经过我本人多次被坑经验,此条去掉后,虽然svn服务器可以连接,但一直会提示“认证失败”,注释掉即可正常

还有多数资料会让大家在realm = My First Repository处填写服务器ip,经过测试,填写后并无什么用处,所以大家去掉注释即可,无需做任何修改

到此,配置已经全部完成,账号信息已经添加成功

第五步:防火墙开启

多数情况下服务器安装完成,配置完成后,无法连接svn服务器,均是防火墙问题,大家按照如下3条命令逐一执行即可

>/sbin/iptables -I INPUT -p tcp --dport 3690 -j ACCEPT

>/etc/init.d/iptables save

>service iptables restart

执行结果如下图:

未分类

六:启动svn服务器

在跟目录下,执行如下命令:

>svnserve -d -r /var/svn/svnrepos

启动成功后,可用ps -aux查看服务启动是否成功

七:客户端访问svn服务器

在windows客户端,输入地址:svn://ip地址:3690/xxxx (iP地址为你linux的ip,xxxx为前文创建的版本库名称,3690为svn默认端口)

弹出输入用户名和密码,输入即可访问

到此,Linux下svn服务器搭建就总结完毕,感谢大家的阅读。

git基本操作命令介绍

1、创建一个新的仓库:(选择一个合适的地方,创建一个空目录)

$mkdir learngit       //learngit是用git新建的一个目录
$cd learngit
$pwd       //pwd命令用于显示当前目录

2、 通过git init命令把这个目录编程git可以管理的仓库:

$git init

3、 用git add把文件添加到仓库: (可以一次add多个文件,可反复使用,添加多个文件,其实质是把文件添加到“工作区”的“暂存区”)

$git add **                 //**是文件名

4、 用git commit告诉git,把文件提交到仓库,其实质是把文件添加到“分支区”:

$git commit -m “**说明内容**”         //-m后面输入的是本次提交的说明        

5、$git status命令可以随时掌握工作区状态

$git status      //告诉你有文件被修改过
$git diff      //可以查看修改内容

6、 $git log 可以告诉我们历史记录,当前的仓库状态 (–pretty=oneline参数可以把历史记录整合到一行)

$git log                    //告诉我们历史记录

7、 HEAD表示当前的版本,上一版本就是HEAD^,上上一个版本就是HEAD^^,上100个版本就是HEAD~100

8、 $git reset –hard HEAD^ //退回到上一个版本,如果–hard 后面是跟commit id,就可回到该id所对应的状态

$git reset --hard HEAD^     

9、查看该文件的内容

$cat **             //**是文件名

10、 查看命令历史

$git reflog             //以便确定要回到未来的哪个版本

11、 撤销修改:

$git checkout -- **                //把**文件在工作区的修改全部撤销

①一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
②一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

12、 删除文件:

$rm **             //删除工作区的文件
$git rm             //删除工作区、暂存区的文件
$git commit             //删除分支的文件

13、 添加远程库:

$git remote add origin git@server-name:path/repo-name.git             //关联一个远程仓库
$git push -u origin master              //第一次推送master分支的所有内容
$git push origin master              //此后,每次本地提交后,只要有必要,使用此命令推送最新修改

14、 从远程库克隆:

$git clone ***           //***是远程仓库地址
$cd *filename*
$ls

15、 git中与分支相关:

$git branch             //查看分支
$git branch              //创建分支
$git checkout              //切换分支
$git checkout -b               //创建+切换分支
$git merge -b               //合并某分支到当前分支
$git branch -d              //删除分支
$git log --graph             //查看分支合并图
$git merge --no-ff -m "说明"               //可以用普通模式合并,合并后的历史有分支,能看出来曾经做过的合并,二fastforward合并看不出来曾经做过的合并

16、 多人协作:

1、首先,可以试图用git push origin branch-name推送自己的修改;
2、如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
3、如果合并有冲突,则解决冲突,并在本地提交;
4、没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
5、如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch –set-upstream branch-name origin/branch-name。

Git 分支管理与冲突解决

Git 分支提供了并行工作的功能。 假设你准备同时学习 git 和 SVN,你可以用两个分支分别来学习,完成之后进行合并,你就掌握了两种工具的使用了。 Git 和 GitHub 的基本操作可以参考我的这篇博客Git 和 GitHub 使用。

1. 分支管理

  • 查看分支 git brance

  • 创建分支 git branch dev # dev 是分支名

  • 切换分支 git checkout dev

  • 创建+切换 git checkout -b dev

未分类

  • 合并分支 git merge dev #分支 dev 合并到 master

  • 删除分支 git branch -d dev #已合并的分支

未分类

  • 强行删除分支 git branch -D dev #分支未合并
  • 查看分支图 git log –graph

未分类

远程仓库的分支

当你从远程仓库克隆时,实际上 Git 自动把本地的 master 分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。

未分类

如果要在远程仓库的其他分支 (如 dev 分支)上开发,就必须创建远程 origin/dev 分支到本地:

    git checkout -b dev origin/dev       #创建远程仓库的分支到本地,必须先克隆或关联一个远程分支

本地分支和远程分支的名字最好一致。

未分类

推送成功之后, GitHub 上的 MyRepos 仓库 dev 分支上增加了一个文件。

未分类

2. 分支合并模式

Fast forward 模式

默认模式,在这种模式下, 删除分支后,会丢掉分支信息,看不到合并记录.。并不是任何情况都能用这种模式。

普通模式

加上 --no-ff 参数就是普通模式。在普通模式下, Git 会在 merge 时生成一个新的 commit,这样从分支历史上就可以看出分支信息。

普通模式

未分类

快进模式

未分类

分支图

未分类

在分支图中, 红线是子分支 dev, 绿线是主分支 master. 子主分支分别提交了一次修改, 在将 dev 合并到 master 时发生冲突, 修改冲突文件内容之后再提交。

3. 解决冲突

如果两个分支都分别有了新的提交,Git 无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突。必须手动解决冲突后再提交。git status 也可以告诉我们冲突的文件。

内容冲突

两个分支对同一文件的内容进行了修改并分别提交, 如果合并失败, 就必须手动解决冲突, 修改文件的内容之后再进行提交。

未分类

在冲突内容中, Git用<<<<<<>>>>>>标记出不同分支的内容. 文件的内容可以协商修改。

树冲突

一个分支修改了内容, 另个一分支删除了文件, 在试图合并时就会出现树冲突。假设子分支(如 dev)是要合并到主分支 master 的, 处理的方法有:

放弃 dev 的修改:强制删除 dev 分支, 然后提交即可。

放弃 master 的修改—-分下面两种情况:

  1. master 修改了内容, dev 删除了文件: 在 master 分支中删除该文件, 然后提交;
  2. master 删除了文件, dev 修改了内容: 在 master 分支中添加被修改的文件, 然后提交。

master 修改了内容, dev 删除了文件:

未分类

master 删除了文件, dev 修改了内容:

未分类

对于文件的移动(在 Git 仓库目录范围内)和重命名, Git 都可以自动合并。

远程仓库推送冲突

  • 从远程分支抓取最新的提交 git pull

  • 建立本地分支与远程分支的连接 git branch –set-upstream dev origin/dev # dev 为分支名

未分类

如果推送出现冲突, 先将远程分支最新的提交抓取下来, 在本地解决冲突之后再推送。解决冲突的方法与本地冲突完全相同

git代码merge和回滚操作

1. git merge

首先这里说说git merge操作

假如有以下的情况:
我本地和远程服务器各有一个代码仓库,本地的仓库有两个分支:master和dev分支,远程仓库也有两个分支:master和dev。两者一一对应。

假如我在dev分支上添加了很多的内容,并提交到了服务器,现在想在master分支上也加上同样的内容,怎么办呢?

方法有下面两种:

1.1 使用git merge命令

切换到master分支:git checkout master
合并分支:git merge dev

1.2 使用git cherry-pick命令

切换到master分支:git checkout master

git cherry-pick -n commit号 将某一次提交的内容合并过来
git cherry-pick ..dev 将dev分支的整个提交内容都合并过来
git cherry-pick dev

这里合并代码,难免会遇到冲突,对于webstorm用户,可以直接用自带的图形界面处理冲突,我这里推介visual studio code编辑器,微软良心作品。

2. git代码回滚

git代码库回滚: 指的是将代码库某分支退回到以前的某个commit id

2.1 本地代码库回滚

git reset --hard commit-id :回滚到commit-id,讲commit-id之后提交的commit都去除

git reset --hard HEAD~3:将最近3次的提交回滚

对于怎么看commit-id 可以使用命令:

未分类

结果如下:

未分类

画红圈的就是commit-id

2.2 远程代码库回滚

这个是重点要说的内容,过程比本地回滚要复杂

应用场景:自动部署系统发布后发现问题,需要回滚到某一个commit,再重新发布

原理:先将本地分支退回到某个commit,删除远程分支,再重新push本地分支

操作步骤:

1、git checkout master

2、git pull

3、git branch master_backup //备份一下这个分支当前的情况

4、git reset --hard the_commit_id //把master本地回滚到the_commit_id

5、git push origin :master //删除远程 master

6、git push origin master //用回滚后的本地分支重新建立远程分支

7、git branch -d master_backup //如果前面都成功了,删除这个备份分支

好,主要就这些了。

Git基本概念及工作流介绍

未分类

git介绍

Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。Torvalds 开始着手开发 Git 来替代 BitKeeper,后者之前一直是 Linux 内核开发人员在全球使用的主要源代码工具。尽管最初 Git 的开发是为了辅助 Linux 内核开发的过程,但是我们已经发现在很多其他自由软件项目中也使用了 Git。例如 很多 Freedesktop 的项目迁移到了 Git 上。

Git基础

Git首先需要掌握的概念

  • 工作区:就是在电脑里能看到的目录
  • 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库,版本库里面存了很多东西,其中最重要的就是暂存区(stage或index),Git为我们自动创建的第一个分支master,以及指向master分支的一个指针叫做HEAD
  • 远程库(中央仓库)

结构如下所示:

未分类

工作区内修改的代码提交到远程库需要三步:

  • git add把代码文件添加到暂存区
  • git commit把暂存区的内容提交到当前分支
  • git push把代码推到远程库

Git工作流

掌握工作流能更好的实现团队间通过远程库进行协作。

中心化的工作流

中心化的工作流需要远程库存在一个master分支即可

未分类

A和B同时对项目修改,A和B的本地都有了各自的历史,A先提交代码到远程库,不会发生问题,B再提交的时候就会产生冲突
远程库在这里作为中央仓库代表官方项目,因此它的提交历史应该被视作神圣不可更改的。如果开发者的本地提交和中央仓库分叉,Git会拒绝将他们的修改推送上去,因为这会覆盖官方提交
冲突解决办法:先将代码拉到本地,再执行rebase操作

完整命令

git pull --rebase origin master

合并过程如有冲突,需手动进行修改,可以用git status查看当前工作区状态
合并完成后

git push origin master

Feature分支的工作流

未分类

团队成员在不同的分支上修改不同功能,等待功能模块完成后再合并到主分支。隔离功能开发后,通过pull request合并代码,也可以和其他成员沟通,其他成员对代码查看和提问。

我们项目组中使用这种工作流

GitFlow工作流

GitFlow工作流围绕项目发布定义了一个严格的分支模型,方便管理大型项目。和功能分支相比,这种工作流没有增加任何新的概念或命令。除了功能分支之外,它还为准备发布、维护发布、记录发布分别是用了单独的分支。
它有两个分支来记录项目历史。master分支存储官方发布历史,develop分支整合功能分支,这两个分支不直接交互。
开发分支:如果develop分支的新功能足够发布,可以从develop分支fork一个发布分支,只有和发布相关的任务应该在这个分支进行,如修复bug、生成文档等。完成发布后,发布分支合并会master和develop分支

维护分支,通常有以下约定:

  • 从develop创建
  • 合并进master分支
  • 命名规范release-*

Fork工作流

未分类

Fork工作流与其他工作流不同的是,每个开发者都有一个远程代码库和本地代码库,Fork工作流的主要优点在于贡献可以轻易地整合进项目,而不需要每个人都推送到单一的远程库,开发者将代码推到个人仓库后在告知中央仓库需要合并代码
项目管理员执行合并操作时可以有两步:

直接检查PullRequest中检查代码
将代码拉取到本地仓库然后手动合并

以上对Git使用做了大致总结,欢迎补充。

鲁大师问:Git最常用和最不常用的5个命令分别是什么?
我答:
最常用的

git status
git log --oneline
git commit
git fetch
git merge

最不常用的

git pull
git add
git rebase
git clone
git reflog

CentOS编译安装zabbix 3.2.7

修改/usr/local/apache/
修改php.ini 文件

[root@localhost zabbix-3.2.7]# groupadd zabbix

[root@localhost zabbix-3.2.7]# useradd -g zabbix zabbix
yum安装 net-snmp,net-snmp-devel,mysql(mariadb),mysql-devel(mariadb-devel),curl,curl-devel

进入zabbix安装目录

./configure --prefix=/usr/local/zabbix --enable-server --enable-agent --with-mysql --enable-ipv6 --with-net-snmp --with-libcurl --with-libxml2
make 
make install
systemctl start mariadb
mysql
create database zabbix character set utf8 collate utf8_bin;
grant all privileges on zabbix.* to zabbix@localhost identified by '123456';
---------------------
如果有如下报错
# MariaDB [(none)]> grant all on zabbix.* to zabbix@localhost identified by ‘123456‘;
#ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your #MariaDB server version for the right syntax to use near '‘123456‘' at line 1
修改‘’为英文状态
----------------------
flush privileges;
exit;
mkdir -p /usr/local/apache/htdocs/zabbix

[root@localhost zabbix-3.2.7]# cp -ra frontends/php/* /usr/local/apache/htdocs/zabbix

进入数据库文件目录,将相关数据导入数据库

[root@localhost mysql]# pwd
/usr/src/zabbix-3.2.7/database/mysql
root@localhost mysql]# mysql -uzabbix -p123456 zabbix < schema.sql 
[root@localhost mysql]# mysql -uzabbix -p123456 zabbix < images.sql
[root@localhost mysql]# mysql -uzabbix -p123456 zabbix < data.sql
chown zabbix:zabbix /usr/local/apache/htdocs/zabbix


cp /usr/local/zabbix/sbin/zabbix_server /etc/init.d/

编辑/usr/local/zabbix/etc/zabbix_server.conf

修改DBHost=localhost DBName=zabbix DBUser=zabbix DBPssword=123456

报错:PHP bcmath extension missing (PHP configuration parameter --enable-bcmath).
进入php安装目录 /usr/src/php-7.1.7/ext/bcmath
执行/usr/src/php-7.1.7/ext/bcmath
[root@localhost bcmath]# ./configure --with-php-config=/usr/local/php7/bin/php-config
[root@localhost bcmath]# make  &  make install
Installing shared extensions:     /usr/local/php7/lib/php/extensions/no-debug-non-zts-20160303/
[root@localhost bcmath]# cd /usr/local/php7/lib/php/extensions/no-debug-non-zts-20160303/

[root@localhost php7]# cp /usr/local/php7/lib/php/extensions/no-debug-non-zts-20160303/bcmath.so /usr/local/php7/include/php/ext(这是默认路径,php.ini中可定义)

修改php.ini ,最后一行加

extension=bcmath.so

重启httpd zabbix服务

docker部署zabbix监控系统(nginx mysql)

本次使用docker搭建zabbix的组合是mysql+docker+zabix-server

1. 先安装数据库mysql

docker run --name zabbix-mysql-server --hostname zabbix-mysql-server 
-e MYSQL_ROOT_PASSWORD="123456" 
-e MYSQL_USER="zabbix" 
-e MYSQL_PASSWORD="123456" 
-e MYSQL_DATABASE="zabbix" 
-p 3306:3306  
-d 
mysql

2. 创建zabbix-server

docker run  --name zabbix-server-mysql --hostname zabbix-server-mysql 
--link zabbix-mysql-server:mysql 
-e DB_SERVER_HOST="mysql" 
-e MYSQL_USER="zabbix" 
-e MYSQL_DATABASE="zabbix" 
-e MYSQL_PASSWORD="123456" 
-v /etc/localtime:/etc/localtime:ro 
-v /data/docker/zabbix/alertscripts:/usr/lib/zabbix/alertscripts 
-v /data/docker/zabbix/externalscripts:/usr/lib/zabbix/externalscripts 
-p 10051:10051 
-d 
zabbix/zabbix-server-mysql

3. 最后web-nginx

最后安装zabbix-web-nginx
docker run --name zabbix-web-nginx-mysql --hostname zabbix-web-nginx-mysql 
--link zabbix-mysql-server:mysql 
--link zabbix-server-mysql:zabbix-server 
-e DB_SERVER_HOST="mysql" 
-e MYSQL_USER="zabbix" 
-e MYSQL_PASSWORD="123456" 
-e MYSQL_DATABASE="zabbix" 
-e ZBX_SERVER_HOST="zabbix-server" 
-e PHP_TZ="Asia/Shanghai" 
-p 8000:80 
-p 8443:443 
-d 
zabbix/zabbix-web-nginx-mysql

登录访问测试

浏览器访问ip:8000查看
默认登录
username:Admin
password:zabbix

这里说明下,mysql没做数据卷的映射,nginx也没做数据卷的映射,在实际生产环境下,最好做数据映射。防止数据丢失。

docker-zabbbix-agent的安装以及链接zabbix-server

docker run --name zabbix-agent --link zabbix-server-mysql:zabbix-server -d zabbix/zabbix-agent:latest

最后需要在web端将,zabbix-agent添加到zabbix-server的host列表里面。

监控

zabbix主动发现并监控磁盘IO性能

一. 基本概念

1. 读/写IO

最为常见说法,读IO,就是发指令,从磁盘读取某段扇区的内容。指令一般是通知磁盘开始扇区位置,然后给出需要从这个初始扇区往后读取的连续扇区个数,同时给出动作是读,还是写。磁盘收到这条指令,就会按照指令的要求,读或者写数据。控制器发出的这种指令+数据,就是一次IO,读或者写。

2. 大/小块IO

指控制器的指令中给出的连续读取扇区数目的多少,如果数目很大,比如128,64等等,就应该算是大块IO,如果很小,比如1, 4,8等等,就应该算是小块IO,大块和小块之间,没有明确的界限。

3. 连续/随机IO

连续和随机,是指本次IO给出的初始扇区地址,和上一次IO的结束扇区地址,是不是完全连续的,或者相隔不多的,如果是,则本次IO应该算是一个连续IO,如果相差太大,则算一次随机IO。连续IO,因为本次初始扇区和上次结束扇区相隔很近,则磁头几乎不用换道或换道时间极短;如果相差太大,则磁头需要很长的换道时间,如果随机IO很多,导致磁头不停换道,效率大大降底。

4. 顺序/并发IO

这个的意思是,磁盘控制器每一次对磁盘组发出的指令套(指完成一个事物所需要的指令或者数据),是一条还是多条。如果是一条,则控制器缓存中的IO队列,只能一个一个的来,此时是顺序IO;如果控制器可以同时对磁盘组中的多块磁盘,同时发出指令套,则每次就可以执行多个IO,此时就是并发IO模式。并发IO模式提高了效率和速度。

5. IO并发几率

单盘,IO并发几率为0,因为一块磁盘同时只可以进行一次IO。对于raid0,2块盘情况下,条带深度比较大的时候(条带太小不能并发IO,下面会讲到),并发2个IO的几率为1/2。其他情况请自行运算。

6. IOPS

即每秒进行读写(I/O)操作的次数,一个IO所用的时间=寻道时间+数据传输时间。 IOPS=IO并发系数/(寻道时间+数据传输时间),由于寻道时间相对传输时间,大几个数量级,所以影响IOPS的关键因素,就是降底寻道时间,而在连续IO的情况下,寻道时间很短,仅在换磁道时候需要寻道。在这个前提下,传输时间越少,IOPS就越高。

7. 每秒IO吞吐量

显然,每秒IO吞吐量=IOPS乘以平均IO SIZE。 Io size越大,IOPS越高,每秒IO吞吐量就越高。

8. 设磁头每秒读写数据速度为V,V为定值

则IOPS=IO并发系数/(寻道时间+IO SIZE/V),代入,得每秒IO吞吐量=IO并发系数乘IO SIZE乘V/(V乘寻道时间+IO SIZE)。我们可以看出影响每秒IO吞吐量的最大因素,就是IO SIZE和寻道时间,IO SIZE越大,寻道时间越小,吞吐量越高。相比能显著影响IOPS的因素,只有一个,就是寻道时间。

二. 监控磁盘IO的基本原理:通过分析/proc/diskstats文件,来对IO的性能进行监控。

1. 第一至第三个域

分别是主设备号,次设备号,设备名称

2. 第4个域

读完成次数 —– 读磁盘的次数,成功完成读的总次数。(number of issued reads. This is the total number of reads completed successfully.)

3. 第5个域

合并读完成次数, 第9个域:合并写完成次数。为了效率可能会合并相邻的读和写。从而两次4K的读在它最终被处理到磁盘上之前可能会变成一次8K的读,才被计数(和排队),因此只有一次I/O操作。这个域使你知道这样的操作有多频繁。(number of reads merged)

4. 第6个域

读扇区的次数,成功读过的扇区总次数。(number of sectors read. This is the total number of sectors read successfully.)

5. 第7个域

读花费的毫秒数,这是所有读操作所花费的毫秒数(用__make_request()到end_that_request_last()测量)。(number of milliseconds spent reading. This is the total number of milliseconds spent by all reads (as measured from __make_request() to end_that_request_last()).)

6. 第8个域

写完成次数 —-写完成的次数,成功写完成的总次数。(number of writes completed. This is the total number of writes completed successfully.)

7. 第9个域

合并写完成次数 —–合并写次数。(number of writes merged Reads and writes which are adjacent to each other may be merged for efficiency. Thus two 4K reads may become one 8K read before it is ultimately handed to the disk, and so it will be counted (and queued) as only one I/O. This field lets you know how often this was done.)

8. 第10个域

写扇区次数 —- 写扇区的次数,成功写扇区总次数。(number of sectors written. This is the total number of sectors written successfully.)

9. 第11个域

写操作花费的毫秒数 — 写花费的毫秒数,这是所有写操作所花费的毫秒数(用__make_request()到end_that_request_last()测量)。(number of milliseconds spent writing This is the total number of milliseconds spent by all writes (as measured from __make_request() to end_that_request_last()).)

10. 第12个域

正在处理的输入/输出请求数 — -I/O的当前进度,只有这个域应该是0。当请求被交给适当的request_queue_t时增加和请求完成时减小。(number of I/Os currently in progress. The only field that should go to zero. Incremented as requests are given to appropriate request_queue_t and decremented as they finish.)

11. 第13个域

输入/输出操作花费的毫秒数 —-花在I/O操作上的毫秒数,这个域会增长只要field 9不为0。(number of milliseconds spent doing I/Os. This field is increased so long as field 9 is nonzero.)

12. 第14个域

输入/输出操作花费的加权毫秒数 —– 加权, 花在I/O操作上的毫秒数,在每次I/O开始,I/O结束,I/O合并时这个域都会增加。这可以给I/O完成时间和存储那些可以累积的提供一个便利的测量标准。(number of milliseconds spent doing I/Os. This field is incremented at each I/O start, I/O completion, I/O merge, or read of these stats by the number of I/Os in progress (field 9) times the number of milliseconds spent doing I/O since the last update of this field. This can provide an easy measure of both I/O completion time and the backlog that may be accumulating.)

三. zabbix监控主动发现磁盘并监控其吞吐量与iops

1. 监控内容的json化脚本partition_low_discovery.sh

#!/bin/bash
# Author: guoxiangfu
# Email: [email protected]
#script name:partition_low_discovery.sh
#Fucation:zabbix low-level discovery
partition() {
            port=($(grep -E "(vd[a-z]$|sd[a-z]$)" /proc/partitions|awk '{print $4}'))
            printf '{n'
            printf 't"data":[n'
               for key in ${!port[@]}
                   do
                       if [[ "${#port[@]}" -gt 1 && "${key}" -ne "$((${#port[@]}-1))" ]];then
                          printf 't {n'
                          printf "ttt"{#PARTITIONNAME}":"${port[${key}]}"},n"
                     else [[ "${key}" -eq "((${#port[@]}-1))" ]]
                          printf 't {n'
                          printf "ttt"{#PARTITIONNAME}":"${port[${key}]}"}n"
                       fi
               done
                          printf 't ]n'
                          printf '}n'
}
$1

把此文件存放到scripts里,然后给与755权限,并修改用户与组为zabbix

2. 可运行脚本检测是否能成功运行,运行的结果类似如下:

监控

3. 同时允许zabbix用户无密码运行netstat

echo "zabbix ALL=(root) NOPASSWD:/bin/netstat">>/etc/sudoers
#Disable requiretty
sed -i 's/^Defaults.*.requiretty/#Defaults    requiretty/' /etc/sudoers

四. 修改zabbix_agentd配置

1. 在zabbix_agentd.conf中添加以下内容

#monitor process
UserParameter=process.nginx.memory,/etc/zabbix/scripts/processstatus.sh nginx
UserParameter=process.nginx.cpu,/etc/zabbix/scripts/processstatus.sh nginxcpu
UserParameter=custom.vfs.dev.read.ms[*],cat /proc/diskstats | grep $1 | head -1 | awk '{print $$7}'
UserParameter=custom.vfs.dev.write.ops[*],cat /proc/diskstats | grep $1 | head -1 | awk '{print $$8}'
UserParameter=custom.vfs.dev.write.ms[*],cat /proc/diskstats | grep $1 | head -1 | awk '{print $$11}'
UserParameter=custom.vfs.dev.io.active[*],cat /proc/diskstats | grep $1 | head -1 | awk '{print $$12}'
UserParameter=custom.vfs.dev.io.ms[*],cat /proc/diskstats | grep $1 | head -1 | awk '{print $$13}'
UserParameter=custom.vfs.dev.read.sectors[*],cat /proc/diskstats | grep $1 | head -1 | awk '{print $$6}'
UserParameter=custom.vfs.dev.write.sectors[*],cat /proc/diskstats | grep $1 | head -1 | awk '{print $$10}'
UserParameter=zabbix_partition_discovery[*],/bin/bash /etc/zabbix/scripts/partition_low_discovery.sh $1

2. 重启zabbix服务

/etc/init.d/zabbix-agent restart

五. 主机关联模板

1. 导入监控模板文件,

下载Template_partition_Auto_Discovery:
https://www.guoxiangfu.com/zb_users/upload/2017/07/201707141500004488508687.zip

1.1 导入模板

监控

监控

1.2 关联zabbix客户端主机

监控

监控

监控

2. 因为要监控特有的分区

需要使用zabbix正则表达式过滤,管理->一般->右侧下来条选择“正则表达式”->创建

3. 正则表达式:

名称:Partition regex
表达式:^(vda|vdb|vdc|vdd|vde|vdf|vdg|sda|sdb|sdc|sdd|sde|sdf|sdg|xvda|xvdb|xvdc|xvdd|xvde|xvdf|
xvdg|xvdh|xvdi|xvdj|xvdk|xvdq|xvdl)$
期望的结果:结果为真

监控

监控

监控

3.1 打开主机监控的图形

监控

Zabbix 3.2.6配置ODBC监控MySQL和Oracle

一、总览

ODBC的监控和在Zabbix前端配置数据库监控条目类型基本一致。

ODBC是用C语言编写的用于连接数据库管理系统的一个中间件,最初有微软公司研发,后来发展到各大平台。

有了ODBC的支持,Zabbix可以查询很多种数据库,因为Zabbix自己不直接去连接数据库,而是通过ODBC的接口和驱动,因此可以更加高效的去监控不同的数据库。

二、安装配置

1、编译Zabbix server

要支持ODBC功能,在编译的时候需要加上--with-unixodbc,解决依赖需要安装如下软件包,
yum -y install unixODBC unixODBC-devel

2、安装unixODBC驱动

驱动是用于ODBC连接数据库用的,他可以支持各式各样的驱动,在大部分的Linux发行版中的仓库中,都有这些驱动,我们安装一个MySQL的驱动,用来监控MySQL数据库。
yum install mysql-connector-odbc

3、配置unixODBC

ODBC的配置主要是通过修改odbcinst.ini和odbc.ini两个文件,可以通过下面的命令去指定配置文件的位置。

# odbcinst -j
unixODBC 2.2.14
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /root/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8

odbcinst.ini主要是配置安装的ODBC数据库驱动,如MySQL,oracle,各字段含义我不再介绍。

[MySQL]                      # 驱动名称,在数据库文件中需要
Description     = ODBC for MySQL
Driver          = /usr/lib/libmyodbc5.so
Setup           = /usr/lib/libodbcmyS.so
Driver64        = /usr/lib64/libmyodbc5.so
Setup64         = /usr/lib64/libodbcmyS.so
FileUsage       = 1

odbc.ini主要是配置数据源。

[test]                        # 数据源名称Data source name,在zabbix前端配置需要
Description = MySQL test database
Driver      = mysql           # 从驱动文件odbcinst.ini获取
Server      = 127.0.0.1
User        = zabbix
Password    = zabbix
Port        = 3306
Database    = zabbix

我们可以通过在安装unixODBC的时候附带安装的一个命令isql来判断我们是否可以成功的连接数据库。

# isql test
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL>

4、配置Zabbix前端web

首先创建一个监控条目。

监控

这几个条目是必填的,具体解释如下:

  • Type 这里我们选择Database monitor
  • Key 选择db.odbc.select[unique_description,data_source_name]
    unique_description将会用于触发器中的条目
    data_source_name填写在odbc.ini中的test
  • User name 输入在odbc.ini中的用户名
  • Password 输入在odbc.ini中的密码
  • SQL query 输入SQL查询语句
  • Type of information 需要我们之前查询的返回值是什么,正确的选择才会被支持

5、注意事项

  • 查询语句执行时间不能超过配置的超时时间

  • 查询只允许返回一个值.

  • 如果查询语句返回了多个列,它只读取第一列

  • 如果查询语句返回了多行,它读取第一条

  • SQL语句必须是 select开头,只能是查询语句.

  • SQL语句不能包含换行符

6、错误消息

从zabbix 2.08开始ODBC提供如下详细的错误信息:
Cannot execute ODBC query:[SQL_ERROR]:[42601][7][ERROR: syntax error at or near ";"; Error while executing the query]|
-------------------------  ---------   -----  |  ------------------------------------------------------------------- |
            |                  |         |    `- Native error code            `- error message.                      `- Record separator
            |                  |         `-SQLState
            `- Zabbix message  `- ODBC return code
错误消息最长不能超过128字节,因此错误消息太长会被截断。

三、验证

因为我们没有创建图像,可以从最新数据库里面查看我们创建的条目。

监控

你可以写更加复杂的SQL查询语句,以及制作触发器来对数据库更加详细的监控。

附录:

以上是对监控MySQL做的监控,下面我主要简要对Oracle的监控做下介绍。

1、下载oracle客户端

http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html

官网下载速度比较慢,也可以到我上传到51CTO下载中心的地方下载。

http://down.51cto.com/data/2328882

oracle-instantclient11.2-basic-11.2.0.3.0-1.x86_64.rpm
oracle-instantclient11.2-devel-11.2.0.3.0-1.x86_64.rpm
oracle-instantclient11.2-odbc-11.2.0.3.0-1.x86_64.rpm
oracle-instantclient11.2-sqlplus-11.2.0.3.0-1.x86_64.rpm

2、安装

yum localinstall oracle-instantclient11.2-*

3、创建本地监控

安装的默认位置分别在
/usr/share/oracle/11.2/client64
/usr/include/oracle/11.2/client64
/usr/lib/oracle/11.2/client64
 设置环境变量之前,在/usr/lib/oracle/11.2/client64下创建network/admin文件夹,
mkdir  -p  /usr/lib/oracle/11.2/client64/network/admin
在此文件夹下创建tnsnames.ora,其内容入下:
test_oracle=
   (DESCRIPTION =
     (ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.1.14)(PORT = 1521))
     (CONNECT_DATA =
        (SERVER = DEDICATED)
        (SERVICE_NAME = basicdb)
     )
    )

    在/usr/lib/oracle/11.2/client64/network/admin文件下创建sqlnet.ora,输入:

NAME_DIRECTORY_PATH=(TNSNAMES,EZCONNECT)

4、配置环境变量

export ORACLE_HOME=/usr/lib/oracle/11.2/client64
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib64:$LD_LIBRARY_PATH
export TNS_ADMIN=$ORACLE_HOME/network/admin
export PATH=$PATH:$ORACLE_HOME/bin:$HOME/bin

5、配置需要的库

chmod +x /usr/lib/oracle/11.2/client64/lib/libsqora.so.11.1
cd /usr/lib64/
ln -s libodbcinst.so.2.0.0  libodbcinst.so.1

6、添加oracle驱动

# vim  /etc/odbcinst.ini
[oracle]
Description     = Oracle ODBC driver for Oracle 11g
Driver          = /usr/lib/oracle/11.2/client64/lib/libsqora.so.11.1

7、添加oracle数据源

# vim  /etc/odbc.ini  
[test1]
Driver= oracle
DSN= test_oracle
ServerName= yourname
UserID= basicdb
Password= yourpasswd

8、sqlplus测试连接

# sqlplus yourname/yourpasswd@test_oracle

SQL*Plus: Release 11.2.0.3.0 Production on Wed Jul 19 11:39:18 2017

Copyright (c) 1982, 2011, Oracle.  All rights reserved.


Connected to:

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL&gt; exit

9、配置zabbix前端

参考文档:https://www.zabbix.com/documentation/3.2/manual/config/items/itemtypes/odbc_checks

配置zabbix使用mailx实现邮件报警

说明:

Zabbix监控服务端、客户端都已经部署完成,被监控主机已经添加,Zabiix监控运行正常。

实现目的:

在Zabbix服务端设置邮件报警,当被监控主机宕机或者达到触发器预设值时,会自动发送报警邮件到指定邮箱。

具体操作:

以下操作在Zabbix监控服务端进行

备注:Zabbix监控服务端

操作系统:CentOS

使用外部邮箱账号发送报警邮件设置:

一、关闭sendmail或者postfix

service sendmail stop #关闭

chkconfig sendmail off #禁止开机启动

service postfix stop

chkconfig postfix off

备注:

使用外部邮箱账号时,不需要启动sendmail或者postfix

如果在sendmail或者postfix启动的同时使用外部邮箱发送报警邮件,首先会读取外部邮箱

配置信息。

二、安装邮件发送工具mailx

yum install mailx #安装

CentOS 5.x 编译安装mailx,直接yum安装的mailx版本太旧,使用外部邮件发送会有问题。

yum remove mailx #卸载系统自带的旧版mailx

下载mailx:

http://nchc.dl.sourceforge.net/project/heirloom/heirloom-mailx/12.4/mailx-12.4.tar.bz2

tar jxvf mailx-12.4.tar.bz2 #解压

cd mailx-12.4 #进入目录

make #编译

make install UCBINSTALL=/usr/bin/install #安装

ln -s /usr/local/bin/mailx /bin/mail #创建mailx到mail的软连接

ln -s /etc/nail.rc /etc/mail.rc #创建mailx配置文件软连接

三、配置Zabbix服务端外部邮箱

vi /etc/mail.rc #编辑,添加以下信息

set [email protected]

smtp=smtp.163.com   //添加发送人、发送服务器

set [email protected]

smtp-auth-password=123456   //添加发送人的邮箱和登录密码。

set smtp-auth=login  

:wq! #保存退出

echo "zabbix test mail" |mail -s "zabbix" [email protected]

#测试发送邮件,标题zabbix,邮件内容:zabbix test mail,发送到的邮箱:[email protected]或者[email protected],发送短信的时候要在139邮箱上面开启短信提醒。这里我就不说了,自己百度去。

#这时候,邮箱[email protected]会收到来自[email protected]的测试邮件

四、配置Zabbix服务端邮件报警

1、打开Zabbix

管理-示警媒介类型-创建媒体类型

监控

名称:Sendmail

类型:脚本

脚本名称:sendmail.sh

已启用:勾选

2、设置Zabbix用户报警邮箱地址

可以添加163邮箱也可以添加139邮箱。

监控

监控

类型:Sendmail

收件人:[email protected]

其他默认即可,也可
以根据需要设置

状态:已启用

存档

3、设置Zabbix触发报警的动作

组态-动作-创建动作

监控

名称:Action-Email

默认接收人:故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME}故障!

默认信息:

  • 告警主机:{HOSTNAME1}

  • 告警时间:{EVENT.DATE} {EVENT.TIME}

  • 告警等级:{TRIGGER.SEVERITY}

  • 告警信息: {TRIGGER.NAME}

  • 告警项目:{TRIGGER.KEY1}

  • 问题详情:{ITEM.NAME}:{ITEM.VALUE}

  • 当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}

  • 事件ID:{EVENT.ID}

  • 恢复信息:打钩

  • 恢复主旨:恢复{TRIGGER.STATUS}, 服务器:{HOSTNAME1}: {TRIGGER.NAME}已恢复!

  • 恢复信息:

  • 告警主机:{HOSTNAME1}

  • 告警时间:{EVENT.DATE} {EVENT.TIME}

  • 告警等级:{TRIGGER.SEVERITY}

  • 告警信息: {TRIGGER.NAME}

  • 告警项目:{TRIGGER.KEY1}

  • 问题详情:{ITEM.NAME}:{ITEM.VALUE}

  • 当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}

  • 事件ID:{EVENT.ID}

  • 已启用:打钩

监控

切换到操作选项

新的

操作类型:送出信息

送到用户:添加

默认信息:打钩

选择用户:Admin

选择

仅送到:Sendmail

存档

4、添加Zabbix服务端邮件发送脚本

cd /usr/local/zabbix/share/zabbix/alertscripts #进入脚本存放目录

vi sendmail.sh #编辑,添加以下代码

#!/bin/sh

echo "$3" | mail -s "$2" $1

:wq! #保存退出

chown -R zabbix.zabbix /usr/local/zabbix/share/zabbix/alertscripts/*

zabbix_server.conf 文件中加入脚本的相对路径

AlertScriptsPath=/usr/local/zabbix/share/zabbix/alertscripts

#设置脚本所有者为zabbix用户

chmod +x /usr/local/zabbix/share/zabbix/alertscripts/sendmail.sh

#设置脚本执行权限

五、测试Zabbix报警

关闭Zabbix客户端服务

service zabbix_agentd stop

查看你的[email protected]邮箱,会收到报警邮件

再开启Zabbix客户端服务

service zabbix_agentd start

查看你的[email protected]邮箱,会收到恢复邮件

使用外部邮箱账号发送报警邮件设置完成。

至此,Zabbix邮件报警设置完成。