Linux下MySQL/MariaDB Galera集群搭建过程

MariaDB介绍

MariaDB是开源社区维护的一个MySQL分支,由MySQL的创始人Michael Widenius主导开发,采用GPL授权许可证。

MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。

详细介绍请参考链接:

http://mariadb.org/(官网)

http://baike.baidu.com/link?url=dFJ-My-I52YFc1mx26K804LPwZrcEWCwB4IqfA4-soYx6295BZLIe7bEFgOtt3CWZ8AYpkp1P342L4S-R4x4CK

Galera Cluster介绍

Galera Cluster是基于MySQL/innodb二次开发而成的一个支持“多主同步”的数据库主从集群,具有高可用,易于扩展等特点。

详细介绍请参考链接:

http://galeracluster.com/(官网)

Galera replication for MySQL

本文使用的Linux发行版:CentOS6.7 下载地址:https://wiki.centos.org/Download

1. 添加yum源

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

添加如下几行:

[mariadb] name = MariaDB
baseurl = http://yum.mariadb.org/5.5/rhel6-amd64
gpgkey = https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck = 1

未分类

2. 安装mariadb galera软件包

[root@localhost ~]# yum install MariaDB-Galera-server MariaDB-client galera

未分类

未分类

3. 修改防火墙配置

[root@localhost ~]# vi /etc/sysconfig/iptables

添加如下几行:

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 4444 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 4567 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 4568 -j ACCEPT

未分类

4. 重启防火墙功能

[root@localhost ~]# service iptables restart

未分类

5. 安装selinux管理工具

[root@localhost ~]# yum provides /usr/sbin/semanage
[root@localhost ~]# yum -y install policycoreutils-python

未分类

6. 修改selinux安全策略

[root@localhost ~]# semanage port -a -t mysqld_port_t -p tcp 4567
[root@localhost ~]# semanage port -a -t mysqld_port_t -p tcp 4568
[root@localhost ~]# semanage permissive -a mysqld_t

未分类

7. 启动mysql服务

[root@localhost ~]# service mysql start

8. 执行mysql安全设置

[root@localhost ~]# mysql_secure_installation

(先设置root账户密码,再一直“y”下去即可)

未分类

未分类

9. 创建用于节点同步的账号

[root@localhost ~]# mysql -uroot -p
MariaDB [(none)]> grant usage on *.* to sst@'%' identified by '123456';
MariaDB [(none)]> flush privileges;

10. 修改mysql默认字符集

MariaDB [(none)]> show variables like 'character%';
MariaDB [(none)]> set character_set_server = utf8;
MariaDB [(none)]> set character_set_database = utf8;

11. 修改集群节点配置

[root@localhost ~]# cp /usr/share/mysql/wsrep.cnf /etc/my.cnf.d/
[root@localhost ~]# vi /etc/my.cnf.d/wsrep.cnf

修改如下几行:

wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://"    #集群节点N的地址(注意把前面的"#"删掉!)
wsrep_sst_auth=sst:123456    #节点N的数据库账户和密码
  • 参数说明

“gcomm://” 是特殊的地址,仅仅是galera cluster初始化启动时候使用。
如果集群启动以后,我们关闭了第一个节点,那么再次启动的时候必须先修改”gcomm://”为其他节点的集群地址,例如wsrep_cluster_address=”gcomm://192.168.0.152″。

检查/etc/my.cnf中有没有!includedir /etc/my.cnf.d/这一行,没有则添加。

[root@localhost ~]# vi /etc/my.cnf

未分类

到这里,第1个节点的配置就完成了,然后在另一台主机上按照步骤1~11配置第2个节点,只需修改节点2的wsrep_cluster_address为节点1的IP即可,以此类推。

12. 启动集群节点

  • 检查mysql进程:[root@localhost ~]# ps aux|grep mysql
  • 停止mysql服务:[root@localhost ~]# service mysql stop
  • 启动第1个节点:[root@localhost ~]# service mysql bootstrap

未分类

启动第2、3、…个节点:[root@localhost ~]# service mysql start

未分类

(注意:启动mysql之前先检查一下服务是否已经启动,不要重复启动,如果无法停止当前mysql服务则手动kill掉mysql的进程)

13. 检查集群运行状态

[root@localhost ~]# mysql -uroot -p
MariaDB [(none)]> show status like 'wsrep%';

如果wsrep_connected=ON且wsrep_ready=ON则说明节点成功接入集群。

未分类

未分类

14. 配置集群的仲裁节点

对于只有2个节点的galera cluster和其他集群软件一样,需要面对极端情况下的“脑裂”状态。为了避免这种问题,galera引入了“arbitrator(仲裁人)”。
“仲裁人”节点上没有数据,它在集群中的作用就是在集群发生分裂时进行仲裁,集群中可以有多个“仲裁人”节点。将“仲裁人”节点加入集群的方法很简单,运行如下命令即可:
[root@localhost ~]# garbd -a gcomm://<节点IP> -g my_wsrep_cluster -d

  • 参数说明

-a 集群地址
-g 集群名称
-d 以daemon模式运行

15. 检查数据库是否符合要求

部署到集群之前,建议先检查数据库是否符合galera的要求,比如存储引擎必须是innodb、数据表必须有主键等,否则记录将不会在多台复制。

选择指定的数据库,执行以下SQL输出不符合要求的表及其原因,根据相应的原因修改即可:

select distinct concat( t.table_schema, '.', t.table_name ) as tbl, t. engine, if ( isnull(c.constraint_name), 'nopk', '' ) as nopk, if ( s.index_type = 'fulltext', 'fulltext', '' ) as ftidx, if ( s.index_type = 'spatial', 'spatial', '' ) as gisidx from information_schema. tables as t left join information_schema.key_column_usage as c on ( t.table_schema = c.constraint_schema and t.table_name = c.table_name and c.constraint_name = 'primary' ) left join information_schema.statistics as s on ( t.table_schema = s.table_schema and t.table_name = s.table_name and s.index_type in ('fulltext', 'spatial')) where t.table_schema not in ( 'information_schema', 'performance_schema', 'mysql' ) and t.table_type = 'base table' and ( t.engine <> 'innodb' or c.constraint_name is null or s.index_type in ('fulltext', 'spatial')) order by t.table_schema, t.table_name;

16. 常见问题

  • 启动mysql时出错:SST in progress, setting sleep higher. ERROR!
    • 确保本机已安装rsync:[root@localhost ~]# yum list|grep rsync
    • 确保已允许galera sst使用的端口4444、4567、4568通过防火墙并重启防火墙功能
    • 确保selinux已对端口4444开放权限:[root@localhost ~]# semanage port -a -t mysqld_port_t -p tcp 4444
  • 查看galera集群状态时wsrep_connected和wsrep_ready的值均为OFF!

打开/etc/my.cnf.d/wsrep.cnf文件,找到wsrep_cluster_address=”gcomm://”这一行,检查前面是否有”#”,如果有则删掉并重启mysql。

linux 开启独立iptables日志

iptables的日志(log)由syslogd纪录和管理。初始存放在 /var/log/messages里面。自动采取循环纪录(rotation)的方式记录。但是由于混在 messages中,对于管理和监视产生了不便。

由于iptables是linux的内核本身的功能,由dmesg或syslogd的facility结合内核管理。iptables的日志的初始值是[warn(=4)], 需要修改 rsyslog.conf。

注:系统日志配置在CentOS5上叫syslog,而在CentOS6上叫rsyslog,叫增强版的syslog,CentOS5上的配置文件在/etc/syslog.conf下,而CentOS6在/etc/rsyslog.conf下。

1、修改/etc/rsyslog.conf

*.info;mail.none;authpriv.none;cron.none                /var/log/messages

修改为

*.info;*.!notice;mail.none;authpriv.none;cron.none                /var/log/messages

同时添加

kern.=notice                                            /var/log/iptables.log

建议改为notice,将iptables产生的日志放在 /var/log/iptables.log

2、iptablse添加日志选项

iptables -t nat -I POSTROUTING -o eth0 -j LOG --log-level notice --log-prefix "iptables "

–log-level 为日志级别
–log-prefix 添加日志前缀便于分析处理

3、让日志滚动

在/etc/logrotate.d/syslog中 添加
/var/log/iptables.log,默认使用的是系统的轮替规则,当然也可以根据自己的需要去修改

4、用自己的轮替规则

(1)在目录/etc/logrotate.d/下创建一个日志转储的配置文件(名字可以自己定义,只要在该目录下就会被执行),比如iptables

(2)配置文件iptables的内容如下

/var/log/iptables.log {
daily
dateext
copytruncate
nocompress
rotate 15
}

第一行的左大括号之前的/var/log/iptables.log 指出了要转储的日志文件的具体位置和文件名;
daily:按天去转储;
dateext:表示转储后的日志文件会附加上日期信息
copytruncate 用于还在打开中的日志文件,把当前日志备份并截断;
nocompress 不要对转储的日志压缩
rotate 15 保留多少个转储之后的日志文件;

(3)确保iptables的权限为:-rw-r–r–

A 七种信息等级

1)info
2)notice
3)warning或warn
4)err或error
5)crit
6)alert
7)emerg或panic:导致系统几乎要死机

B 信息等级的指定方式

1). xxx: 表示大于xxx级别的信息
2).=xxx:表示等于xxx级别的信息
3).!xxx:表示在xxx之外的等级的信息

附加:

更改linux rsyslog 日期格式
默认时间格式:Dec 16 09:52:01,看起来不习惯,修改成 2014-12-16 09:52:01

vim /etc/rsyslog.conf
# 定义自己的本土化的时间格式
$template myformat,"%$NOW% %TIMESTAMP:8:15% %hostname% %syslogtag% %msg%n"
# Use default timestamp format
#$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
# 使用自定义的格式
$ActionFileDefaultTemplate myformat

Linux Awk使用案例总结 nginx日志统计

知识点:

  • 数组

数组是用来存储一系列值的变量,可通过索引来访问数组的值。
Awk中数组称为关联数组,因为它的下标(索引)可以是数字也可以是字符串。
下标通常称为键,数组元素的键和值存储在Awk程序内部的一个表中,该表采用散列算法,因此数组元素是随机排序。

数组格式:array[index]=value

一、Nginx日志分析

日志格式

'$remote_addr - $remote_user [$time_local] "$request" $status $request_body  $body_bytes_sent "$http_referer"  "$http_user_agent" "$http_x_forwarded_for"

日志记录:

183.251.21.109 - - [16/Sep/2017:09:43:36 +0800] "POST /article/getKeywords HTTP/1.1" 200 str=Linux+Awk%E4%BD%BF%E7%94%A8%E6%A1%88%E4%BE%8B%E6%80%BB%E7%BB%93+nginx%E6%97%A5%E5%BF%97%E7%BB%9F%E8%AE%A1  185 "http://xxxx" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36" "-"

1、统计日志中访问最多的10个IP

思路:对第一列进行去重,并输出出现的次数

方法1:

awk '{a[$1]++}END{for(i in a)print a[i],i|"sort -k1 -nr|head -n10"}' access.log

方法2:

awk '{print $1}' access.log |sort |uniq -c |sort -k1 -nr |head -n10

说明:a[$1]++ 创建数组a,以第一列作为下标,使用运算符++作为数组元素,元素初始值为0。处理一个IP时,下标是IP,元素加1,处理第二个IP时,下标是IP,元素加1,如果这个IP已经存在,则元素再加1,也就是这个IP出现了两次,元素结果是2,以此类推。因此可以实现去重,统计出现次数。

2、统计日志中访问大于100次的IP

方法1:

awk '{a[$1]++}END{for(i in a){if(a[i]>100)print i,a[i]}}' access.log

方法2:

awk '{a[$1]++;if(a[$1]>100){b[$1]++}}END{for(i in b){print i,a[i]}}' access.log

说明:方法1是将结果保存a数组后,输出时判断符合要求的IP。方法2是将结果保存a数组时,并判断符合要求的IP放到b数组,最后打印b数组的IP。

3、统计2016年4月9日一天内访问最多的10个IP

思路:先过滤出这个时间段的日志,然后去重,统计出现次数

方法1:

awk '$4>="[9/Apr/2016:00:00:01" && $4<="[9/Apr/2016:23:59:59" {a[$1]++}END{for(i in a)print a[i],i|"sort -k1 -nr|head -n10"}' access.log

方法2:

sed -n '/[9/Apr/2016:00:00:01/,/[9/Apr/2016:23:59:59/p' access.log |sort |uniq -c |sort -k1 -nr |head -n10  #前提开始时间与结束时间日志中必须存在

4、统计当前时间前一分钟的访问数

思路:先获取当前时间前一分钟对应日志格式的时间,再匹配统计

date=$(date -d '-1 minute' +%d/%b/%Y:%H:%M);awk -vdate=$date '$0~date{c++}END{print c}' access.log
date=$(date -d '-1 minute' +%d/%b/%Y:%H:%M);awk -vdate=$date '$4>="["date":00" && $4<="["date":59"{c++}END{print c}' access.log
grep -c $(date -d '-1 minute' +%d/%b/%Y:%H:%M) access.log

说明:date +%d/%b/%Y:%H:%M –> 09/Apr/2016:01:55

5、统计访问最多的前10个页面($request)

awk '{a[$7]++}END{for(i in a)print a[i],i|"sort -k1 -nr|head -n10"}' access.log

6、统计每个URL访问内容的总大小($body_bytes_sent)

awk '{a[$7]++;size[$7]+=$10}END{for(i in a)print a[i],size[i],i}' access.log

7、统计每个IP访问状态码数量($status)

awk '{a[$1" "$9]++}END{for(i in a)print i,a[i]}' access.log

8、统计访问状态码为404的IP及出现次数

awk '{if($9~/404/)a[$1" "$9]++}END{for(i in a)print i,a[i]}' access.log

Linux下lua开发环境安装及安装luafilesystem

1. 先安装 lua 的相关依赖

安装 C 开发环境

由于 gcc 包需要依赖 binutils 和 cpp 包,另外 make 包也是在编译中常用的,所以一共需要 9 个包来完成安装,因此我们只需要执行 9 条指令即可:

gcc:命令未找到(解决方法)

yum install cpp
yum install binutils
yum install glibc
yum install glibc-kernheaders
yum install glibc-common
yum install glibc-devel
yum install gcc
yum install make
yum install readline-devel

2. 安装 lua5.1.5

未分类

下载地址:http://www.lua.org/ftp/

tar -zxvf lua-5.1.5.tar.gz
cd lua-5.1.5
vi Makefile

设置 INSTALL_TOP= /usr/local/lua

make linux
make test
make install
rm -rf  /usr/bin/lua
ln -s /usr/local/lua/bin/lua /usr/bin/lua
ln -s /usr/local/lua/share/lua /usr/share/lua

设置环境变量:

vim /etc/profile

添加:

export LUA_HOME=/usr/local/lua
export PATH=$PATH:$LUA_HOME/bin

环境变量生效:

source /etc/profile

3、安装 luarocks

是一个 Lua 包管理器,基于 Lua 语言开发,提供一个命令行的方式来管理 Lua 包依赖、安装第三方 Lua 包等。

地址:https://github.com/luarocks/luarocks

使用 luarocks-2.2.1 版本在我机器上没有问题,但是使用 luarocks-2.4.2 出现问题

wget http://luarocks.org/releases/luarocks-2.2.1.tar.gz
tar -zxvf luarocks-2.2.1.tar.gz
cd luarocks-2.2.1
./configure --with-lua=/usr/local --with-lua-include=/usr/local/lua/include

设置环境变量:

export LUA_LUAROCKS_PATH=/usr/local/luarocks-2.2.1
export PATH=$PATH:$LUA_LUAROCKS_PATH
make & make install

4、安装 luafilesystem

是一个用于 lua 进行文件访问的库,可以支持 lua 5.1 和 lua5.2,且是跨平台的,在为 lua 安装 lfs 之前需要先安装luarocks。因为自己的需求刚好需要这模块。

地址:https://github.com/keplerproject/luafilesystem

文档:http://keplerproject.github.io/luafilesystem/index.html
luarocks install luafilesystem

5、测试

测试 lua 是否安装成功

lua -v

结果:

Lua 5.1.5  Copyright (C) 1994-2012 Lua.org, PUC-Rio

测试 luafilesystem 是否安装成功

a.lua
local lfs = require"lfs"
function Rreturn(filePath)
local time = os.date("%a, %d %b %Y %X GMT", lfs.attributes(filePath).modification)

–打印文件的修改时间

print(time)
end
Rreturn("/opt/lua/a.txt")
a.txt
a
b
c

运行:

lua  a.lua

结果:

Tue, 16  Sep 2017 9:43:13 GMT

出现打印出时间的结果就意味着已经安装好了。

当然以上这是在 Linux 安装的, Windows 上的其实比这还简单了,但是安装 luafilesystem 的话需要自己去下载个 lfs.dll ,然后把这个放到 lua 的安装路径去。很简单的,这里就不细说了。

出现过的错误:

[root@n1 lua-5.1.5]# make linux test
cd src && make linux
make[1]: Entering directory `/opt/lua-5.1.5/src'
make all MYCFLAGS=-DLUA_USE_LINUX MYLIBS="-Wl,-E -ldl -lreadline -lhistory -lncurses"
make[2]: Entering directory `/opt/lua-5.1.5/src'
gcc -O2 -Wall -DLUA_USE_LINUX   -c -o lapi.o lapi.c
make[2]: gcc:命令未找到
make[2]: *** [lapi.o] 错误 127
make[2]: Leaving directory `/opt/lua-5.1.5/src'
make[1]: *** [linux] 错误 2
make[1]: Leaving directory `/opt/lua-5.1.5/src'
make: *** [linux] 错误 2

原因:最开始的那些依赖没安装。

脚本:将不属于属于Linux默认用户找出来

导读:将不属于linux默认模板的用户找出来,虽然可以直接查看/etc/passwd文件,不过,如果用户多了不觉得繁琐吗?

最近在工作中,需要将生产服务器中所有不是默认的账户进行统计。额、用 计划生育的话来说:”给所有的生产服务器进行一次账户普查”。如果说,使用cat /etc/passwd 固然也能很好的完成任务。但是,在一些复杂的系统当中,用户名千奇百怪。为了不遗漏,也为了偷懒。就小小的搞了一段shell脚本来完成这个工作。

使用过程中也出现了各种问题,例如:某个用户叫aadm,有个系统默认的用户交adm。悲剧的事情发生了,grep开始未做精确匹配(-w),导致遗漏掉。在这里主要吐槽某些开发者,能不能别起一些相似度很高的名字来混淆视听。

未分类

貌似,这样还可以定时排查下,是否有莫名账户存在于你的系统中。提高系统安全。

脚本代码

#!/bin/bash

#作者:shengbao

#时间:20170330

#作用:将不属于系统默认的用户查找出来

#更新记录

#更新时间:20170331

#更新内容:grep 添加参数-w,精确匹配。

userlist=`cat <<eof

root

bin

daemon

adm

lp

sync

shutdown

halt

mail

uucp

operator

games

gopher

ftp

nobody

dbus

rpc

usbmuxd

oprofile

vcsa

rtkit

abrt

hsqldb

avahi-autoipd

saslauth

postfix

rpcuser

nfsnobody

haldaemon

gdm

ntp

apache

pulse

sshd

tcpdump

yunwei

eof`

cat /etc/passwd | awk -F ':' '{print $1}'|grep -Fvw "$userlist"

rm -rf $0

Linux设置环境变量的方法和区别

设置 Linux 环境变量可以通过 export 实现,也可以通过修改几个文件来实现,有必要弄清楚这两种方法以及这几个文件的区别。

通过文件设置 Linux 环境变量

首先是设置全局环境变量,对所有用户都会生效:

  • etc/profile: 此文件为系统的每个用户设置环境信息。当用户登录时,该文件被执行一次,并从 /etc/profile.d 目录的配置文件中搜集shell 的设置。一般用于设置所有用户使用的全局变量。
  • /etc/bashrc: 当 bash shell 被打开时,该文件被读取。也就是说,每次新打开一个终端 shell,该文件就会被读取。

接着是与上述两个文件对应,但只对单个用户生效:

  • ~/.bash_profile 或 ~/.profile: 只对单个用户生效,当用户登录时该文件仅执行一次。用户可使用该文件添加自己使用的 shell 变量信息。另外在不同的LINUX操作系统下,这个文件可能是不同的,可能是 ~/.bash_profile, ~/.bash_login 或 ~/.profile 其中的一种或几种,如果存在几种的话,那么执行的顺序便是:~/.bash_profile、 ~/.bash_login、 ~/.profile。比如 Ubuntu 系统一般是 ~/.profile 文件。
  • ~/.bashrc: 只对单个用户生效,当登录以及每次打开新的 shell 时,该文件被读取。

此外,修改 /etc/environment 这个文件也能实现环境变量的设置。/etc/environment 设置的也是全局变量,从文件本身的作用上来说, /etc/environment 设置的是整个系统的环境,而/etc/profile是设置所有用户的环境。有几点需注意:

  • 系统先读取 etc/profile 再读取 /etc/environment(还是反过来?)
  • /etc/environment 中不能包含命令,即直接通过 VAR=”…” 的方式设置,不使用 export 。
  • 使用 source /etc/environment 可以使变量设置在当前窗口立即生效,需注销/重启之后,才能对每个新终端窗口都生效。

修改 Linux 环境变量实例

以 Ubuntu 为例,修改 ~/.profile 文件:

vim ~/.profile

如果该文件存在,则在文件的最后看到如下代码,PATH 变量的值使用冒号(:)隔开的:

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi

在最后加上代码 PATH=”$PATH:/usr/local/hadoop/bin”,注意等号(=)两边不要有空格,即:

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
PATH="$PATH:/usr/local/hadoop/bin"

因为这个文件是在用户登陆是才读取一次的,所以需要重启才会生效(修改 /etc/profile、/etc/environment 也是如此)。但可以使用命令 source ./.profile 使其立即生效。通过 echo $PATH 可以看到修改后的变量值:

source ./.profile
echo $PATH

通过 Shell 命令 export 修改 Linux 环境变量

另一种修改 Linux 环境变量的方式就是通过 Shell 命令 export,注意变量名不要有美元号 $,赋值语句中才需要有:

export PATH=$PATH:/usr/local/hadoop/bin
  • export 方式只对当前终端 Shell 有效
  • 使用 export 设置的变量,只对当前终端 Shell 有效,也就是说如果新打开一个终端,那这个 export 设置的变量在新终端中使无法读取到的。适合设置一些临时变量。

根据变量所需,选择设置方式,例如 JAVA_HOME 这类变量,就适合将其设为为全局变量,可在 /etc/environment 中设置。

9个Linux系统常用监控命令

我们的系统一旦上线跑起来我们自然希望它一直相安无事,不要宕机,不要无响应,不要慢腾腾的。但是这不是打开机器电源然后放任不管就可以得到的。所以我们要监视系统的运行状况,发现问题及时处理。

对于系统和网络管理员来说每天监控和调试Linux系统的性能问题是一项繁重的工作。监控和保持系统启动并运行是很不容易的一件事。因此实验楼介绍部分linux的系统监控命令。

(1)Linux进程监控:TOP

Linux下的Top命令是一个性能监控程序,许多系统管理员常常用它来监控Linux性能,在许多Linux或者类Unix操作系统里都有这个命令。

Top命令用于按一定的顺序显示所有正在运行而且处于活动状态的实时进程,而且会定期更新显示结果。这条命令显示了CPU的使用率、内存使用率、交换内存使用大小、高速缓存使用大小、缓冲区使用大小,进程PID、所使用命令以及其他。它还可以显示正在运行进程的内存和CPU占用多的情况。

$ top

操作截图:

未分类

在图中依次可以看到进程PID,进程用户,CPU使用率,内存使用率、交换内存使用大小等等信息。top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.

通过man top可以查看到详细的top命令使用方式。

$ man top

操作截图:

未分类

(2)虚拟内存统计 : vmstat

Linux 的 VmStat 命令用于显示虚拟内存、内核线程、磁盘、系统进程、I/O 块、中断、CPU 活动 等的统计信息。

一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数,

$ vmstat 2 1
$ vmstat 2 2

操作截图:

未分类

如果要求vmstat每2秒采集数据,一直采集,直到结束程序(Ctrl+c)。则省略采集次数:

$ vmstat 2

测试参数讲解:

  • r :表示运行队列,如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高
  • b :表示阻塞的进程数swpd :虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器
  • free :空闲的物理内存的大小
  • buff : 系统占用的缓存大小
  • cache :直接用来记忆我们打开的文件,给文件做缓冲
  • si :每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了
  • us :用户CPU时间
  • sy :系统CPU时间
  • so : 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。
  • sy : 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。
  • id : 空闲 CPU时间,一般来说,id + us + sy = 100
  • wt : 等待IO CPU时间。

(3)列出打开的文件:lsof

它常用于以列表的形式显示所有打开的文件和进程。打开的文件包括磁盘文件、网络套接字、管道、设备和进程。

使用这条命令的主要情形之一就是在无法挂载磁盘和显示正在使用或者打开某个文件的错误信息的时候。使用这条命令,你可以很容易地看到正在使用哪个文件。

$ lsof

操作截图:

未分类

此命令运行的结果较长,截图部分。

(4)网络包分析器:tcpdump

Tcpdump是最广泛使用的网络包分析器或者包监控程序之一,它用于捕捉或者过滤网络上指定接口上接收或者传输的TCP/IP包。

它还有一个选项用于把捕捉到的包保存到文件里,以便以后进行分析。

  • -h:查看命令帮助
  • -i:网络接口
  • -c :需要输出包数量
$ sudo apt-get update
$ sudo apt-get install tcpdump 
$ tcpdump -h
$ sudo tcpdump -i eth0 -c 3

操作截图:

未分类

(5)网络状态统计:netstat

Netstat是一个用于监控进出网络的包和网络接口统计的命令行工具。它是一个非常有用的工具,系统管理员可以用来监控网络性能,定位并解决网络相关问题。

  • -h: 查看帮助
  • -r:
  • -i:查看网络接口
$ netstat -h
$ netstat -r
$ netstat -i

操作截图:

未分类

未分类

(6)进程监控:Htop

Htop 是一个非常高级的交互式的实时linux进程监控工具。 它和top命令十分相似,但是它具有更丰富的特性,例如用户可以友好地管理进程,快捷键,垂直和水平方式显示进程等等。

Htop是一个第三方工具,它不包含在linux系统中,你需要使用管理工具去安装它。

$ sudo apt-get install htop
$ htop

未分类

(7)监控Linux磁盘I/O :iotop

iotop命令同样也非常类似于top命令和Htop程序,不过它具有监控并显示实时磁盘I/O和进程的统计功能。在查找具体进程和大量使用磁盘读写进程的时候,这个工具就非常有用。

这个命令只有在kernelv2.6.20及以后的版本中才有。python版本需要 python2.7及以上版本。由于系统原因,实验环境并不支持此命令。此处仅做介绍。

(8)输入/输出统计:iostat

iostat是一个用于收集显示系统存储设备输入和输出状态统计的简单工具。这个工具常常用来追踪存储设备的性能问题,其中存储设备包括设备、本地磁盘,以及诸如使用NFS等的远端磁盘。

$ sudo apt-get install sysstat
$ iostat

操作截图:

未分类

各项含义: avg-cpu段:

  • %user: 在用户级别运行所使用的CPU的百分比.
  • %nice:优先进程消耗的CPU时间,占所有CPU的百分比.
  • %system: 在系统级别(kernel)运行所使用CPU的百分比.
  • %iowait: CPU等待硬件I/O时,所占用CPU百分比.
  • %steal: 管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比.
  • %idle: CPU空闲时间的百分比.

Device段:

  • tps: 每秒钟发送到的I/O请求数.
  • KB_read /s: 每秒读取的block数.
  • KB_wrtn/s: 每秒写入的block数.
  • KB_read: 启动到现在 读入的block总数.
  • KB_wrtn: 启动到现在写入的block总数.

查看帮助:

$ man iostat

(9)实时局域网IP监控:IPTraf

IPTraf是一个在Linux控制台运行的、开放源代码的实时网络(局域网)监控应用。它采集了大量信息,比如通过网络的IP流量监控,包括TCP标记、ICMP详细信息、TCP/UDP流量分离、TCP连接包和字节数。同时还采集有关接口状态的常见信息和详细信息:TCP、UDP、IP、ICMP、非IP,IP校验和错误,接口活动等。

$ sudo apt-get install iptraf
$ sudo iptraf

操作截图(注意图片中下面的提示操作信息。):

未分类

未分类

查看命令帮助信息,根据需要选择合适的参数,进行监控。此处便不再赘述命令参数:

$ sudo iptraf -h

Linux如何查看端口被哪个进程占用

lsof -i:端口号

lsof -i:端口号,用于查看某一端口的占用情况,比如查看22号端口使用情况,lsof -i:8080,如下图

[root@master bin]# lsof -i:8080
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    4509 root  241u  IPv6  35534      0t0  TCP *:webcache (LISTEN)

netstat -tunlp|grep 端口号

netstat -tunlp|grep 端口号,用于查看指定端口号的进程情况,如查看22端口的情况,netstat -tunlp|grep 8080,如下图

[root@master bin]# netstat -tunlp | grep 8080
tcp        0      0 :::8080                     :::*                        LISTEN      4509/java

Linux CentOS 7安装Redis服务器教程

说明:redis的缩写是REmote DIctionary Server。它是最流行的开源,高级key-value存储系统。这里说下CentOS 7上安装redis服务器方法。

项目地址:http://redis.io/

安装

一、安装EPEL repo

这里用的CentOS x86_64操作系统架构,所以我将仅使用适用于x86_64的epel repo软件包。请根据您的操作系统架构(EPEL URL)搜索epel repo软件包

yum install wget
wget -r --no-parent -A 'epel-release-*.rpm' http://dl.fedoraproject.org/pub/epel/7/x86_64/e/
rpm -Uvh dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-*.rpm

之后将会在/etc/yum.repos.d中创建两个epel的repo文件。分别是epel.repo和epel-testing.repo。

二、安装Redis服务器

1、yum安装redis服务器

yum install redis

两个重要的redis服务器配置文件的路径/etc/redis.conf和/etc/redis-sentinel.conf。

2、启动redis服务器

systemctl start redis.service

3、检查redis服务器的运行状态

systemctl status redis.service

4、测试Redis的安装

redis-cli ping

如果返回结果PONG,则安装成功。

三、redis服务器相关命令

systemctl start redis.service  #启动redis服务器 
systemctl stop redis.service  #停止redis服务器
systemctl restart redis.service  #重新启动redis服务器 
systemctl status redis.service  #获取redis服务器的运行状态 
systemctl enable redis.service  #开机启动redis服务器
systemctl disable redis.service  #开机禁用redis服务器

四、Redis服务器监听端口

Redis Server默认侦听端口号6379,可使用SS命令查看。

ss -nlp|grep redis

学习Redis请看:http://redis.io/documentation

LINUX的bash如何给shell脚本传参数

bash命令后边可以跟任意的参数,具体要如何操作?

执行“vi test.sh”创建一个新的shell脚本。

脚本test.sh的内容如下:

#!/bin/sh
name=$1
echo "the ${name} !"

给新建的test.sh的脚本赋可执行权限,命令为“chmod 755 test.sh”。执行可以看到结果.

如果想判断参数为空则中止执行,可以

if [ "$1" = "" ]; then
        echo -e "请提供参数."
        exit 1
fi

或:

if [ $# == 0 ];then
    echo "没有带参数";
else
       echo "带了$#个参数"
fi

或:

if [ "$1" ];then
    echo "带参数";
else
    echo "没有带参数 "
fi

上面的代码其实和使用if结构的-z参数是一样的,都是用于检测字符串是符不空值。因此也可以换成使用-z参数来判断。示例代码如下 :

if [ -z "$1" ];then
    echo "没有带参数";
else
    echo "带参数"
fi

详解:

“name=$1″中$1为系统提供的位置参数,$0代表程序的名称,[$1/$2/…]从1开始为传递的参数。

linux系统除了提供位置参数还提供内置参数,内置参数如下: 

$# ----传递给程序的总的参数数目  

$? ----上一个代码或者shell程序在shell中退出的情况,如果正常退出则返回0,反之为非0值。   

$* ----传递给程序的所有参数组成的字符串。   

$n ----表示第几个参数,$1 表示第一个参数,$2 表示第二个参数 ...   $0 ----当前程序的名称   

$@----以"参数1" "参数2" ... 形式保存所有参数   

$$ ----本程序的(进程ID号)PID   

$! ----上一个命令的PID