zabbix怎么部署在两个服务器上面,一个服务端(server)一个数据库(MySQL)
环境centos8.2 数据库mysql 5.7.31 zabbix5.2
1、安装前的准备工作,在两台服务器上都要关闭防火墙(还有两台服务器都要进入root,防止后面因为权限问题,运行不了指令)
systemctl stop firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
systemctl disable --now firewalld
2、安装的用户密码
zabbix db: root Z@bbix@123
zabbix Z@bbix@123
zabbix web: Admin zabbix
3、在server安装zabbix
rpm -Uvh https://repo.zabbix.com/zabbix/5.2/rhel/8/x86_64/zabbix-release-5.2-1.el8.noarch.rpm
dnf clean all
dnf install zabbix-server-mysql zabbix-web-mysql zabbix-apache-conf zabbix-agent
4、在db服务器上安装MySQL5.7.31
https://www.cnblogs.com/know-more/p/13292741.html(参考网上的做法设置镜像,使得下载数据库能够节省不少时间)
wget https://cdn.mysql.com/Downloads/MySQL-5.7/mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz
(如果下载的慢的话,就取消重新尝试几遍)
tar -zxvf mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz -C /opt
cd /opt
mv mysql-5.7.31-linux-glibc2.12-x86_64 mysql-5.7.31
mkdir mysql
groupadd mysql
useradd -r -g mysql mysq
mv mysql-5.7.31 mysql
cd /opt/mysql/mysql-5.7.31
chown -R mysql:mysql /opt/mysql/mysql-5.7.31
yum install libaio
./bin/mysqld --initialize --user=mysql --basedir=/opt/mysql/mysql-5.7.31/ --datadir=/opt/mysql/mysql-5.7.31/data/
初始化完成之后查看最后一行的是密码
最后一行里包含了root用户的临时密码如:[Note] A temporary password is generated for root@localhost: 6LkwFig+oi0R
(记得保存下来,后面要用到)
cp -a ./support-files/mysql.server /etc/init.d/mysqld (MySQL加入本地服务器)
[mysqld]
bind-address=0.0.0.0 #绑定地址为0.0.0.0只是允许它接受远程连接的步骤的一部分
#设置mysql的安装目录
basedir = /opt/mysql/mysql-5.7.31
#设置mysql数据库的数据存放目录
datadir = /opt/mysql/mysql-5.7.31/data
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
user=mysql
port=3306
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
symbolic-links=0
max_connections=200
default-storage-engine=INNODB
lower_case_table_names=1
max_allowed_packet=32M
explicit_defaults_for_timestamp=true
[mysqld_safe]
log-error = /opt/mysql/mysql-5.7.31/data/mysqld.log #日志>目录需要赋权限 chown -R mysql:mysql /var/lib/mariadb
pid-file = /opt/mysql/mysql-5.7.31/data/mysqld.pid
#目录需要赋权限 chown -R mysql:mysql /var/run/mariadb
#注意:mysql连接localhost通常通过一个Unix域套接字文件进行>@@@ #注意:mysql连接localhost通常通过一个Unix域套接字文件进行,一般是/tmp/mysql.sock,这个socket路径不要修改,不然连本地mysql的时候回报错:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock'
[client]
port=3306
socket=/var/lib/mysql/mysql.sock
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
然后按esc,再按:,然后输入wq!回车即可
service mysqld start
原因没有目录并且没有权限
mkdir /opt/mysql/mysql-5.7.31/data
touch /opt/mysql/mysql-5.7.31/data/mysqld.log
chown -R mysql:mysql /opt/mysql/mysql-5.7.31/data/
发现并没有/var/log/mariadb/mariadb.log这个路径,那我们就创建, 并给mysql用户授权即可
mkdir /var/lib/mysql
chown -R mysql:mysql /var/lib/mysql
再启动服务
然后再次运行
service mysqld start,这时候有下面这句话就是启动成功了
[admin@DB ~]$ sudo service mysqld start
Starting MySQL. SUCCESS! (提示成功)
但是这时候我们直接mysql -uroot -p
可能是会出现位置问题,导致我们无法正确启动,如果是安装在默认地址,那就不用考虑这个问题,但是如果不是安装在默认地址,我们这边就得修改一些配置才能正确启动
配置环境变量,编辑/etc/profile,方便在任何地方用mysql命令
vim /etc/profile
在最后面添加下面内容:
#mysql
export MYSQL_HOME=/opt/mysql/mysql-5.7.31
export PATH=$PATH:$MYSQL_HOME/bin
重新编译profile让配置生效
source /etc/profile
再输入这条命令下载一些内容
yum install libncurses*
我们再输入
mysql -uroot -p
password(密码是刚刚在上面生成的随机密码)
mysql> alter user user() identified by "Z@bbix@123";
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Z@bbix@123' WITH GRANT OPTION;
mysql> flush privileges;
mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> create user zabbix@localhost identified by ' Z@bbix@123';
mysql> grant all privileges on zabbix.* to zabbix@localhost;
mysql> GRANT ALL PRIVILEGES ON *.* TO 'zabbix'@'localhost'IDENTIFIED BY 'Z@bbix@123' WITH GRANT OPTION;
mysql> flush privileges;
mysql> quit;
find / -name create.sql.gz
然后想办法把这个文件拉到我们的db这个服务器上面
然后在我们的db服务器上面运行这条命令
zcat /usr/share/doc/zabbix-server-mysql/create.sql.gz | mysql -uzabbix -pZ@bbix@123 –Dzabbix
运行好之后,再进去我们的数据库
mysql -uroot -p
password
use zabbix;
show tables;
5、这时再回到我们的server服务器上面
vim /etc/zabbix/zabbix_server.conf
DBPassword= Z@bbix@123
DBHost=xxx.xxx.xxx.xxx(你db那个服务器上面的ip地址)
- server改变时区
vim /etc/php-fpm.d/zabbix.conf
php_value[date.timezone] = Asia/Shanghai
- 启动server
systemctl restart zabbix-server zabbix-agent httpd php-fpm
systemctl enable zabbix-server zabbix-agent httpd php-fpm
6、一些相关文档和目录地址
Server 启动和关闭
systemctl start zabbix-server
systemctl stop zabbix-server
Agent 的启动和关闭
systemctl start zabbix-agent
systemctl stop zabbix-agent
Mysql 的重新启动
systemctl restart mysqld
http、php 的重新启动
systemctl restart httpd php-fpm
自启动配置项目位置
/usr/lib/systemd/system/zabbix-agent.service
/usr/lib/systemd/system/zabbix-server.service
日志文件路径
tail -f /var/log/zabbix/zabbix_agentd.log
tail -f /var/log/zabbix/zabbix_server.log
tail –f /opt/mysql/mysql-5.7.31/data/mysqld.log
tail –f /var/log/httpd/access_log
配置文件路径
/etc/zabbix/zabbix_agent.conf
/etc/zabbix/zabbix_server.conf
7、开始配置我们的前端
浏览器访问:http://(你的server服务器的ip地址)/zabbix
访问成功后可以看到:
之后就是一步步配置。
默认用户名为Admin,密码为zabbix
dnf install langpacks-zh_CN.noarch
安装glibc-common实现对语言包的识别:
dnf install glibc-common
# 如果已安装过,需要重新安装,用reinstall
dnf reinstall glibc-common
检测是否安装成功:
locale -a | grep zh_CN
这里有一个问题,首先在前端配置数据库的时候出错,无法注册数据,这是因为我们缺少一个文件
vim /etc/zabbix/web/zabbix.conf.php
把下面这段内容全部复制进去,这个文档,然后保存退出
<?php
// Zabbix GUI configuration file.
$DB['TYPE'] = 'MYSQL';
$DB['SERVER'] = 'xxx.xxx.xxx.xx';(你db服务器的ip地址)
$DB['PORT'] = '3306';
$DB['DATABASE'] = 'zabbix';
$DB['USER'] = 'zabbix';
$DB['PASSWORD'] = 'Z@bbix@123';
// Schema name. Used for PostgreSQL.
$DB['SCHEMA'] = '';
// Used for TLS connection.
$DB['ENCRYPTION'] = false;
$DB['KEY_FILE'] = '';
$DB['CERT_FILE'] = '';
$DB['CA_FILE'] = '';
$DB['VERIFY_HOST'] = false;
$DB['CIPHER_LIST'] = '';
// Vault configuration. Used if database credentials are stored in Vault secrets manager.
$DB['VAULT_URL'] = '';
$DB['VAULT_DB_PATH'] = '';
$DB['VAULT_TOKEN'] = '';
// Use IEEE754 compatible value range for 64-bit Numeric (float) history values.
// This option is enabled by default for new Zabbix installations.
// For upgraded installations, please read database upgrade notes before enablin g this option.
$DB['DOUBLE_IEEE754'] = true;
$ZBX_SERVER = 'xxx.xxx.xxx.xxx';(你server服务器的IP地址)
$ZBX_SERVER_PORT = '10051';
$ZBX_SERVER_NAME = '';
$IMAGE_FORMAT_DEFAULT = IMAGE_FORMAT_PNG;
// Uncomment this block only if you are using Elasticsearch.
// Elasticsearch url (can be string if same url is used for all types).
//$HISTORY['url'] = [
// 'uint' => 'http://localhost:9200',
// 'text' => 'http://localhost:9200'
//];
// Value types stored in Elasticsearch.
//$HISTORY['types'] = ['uint', 'text'];
// Used for SAML authentication.
// Uncomment to override the default paths to SP private key, SP and IdP X.509 c ertificates, and to set extra settings.
//$SSO['SP_KEY'] = 'conf/certs/sp.key';
//$SSO['SP_CERT'] = 'conf/certs/sp.crt';
//$SSO['IDP_CERT'] = 'conf/certs/idp.crt';
//$SSO['SETTINGS'] = [];
Mysql –uroot –p
Password
mysql> GRANT ALL PRIVILEGES ON *.* TO zabbix@"%" IDENTIFIED BY "Z@bbix@123";
mysql> flush privileges;
这样再打开我们的网址,就是zabbix的页面了直接登录账户Admin,密码:zabbix进去就好了
问题在于zabbix默认的字体文件不支持中文,所以中文字符的显示成了乱码;
在windows的C:\Windows\Fonts目录下复制想要的字体(.ttf)到服务器的
/usr/share/zabbix/assets/fonts目录下,
注意大写的字体名要改为小写的,
修改配置文件:
vim /usr/share/zabbix/include/defines.inc.php
把define('ZBX_GRAPH_FONT_NAME', 'graphfont');
中的‘graphfont‘更改为你的字体名
8、Zabbix数据表分区
-
使用truncate命令清空zabbix 所有监控数据
-
先进入mysql –uzabbix –pZ@bbix@123
-
use zabbix;
-
show tables;
truncate table history;
optimize table history;
\-------------------------------------------------------
truncate table history_str;
optimize table history_str;
\-------------------------------------------------------
truncate table history_uint;
optimize table history_uint;
\-------------------------------------------------------
truncate table trends;
optimize table trends;
\-------------------------------------------------------
truncate table trends_uint;
optimize table trends_uint;
\-------------------------------------------------------
SET FOREIGN_KEY_CHECKS=0;
truncate table events;
SET FOREIGN_KEY_CHECKS=1;
optimize table events;
注意:这些命令会把zabbix所有的监控数据清空,只是清空监控数据,添加的主机,配置,拓扑图不会丢失。如果对监控数据比较看重的话注意备份数据库
truncate是删除了表,然后根据表结构重新建立。
vim partition.sql
DELIMITER $$
DROP PROCEDURE IF EXISTS `partition_create`$$
CREATE PROCEDURE `partition_create`(SCHEMANAME varchar(64), TABLENAME varchar(64), PARTITIONNAME varchar(64), CLOCK int)
BEGIN
/*
SCHEMANAME = The DB schema in which to make changes
TABLENAME = The table with partitions to potentially delete
PARTITIONNAME = The name of the partition to create
*/
/*
Verify that the partition does not already exist
*/
DECLARE RETROWS INT;
SELECT COUNT(1) INTO RETROWS
FROM information_schema.partitions
WHERE table_schema = SCHEMANAME AND table_name = TABLENAME AND partition_description >= CLOCK;
IF RETROWS = 0 THEN
/*
1. Print a message indicating that a partition was created.
2. Create the SQL to create the partition.
3. Execute the SQL from #2.
*/
SELECT CONCAT( "partition_create(", SCHEMANAME, ",", TABLENAME, ",", PARTITIONNAME, ",", CLOCK, ")" ) AS msg;
SET @sql = CONCAT( 'ALTER TABLE ', SCHEMANAME, '.', TABLENAME, ' ADD PARTITION (PARTITION ', PARTITIONNAME, ' VALUES LESS THAN (', CLOCK, '));' );
PREPARE STMT FROM @sql;
EXECUTE STMT;
DEALLOCATE PREPARE STMT;
END IF;
END$$
DELIMITER ;
DELIMITER $$
DROP PROCEDURE IF EXISTS `partition_drop`$$
CREATE PROCEDURE `partition_drop`(SCHEMANAME VARCHAR(64), TABLENAME VARCHAR(64), DELETE_BELOW_PARTITION_DATE BIGINT)
BEGIN
/*
SCHEMANAME = The DB schema in which to make changes
TABLENAME = The table with partitions to potentially delete
DELETE_BELOW_PARTITION_DATE = Delete any partitions with names that are dates older than this one (yyyy-mm-dd)
*/
DECLARE done INT DEFAULT FALSE;
DECLARE drop_part_name VARCHAR(16);
/*
Get a list of all the partitions that are older than the date
in DELETE_BELOW_PARTITION_DATE. All partitions are prefixed with
a "p", so use SUBSTRING TO get rid of that character.
*/
DECLARE myCursor CURSOR FOR
SELECT partition_name
FROM information_schema.partitions
WHERE table_schema = SCHEMANAME AND table_name = TABLENAME AND CAST(SUBSTRING(partition_name FROM 2) AS UNSIGNED) < DELETE_BELOW_PARTITION_DATE;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
/*
Create the basics for when we need to drop the partition. Also, create
@drop_partitions to hold a comma-delimited list of all partitions that
should be deleted.
*/
SET @alter_header = CONCAT("ALTER TABLE ", SCHEMANAME, ".", TABLENAME, " DROP PARTITION ");
SET @drop_partitions = "";
/*
Start looping through all the partitions that are too old.
*/
OPEN myCursor;
read_loop: LOOP
FETCH myCursor INTO drop_part_name;
IF done THEN
LEAVE read_loop;
END IF;
SET @drop_partitions = IF(@drop_partitions = "", drop_part_name, CONCAT(@drop_partitions, ",", drop_part_name));
END LOOP;
IF @drop_partitions != "" THEN
/*
1. Build the SQL to drop all the necessary partitions.
2. Run the SQL to drop the partitions.
3. Print out the table partitions that were deleted.
*/
SET @full_sql = CONCAT(@alter_header, @drop_partitions, ";");
PREPARE STMT FROM @full_sql;
EXECUTE STMT;
DEALLOCATE PREPARE STMT;
SELECT CONCAT(SCHEMANAME, ".", TABLENAME) AS `table`, @drop_partitions AS `partitions_deleted`;
ELSE
/*
No partitions are being deleted, so print out "N/A" (Not applicable) to indicate
that no changes were made.
*/
SELECT CONCAT(SCHEMANAME, ".", TABLENAME) AS `table`, "N/A" AS `partitions_deleted`;
END IF;
END$$
DELIMITER ;
DELIMITER $$
DROP PROCEDURE IF EXISTS `partition_maintenance`$$
CREATE PROCEDURE `partition_maintenance`(SCHEMA_NAME VARCHAR(32), TABLE_NAME VARCHAR(32), KEEP_DATA_DAYS INT, HOURLY_INTERVAL INT, CREATE_NEXT_INTERVALS INT)
BEGIN
DECLARE OLDER_THAN_PARTITION_DATE VARCHAR(16);
DECLARE PARTITION_NAME VARCHAR(16);
DECLARE OLD_PARTITION_NAME VARCHAR(16);
DECLARE LESS_THAN_TIMESTAMP INT;
DECLARE CUR_TIME INT;
CALL partition_verify(SCHEMA_NAME, TABLE_NAME, HOURLY_INTERVAL);
SET CUR_TIME = UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%Y-%m-%d 00:00:00'));
SET @__interval = 1;
create_loop: LOOP
IF @__interval > CREATE_NEXT_INTERVALS THEN
LEAVE create_loop;
END IF;
SET LESS_THAN_TIMESTAMP = CUR_TIME + (HOURLY_INTERVAL * @__interval * 3600);
SET PARTITION_NAME = FROM_UNIXTIME(CUR_TIME + HOURLY_INTERVAL * (@__interval - 1) * 3600, 'p%Y%m%d%H00');
IF(PARTITION_NAME != OLD_PARTITION_NAME) THEN
CALL partition_create(SCHEMA_NAME, TABLE_NAME, PARTITION_NAME, LESS_THAN_TIMESTAMP);
END IF;
SET @__interval=@__interval+1;
SET OLD_PARTITION_NAME = PARTITION_NAME;
END LOOP;
SET OLDER_THAN_PARTITION_DATE=DATE_FORMAT(DATE_SUB(NOW(), INTERVAL KEEP_DATA_DAYS DAY), '%Y%m%d0000');
CALL partition_drop(SCHEMA_NAME, TABLE_NAME, OLDER_THAN_PARTITION_DATE);
END$$
DELIMITER ;
DELIMITER $$
DROP PROCEDURE IF EXISTS `partition_verify`$$
CREATE PROCEDURE `partition_verify`(SCHEMANAME VARCHAR(64), TABLENAME VARCHAR(64), HOURLYINTERVAL INT(11))
BEGIN
DECLARE PARTITION_NAME VARCHAR(16);
DECLARE RETROWS INT(11);
DECLARE FUTURE_TIMESTAMP TIMESTAMP;
/*
* Check if any partitions exist for the given SCHEMANAME.TABLENAME.
*/
SELECT COUNT(1) INTO RETROWS
FROM information_schema.partitions
WHERE table_schema = SCHEMANAME AND table_name = TABLENAME AND partition_name IS NULL;
/*
* If partitions do not exist, go ahead and partition the table
*/
IF RETROWS = 1 THEN
/*
* Take the current date at 00:00:00 and add HOURLYINTERVAL to it. This is the timestamp below which we will store values.
* We begin partitioning based on the beginning of a day. This is because we don't want to generate a random partition
* that won't necessarily fall in line with the desired partition naming (ie: if the hour interval is 24 hours, we could
* end up creating a partition now named "p201403270600" when all other partitions will be like "p201403280000").
*/
SET FUTURE_TIMESTAMP = TIMESTAMPADD(HOUR, HOURLYINTERVAL, CONCAT(CURDATE(), " ", '00:00:00'));
SET PARTITION_NAME = DATE_FORMAT(CURDATE(), 'p%Y%m%d%H00');
-- Create the partitioning query
SET @__PARTITION_SQL = CONCAT("ALTER TABLE ", SCHEMANAME, ".", TABLENAME, " PARTITION BY RANGE(`clock`)");
SET @__PARTITION_SQL = CONCAT(@__PARTITION_SQL, "(PARTITION ", PARTITION_NAME, " VALUES LESS THAN (", UNIX_TIMESTAMP(FUTURE_TIMESTAMP), "));");
-- Run the partitioning query
PREPARE STMT FROM @__PARTITION_SQL;
EXECUTE STMT;
DEALLOCATE PREPARE STMT;
END IF;
END$$
DELIMITER ;
DELIMITER $$
DROP PROCEDURE IF EXISTS `partition_maintenance_all`$$
CREATE PROCEDURE`partition_maintenance_all`(SCHEMA_NAME VARCHAR(32))
BEGIN
CALL partition_maintenance(SCHEMA_NAME, 'history', 7, 24, 7);
CALL partition_maintenance(SCHEMA_NAME, 'history_log', 7, 24, 7);
CALL partition_maintenance(SCHEMA_NAME, 'history_str', 7, 24, 7);
CALL partition_maintenance(SCHEMA_NAME, 'history_text', 7, 24, 7);
CALL partition_maintenance(SCHEMA_NAME, 'history_uint', 30, 24, 7);
CALL partition_maintenance(SCHEMA_NAME, 'trends', 730, 24, 14);
CALL partition_maintenance(SCHEMA_NAME, 'trends_uint', 730, 24, 14);
END$$
DELIMITER ;
- 导入sql文件 在我们的db服务器上
mysql -uzabbix -p Z@bbix@123 zabbix < partition.sql
执行存储过程
[root@zabbix ~]#nohup mysql -uzabbix -p123456 zabbix -e “CALL partition_maintenance_all(‘zabbix’)” &> /root/partition.log&
然后进去数据库查看
mysql –uroot –p
password
use zabbix;
show create table history;
如果是下面这种场景,说明就是分区创建成功,有很多的partition
...
| history | CREATE TABLE `history` (
`itemid` bigint(20) unsigned NOT NULL,
`clock` int(11) NOT NULL DEFAULT '0',
`value` double(16,4) NOT NULL DEFAULT '0.0000',
`ns` int(11) NOT NULL DEFAULT '0',
KEY `history_1` (`itemid`,`clock`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
/*!50100 PARTITION BY RANGE (`clock`)
(PARTITION p201906260000 VALUES LESS THAN (1561608000) ENGINE = InnoDB,
PARTITION p201906270000 VALUES LESS THAN (1561694400) ENGINE = InnoDB,
PARTITION p201906280000 VALUES LESS THAN (1561780800) ENGINE = InnoDB,
PARTITION p201906290000 VALUES LESS THAN (1561867200) ENGINE = InnoDB,
PARTITION p201906300000 VALUES LESS THAN (1561953600) ENGINE = InnoDB,
PARTITION p201907010000 VALUES LESS THAN (1562040000) ENGINE = InnoDB,
PARTITION p201907020000 VALUES LESS THAN (1562126400) ENGINE = InnoDB) */ |
- 导入添加计划任务,在我们的db服务器上
crontab -e
#zabbix partition_maintenance
01 01 * * * mysql -uzabbix -p Z@bbix@123 zabbix -e"CALL partition_maintenance_all('zabbix')" &>/var/log/partition.log
然后按esc,再按:,再输入x回车退出即可
然后再查看我们的有没有添加成功
crontab -l