Zabbix企业级分布式监控系统
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.12 升级Zabbix

升级Zabbix分为两种情况:一是同版本升级,不涉及数据库的升级更新;二是跨版本升级,涉及数据库表结构的更改。

3.12.1 同版本升级的方法

同版本升级,执行命令即可,以下是操作步骤。

(1)备份软件相关文件和配置文件,命令如下:

shell# mkdir -p /data/zabbix/backup
shell# cp -r /etc/zabbix  /data/zabbix/backup/zabbix_conf
shell# cp -r /usr/share/zabbix /data/zabbix/backup/zabbix_web
shell# cp -r /usr/sbin/zabbix_server /data/zabbix/backup/zabbix_server
shell# cp -r /usr/sbin/zabbix_proxy /data/zabbix/backup/zabbix_proxy
shell# cp -r /usr/share/doc/zabbix-* /data/zabbix-backup/

(2)备份数据库,使用本章3.9.2节的备份脚本进行。

(3)升级软件,相关操作命令如下:

shell# rpm -Uvh https://repo.zabbix.com/zabbix/4.0/rhel/7/x86_64/zabbix-release-4.0-1.el7.centos.noarch.rpm
shell# systemctl stop zabbix-server    #停止zabbix-server
shell# systemctl stop zabbix-proxy     #停止zabbix-proxy
shell#  yum  upgrade  zabbix-server-mysql  zabbix-web-mysql  zabbix-agent zabbix-get -y
shell# systemctl start zabbix-server  #开启zabbix-server
shell# systemctl start zabbix-proxy   #开启zabbix-proxy
shell# ps -ef |grep zabbix             #查看进程
shell# tail -f /var/log/zabbix/zabbix_server.log #查看日志

3.12.2 跨版本升级的方法

跨版本升级,其步骤与同版本升级的步骤一致。由于之前版本存有监控数据,因此在升级过程中执行SQL语句更改的速度会比较慢。一般跨版本升级不会涉及history、trends这些存储监控历史数据的表结构的改动,故升级过程时间不会特别长,具体视数据库状况和服务器性能而定。

从启动zabbix_server进程的那一刻起,后台就执行了对表结构进行更改的操作,此过程不可逆。此时,切记不可以强行中断zabbix_server进程;否则,再次启动进程,可能会造成表结构更改失败的后果,从而导致升级失败。如果遇到这种情况,最简单的方法是将表结构删除(history、trends表需保留),使用之前的备份进行恢复,等数据库恢复完成后,再重新启动zabbix_server进程,数据库可再次进行自动升级。

3.12.3 数据库自动升级的原理

数据库升级的过程是由zabbix_server进程自动执行的,升级语句包含在代码中,有ALTER、UPDATE等SQL语句。

#代码位于https://github.com/zabbix-book/zabbix-4.0.0alpha8/blob/master/src/libs/zbxdbupgrade/dbupgrade_3050.c#L761-L780
static int  DBpatch_3050069(void)
{
    int res;

    res = DBexecute(
        "update widget_field"
        " set name='itemids'"
        " where name='itemid'"
            " and exists ("
                "select null"
                " from widget w"
                " where widget_field.widgetid=w.widgetid"
                    " and w.type='plaintext'"
            ")");

    if(ZBX_DB_OK > res)
        return FAIL;

    return SUCCEED;
}

3.12.4 升级失败的处理案例

以下案例由笔者好友汤永全提供。升级失败的原因是在升级过程中,意外中断了zabbix_server进程,致使表结构更改不成功,间接导致zabbix_server更新失败。通过查询zabbix_server.log的日志,可以看到如下提示:

12259:20181011:145325.324 Starting Zabbix Server. Zabbix 4.0.0(revision 85308).
12259:20181011:145325.324 ****** Enabled features ******
12259:20181011:145325.324 SNMP monitoring:           YES
12259:20181011:145325.324 IPMI monitoring:           YES
12259:20181011:145325.324 Web monitoring:             YES
12259:20181011:145325.324 VMware monitoring:         YES
12259:20181011:145325.324 SMTP authentication:       YES
12259:20181011:145325.324 Jabber notifications:      YES
12259:20181011:145325.324 Ez Texting notifications:  YES
12259:20181011:145325.324 ODBC:                       YES
12259:20181011:145325.324 SSH2 support:               YES
12259:20181011:145325.324 IPv6 support:               YES
12259:20181011:145325.324 TLS support:                YES
12259:20181011:145325.324 ******************************
12259:20181011:145325.324 using configuration file:/etc/zabbix/zabbix_server.conf
12259:20181011:145325.328 current database version (mandatory/optional):03050047/03050047
12259:20181011:145325.328 required mandatory version: 04000000

为了更清楚地了解为何更新失败,将zabbix_server.conf的日志级别改为Debug模式,重新启动,可以看到如下错误提示:

12988:20181011:145847.827 [Z3005] query failed: [1060] Duplicate column name  'query_fields'  [alter  table  `items`  add  `query_fields`  varchar(2048)default '' not null]
  12988:20181011:145847.827 query [alter table `items` add `query_fields`varchar(2048) default '' not null] failed, setting transaction as failed
  12988:20181011:145847.827 query [txnlev:1] [rollback; ]
  12988:20181011:145847.827 database upgrade failed
  12988:20181011:145847.827 End of DBcheck_version():FAIL
  13008:20181011:145858.079 Starting Zabbix Server. Zabbix 4.0.0
(revision 85308).

通过日志可以看到,是因为表结构无法添加字段而导致的更新失败。查询items表结构:

mysql> show create table items \G;
*************************** 1. row ***************************
        Table: items
Create Table: CREATE TABLE `items`(
`itemid` bigint(20)unsigned NOT NULL,
......省略部分输出......
`state` int(11)NOT NULL DEFAULT '0',
......省略部分输出......
`url` varchar(2048)COLLATE utf8_bin NOT NULL DEFAULT '',
`query_fields` varchar(2048) COLLATE utf8_bin NOT NULL DEFAULT '',
  PRIMARY KEY(`itemid`),
  UNIQUE KEY `items_1`(`hostid`, `key_`),
  KEY `items_3`(`status`),
......省略部分输出......
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin

删除提示错误的字段,命令如下:

mysql> alter table `items` DROP COLUMN `query_fields` ;

重启zabbix_server进程,可以顺利升级。

当然,这个案例只是个例,并不能保证100%成功解决问题。但是通过这个案例,我们可以清楚地知道,如果升级失败,多半是由于表结构更新失败导致的。最快的解决办法是,通过恢复数据库再次升级。如果读者遇到这种情况,可参考本节介绍的处理办法来解决。