[Zabbix] 解决zabbix中文乱码问题


1、在windows机器上查找simkai.ttf文件,在windows下拷贝simkai字体到zabbix server端,并拷贝到相应目录

可在c盘路径下搜索simkai.ttf,本地机器的路径为‘C:\Windows\WinSxS\amd64_microsoft-windows-font-truetype-simkai_31bf3856ad364e35_10.0.17134.1_none_d7e1e1a5de638405’,每台机器对应的目录会有差异,但‘C:\Windows\WinSxS’路径一致。

2、将找到的simkai文件上传到zabbix-server端nginx的安装目录下

1
mv simkai.ttf /data/nginx-1.9.15/html/zabbix/fonts/

3、修改nginx配置文件

1
sed -i 's/DejaVuSans/simkai/g' /data/nginx-1.9.15/html/zabbix/include/defines.inc.php

4、重启php-fpm、nginx

1
2
3
4
nginx -s stop
service php-fpm stop
service php-fpm start
nginx

点击阅读

[Zabbix] zabbix监控磁盘io总吞吐量批量安装配置


0、编辑监控磁盘io总吞吐量脚本

cat /home/zabbix/disk_io_check.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
sudo bash
#安装iostat命令
yum install -y sysstat
#创建监控目录及数据文件
mkdir -p /usr/local/zabbix/script
touch /usr/local/zabbix/script/iostat_data.txt
chown zabbix.zabbix /usr/local/zabbix/script/iostat_data.txt
chmod 777 /usr/local/zabbix/script/iostat_data.txt
touch /usr/local/zabbix/script/iostat_collect_data.sh
chown zabbix.zabbix /usr/local/zabbix/script/iostat_collect_data.sh
chmod 777 /usr/local/zabbix/script/iostat_collect_data.sh
#编辑收集数据脚本
echo "
#!/bin/bash
iostat -dxkt 1 2|grep -E '^sd|^xvda|^vd' > /usr/local/zabbix/script/iostat_data.txt" > /usr/local/zabbix/script/iostat_collect_data.sh
#添加到定时任务,每分钟收集一次
echo "* * * * * root sh /usr/local/zabbix/script/iostat_collect_data.sh" >> /etc/crontab
#添加参数到zabbix配置文件
echo "
#每秒进行 merge 的读操作数目。即 rmerge/s
UserParameter=disk.status.rmerge,cat /usr/local/zabbix/script/iostat_data.txt|tail -n \`iostat -dxk 1 1|grep -E '^sd|^xvda|^vd'|wc -l\` |awk '{print \$2}'|awk '{sum+=\$1} END {print sum}'
#每秒进行 merge 的写操作数目。即 wmerge/s
UserParameter=disk.status.wmerge,cat /usr/local/zabbix/script/iostat_data.txt |tail -n \`iostat -dxk 1 1|grep -E '^sd|^xvda|^vd'|wc -l\` |awk '{print \$3}'|awk '{sum+=\$1} END {print sum}'
#每秒完成的读 I/O 设备次数。即 rio/s
UserParameter=disk.status.rio,cat /usr/local/zabbix/script/iostat_data.txt |tail -n \`iostat -dxk 1 1|grep -E '^sd|^xvda|^vd'|wc -l\` |awk '{print \$4}'|awk '{sum+=\$1} END {print sum}'
#每秒完成的写 I/O 设备次数。即 wio/s
UserParameter=disk.status.wio,cat /usr/local/zabbix/script/iostat_data.txt |tail -n \`iostat -dxk 1 1|grep -E '^sd|^xvda|^vd'|wc -l\` |awk '{print \$5}'|awk '{sum+=\$1} END {print sum}'
#每秒读K字节数。是 rsect/s 的一半,因为每扇区大小为512字节。
UserParameter=disk.status.rsect,cat /usr/local/zabbix/script/iostat_data.txt |tail -n \`iostat -dxk 1 1|grep -E '^sd|^xvda|^vd'|wc -l\` |awk '{print \$6}'|awk '{sum+=\$1} END {print sum}'
#每秒写K字节数。是 wsect/s 的一半。
UserParameter=disk.status.wsect,cat /usr/local/zabbix/script/iostat_data.txt |tail -n \`iostat -dxk 1 1|grep -E '^sd|^xvda|^vd'|wc -l\` |awk '{print \$7}'|awk '{sum+=\$1} END {print sum}'
#平均每次设备I/O操作的数据大小 (扇区)。
UserParameter=disk.status.sectsize,cat /usr/local/zabbix/script/iostat_data.txt |tail -n \`iostat -dxk 1 1|grep -E '^sd|^xvda|^vd'|wc -l\` |awk '{print \$8}'|awk '{sum+=\$1} END {print sum}'
#平均I/O队列长度。
UserParameter=disk.status.queuelength,cat /usr/local/zabbix/script/iostat_data.txt |tail -n \`iostat -dxk 1 1|grep -E '^sd|^xvda|^vd'|wc -l\` |awk '{print \$9}'|awk '{sum+=\$1} END {print sum}'
#平均每次设备I/O操作的等待时间 (毫秒)。
UserParameter=disk.status.avgiowait,cat /usr/local/zabbix/script/iostat_data.txt |tail -n \`iostat -dxk 1 1|grep -E '^sd|^xvda|^vd'|wc -l\` |awk '{print \$10}'|awk '{sum+=\$1} END {print sum}'
#平均每次设备I/O读操作的等待时间 (毫秒)。
UserParameter=disk.status.avgreadiowait,cat /usr/local/zabbix/script/iostat_data.txt |tail -n \`iostat -dxk 1 1|grep -E '^sd|^xvda|^vd'|wc -l\` |awk '{print \$11}'|awk '{sum+=\$1} END {print sum}'
#平均每次设备I/O写操作的等待时间 (毫秒)。
UserParameter=disk.status.avgwriteiowait,cat /usr/local/zabbix/script/iostat_data.txt |tail -n \`iostat -dxk 1 1|grep -E '^sd|^xvda|^vd'|wc -l\` |awk '{print \$12}'|awk '{sum+=\$1} END {print sum}'
#平均每次设备I/O操作的服务时间 (毫秒)。
UserParameter=disk.status.svctm,cat /usr/local/zabbix/script/iostat_data.txt |tail -n \`iostat -dxk 1 1|grep -E '^sd|^xvda|^vd'|wc -l\` |awk '{print \$13}'|awk '{sum+=\$1} END {print sum}'
# 一秒中有百分之多少的时间用于 I/O 操作,即被io消耗的cpu百分比
UserParameter=disk.status.util,cat /usr/local/zabbix/script/iostat_data.txt |tail -n \`iostat -dxk 1 1|grep -E '^sd|^xvda|^vd'|wc -l\` |awk '{print \$14}'|awk '{sum+=\$1} END {print sum}'
" > /usr/local/zabbix/etc/zabbix_agentd.conf.d/iostat_data.conf
echo "
Include=/usr/local/zabbix/etc/zabbix_agentd.conf.d
" >> /usr/local/zabbix/etc/zabbix_agentd.conf
#重新启动zabbix_agent客户端
/etc/init.d/zabbix_agentd restart
#查看监控进程是否启动
netstat -tunlp|grep 10050

1、如果需要批量安装,在ansible-server端配置批量上传脚本

cat /etc/ansible/scopy-diskio-zabbix.sh

1
2
3
4
5
- hosts: test
remote_user: centos
tasks:
- name: scopy zabbix-agent config to all hosts
copy: src="/home/zabbix/disk_io_check.sh" dest="/home/zabbix/disk_io_check.sh"

执行批量上传脚本

1
ansible-playbook /etc/ansible/scopy-diskio-zabbix.sh

执行脚本批量配置监控磁盘io总吞吐量

1
ansible test -m command -a 'sudo sh /home/centos/execute-zabbix.sh'

2、web端配置监控模板,亦可自行编译,点击此处下载

点击阅读

[Zabbix] zabbix-agent批量安装配置


0、本文批量安装使用ansible加shell脚本的方法,首先安装ansible

1
yum -y install ansible

1、修改ansible-server端免交互登录

cat /etc/ssh/ssh_config

1
2
StrictHostKeyChecking no
UserKnownHostsFile /dev/null

修改好配置后,重新启动sshd服务即可,命令为:/etc/init.d/sshd restart (或 service sshd restart 或/bin/systemctl restart sshd.service)

2、编辑/etc/ansible/hosts主机配置文件

cat /etc/ansible/hosts

1
2
3
4
[test]
172.29.25.196 ansible_ssh_private_key_file=/root/test ansible_ssh_user=centos
172.29.16.6 ansible_ssh_private_key_file=/root/test ansible_ssh_user=centos
172.29.20.97 ansible_ssh_private_key_file=/root/test ansible_ssh_user=centos

hosts文件使用参数详解

1
2
3
4
5
6
7
8
9
10
11
ansible_ssh_host   #用于指定被管理的主机的真实IP
ansible_ssh_port #用于指定连接到被管理主机的ssh端口号,默认是22
ansible_ssh_user #ssh连接时默认使用的用户名
ansible_ssh_pass #ssh连接时的密码
ansible_sudo_pass #使用sudo连接用户时的密码
ansible_sudo_exec #如果sudo命令不在默认路径,需要指定sudo命令路径
ansible_ssh_private_key_file #秘钥文件路径,秘钥文件如果不想使用ssh-agent管理时可以使用此选项
ansible_shell_type #目标系统的shell的类型,默认sh
ansible_connection #SSH 连接的类型: local , ssh , paramiko,在 ansible 1.2 之前默认是 paramiko ,后来智能选择,优先使用基于 ControlPersist 的 ssh(支持的前提)
ansible_python_interpreter #用来指定python解释器的路径,默认为/usr/bin/python 同样可以指定ruby 、perl 的路径
ansible_*_interpreter #其他解释器路径,用法和ansible_python_interpreter类似,这里"*"可以是ruby或才perl等其他语言

上例中使用的是私钥和用户名,如果想要使用执行端口,密码,用户名可参考上面详解参数。

3、编辑批量上传脚本

cat /etc/ansible/scopy-test-zabbix.sh

1
2
3
4
5
6
7
- hosts: test
remote_user: centos
tasks:
- name: scopy zabbix to all hosts
copy: src="/root/zabbix-3.4.2.tar.gz" dest="/home/centos/zabbix-3.4.2.tar.gz"
- name: scopy zabbix-agent config to all hosts
copy: src="/home/centos/execute-zabbix.sh" dest="/home/centos/execute-zabbix.sh"

src:代表本机的源文件,dest代表目标端的路径
hosts:要与/etc/ansible/hosts下的[test]保持一致。

execute-zabbix.sh脚本为安装zabbix-agent脚本
cat /home/centos/execute-zabbix.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/sh
mkdir /home/zabbix
useradd -r -s /sbin/nologin zabbix
yum -y install gcc gcc-c++ pcre-devel openssl-devel
mv /home/centos/zabbix-3.4.2.tar.gz /home/zabbix/
cd /home/zabbix
tar -zxvf zabbix-3.4.2.tar.gz
cd zabbix-3.4.2
/home/zabbix/zabbix-3.4.2/configure --prefix=/usr/local/zabbix --enable-agent --with-openssl
make
make install
#host1=`ifconfig eth0 |awk -F '[ :]+' 'NR==2 {print $3}'`
host1=`ip addr |grep dynamic |awk '{print $2}'|awk -F'/' '{print $1}'`
echo "LogFile=/tmp/zabbix_agentd.log
Server=172.29.12.85
ServerActive=172.29.12.85
Hostname=$host1"> /usr/local/zabbix/etc/zabbix_agentd.conf

cp /home/zabbix/zabbix-3.4.2/misc/init.d/fedora/core/zabbix_agentd /etc/init.d/
ln -s /usr/local/zabbix/etc/zabbix_agentd.conf /usr/local/etc/zabbix_agentd.conf
sed -i 's/BASEDIR=\/usr\/local/BASEDIR=\/usr\/local\/zabbix/g' /etc/init.d/zabbix_agentd
service zabbix_agentd start
chkconfig --add zabbix_agentd
chkconfig --level 35 zabbix_agentd on
netstat -lnpt | grep zabbix_agent

server端的ip地址根据自己的zabbix-proxy或者zabbix-server自行定义。

执行批量脚本将文件上传到目标端:

1
ansible-playbook /etc/ansible/scopy-test-zabbix.sh

在ansible-server端执行批量安装脚本

1
ansible test -m command -a 'sudo sh /home/centos/execute-zabbix.sh'

4、编辑查看zabbix-agent进程的脚本,并批量上传到被监控端

编辑检查zabbix-agent进程脚本
cat /home/centos/check-zabbix-port.sh

1
2
#!/bin/bash
netstat -tunlp |grep 10050

编辑批量上传脚本
cat /etc/ansible/scopy-test-check-zabbixport.sh

1
2
3
4
5
- hosts: test
remote_user: centos
tasks:
- name: scopy zabbix-check-port to all hosts
copy: src="/home/centos/check-zabbix-port.sh" dest="/home/centos/check-zabbix-port.sh"

执行批量上传脚本

1
ansible-playbook /etc/ansible/scopy-test-check-zabbixport.sh

在ansible-server服务端执行检查脚本

1
ansible test -m command -a 'sudo sh /home/centos/check-zabbix-port.sh'

点击阅读

[Zabbix] zabbix-server安装配置


0、安装zabbix-server之前需要把server依赖环境lnmp安装完成,首先安装依赖包:

1
2
yum groupinstall "Development tools"  
yum -y install gcc gcc-c++ cmake autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers pcre-devel libaio openssl openssl-devel

1、上传nginx软件包到服务器,如果没有可点击此处下载

创建nginx用户,创建nginx安装目录

1
2
useradd nginx -s /sbin/nologin -M   
mkdir /data/soft

解压安装包、编译安装

1
2
3
4
tar -zxvf nginx-1.9.15.tar.gz
cd nginx-1.9.15
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module
make && make install

检查语法

1
/usr/local/nginx/sbin/nginx -t

启动nginx

1
/usr/local/nginx/sbin/nginx

查看进程是否正常启动

1
netstat -tunlp|grep nginx

关闭nginx服务

1
/usr/local/nginx/sbin/nginx -s stop

2、Mysql数据库安装

下载mysql数据库(可自行下载自己喜欢的版本)

1
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz

添加用户

1
useradd mysql -s /sbin/nologin -M

解压、重命名

1
2
tar -zxvf mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz 
mv mysql-5.7.18-linux-glibc2.5-x86_64 /application/mysql

改变权限权限、初始化,初始化过程中会默认生成随机密码,记录以便后面更改:

1
2
3
chown -R mysql.mysql /data/mysql/ 
/data/mysql/bin/mysqld --initialize --user=mysql --basedir=/data/mysql/ --datadir=/data/mysql/data/
/data/mysql/bin/mysql_ssl_rsa_setup --datadir=/data/mysql/data/

修改配置文件
cat /data/mysql/support-files/my_default.cnf

1
2
3
4
5
6
7
8
9
10
[mysqld]
user = mysql
port = 3306
server_id = 1
socket=/tmp/mysql.sock
basedir =/data/mysql/
datadir =/data/mysql/data/
character-set-server=utf8
[client]
socket=/tmp/mysql.sock

配合mysql启动命令:

1
2
3
cp my_default.cnf /etc/my.cnf
cp mysql.server /etc/init.d/mysqld
chmod 755 /etc/init.d/mysqld

修改/etc/init.d/mysqld,文件数据和安装路径

1
2
basedir=/data/mysql/
datadir=/dadta/mysql/data/

启动mysql

1
/etc/init.d/mysqld start

修改mysql密码

1
2
3
4
mysql -u  root -p
set password=password('root');
grant all privileges on *.* to 'root'@'%' identified by 'root';
flush privileges;

3、安装php服务

安装依赖包

1
yum install -y zlib libxml2 libjpeg freetype libpng gd curl libiconv  zlib-devel libxml2-devel libjpeg-devel freetype-devel libpng-devel gd-devel curl-devel openssl-devel libxslt-devel libxslt*

安装libiconv,下载链接

1
2
3
4
tar -zxvf libiconv-1.14.tar.gz 
cd libiconv-1.14
./configure --prefix=/usr/local/libiconv
make && make install

报错:
./stdio.h:1010:1: error: ‘gets’ undeclared here (not in a function)
_GL_WARN_ON_USE (gets, “gets is a security hole - use fgets instead”);

vi srclib/stdio.in.h文件,接着搜索到在698行:

1
_GL_WARN_ON_USE (gets, “gets is a security hole - use fgets instead”);

这一行,然后把这个替换成下面三行:

1
2
3
#if defined(__GLIBC__) && !defined(__UCLIBC__) && !__GLIBC_PREREQ(2, 16)
_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
#endif

安装Libmcrypt,下载链接

1
2
3
4
5
6
7
8
9
10
tar -zxvf libmcrypt-2.5.8.tar.gz 
cd libmcrypt-2.5.8
./configure
make && make install

/sbin/ldconfig
cd libltdl/
./configure --enable-ltdl-install
make && make install
cd ../../

安装mhash,下载链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
tar -zxvf mhash-0.9.9.9.tar.gz 
cd mhash-0.9.9.9
./configure
make && make install
cd ../
rm -f /usr/lib64/libmcrypt.*
rm -f /usr/lib64/libmhash*
ln -s /usr/local/lib/libmcrypt.la /usr/lib64/libmcrypt.la
ln -s /usr/local/lib/libmcrypt.so /usr/lib64/libmcrypt.so
ln -s /usr/local/lib/libmcrypt.so.4 /usr/lib64/libmcrypt.so.4
ln -s /usr/local/lib/libmcrypt.so.4.4.8 /usr/lib64/libmcrypt.so.4.4.8
ln -s /usr/local/lib/libmhash.a /usr/lib64/libmhash.a
ln -s /usr/local/lib/libmhash.la /usr/lib64/libmhash.la
ln -s /usr/local/lib/libmhash.so /usr/lib64/libmhash.so
ln -s /usr/local/lib/libmhash.so.2 /usr/lib64/libmhash.so.2
ln -s /usr/local/lib/libmhash.so.2.0.1 /usr/lib64/libmhash.so.2.0.1
ln -s /usr/local/lib/libmcrypt-config /usr/lib/libmcrypt-config

安装mcrypt,下载链接

1
2
3
4
5
tar -xf mcrypt-2.6.8.tar.gz   
cd mcrypt-2.6.8/
/sbin/ldconfig
./configure LD_LIBRARY=/usr/local/lib && make &&make install
cd ..

安装php,下载链接

1
2
3
4
5
6
7
tar -zxvf php-5.6.11.tar.gz 
cd php-5.6.11

修改mysql路径对应为自己的mysql安装路径
./configure --prefix=/usr/local/php --with-mysql=/data/mysql --with-iconv-dir=/usr/local/libiconv --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-fpm --enable-mbstring --with-mcrypt --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --enable-short-tags --enable-static --with-xsl --with-fpm-user=nginx --with-fpm-group=nginx --enable-ftp --enable-pdo --with-pdo-mysql --enable-opcache=no
make && make install
cd ..

安装过程提示缺少mysqlclient包的问题,根据版本差异执行以下命令:

1
2
3
ln -s /data/mysql/lib/libmysqlclient.so.18 /usr/lib64/
或者
ln -s /data/mysql/lib/libmysqlclient.so.20 /usr/lib64/

缺少phar.phar文件

1
2
3
4
5
6
7
8
9
chmod: cannot access `ext/phar/phar.phar': No such file or directory
make: [ext/phar/phar.phar] Error 1 (ignored)

Build complete.
Don't forget to run 'make test'.

解决方法
#cd ext/phar/
#cp ./phar.php ./phar.phar

配置文件(php.ini和php-fpm)

1
2
3
需要把php.ini文件放到lib下面,放到etc下面不生效:
cp /data/soft/php-5.6.11/php.ini-production /usr/local/php/lib/php.ini
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf

检查语法、启动

1
2
3
4
5
6
7
8
9
10
11
12
/usr/local/php/sbin/php-fpm -t 
/usr/local/php/sbin/php-fpm
cp /data/soft/php-5.6.11/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
chmod a+x /etc/init.d/php-fpm
加入开机启动
chkconfig --add php-fpm
chkconfig --level 35 php-fpm on
启动 php-fpm
service php-fpm start
netstat -anpt | grep php-fpm
停止 php-fpm
service php-fpm stop

4、配置nginx使其支持php

cat /usr/local/nginx/conf/nginx.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
server {
listen 80;
server_name localhost;

location / {
root html;
index index.php index.html index.htm; # 加入 index.php
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

location ~ \.php$ { # 整段注释去掉
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name; # 修改为自己的根目录
include fastcgi_params;
}
}

创建测试页面

1
echo "<?php phpinfo(); ?>" > /usr/local/nginx/html/info.php

重启 Nginx 、php-fpm

1
2
3
4
service php-fpm stop
service php-fpm start
nginx -s stop
nginx

浏览器访问测试页面

1
localhost/info.php

5、安装zabbix-server

下载安装包
wget https://jaist.dl.sourceforge.net/project/zabbix/ZABBIX%20Latest%20Stable/4.0.3/zabbix-4.0.3.tar.gz
安装依赖包

1
yum -y install ntpdate net-snmp net-snmp-devel libcurl-devel libevent-devel

设置zabbix用户,编译安装zabbix

1
2
3
4
5
6
7
8
9
10
11
12
13
useradd -r -s /sbin/nologin zabbix
tar -zxvf zabbix-4.0.3.tar.gz
cd zabbix-4.0.3
./configure --prefix=/usr/local/zabbix --enable-server --enable-agent --with-mysql --with-net-snmp --with-libcurl --with-libxml2 --with-openssl

# --prefix 指定安装路径
# --enable-server 安装 Server 端
# --enable-agent 安装 Agent 端
# --with-mysql 使用 Mysql 数据库
# --with-net-snmp 支持 SNMP 协议
# --with-libcurl 支持 libcurl URL 监控

make && make install

mysql数据库添加zabbix初始化数据

1
2
3
4
5
6
7
8
mysql> create database zabbixDB character set utf8;                                    # 创建 zabbixDB 并设置编码为 utf8
mysql> grant all on zabbixDB.* to 'zabbix'@'%' identified by 'zabbix'; # 建立授权用户
mysql> flush privileges; # 刷新授权表 ( 虽然 grant 操作是不需要刷新授权表的,但那又如何 ? )
mysql> use zabbixDB;
mysql> source /data/soft/zabbix-4.0.3/database/mysql/schema.sql # 导入数据
mysql> source /data/soft/zabbix-4.0.3/database/mysql/images.sql
mysql> source /data/soft/zabbix-4.0.3/database/mysql/data.sql
mysql> quit

配置 Zabbix 服务

1
2
3
4
5
6
# 服务端启动脚本
shell > cp /data/soft/zabbix-4.0.3/misc/init.d/fedora/core/zabbix_server /etc/init.d/
# 客户端启动脚本
shell > cp /data/soft/zabbix-4.0.3/misc/init.d/fedora/core/zabbix_agentd /etc/init.d/
# 网页文件
shell > cp -R /data/soft/zabbix-4.0.3/frontends/php/ /usr/local/nginx/html/zabbix

服务端配置文件
vim /usr/local/zabbix/etc/zabbix_server.conf

1
2
3
4
LogFile=/tmp/zabbix_server.log  # 日志文件存放位置
DBName=zabbixDB # 数据库名
DBUser=zabbix # 连接用户
DBPassword=zabbix # 连接密码

服务端启动脚本

1
2
shell > vim /etc/init.d/zabbix_server 
BASEDIR=/usr/local/zabbix # 修改后的位置 ( 原:/usr/local )

客户端启动脚本

1
2
shell >vim /etc/init.d/zabbix_agentd
BASEDIR=/usr/local/zabbix # 修改后的位置 ( 原:/usr/local )

配置zabbix开机启动,并启动Zabbix服务

1
2
3
4
5
6
7
8
shell > chkconfig --add zabbix_server
shell > chkconfig --add zabbix_agentd
shell > chkconfig --level 35 zabbix_server on
shell > chkconfig --level 35 zabbix_agentd on
shell > service zabbix_server start
Starting zabbix_server: [确定]
shell > service zabbix_agentd start
Starting zabbix_agentd: [确定]

查看进程启动是否正常

1
2
3
shell > netstat -anpt | grep zabbix ( 注意:要来确认一下到底有没有启动成功,因为当授权用户无法连接数据库时,zabbix_server 是无法启动的,但是启动过程显示成功 )
tcp 0 0 0.0.0.0:10050 0.0.0.0:* LISTEN 75399/zabbix_agentd
tcp 0 0 0.0.0.0:10051 0.0.0.0:* LISTEN 75321/zabbix_server

6、登陆网页进行配置 Zabbix ( http://your-domain/zabbix )(初始用户名密码为admin/zabbix)

第一个页面是欢迎页面,直接 Next


第二个页面大多会有多处检测失败,也是出问题最多的位置,修改php文件一下参数:
vim /usr/local/php/etc/php.ini

1
2
3
4
5
6
7
post_max_size = 16M
max_execution_time = 300
max_input_time = 300
去掉date前面的分号,并添加时区
date.timezone = Asia/Shanghai
去掉always前面的分号
always_populate_raw_post_data = -1

根据页面提示报错还需要修改以下配置:

1
2
3
4
5
6
7
8
9
cd /root/php-5.6.11/ext/openssl/
cp ./config0.m4 ./config.m4
#重新编译php,添加mysqli模块
cd /data/soft/php-5.6.11/ext/mysqli
/usr/local/php/bin/phpize
./configure --prefix=/data/soft/mysqli --with-php-config=/usr/local/php/bin/php-config --with-mysqli=/data/mysql/bin/mysql_config
make
make test
make install

配置完成后在php.ini下加入下来一行
vim /usr/local/php/etc/php.ini

1
extension=mysqli.so

安装过程中的其他报错

1
fatal error: ext/mysqlnd/mysql_float_to_double.h: No such file or directory

vim /data/soft/php-5.6.11/ext/mysqli/mysqli_api.c

1
2
3
4
把第36行的
#include "ext/mysqlnd/mysql_float_to_double.h"
修改为
#include "/data/soft/php-5.6.11/ext/mysqlnd/mysql_float_to_double.h"

点击下一步,配置数据库信息,根据自己配置的db信息填写

点击下一步,设置zabbix-server信息

点击下一步,预览设置的db和server的信息

点击下一步,按提示要求,将下载下来的文件放到相应的目录

zabbix-server安装完成

7、zabbix-proxy代理端安装

依赖包安装

1
2
yum -y groupinstall "Development tools" 
yum -y install gcc gcc-c++ cmake autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel openssl openssl-devel openldap openldap-devel nss_ldap openldap-clients openldap-servers pcre-devel libaio ntpdate net-snmp net-snmp-devel libcurl-devel libevent-devel vim telnet pcre-devel

添加zabbix用户,并编译安装zabbix-proxy

1
2
3
4
5
6
7
8
9
useradd -r -s /sbin/nologin zabbix
tar -zxvf zabbix-3.4.2.tar.gz
cd zabbix-3.4.2
./configure --prefix=/usr/local/zabbix --enable-agent --enable-proxy --with-mysql --with-net-snmp --with-libcurl --with-libxml2 --with-openssl
# --enable-agent 不是必须的 ( 如果不想监控 Proxy 的话 )
mysql路径如果安装路径不是默认,需要单独指定
./configure --prefix=/usr/local/zabbix --enable-agent --enable-proxy --with-mysql=/data/mysql/bin/mysql_config --with-net-snmp --with-libcurl --with-libxml2 --with-openssl

make && make install

将proxy代理所需要的初始化数据导入到mysql数据库:

1
2
3
4
5
6
mysql -u root -p
mysql> create database proxydb character set utf8; # 创建数据库
mysql> grant all on proxydb.* to 'proxy'@'%' identified by 'proxydb'; # 创建授权用户
mysql> flush privileges; # 刷新授权表,虽然不需要~
mysql> use proxydb;
mysql> source /root/zabbix-3.4.2/database/mysql/schema.sql # 导入数据,只导入这一个就可以了

修改zabbix_proxy.conf配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@node1 ~]# grep -vP '^$|#' /usr/local/zabbix/etc/zabbix_proxy.conf
ProxyMode=0
Server=192.168.197.135
ServerPort=10051
Hostname=node1
LogFile=/tmp/zabbix_proxy.log
DBHost=localhost
DBName=proxydb
DBUser=proxy
DBPassword=proxydb
ConfigFrequency=60
DataSenderFrequency=60
Timeout=4
LogSlowQueries=3000

参数详解:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
ProxyMode=0                    # 0 代表 Proxy 处于主动模式,即:Proxy 主动去请求 Zabbix Server 获取监控项;1 代表被动模式
Server=192.168.188.30 #填写Server的IP,Proxy会将收集到的数据发往这个IP。
ServerPort=10051 # Zabbix Server 监听端口,同上只在 Proxy 为主动模式时生效
Hostname=node1 # 这个很重要啦,跟 Agent 的 Hostname 一样重要,注意修改Hostname与web界面的需要添加的主机名称一致
LogFile=/var/log/zabbix/zabbix_proxy.log # Proxy 日志文件位置
LogFileSize=0
PidFile=/var/run/zabbix/zabbix_proxy.pid
DBHost=localhost # 连接哪里的数据库
DBName=proxydb #Proxy连接的数据库
DBUser=proxy #连接数据库的用户名
DBPassword=proxypass #连接数据库的秘密
DBSocket=/var/lib/mysql/mysql.sock
ProxyLocalBuffer=0 #当数据发送到Server,还要在本地保留多少小时.不保留
ProxyOfflineBuffer=3 #当数据没有发送到Server,在本地保留多少小时,3小时。
HeartbeatFrequency=60 #心跳检测代理在Server的可用性
ConfigFrequency=60 # Proxy 向 Zabbix Server 请求监控项间隔,单位为 秒,默认3600秒.
DataSenderFrequency=3 #代理收集到数据后,多久向Server发送一次,单位为 秒
ExternalScripts=/usr/lib/zabbix/externalscripts
TLSConnect=psk #加密传输
TLSPSKFile=/usr/local/zabbix/etc/zabbix_proxy.psk #加密传输文件
TLSPSKIdentity=PSK 002 #加密传输标识,与web控制台一致
#DebugLevel=5

如果要加密传输生成秘钥

1
openssl rand -hex 32

将秘钥存入/usr/local/zabbix/etc/zabbix_proxy.psk文件
然后再zabbix-server,web控制台添加zabbix-proxy信息


启动 zabbix_proxy

1
/usr/local/zabbix/sbin/zabbix_proxy

启动报错如下

1
/usr/local/zabbix/sbin/zabbix_proxy: error while loading shared libraries: libmysqlclient.so.20: cannot open shared object file: No such file or directory

解决方法

1
ln -s /application/mysql/lib/libmysqlclient.so.20 /usr/lib64/

查看是否启动成功:

1
2
netstat -lnpt | grep zabbix_proxy
tcp 0 0 0.0.0.0:10051 0.0.0.0:* LISTEN 80154/zabbix_proxy

加入开机启动

1
echo "/usr/local/zabbix/sbin/zabbix_proxy" >> /etc/rc.local

点击阅读

[Zabbix] zabbix监控cassandra数据库


1、安装java_gate_way,如果当前监控架构为client-server将zabbix-java-gate-way安装在server端口,如果当前架构为client-proxy-server,将zabbix-java-gate-way安装在proxy端,安装步骤如下(下面以client-proxy-server架构为例):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
创建zabbix用户,安装依赖包:
sudo bash
mkdir /home/zabbix
useradd -r -s /sbin/nologin zabbix
yum -y install gcc gcc-c++ pcre-devel openssl-devel
yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel

上传zabbix安装包,并安装java-gate-way:
mv /data/download/zabbix-3.4.2.tar.gz /home/zabbix/
cd /home/zabbix/
tar -zxvf zabbix-3.4.2.tar.gz
cd zabbix-3.4.2
./configure --prefix=/data/zabbix --enable-java
(如果zabbix-porxy或zabbix-server已安装,可指定一个新路径,gate-way与proxy、server并没有直接关系,可不必一起安装;如果都没有安装,为了管理方便,亦可放到同一目录)
make && make install

安装完成之后,会在指定目录下存在以下文件:

1
2
3
4
5
6
7
ll /data/zabbix/sbin/zabbix_java/
total 12
drwxr-xr-x. 2 root root 65 Aug 23 02:41 bin
drwxr-xr-x. 2 root root 177 Aug 23 02:36 lib
-rw-r--r--. 1 root root 791 Aug 23 02:36 settings.sh
-rwxr-xr-x. 1 root root 545 Aug 23 02:36 shutdown.sh
-rwxr-xr-x. 1 root root 2025 Aug 23 02:36 startup.sh

包括启动脚本,关闭脚本,配置文件,依赖库,运行命令等文件。
启动java_gate_way:

1
./startup.sh

2、安装完成之后,修改zabbix_proxy.conf配置文件,添加以下参数:

1
2
3
JavaGateway=127.0.0.1
JavaGatewayPort=10052
StartJavaPollers=5

默认端口为10052,因为zabbix-proxy与gate-way在同一台服务器上,因此使用127.0.0.1即可。必须指定java轮询器的预分叉实例数,默认情况下启动不会启动与jmx监控相关的进程。
修改完成之后重新启动zabbix-proxy服务,是修改参数生效。

3、修改cassandra-java启动参数,使其jmx监控进程允许其他服务器访问

cat /etc/cassandra/conf/cassandra-env.sh |grep -v ‘^#’ |grep -v ‘^$’

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
calculate_heap_sizes()
{
case "`uname`" in
Linux)
system_memory_in_mb=`free -m | awk '/:/ {print $2;exit}'`
system_cpu_cores=`egrep -c 'processor([[:space:]]+):.*' /proc/cpuinfo`
;;
FreeBSD)
system_memory_in_bytes=`sysctl hw.physmem | awk '{print $2}'`
system_memory_in_mb=`expr $system_memory_in_bytes / 1024 / 1024`
system_cpu_cores=`sysctl hw.ncpu | awk '{print $2}'`
;;
SunOS)
system_memory_in_mb=`prtconf | awk '/Memory size:/ {print $3}'`
system_cpu_cores=`psrinfo | wc -l`
;;
Darwin)
system_memory_in_bytes=`sysctl hw.memsize | awk '{print $2}'`
system_memory_in_mb=`expr $system_memory_in_bytes / 1024 / 1024`
system_cpu_cores=`sysctl hw.ncpu | awk '{print $2}'`
;;
*)
# assume reasonable defaults for e.g. a modern desktop or
# cheap server
system_memory_in_mb="2048"
system_cpu_cores="2"
;;
esac
# some systems like the raspberry pi don't report cores, use at least 1
if [ "$system_cpu_cores" -lt "1" ]
then
system_cpu_cores="1"
fi
# set max heap size based on the following
# max(min(1/2 ram, 1024MB), min(1/4 ram, 8GB))
# calculate 1/2 ram and cap to 1024MB
# calculate 1/4 ram and cap to 8192MB
# pick the max
half_system_memory_in_mb=`expr $system_memory_in_mb / 2`
quarter_system_memory_in_mb=`expr $half_system_memory_in_mb / 2`
if [ "$half_system_memory_in_mb" -gt "1024" ]
then
half_system_memory_in_mb="1024"
fi
if [ "$quarter_system_memory_in_mb" -gt "8192" ]
then
quarter_system_memory_in_mb="8192"
fi
if [ "$half_system_memory_in_mb" -gt "$quarter_system_memory_in_mb" ]
then
max_heap_size_in_mb="$half_system_memory_in_mb"
else
max_heap_size_in_mb="$quarter_system_memory_in_mb"
fi
MAX_HEAP_SIZE="${max_heap_size_in_mb}M"
# Young gen: min(max_sensible_per_modern_cpu_core * num_cores, 1/4 * heap size)
max_sensible_yg_per_core_in_mb="100"
max_sensible_yg_in_mb=`expr $max_sensible_yg_per_core_in_mb "*" $system_cpu_cores`
desired_yg_in_mb=`expr $max_heap_size_in_mb / 4`
if [ "$desired_yg_in_mb" -gt "$max_sensible_yg_in_mb" ]
then
HEAP_NEWSIZE="${max_sensible_yg_in_mb}M"
else
HEAP_NEWSIZE="${desired_yg_in_mb}M"
fi
}
java_ver_output=`"${JAVA:-java}" -version 2>&1`
jvmver=`echo "$java_ver_output" | grep '[openjdk|java] version' | awk -F'"' 'NR==1 {print $2}' | cut -d\- -f1`
JVM_VERSION=${jvmver%_*}
JVM_PATCH_VERSION=${jvmver#*_}
if [ "$JVM_VERSION" \< "1.8" ] ; then
echo "Cassandra 3.0 and later require Java 8u40 or later."
exit 1;
fi
if [ "$JVM_VERSION" \< "1.8" ] && [ "$JVM_PATCH_VERSION" -lt 40 ] ; then
echo "Cassandra 3.0 and later require Java 8u40 or later."
exit 1;
fi
jvm=`echo "$java_ver_output" | grep -A 1 'java version' | awk 'NR==2 {print $1}'`
case "$jvm" in
OpenJDK)
JVM_VENDOR=OpenJDK
# this will be "64-Bit" or "32-Bit"
JVM_ARCH=`echo "$java_ver_output" | awk 'NR==3 {print $2}'`
;;
"Java(TM)")
JVM_VENDOR=Oracle
# this will be "64-Bit" or "32-Bit"
JVM_ARCH=`echo "$java_ver_output" | awk 'NR==3 {print $3}'`
;;
*)
# Help fill in other JVM values
JVM_VENDOR=other
JVM_ARCH=unknown
;;
esac
JVM_OPTS="$JVM_OPTS -Xloggc:/var/log/cassandra/gc.log"
JVM_OPTS_FILE=$CASSANDRA_CONF/jvm.options
for opt in `grep "^-" $JVM_OPTS_FILE`
do
JVM_OPTS="$JVM_OPTS $opt"
done
echo $JVM_OPTS | grep -q Xmn
DEFINED_XMN=$?
echo $JVM_OPTS | grep -q Xmx
DEFINED_XMX=$?
echo $JVM_OPTS | grep -q Xms
DEFINED_XMS=$?
echo $JVM_OPTS | grep -q UseConcMarkSweepGC
USING_CMS=$?
echo $JVM_OPTS | grep -q UseG1GC
USING_G1=$?
if [ "x$MAX_HEAP_SIZE" = "x" ] && [ "x$HEAP_NEWSIZE" = "x" -o $USING_G1 -eq 0 ]; then
calculate_heap_sizes
elif [ "x$MAX_HEAP_SIZE" = "x" ] || [ "x$HEAP_NEWSIZE" = "x" -a $USING_G1 -ne 0 ]; then
echo "please set or unset MAX_HEAP_SIZE and HEAP_NEWSIZE in pairs when using CMS GC (see cassandra-env.sh)"
exit 1
fi
if [ "x$MALLOC_ARENA_MAX" = "x" ] ; then
export MALLOC_ARENA_MAX=4
fi
if [ $DEFINED_XMX -ne 0 ] && [ $DEFINED_XMS -ne 0 ]; then
JVM_OPTS="$JVM_OPTS -Xms${MAX_HEAP_SIZE}"
JVM_OPTS="$JVM_OPTS -Xmx${MAX_HEAP_SIZE}"
elif [ $DEFINED_XMX -ne 0 ] || [ $DEFINED_XMS -ne 0 ]; then
echo "Please set or unset -Xmx and -Xms flags in pairs on jvm.options file."
exit 1
fi
if [ $DEFINED_XMN -eq 0 ] && [ $DEFINED_XMX -ne 0 ]; then
echo "Please set or unset -Xmx and -Xmn flags in pairs on jvm.options file."
exit 1
elif [ $DEFINED_XMN -ne 0 ] && [ $USING_CMS -eq 0 ]; then
JVM_OPTS="$JVM_OPTS -Xmn${HEAP_NEWSIZE}"
fi
if [ "$JVM_ARCH" = "64-Bit" ] && [ $USING_CMS -eq 0 ]; then
JVM_OPTS="$JVM_OPTS -XX:+UseCondCardMark"
fi
JVM_OPTS="$JVM_OPTS -XX:CompileCommandFile=$CASSANDRA_CONF/hotspot_compiler"
JVM_OPTS="$JVM_OPTS -javaagent:$CASSANDRA_HOME/lib/jamm-0.3.0.jar"
if [ "x$CASSANDRA_HEAPDUMP_DIR" != "x" ]; then
JVM_OPTS="$JVM_OPTS -XX:HeapDumpPath=$CASSANDRA_HEAPDUMP_DIR/cassandra-`date +%s`-pid$$.hprof"
fi
JVM_ON_OUT_OF_MEMORY_ERROR_OPT="-XX:OnOutOfMemoryError=kill -9 %p"
JVM_OPTS="$JVM_OPTS -Djava.rmi.server.hostname=10.0.7.50"
if [ "x$LOCAL_JMX" = "x" ]; then
LOCAL_JMX=no
fi
JMX_PORT="7199"
if [ "$LOCAL_JMX" = "yes" ]; then
JVM_OPTS="$JVM_OPTS -Dcassandra.jmx.local.port=$JMX_PORT"
JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
else
JVM_OPTS="$JVM_OPTS -Dcassandra.jmx.remote.port=$JMX_PORT"
# if ssl is enabled the same port cannot be used for both jmx and rmi so either
# pick another value for this property or comment out to use a random port (though see CASSANDRA-7087 for origins)
JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.rmi.port=$JMX_PORT"
# turn on JMX authentication. See below for further options
JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
# jmx ssl options
JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.ssl=false"
#JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.ssl.need.client.auth=true"
#JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.ssl.enabled.protocols=<enabled-protocols>"
#JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.ssl.enabled.cipher.suites=<enabled-cipher-suites>"
#JVM_OPTS="$JVM_OPTS -Djavax.net.ssl.keyStore=/path/to/keystore"
#JVM_OPTS="$JVM_OPTS -Djavax.net.ssl.keyStorePassword=<keystore-password>"
#JVM_OPTS="$JVM_OPTS -Djavax.net.ssl.trustStore=/path/to/truststore"
#JVM_OPTS="$JVM_OPTS -Djavax.net.ssl.trustStorePassword=<truststore-password>"
fi
JVM_OPTS="$JVM_OPTS -Djava.library.path=$CASSANDRA_HOME/lib/sigar-bin"
JVM_OPTS="$JVM_OPTS $MX4J_ADDRESS"
JVM_OPTS="$JVM_OPTS $MX4J_PORT"
JVM_OPTS="$JVM_OPTS $JVM_EXTRA_OPTS"

主要修改一下内容,默认LOCAL_JMX=yes

1
2
3
if [ "x$LOCAL_JMX" = "x" ]; then
LOCAL_JMX=no
fi

将true改为false,修改远程访问认证无需密码:

1
2
3
4
5
6
7
8
9
10
if [ "$LOCAL_JMX" = "yes" ]; then
JVM_OPTS="$JVM_OPTS -Dcassandra.jmx.local.port=$JMX_PORT"
JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
else
JVM_OPTS="$JVM_OPTS -Dcassandra.jmx.remote.port=$JMX_PORT"
# if ssl is enabled the same port cannot be used for both jmx and rmi so either
# pick another value for this property or comment out to use a random port (though see CASSANDRA-7087 for origins)
JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.rmi.port=$JMX_PORT"
# turn on JMX authentication. See below for further options
JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.authenticate=false"

4、在zabbix-proxy端测试,获取被监控端的数据是否正常,监控脚本如下:

cat /data/zabbix/sbin/zabbix_java/bin/zabbix_get_jmx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/usr/bin/env bash

if [ $# != 5 ]
then
echo "Usage: $0 <JAVA_GATEWAY_HOST> <JAVA_GATEWAY_PORT> <JMX_SERVER> <JMX_PORT> <KEY>"
exit;
fi

# create connection
exec 3<>/dev/tcp/$1/$2

# compose message
MSG="{\"request\": \"java gateway jmx\",\"jmx_endpoint\":\"service:jmx:rmi:///jndi/rmi://$3:$4/jmxrmi\",\"keys\": [\"$5\"]}"
# write message length as zero-padded 16-digit hexadecimal number
printf -v LEN '%016x' "${#MSG}"

# prepare message length in little endian representation
BYTES=""
for i in {0..14..2}
do
BYTES="\\x${LEN:$i:2}$BYTES"
done

# prepend protocol header and message length
printf "ZBXD\\1$BYTES%s" "$MSG" >&3

# output the result skipping 5 bytes of "ZBXD\\1" header and 8 bytes of message length
tail -c+13 <&3

该脚本可自行存放,没有规定,测试命令如下:

1
./zabbix_get_jmx 127.0.0.1 10052 10.0.7.50 7199 'jmx[\"org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=MemtablePostFlush,name=ActiveTasks\",\"Value\"]'

127.0.0.1:为java-gate-way地址;
10052:为java-gate-way端口;
10.0.7.50:为被监控端的ip地址;
7199:为被监控端jmx的端口;
org.apache**:为要获取的参数,需要获取哪些参数可查看官方文档

5、zabbix官网提供了对cassandra的监控模板,其中有部分参数已失效,如需下载官方模板,点击此处,该模板为纯英文,且里面参数没有详细描述,下面为根据个人理解翻译后的模板,点击此处下载

点击阅读

[Linux] centos7.2 服务器 使用df -h卡死问题


1、服务器使用df -h命令卡死,crtl+c没有反应,ps -ef|grep df 命令杀掉df -h进程也无效。

2、重新启动会话,使用strace跟踪df -h执行状态

strace df -h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
execve("/usr/bin/df", ["df", "-h"], [/* 24 vars */]) = 0
brk(NULL) = 0x1e9c000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7efe77097000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=19527, ...}) = 0
mmap(NULL, 19527, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7efe77092000
close(3) = 0
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 \34\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=2107816, ...}) = 0
mmap(NULL, 3932736, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7efe76ab6000
mprotect(0x7efe76c6c000, 2097152, PROT_NONE) = 0
mmap(0x7efe76e6c000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b6000) = 0x7efe76e6c000
mmap(0x7efe76e72000, 16960, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7efe76e72000
close(3) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7efe77091000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7efe7708f000
arch_prctl(ARCH_SET_FS, 0x7efe7708f740) = 0
mprotect(0x7efe76e6c000, 16384, PROT_READ) = 0
mprotect(0x616000, 4096, PROT_READ) = 0
mprotect(0x7efe77098000, 4096, PROT_READ) = 0
munmap(0x7efe77092000, 19527) = 0
brk(NULL) = 0x1e9c000
brk(0x1ebd000) = 0x1ebd000
brk(NULL) = 0x1ebd000
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=106065056, ...}) = 0
mmap(NULL, 106065056, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7efe7058f000
close(3) = 0
open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2502, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7efe77096000
read(3, "# Locale name alias data base.\n#"..., 4096) = 2502
read(3, "", 4096) = 0
close(3) = 0
munmap(0x7efe77096000, 4096) = 0
open("/usr/share/locale/zh_CN.UTF-8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/zh_CN.utf8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/zh_CN/LC_MESSAGES/coreutils.mo", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=190751, ...}) = 0
mmap(NULL, 190751, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7efe77060000
close(3) = 0
open("/usr/share/locale/zh.UTF-8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/zh.utf8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/zh/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/mtab", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7efe77096000
read(3, "rootfs / rootfs rw 0 0\nsysfs /sy"..., 1024) = 1024
read(3, "ev,noexec,relatime,freezer 0 0\nc"..., 1024) = 1024
read(3, "sd rw,relatime 0 0\n", 1024) = 19
read(3, "", 1024) = 0
close(3) = 0
munmap(0x7efe77096000, 4096) = 0
open("/usr/lib64/gconv/gconv-modules.cache", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=26254, ...}) = 0
mmap(NULL, 26254, PROT_READ, MAP_SHARED, 3, 0) = 0x7efe77059000
close(3) = 0
stat("/", {st_mode=S_IFDIR|0555, st_size=4096, ...}) = 0
stat("/sys", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0
stat("/proc", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0
stat("/dev", {st_mode=S_IFDIR|0755, st_size=3140, ...}) = 0
stat("/sys/kernel/security", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/dev/shm", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=40, ...}) = 0
stat("/dev/pts", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/run", {st_mode=S_IFDIR|0755, st_size=740, ...}) = 0
stat("/sys/fs/cgroup", {st_mode=S_IFDIR|0755, st_size=280, ...}) = 0
stat("/sys/fs/cgroup/systemd", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/sys/fs/pstore", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/sys/fs/cgroup/memory", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/sys/fs/cgroup/cpu,cpuacct", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/sys/fs/cgroup/net_cls", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/sys/fs/cgroup/freezer", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/sys/fs/cgroup/devices", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/sys/fs/cgroup/blkio", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/sys/fs/cgroup/perf_event", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/sys/fs/cgroup/cpuset", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/sys/fs/cgroup/hugetlb", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/sys/kernel/config", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/", {st_mode=S_IFDIR|0555, st_size=4096, ...}) = 0
stat("/proc/sys/fs/binfmt_misc"

df -h进程在”/proc/sys/fs/binfmt_misc”这个位置卡主了

3、启动另一个会话,重新挂在这个目录

1
systemctl restart proc-sys-fs-binfmt_misc.automount

4、strace df -h 跟踪的进程内容有新的输出,完整信息输出如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
execve("/usr/bin/df", ["df", "-h"], [/* 24 vars */]) = 0
brk(NULL) = 0x1e9c000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7efe77097000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=19527, ...}) = 0
mmap(NULL, 19527, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7efe77092000
close(3) = 0
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0 \34\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=2107816, ...}) = 0
mmap(NULL, 3932736, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7efe76ab6000
mprotect(0x7efe76c6c000, 2097152, PROT_NONE) = 0
mmap(0x7efe76e6c000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b6000) = 0x7efe76e6c000
mmap(0x7efe76e72000, 16960, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7efe76e72000
close(3) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7efe77091000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7efe7708f000
arch_prctl(ARCH_SET_FS, 0x7efe7708f740) = 0
mprotect(0x7efe76e6c000, 16384, PROT_READ) = 0
mprotect(0x616000, 4096, PROT_READ) = 0
mprotect(0x7efe77098000, 4096, PROT_READ) = 0
munmap(0x7efe77092000, 19527) = 0
brk(NULL) = 0x1e9c000
brk(0x1ebd000) = 0x1ebd000
brk(NULL) = 0x1ebd000
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=106065056, ...}) = 0
mmap(NULL, 106065056, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7efe7058f000
close(3) = 0
open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2502, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7efe77096000
read(3, "# Locale name alias data base.\n#"..., 4096) = 2502
read(3, "", 4096) = 0
close(3) = 0
munmap(0x7efe77096000, 4096) = 0
open("/usr/share/locale/zh_CN.UTF-8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/zh_CN.utf8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/zh_CN/LC_MESSAGES/coreutils.mo", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=190751, ...}) = 0
mmap(NULL, 190751, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7efe77060000
close(3) = 0
open("/usr/share/locale/zh.UTF-8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/zh.utf8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/zh/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/mtab", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7efe77096000
read(3, "rootfs / rootfs rw 0 0\nsysfs /sy"..., 1024) = 1024
read(3, "ev,noexec,relatime,freezer 0 0\nc"..., 1024) = 1024
read(3, "sd rw,relatime 0 0\n", 1024) = 19
read(3, "", 1024) = 0
close(3) = 0
munmap(0x7efe77096000, 4096) = 0
open("/usr/lib64/gconv/gconv-modules.cache", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=26254, ...}) = 0
mmap(NULL, 26254, PROT_READ, MAP_SHARED, 3, 0) = 0x7efe77059000
close(3) = 0
stat("/", {st_mode=S_IFDIR|0555, st_size=4096, ...}) = 0
stat("/sys", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0
stat("/proc", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0
stat("/dev", {st_mode=S_IFDIR|0755, st_size=3140, ...}) = 0
stat("/sys/kernel/security", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/dev/shm", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=40, ...}) = 0
stat("/dev/pts", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/run", {st_mode=S_IFDIR|0755, st_size=740, ...}) = 0
stat("/sys/fs/cgroup", {st_mode=S_IFDIR|0755, st_size=280, ...}) = 0
stat("/sys/fs/cgroup/systemd", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/sys/fs/pstore", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/sys/fs/cgroup/memory", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/sys/fs/cgroup/cpu,cpuacct", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/sys/fs/cgroup/net_cls", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/sys/fs/cgroup/freezer", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/sys/fs/cgroup/devices", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/sys/fs/cgroup/blkio", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/sys/fs/cgroup/perf_event", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/sys/fs/cgroup/cpuset", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/sys/fs/cgroup/hugetlb", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/sys/kernel/config", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/", {st_mode=S_IFDIR|0555, st_size=4096, ...}) = 0
stat("/proc/sys/fs/binfmt_misc", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/dev/hugepages", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
stat("/sys/kernel/debug", {st_mode=S_IFDIR|0700, st_size=0, ...}) = 0
stat("/dev/mqueue", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=40, ...}) = 0
stat("/boot", {st_mode=S_IFDIR|0555, st_size=4096, ...}) = 0
stat("/run/user/0", {st_mode=S_IFDIR|0700, st_size=40, ...}) = 0
stat("/var/lib/nfs/rpc_pipefs", {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0
stat("/proc/fs/nfsd", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
uname({sysname="Linux", nodename="xkey-boss01-8035-184", ...}) = 0
statfs("/", {f_type=0x58465342, f_bsize=4096, f_blocks=9293380, f_bfree=5378782, f_bavail=5378782, f_files=37191680, f_ffree=37150656, f_fsid={64768, 0}, f_namelen=255, f_frsize=4096, f_flags=ST_VALID|ST_RELATIME}) = 0
stat("/", {st_mode=S_IFDIR|0555, st_size=4096, ...}) = 0
statfs("/dev", {f_type=TMPFS_MAGIC, f_bsize=4096, f_blocks=494791, f_bfree=494791, f_bavail=494791, f_files=494791, f_ffree=494430, f_fsid={0, 0}, f_namelen=255, f_frsize=4096, f_flags=ST_VALID|ST_NOSUID}) = 0
stat("/dev", {st_mode=S_IFDIR|0755, st_size=3140, ...}) = 0
statfs("/sys/kernel/security", {f_type=SECURITYFS_MAGIC, f_bsize=4096, f_blocks=0, f_bfree=0, f_bavail=0, f_files=0, f_ffree=0, f_fsid={0, 0}, f_namelen=255, f_frsize=4096, f_flags=ST_VALID|ST_NOSUID|ST_NODEV|ST_NOEXEC|ST_RELATIME}) = 0
stat("/sys/kernel/security", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
statfs("/dev/shm", {f_type=TMPFS_MAGIC, f_bsize=4096, f_blocks=497337, f_bfree=497337, f_bavail=497337, f_files=497337, f_ffree=497336, f_fsid={0, 0}, f_namelen=255, f_frsize=4096, f_flags=ST_VALID|ST_NOSUID|ST_NODEV}) = 0
stat("/dev/shm", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=40, ...}) = 0
statfs("/run", {f_type=TMPFS_MAGIC, f_bsize=4096, f_blocks=497337, f_bfree=458142, f_bavail=458142, f_files=497337, f_ffree=496689, f_fsid={0, 0}, f_namelen=255, f_frsize=4096, f_flags=ST_VALID|ST_NOSUID|ST_NODEV}) = 0
stat("/run", {st_mode=S_IFDIR|0755, st_size=740, ...}) = 0
statfs("/sys/fs/cgroup", {f_type=TMPFS_MAGIC, f_bsize=4096, f_blocks=497337, f_bfree=497337, f_bavail=497337, f_files=497337, f_ffree=497324, f_fsid={0, 0}, f_namelen=255, f_frsize=4096, f_flags=ST_VALID|ST_RDONLY|ST_NOSUID|ST_NODEV|ST_NOEXEC}) = 0
stat("/sys/fs/cgroup", {st_mode=S_IFDIR|0755, st_size=280, ...}) = 0
statfs("/sys/fs/cgroup/systemd", {f_type=CGROUP_SUPER_MAGIC, f_bsize=4096, f_blocks=0, f_bfree=0, f_bavail=0, f_files=0, f_ffree=0, f_fsid={0, 0}, f_namelen=255, f_frsize=4096, f_flags=ST_VALID|ST_NOSUID|ST_NODEV|ST_NOEXEC|ST_RELATIME}) = 0
stat("/sys/fs/cgroup/systemd", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
statfs("/sys/fs/pstore", {f_type=PSTOREFS_MAGIC, f_bsize=4096, f_blocks=0, f_bfree=0, f_bavail=0, f_files=0, f_ffree=0, f_fsid={0, 0}, f_namelen=255, f_frsize=4096, f_flags=ST_VALID|ST_NOSUID|ST_NODEV|ST_NOEXEC|ST_RELATIME}) = 0
stat("/sys/fs/pstore", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
statfs("/sys/fs/cgroup/memory", {f_type=CGROUP_SUPER_MAGIC, f_bsize=4096, f_blocks=0, f_bfree=0, f_bavail=0, f_files=0, f_ffree=0, f_fsid={0, 0}, f_namelen=255, f_frsize=4096, f_flags=ST_VALID|ST_NOSUID|ST_NODEV|ST_NOEXEC|ST_RELATIME}) = 0
stat("/sys/fs/cgroup/memory", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
statfs("/sys/fs/cgroup/cpu,cpuacct", {f_type=CGROUP_SUPER_MAGIC, f_bsize=4096, f_blocks=0, f_bfree=0, f_bavail=0, f_files=0, f_ffree=0, f_fsid={0, 0}, f_namelen=255, f_frsize=4096, f_flags=ST_VALID|ST_NOSUID|ST_NODEV|ST_NOEXEC|ST_RELATIME}) = 0
stat("/sys/fs/cgroup/cpu,cpuacct", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
statfs("/sys/fs/cgroup/net_cls", {f_type=CGROUP_SUPER_MAGIC, f_bsize=4096, f_blocks=0, f_bfree=0, f_bavail=0, f_files=0, f_ffree=0, f_fsid={0, 0}, f_namelen=255, f_frsize=4096, f_flags=ST_VALID|ST_NOSUID|ST_NODEV|ST_NOEXEC|ST_RELATIME}) = 0
stat("/sys/fs/cgroup/net_cls", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
statfs("/sys/fs/cgroup/freezer", {f_type=CGROUP_SUPER_MAGIC, f_bsize=4096, f_blocks=0, f_bfree=0, f_bavail=0, f_files=0, f_ffree=0, f_fsid={0, 0}, f_namelen=255, f_frsize=4096, f_flags=ST_VALID|ST_NOSUID|ST_NODEV|ST_NOEXEC|ST_RELATIME}) = 0
stat("/sys/fs/cgroup/freezer", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
statfs("/sys/fs/cgroup/devices", {f_type=CGROUP_SUPER_MAGIC, f_bsize=4096, f_blocks=0, f_bfree=0, f_bavail=0, f_files=0, f_ffree=0, f_fsid={0, 0}, f_namelen=255, f_frsize=4096, f_flags=ST_VALID|ST_NOSUID|ST_NODEV|ST_NOEXEC|ST_RELATIME}) = 0
stat("/sys/fs/cgroup/devices", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
statfs("/sys/fs/cgroup/blkio", {f_type=CGROUP_SUPER_MAGIC, f_bsize=4096, f_blocks=0, f_bfree=0, f_bavail=0, f_files=0, f_ffree=0, f_fsid={0, 0}, f_namelen=255, f_frsize=4096, f_flags=ST_VALID|ST_NOSUID|ST_NODEV|ST_NOEXEC|ST_RELATIME}) = 0
stat("/sys/fs/cgroup/blkio", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
statfs("/sys/fs/cgroup/perf_event", {f_type=CGROUP_SUPER_MAGIC, f_bsize=4096, f_blocks=0, f_bfree=0, f_bavail=0, f_files=0, f_ffree=0, f_fsid={0, 0}, f_namelen=255, f_frsize=4096, f_flags=ST_VALID|ST_NOSUID|ST_NODEV|ST_NOEXEC|ST_RELATIME}) = 0
stat("/sys/fs/cgroup/perf_event", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
statfs("/sys/fs/cgroup/cpuset", {f_type=CGROUP_SUPER_MAGIC, f_bsize=4096, f_blocks=0, f_bfree=0, f_bavail=0, f_files=0, f_ffree=0, f_fsid={0, 0}, f_namelen=255, f_frsize=4096, f_flags=ST_VALID|ST_NOSUID|ST_NODEV|ST_NOEXEC|ST_RELATIME}) = 0
stat("/sys/fs/cgroup/cpuset", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
statfs("/sys/fs/cgroup/hugetlb", {f_type=CGROUP_SUPER_MAGIC, f_bsize=4096, f_blocks=0, f_bfree=0, f_bavail=0, f_files=0, f_ffree=0, f_fsid={0, 0}, f_namelen=255, f_frsize=4096, f_flags=ST_VALID|ST_NOSUID|ST_NODEV|ST_NOEXEC|ST_RELATIME}) = 0
stat("/sys/fs/cgroup/hugetlb", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
statfs("/sys/kernel/config", {f_type=0x62656570, f_bsize=4096, f_blocks=0, f_bfree=0, f_bavail=0, f_files=0, f_ffree=0, f_fsid={0, 0}, f_namelen=255, f_frsize=4096, f_flags=ST_VALID|ST_RELATIME}) = 0
stat("/sys/kernel/config", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
statfs("/dev/hugepages", {f_type=HUGETLBFS_MAGIC, f_bsize=2097152, f_blocks=0, f_bfree=0, f_bavail=0, f_files=0, f_ffree=0, f_fsid={0, 0}, f_namelen=255, f_frsize=2097152, f_flags=ST_VALID|ST_RELATIME}) = 0
stat("/dev/hugepages", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
statfs("/boot", {f_type=0x58465342, f_bsize=4096, f_blocks=127147, f_bfree=95769, f_bavail=95769, f_files=512000, f_ffree=511670, f_fsid={64513, 0}, f_namelen=255, f_frsize=4096, f_flags=ST_VALID|ST_RELATIME}) = 0
stat("/boot", {st_mode=S_IFDIR|0555, st_size=4096, ...}) = 0
statfs("/run/user/0", {f_type=TMPFS_MAGIC, f_bsize=4096, f_blocks=99468, f_bfree=99468, f_bavail=99468, f_files=497337, f_ffree=497336, f_fsid={0, 0}, f_namelen=255, f_frsize=4096, f_flags=ST_VALID|ST_NOSUID|ST_NODEV|ST_RELATIME}) = 0
stat("/run/user/0", {st_mode=S_IFDIR|0700, st_size=40, ...}) = 0
statfs("/proc/fs/nfsd", {f_type=0x6e667364, f_bsize=4096, f_blocks=0, f_bfree=0, f_bavail=0, f_files=0, f_ffree=0, f_fsid={0, 0}, f_namelen=255, f_frsize=4096, f_flags=ST_VALID|ST_RELATIME}) = 0
stat("/proc/fs/nfsd", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 7), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7efe77096000
write(1, "\346\226\207\344\273\266\347\263\273\347\273\237 \345\256\271"..., 70文件系统 容量 已用 可用 已用% 挂载点
) = 70
write(1, "/dev/mapper/centos-root 36G "..., 50/dev/mapper/centos-root 36G 15G 21G 43% /
) = 50
write(1, "devtmpfs 1.9G "..., 53devtmpfs 1.9G 0 1.9G 0% /dev
) = 53
write(1, "tmpfs 1.9G "..., 57tmpfs 1.9G 0 1.9G 0% /dev/shm
) = 57
write(1, "tmpfs 1.9G 1"..., 53tmpfs 1.9G 154M 1.8G 8% /run
) = 53
write(1, "tmpfs 1.9G "..., 63tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
) = 63
write(1, "/dev/vda1 497M 1"..., 54/dev/vda1 497M 123M 375M 25% /boot
) = 54
write(1, "tmpfs 389M "..., 60tmpfs 389M 0 389M 0% /run/user/0
) = 60
close(1) = 0
munmap(0x7efe77096000, 4096) = 0
close(2) = 0
exit_group(0) = ?
+++ exited with 0 +++

5、重新使用df -h命令,恢复正常。

点击阅读

[Mysql] InnoDB:page_cleaner:1000ms intended loop took xxxms


1、在查看mysqllog日志的时候不经意间发现一条这个提示:

1
[Note] InnoDB: page_cleaner: 1000ms intended loop took 16111ms. The settings might not be optimal. (flushed=7 and evicted=0, during the time.)

造成该问题的主要原因:

1
2
3
4
5
6
7
page_cleaner_thread:脏页清理线程负责将脏页从内存写到磁盘。

出现该问题的原因:上面提示的信息的含义是,有大量脏页需要刷新,理论上应该在1s内完成,但实际却用了16s的时间将脏页刷新到磁盘,它接受脏页的数量远远大于它每秒能够处理脏页的能力,因此为了避免该问题,可降低每秒循环期间搜索脏页的深度(innodb_lru_scan_depth)。

如果数据库存在很多的buffer pool instance 将会引起更多的刷新工作,因此如果只是增大 buffer pool instances 而没有降低lru_scan_depth,很可能会引起性能瓶颈。

如果只是临时对数据库进行大量导入操作造成的这类问题,可以忽略这个问题不需关注。如果数据库一直存在大量更新操作,快速创建大量的脏页,该问题一直存在需要关注。

下面是官方文档对lru_scan_depth参数的解释,中文为自己对官方文档的理解翻译,错误之处望大家指正。

1
2
3
4
5
A setting smaller than the default is generally suitable for most workloads. A value that is much higher than necessary may impact performance. Only consider increasing the value if you have spare I/O capacity under a typical workload. Conversely, if a write-intensive workload saturates your I/O capacity, decrease the value, especially in the case of a large buffer pool.
When tuning innodb_lru_scan_depth, start with a low value and configure the setting upward with the goal of rarely seeing zero free pages. Also, consider adjusting innodb_lru_scan_depth when changing the number of buffer pool instances, since innodb_lru_scan_depth * innodb_buffer_pool_instances defines the amount of work performed by the page cleaner thread each second.
比默认值小适合于大多数工作负载,如果设置比默认值大可能会影响性能。只有当有额外的磁盘io容量的时候才考虑需不需要增加该值。相反,如果在写密集度负载已经使io容量饱和,需要降低该值,尤其是buffer pool的值设置特别大的时候。

如果lru_scan_depth值特别低,而且存在0空闲页,可以考虑调高该值。如果调整buffer pool instances时,需要考虑是否调整innodb_lru_scan_depth大小,因为innodb_lru_scan_depth * innodb_buffer_pool_instances决定了每秒page cleaner thread处理的工作量。

2、解决方法

1
SET GLOBAL innodb_lru_scan_depth=256;

该参数默认只为1024。
这只是数据库级别调整,出现该问题还需要查看服务器硬件问题,磁盘io是否达到瓶颈扥问题。

点击阅读

[Mysql] mysql-mgr集群节点主节点与两个从节点网络异常,造成的集群异常问题


1、mysql-mgr集群节点主节点(A)与两个从节点网络异常,主节点(A)发生切换,从节点(B)切换为主,报错如下:

1
2
3
2018-08-20T05:38:16.071653Z 0 [Warning] Plugin group_replication reported: 'Member with address wallet-mysql-2:3306 has become unreachable.'
2018-08-20T05:38:16.071730Z 0 [Warning] Plugin group_replication reported: 'Member with address wallet-mysql-3:3306 has become unreachable.'
2018-08-20T05:38:16.071744Z 0 [ERROR] Plugin group_replication reported: 'This server is not able to reach a majority of members in the group. This server will now block all updates. The server will remain blocked until contact with the majority is restored. It is possible to use group_replication_force_members to force a new group membership.'

2、对故障节点A操作,使其重新加入集群

A节点:

1
2
mysql -u root -p
start group_replication;

查看报错日志:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2018-08-20T07:29:40.796952Z 12 [Note] Plugin group_replication reported: 'Terminating existing group replication donor connection and purging the corresponding logs.'
2018-08-20T07:29:40.803975Z 26 [Note] Error reading relay log event for channel 'group_replication_recovery': slave SQL thread was killed
2018-08-20T07:29:40.855935Z 12 [Note] 'CHANGE MASTER TO FOR CHANNEL 'group_replication_recovery' executed'. Previous state master_host='wallet-mysql-2', master_port= 3306, master_log_file='', master_log_pos= 4, master_bind=''. New state master_host='<NULL>', master_port= 0, master_log_file='', master_log_pos= 4, master_bind=''.
2018-08-20T07:29:40.906041Z 12 [Note] Plugin group_replication reported: 'Retrying group recovery connection with another donor. Attempt 4/10'
2018-08-20T07:29:40.949597Z 12 [Note] 'CHANGE MASTER TO FOR CHANNEL 'group_replication_recovery' executed'. Previous state master_host='<NULL>', master_port= 0, master_log_file='', master_log_pos= 4, master_bind=''. New state master_host='wallet-mysql-3', master_port= 3306, master_log_file='', master_log_pos= 4, master_bind=''.
2018-08-20T07:29:41.001446Z 12 [Note] Plugin group_replication reported: 'Establishing connection to a group replication recovery donor 7dd813bf-8e3d-11e8-8d92-000d3aa1c31e at wallet-mysql-3 port: 3306.'
2018-08-20T07:29:41.001738Z 29 [Warning] Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information.
2018-08-20T07:29:41.005538Z 29 [Note] Slave I/O thread for channel 'group_replication_recovery': connected to master 'repl@wallet-mysql-3:3306',replication started in log 'FIRST' at position 4
2018-08-20T07:29:41.016839Z 30 [Note] Slave SQL thread for channel 'group_replication_recovery' initialized, starting replication in log 'FIRST' at position 0, relay log './relay-log-group_replication_recovery.000001' position: 4
2018-08-20T07:29:41.028408Z 29 [ERROR] Error reading packet from server for channel 'group_replication_recovery': The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires. (server_errno=1236)
2018-08-20T07:29:41.028442Z 29 [ERROR] Slave I/O for channel 'group_replication_recovery': Got fatal error 1236 from master when reading data from binary log: 'The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires.', Error_code: 1236
2018-08-20T07:29:41.028449Z 29 [Note] Slave I/O thread exiting for channel 'group_replication_recovery', read up to log 'FIRST', position 4
2018-08-20T07:29:41.028493Z 12 [Note] Plugin group_replication reported: 'Terminating existing group replication donor connection and purging the corresponding logs.'
2018-08-20T07:29:41.028790Z 30 [Note] Error reading relay log event for channel 'group_replication_recovery': slave SQL thread was killed
2018-08-20T07:29:41.085012Z 12 [Note] 'CHANGE MASTER TO FOR CHANNEL 'group_replication_recovery' executed'. Previous state master_host='wallet-mysql-3', master_port= 3306, master_log_file='', master_log_pos= 4, master_bind=''. New state master_host='<NULL>', master_port= 0, master_log_file='', master_log_pos= 4, master_bind=''.

出现该问题的原因是现在的新的主节点B,已经清除了binglog,A节点需要恢复的日志已经找不到了,因此需要对A进行数据恢复。

3、在B节点mysqldump一份最新数据,命令如下:

1
/data/mysql/bin/mysqldump --all-databases --set-gtid-purged=ON --single-transaction -uroot -p***** > /data/backup/all.sql

4、将dump的数据库拷贝到A节点,对节点A进行恢复:

1
mysql -u root -p******* < /data/backup/all.sql

执行提示报错

1
2
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.

解决方法:

1
2
3
4
5
6
7
8
9
10
提示只有@@GLOBAL.GTID_EXECUTED为空是,才能设置@@GLOBAL.GTID_PURGED的值,清空GLOBAL.GTID_EXECUTED的值
root@db 07:53: [(none)]> reset master;
ERROR 3190 (HY000): RESET MASTER is not allowed because Group Replication is running.
root@db 07:53: [(none)]> stop group_replication;
Query OK, 0 rows affected (1.01 sec)
root@db 07:53: [(none)]> reset master;
Query OK, 0 rows affected (0.27 sec)
如果数据库为只读的状态还需要将数据库改为读写模式:
root@db 07:54: [performance_schema]> set global read_only=0;
Query OK, 0 rows affected (0.00 sec)

5、重新恢复数据

1
2
mysql -u root -p******* < /data/backup/all.sql
mysql: [Warning] Using a password on the command line interface can be insecure.

恢复完成

6、重新将该节点加入集群

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mysql -u root -p
root@db 07:56: [performance_schema]> select * from replication_group_members;
+---------------------------+-----------+-------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+-----------+-------------+-------------+--------------+
| group_replication_applier | | | NULL | OFFLINE |
+---------------------------+-----------+-------------+-------------+--------------+
1 row in set (0.00 sec)

root@db 07:56: [performance_schema]> start group_replication;
Query OK, 0 rows affected, 1 warning (3.03 sec)
root@db 07:57: [performance_schema]> select * from replication_group_members;
+---------------------------+--------------------------------------+----------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+----------------+-------------+--------------+
| group_replication_applier | *** | wallet-mysql-2 | 3306 | ONLINE |
| group_replication_applier | *** | wallet-mysql-1 | 3306 | RECOVERING |
| group_replication_applier | *** | wallet-mysql-3 | 3306 | ONLINE |
+---------------------------+--------------------------------------+----------------+-------------+--------------+
3 rows in set (0.00 sec)

此时节点A正在与主节点同步数据,待同步完成之后再查看及节点之间的信息:

1
2
3
4
5
6
7
8
9
root@db 07:57:  [performance_schema]> select * from replication_group_members;
+---------------------------+--------------------------------------+----------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+----------------+-------------+--------------+
| group_replication_applier | *** | wallet-mysql-2 | 3306 | ONLINE |
| group_replication_applier | *** | wallet-mysql-1 | 3306 | ONLINE |
| group_replication_applier | *** | wallet-mysql-3 | 3306 | ONLINE |
+---------------------------+--------------------------------------+----------------+-------------+--------------+
3 rows in set (0.00 sec)

此时集群恢复完成。

点击阅读

[Zabbix] zabbix监控redis数据库


1、编写定期收集redis信息脚本,并指定到对应目录

cat /usr/local/zabbix/script/redis_get_data.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
#配置文件路径
dbconfigfile=/data/redis/etc/redis.conf
#主机ip地址
dbhost=`cat ${dbconfigfile} |grep bind|awk '{print $2}'`
#redis启动端口
dbport=`cat ${dbconfigfile} |grep port|awk '{print $2}'`
#数据库命令路径
dbcmdpath=/data/redis/src
#数据库密码
dbpass=`cat ${dbconfigfile} |grep requirepass|awk '{print $2}'`
#指定生成的log路径
dblogpath=/tmp/redis.log
#如果有没密码,使用以下命令
#${dbcmdpath}/redis-cli -h ${dbhost} -a ${dbpass} -p ${dbport} 'info' > ${dblogpath}
#如果没有密码,使用以下命令
${dbcmdpath}/redis-cli -h ${dbhost} -p ${dbport} 'info' > ${dblogpath}

修改redis配置文件目录,生成的log目录,修改完成之后授权脚本执行权限:

1
chmod +x /usr/local/zabbix/script/redis_get_data.sh

2、将脚本添加到定时任务,每分钟执行一次

crontab -l

1
* * * * * sh /usr/local/zabbix/script/redis_get_data.sh

3、编写zabbix监控项文件,通过/usr/local/zabbix/script/redis_get_data.sh脚本生成的log文件,根据关键字过滤,获取对应监控的数值

vim /usr/local/zabbix/etc/zabbix_agentd.conf.d/redis_monitor_parameter.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#数据库进程是否存在
UserParameter=redis_exist[*],ps -ef|grep redis-server|grep -v grep|wc -l
#客户端连接数,包括从库的连接
UserParameter=connected_clients[*],cat /tmp/redis.log |grep 'connected_clients' |cut -d':' -f2
#当前客户端最长输出列表
UserParameter=client_longest_output_list[*],cat /tmp/redis.log |grep client_longest_output_list |cut -d':' -f2
#当前客户端最大输入缓冲区
UserParameter=client_biggest_input_buf[*],cat /tmp/redis.log |grep client_biggest_input_buf |cut -d':' -f2
#阻塞会话数
UserParameter=blocked_clients[*],cat /tmp/redis.log |grep blocked_clients |cut -d':' -f2
#redis通过分配器分配的总内存
UserParameter=used_memory[*],cat /tmp/redis.log |grep used_memory |cut -d':' -f2|head -1
#操作系统通过top和ps命令查看到redis分配的内存
UserParameter=used_memory_rss[*],cat /tmp/redis.log |grep used_memory_rss |cut -d':' -f2|head -1
#redis消耗内存的峰值
UserParameter=used_memory_peak[*],cat /tmp/redis.log |grep used_memory_peak |cut -d':' -f2|head -1
#系统为管理内部数据架构造成的所有内存开销
UserParameter=used_memory_overhead[*],cat /tmp/redis.log |grep used_memory_overhead |cut -d':' -f2|head -1
#redis启动初始化消耗的内存
UserParameter=used_memory_startup[*],cat /tmp/redis.log |grep used_memory_startup |cut -d':' -f2|head -1
#数据集的大小(used_memory减去used_memory_overhead)
UserParameter=used_memory_dataset[*],cat /tmp/redis.log |grep used_memory_dataset |cut -d':' -f2|head -1
#数据集内存占净内存的百分比(used_memory_dataset/(used_memory-used_memory_startup))
UserParameter=used_memory_dataset_perc[*],cat /tmp/redis.log |grep used_memory_dataset_perc |cut -d':' -f2|head -1|cut -d'%' -f1
#lua引擎使用的内存
UserParameter=used_memory_lua[*],cat /tmp/redis.log |grep used_memory_lua |cut -d':' -f2|head -1
#系统配置文件配置的内存
UserParameter=maxmemory[*],cat /tmp/redis.log |grep maxmemory |cut -d':' -f2|head -1
#内存碎片率(需要重点关注)远大于1过高说明内存碎片化严重,原小于1过低说明有大量内存交换,建议增加内存。
UserParameter=mem_fragmentation_ratio[*],cat /tmp/redis.log |grep mem_fragmentation_ratio |cut -d':' -f2|head -1
#自上次转存以来redis发生的更改数
UserParameter=rdb_changes_since_last_save[*],cat /tmp/redis.log |grep rdb_changes_since_last_save |cut -d':' -f2|head -1
#服务端接受的总连接数
UserParameter=total_connections_received[*],cat /tmp/redis.log |grep total_connections_received |cut -d':' -f2|head -1
#服务端处理命令总数
UserParameter=total_commands_processed[*],cat /tmp/redis.log |grep total_commands_processed |cut -d':' -f2|head -1
#服务端每秒处理命令数
UserParameter=instantaneous_ops_per_sec[*],cat /tmp/redis.log |grep instantaneous_ops_per_sec |cut -d':' -f2|head -1
#网络读取的总流量
UserParameter=total_net_input_bytes[*],cat /tmp/redis.log |grep total_net_input_bytes |cut -d':' -f2|head -1
#网络写入的总流量
UserParameter=total_net_output_bytes[*],cat /tmp/redis.log |grep total_net_output_bytes |cut -d':' -f2|head -1
#每秒网络读的流量
UserParameter=instantaneous_input_kbps[*],cat /tmp/redis.log |grep instantaneous_input_kbps |cut -d':' -f2|head -1
#每秒网络写的流量
UserParameter=instantaneous_output_kbps[*],cat /tmp/redis.log |grep instantaneous_output_kbps |cut -d':' -f2|head -1
#因最大连接数达到上限,而被拒绝的连接数,maxclient默认值为10000
UserParameter=rejected_connections[*],cat /tmp/redis.log |grep rejected_connections |cut -d':' -f2|head -1
#键值到期总数
UserParameter=expired_keys[*],cat /tmp/redis.log |grep expired_keys |cut -d':' -f2|head -1
#因maxmemory限制,被驱逐的键值
UserParameter=evicted_keys[*],cat /tmp/redis.log |grep evicted_keys |cut -d':' -f2|head -1
#在主字典里面键值匹配成功的次数
UserParameter=keyspace_hits[*],cat /tmp/redis.log |grep keyspace_hits |cut -d':' -f2|head -1
#在主字典里面键值匹配失败的次数
UserParameter=keyspace_misses[*],cat /tmp/redis.log |grep keyspace_misses |cut -d':' -f2|head -1
#db0数据库键值的数量
UserParameter=db0_keys[*], cat /tmp/redis.log |grep db0 |cat /tmp/redis.log |grep db0|cut -d ',' -f1|cut -d '=' -f2
#db0数据库键值过期的数量
UserParameter=db0_keys_expired[*],cat /tmp/redis.log |cat /tmp/redis.log |grep db0|cut -d ',' -f2|cut -d '=' -f2

4、修改/usr/local/zabbix/etc/zabbix_agentd.conf配置文件,添加该行参数:

1
Include=/usr/local/zabbix/etc/zabbix_agentd.conf.d/

添加完成之后,需要重启zabbix_agent客户端

1
/etc/init.d/zabbix_agentd restart

5、通过zabbix-web控制台,自定义一个模板,新建监控项、触发器、图形等内容,下面链接是我创建的比较简单的redis模板,上传到百度云,仅供参考,点击下载

点击阅读

[linux] suse_11_sp4安装samba-server


0、当前系统版本

1
2
cat /etc/issue
Welcome to SUSE Linux Enterprise Server 11 SP4 (x86_64) - Kernel \r (\l).

1、查看samba是否安装

1
2
localhost:~ # rpm -q samba
samba-3.6.3-0.58.1

如果没有安装,使用以下命令安装:

1
localhost:~ # zypper install samba

2、新建共享目录

1
localhost:~ # mkdir -p /data/share

3、开始配置共享目录

yast进入控制台,network services-samba server

第一次启用samba server会做一些初始化,操作如下(也可根据自己需求自定义):



初始化完成之后,再一次进入samba server,会显示如下:

点击add,开始新增共享目录

修改完成之后保存,会显示新的share目录

4、添加smbuser系统用户

1
2
3
4
5
6
7
localhost:~ # useradd smbuser
localhost:~ # passwd smbuser
Changing password for smbuser.
New Password:
Bad password: too simple
Reenter New Password:
Password changed.

5、为samba服务添加访问用户,设置访问用的密码:

1
2
3
4
localhost:~ # smbpasswd -a smbuser
New SMB password:
Retype new SMB password:
Added user smbuser.

6、修改共享目录权限

1
2
chown smbuser /data/share
chmod 777 /data/share

**如果不修改目录权限,访问预览都是正常的,但是没有写权限,创建目录会报错

7、修改配置配置文件,添加读写权限

vim /etc/samba/smb.conf

1
2
3
4
5
6
7
8
[share]
comment = share
inherit acls = Yes
path = /data/share
read only = No
Valid users =smbuser
Writable = Yes
  Browsable = Yes

8、重启samba服务器

/etc/rc.d/smb restart

9、suse默认防火墙是开启的,客户端要访问samba,需要开启139和445端口

vim /etc/sysconfig/SuSEfirewall2

1
FW_SERVICES_EXT_TCP="22 1521 139 445"

重新启动防火墙

1
rcSuSEfirewall2 restart

10、windows10之后微软默认已放弃安装smbv1客户端,使用windows访问会报如下错误:


因此修改sambaserver服务器端的协议,启用smbv2协议
vim /etc/samba/smb.conf

1
2
3
4
5
[global]
min protocol = SMB2
max protocol = SMB2
client min protocol = SMB2
client max protocol = SMB2

重启samba服务器

1
/etc/rc.d/smb restart

11、在sambaserver本地服务器测试的时候,哪怕指定了smb2协议,也会报如下错误

1
2
3
4
5
6
7
smbclient -U smbuser //10.0.30.180/share -m smb2
Unrecognised protocol level smb2
WARNING: Ignoring invalid value 'SMB3' for parameter 'max protocol'
Unknown parameter encountered: "client min protocol"
Ignoring unknown parameter "client min protocol"
Unknown parameter encountered: "client max protocol"
Ignoring unknown parameter "client max protocol"

该问题为suse 11版本的问题,默认只支持smbv1协议,suse12版本之后才开始支持smbv2.

点击阅读

Proudly powered by Hexo and Theme by Lap
本站访客数人次
© 2020 zeven0707's blog