การติดตั้ง TimescaleDB + PostgreSQL + Zabbix บน CentOS7 - ความท้าทายด้านประสิทธิภาพที่มากับการเก็บข้อมูลขนาดใหญ่
(TimescaleDB + PostgreSQL + Zabbix Installation on CentOS7 - Performance-related challenge with big history and trend data.)
ได้ยินข่าวมาซักพักแล้ว สำหรับ TimescaleDB (TSDB) ที่นำมาใช้งานกับ Zabbix โดยที่ TimescaleDB คือ เป็นส่วนเสริมของ PostgreSQL (PG) ที่มีการทำงานซึ่งเพิ่มประสิทธิภาพตามอนุกรมเวลาและการเพิ่มประสิทธิภาพการจัดการข้อมูลให้กับ PostgreSQL หรือ อีกนัยนึงก็คือมีการออกแบบมาพิเศษเพื่อให้มีประสิทธิภาพการทำงานสูงสุดสำหรับข้อมูลที่มีเวลามาเกี่ยวข้อง
(Heard the news for a while for TimescaleDB that is used with Zabbix. TimescaleDB (TSDB) is a PostgreSQL (PG) extension, which adds time series based performance and data management optimizations to a regular PostgreSQL database. In other words, it is specially designed to provide maximum performance for time series data.)
ซึ่งใน Zabbix นั้น ตารางในฐานข้อมูลที่เกี่ยวข้องอย่างยิ่งยวดที่เกี่ยวข้องกับเวลาคือ history, history_uint, history_str, history_log, history_text, trends and trends_uint
(The Zabbix's database tables that related with time series data are history, history_uint, history_str, history_log, history_text, trends and trends_uint.)
โดย TSDB นั้นจะคล้ายคลึงกับ Table Partitioning (แต่ไม่ได้เหมือนกันทั้งหมด) สำหรับ TSDB จะมีการแบ่งข้อมูลในตารางซึ่งข้อมูลที่แบ่งดังกล่าวจะเรียกว่า chunks ตามที่ได้กำหนดเวลาไว้ว่าในแต่ละอันนั้นคือเวลาช่วงละเท่าใด ซึ่งการแบ่งดังกล่าวจะดำเนินการโดยฐานข้อมูลโดยอัตโนมัติตามช่าวงเวลาที่ได้กำหนดไว้
(In TSDB is similar to Table Partitioning (but quit difference). TSDB splits this table into so-called chunks in accordance with conditions you specify. This think of chunks as of automatically managed table partitions. Every chunk has an associated time range.)
ในการทำ Partitioning นั้น โดยทั่วไปใน Zabbix จะมีโพรเซสที่ดำเนินการคือ Housekeeper ทำจะมี batch กำเนินการทำ partitioning ของข้อมูล เพื่อแยกข้อมูลตามช่วงเวลาที่ได้กำหนดไว้ ซึ่งในช่วงเวลาที่ housekeeper ทำการ partitioning นั้น เมื่อมีการ insert/update/delete ในช่วงเวลาดังกล่าวโดย database syncer ก็อาจเกิดการ lock ตามการทำงานของ database อีกทั้งถ้าข้อมูลมีขนาดใหญ่ ก็ยิ่งทำให้การทำงานดังกล่าวยิ่งช้าลง
(In partitioning process, the Zabbix has batch process named "Housekeeper" that partitioning the table by time condition. Then when the database transaction such as insert/update/delete to perform operation via database synced, it may cause of database lock. In case of big table data, it have more longer process time.)
ข้อได้เปรียบของการใช้งาน TSDB ที่สำคัญหนึ่งในหลายๆ ข้อ คือ จะช่วยเพิ่มประสิทธิภาพของ history syncer และ housekeeper
(The one of manybenefit of TSDB is it brings considerable performance improvements for Zabbix history syncer and housekeeper.)
ขั้นตอนการติดตั้ง Zabbix 4.2 + PostgreSQL 11 + TimescaleDB 1.3 บน CentOS 7 (แถมการติดตั้ง PHP 7.2)
(Step for install Zabbix 4.2 + PostgreSQL 11 + TimescaleDB 1.3 on CentOS 7 plus PHP 7.2)
1. Install required yum related package.
# yum install yum-utils
2. Preparing for PHP 7.2 installation (The PHP 7.2 will be installing with Zabbix frontend installation step.)
# yum install epel-release
# yum-config-manager --enable remi-php72
------ PostgreSQL and TimescaleDB Section ------
3. Preparing for PostgreSQL and TimescaleDB installation
# yum install -y https://download.postgresql.org/pub/repos/yum/11/redhat/rhel-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
- Add following line into file named /etc/yum.repos.d/CentOS-Base.repo, [base] and [updates] sections
exclude=postgresql*
- Add TimescaleDB's third party repository and install TimescaleDB, which will download any dependencies it needs from the PostgreSQL repo
# cat > /etc/yum.repos.d/timescale_timescaledb.repo <<EOL
[timescale_timescaledb]
name=timescale_timescaledb
baseurl=https://packagecloud.io/timescale/timescaledb/el/7/\$basearch
repo_gpgcheck=1
gpgcheck=0
enabled=1
gpgkey=https://packagecloud.io/timescale/timescaledb/gpgkey
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
EOL
# yum update
4. Installing PostgreSQL + TimescaleDB
# yum install timescaledb-postgresql-11
5. Setting PG data directory to other location (other disk/partition for increasing performance and reliability management) e.g. target directory named is /data/pgsql
- Create target directory
# mkdir -p /data/pgsql
# chown -R postgres:postgres /data/pgsql
- Setting target directory in daemon
# systemctl edit postgresql-10.service
[Service]
Environment=PGDATA=/data/pgsql/11/data
- Crosscheck this file will be created
# cat /etc/systemd/system/postgresql-11.service.d/override.conf
[Service]
Environment=PGDATA=/data/pgsql/11/data
- Reload this setting
# systemctl daemon-reload
6. Initial PostgreSQL database
# /usr/pgsql-11/bin/postgresql-11-setup initdb
Initializing database ... OK
7. Tuning databs
# timescaledb-tune --pg-config=/usr/pgsql-11/bin/pg_config --conf-path=/data/pgsql/11/data/postgresql.conf
Using postgresql.conf at this path:
/data/pgsql/11/data/postgresql.conf
--> Answer yes for all questions.
8. Enable and Start PostgreSQL database
# systemctl enable postgresql-11
# systemctl start postgresql-11
# systemctl status postgresql-11
------ Zabbix Section ------
9. Preparing for Zabbix installation
# rpm -ivh https://repo.zabbix.com/zabbix/4.2/rhel/7/x86_64/zabbix-release-4.2-1.el7.noarch.rpm
# yum-config-manager --enable rhel-7-server-optional-rpms
# yum update
10. Installing Zabbix server
# yum install zabbix-server-pgsql
11. Installing Zabbix frontend (PHP 7.2 will be installing with this step)
# yum install zabbix-web-pgsql
12. Database preparation
- Create PG database user name zabbixdbusr
# sudo -u postgres createuser --pwprompt zabbixdbusr
- Create database in PG named zabbix
# sudo -u postgres createdb -O zabbixdbusr -E Unicode -T template0 zabbix
- Import schema to database
# zcat /usr/share/doc/zabbix-server-pgsql*/create.sql.gz | sudo -u zabbixdbusr psql zabbix
- Enable TimescaleDB extension for zabbix database
# echo "CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;" | sudo -u postgres psql zabbix
- Create TimescaleDB related table (Hypertable)
# zcat /usr/share/doc/zabbix-server-pgsql*/timescaledb.sql.gz | sudo -u zabbixdbusr psql zabbix
13. Setting database credentials to related configuration
# vi /etc/zabbix/zabbix_server.conf
DBHost=127.0.0.1
DBName=zabbix
DBUser=zabbixdbusr
DBPassword=<password>
14. Setting PG authentication
# vi /data/pgsql/11/data/pg_hba.conf
host zabbix zabbixdbusr 127.0.0.1/32 password
15. Restarting PostgreSQL for reloading above configuration
# systemctl stop postgresql-11
# systemctl start postgresql-11
# systemctl status postgresql-11
16. Enable and Start Zabbix server
# systemctl enable zabbix-server
# systemctl start zabbix-server
# systemctl status zabbix-server
17. Setting PHP configuration that requires Zabbix
# vi /etc/php.ini
max_execution_time 300
memory_limit 128M
post_max_size 16M
upload_max_filesize 2M
max_input_time 300
max_input_vars 10000
#always_populate_raw_post_data -1
date.timezone Asia/Bangkok
18. Enable and Start HTPD web server
# systemctl enable httpd
# systemctl start httpd
#systemctl status httpd
19. Goto URL http://YOURZABBIXIP/zabbix for completing frontend installation and following installed step.
Database type: PostgreSQL
Database host: 127.0.0.1
Database port: 5432
Database name: zabbix
User: zabbixdbusr
Password: <password>
*** Please considering SELinux ***
Reference:
[1] https://blog.zabbix.com/zabbix-time-series-data-and-timescaledb/6642/
[2] https://www.zabbix.com/documentation/4.2/manual/installation
[3] https://docs.timescale.com/v1.3/getting-started/installation/rhel-centos/installation-yum
(TimescaleDB + PostgreSQL + Zabbix Installation on CentOS7 - Performance-related challenge with big history and trend data.)
ได้ยินข่าวมาซักพักแล้ว สำหรับ TimescaleDB (TSDB) ที่นำมาใช้งานกับ Zabbix โดยที่ TimescaleDB คือ เป็นส่วนเสริมของ PostgreSQL (PG) ที่มีการทำงานซึ่งเพิ่มประสิทธิภาพตามอนุกรมเวลาและการเพิ่มประสิทธิภาพการจัดการข้อมูลให้กับ PostgreSQL หรือ อีกนัยนึงก็คือมีการออกแบบมาพิเศษเพื่อให้มีประสิทธิภาพการทำงานสูงสุดสำหรับข้อมูลที่มีเวลามาเกี่ยวข้อง
(Heard the news for a while for TimescaleDB that is used with Zabbix. TimescaleDB (TSDB) is a PostgreSQL (PG) extension, which adds time series based performance and data management optimizations to a regular PostgreSQL database. In other words, it is specially designed to provide maximum performance for time series data.)
ซึ่งใน Zabbix นั้น ตารางในฐานข้อมูลที่เกี่ยวข้องอย่างยิ่งยวดที่เกี่ยวข้องกับเวลาคือ history, history_uint, history_str, history_log, history_text, trends and trends_uint
(The Zabbix's database tables that related with time series data are history, history_uint, history_str, history_log, history_text, trends and trends_uint.)
โดย TSDB นั้นจะคล้ายคลึงกับ Table Partitioning (แต่ไม่ได้เหมือนกันทั้งหมด) สำหรับ TSDB จะมีการแบ่งข้อมูลในตารางซึ่งข้อมูลที่แบ่งดังกล่าวจะเรียกว่า chunks ตามที่ได้กำหนดเวลาไว้ว่าในแต่ละอันนั้นคือเวลาช่วงละเท่าใด ซึ่งการแบ่งดังกล่าวจะดำเนินการโดยฐานข้อมูลโดยอัตโนมัติตามช่าวงเวลาที่ได้กำหนดไว้
(In TSDB is similar to Table Partitioning (but quit difference). TSDB splits this table into so-called chunks in accordance with conditions you specify. This think of chunks as of automatically managed table partitions. Every chunk has an associated time range.)
ในการทำ Partitioning นั้น โดยทั่วไปใน Zabbix จะมีโพรเซสที่ดำเนินการคือ Housekeeper ทำจะมี batch กำเนินการทำ partitioning ของข้อมูล เพื่อแยกข้อมูลตามช่วงเวลาที่ได้กำหนดไว้ ซึ่งในช่วงเวลาที่ housekeeper ทำการ partitioning นั้น เมื่อมีการ insert/update/delete ในช่วงเวลาดังกล่าวโดย database syncer ก็อาจเกิดการ lock ตามการทำงานของ database อีกทั้งถ้าข้อมูลมีขนาดใหญ่ ก็ยิ่งทำให้การทำงานดังกล่าวยิ่งช้าลง
(In partitioning process, the Zabbix has batch process named "Housekeeper" that partitioning the table by time condition. Then when the database transaction such as insert/update/delete to perform operation via database synced, it may cause of database lock. In case of big table data, it have more longer process time.)
ข้อได้เปรียบของการใช้งาน TSDB ที่สำคัญหนึ่งในหลายๆ ข้อ คือ จะช่วยเพิ่มประสิทธิภาพของ history syncer และ housekeeper
(The one of manybenefit of TSDB is it brings considerable performance improvements for Zabbix history syncer and housekeeper.)
ขั้นตอนการติดตั้ง Zabbix 4.2 + PostgreSQL 11 + TimescaleDB 1.3 บน CentOS 7 (แถมการติดตั้ง PHP 7.2)
(Step for install Zabbix 4.2 + PostgreSQL 11 + TimescaleDB 1.3 on CentOS 7 plus PHP 7.2)
1. Install required yum related package.
# yum install yum-utils
2. Preparing for PHP 7.2 installation (The PHP 7.2 will be installing with Zabbix frontend installation step.)
# yum install epel-release
# yum-config-manager --enable remi-php72
------ PostgreSQL and TimescaleDB Section ------
3. Preparing for PostgreSQL and TimescaleDB installation
# yum install -y https://download.postgresql.org/pub/repos/yum/11/redhat/rhel-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
- Add following line into file named /etc/yum.repos.d/CentOS-Base.repo, [base] and [updates] sections
exclude=postgresql*
- Add TimescaleDB's third party repository and install TimescaleDB, which will download any dependencies it needs from the PostgreSQL repo
# cat > /etc/yum.repos.d/timescale_timescaledb.repo <<EOL
[timescale_timescaledb]
name=timescale_timescaledb
baseurl=https://packagecloud.io/timescale/timescaledb/el/7/\$basearch
repo_gpgcheck=1
gpgcheck=0
enabled=1
gpgkey=https://packagecloud.io/timescale/timescaledb/gpgkey
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
EOL
# yum update
4. Installing PostgreSQL + TimescaleDB
# yum install timescaledb-postgresql-11
5. Setting PG data directory to other location (other disk/partition for increasing performance and reliability management) e.g. target directory named is /data/pgsql
- Create target directory
# mkdir -p /data/pgsql
# chown -R postgres:postgres /data/pgsql
- Setting target directory in daemon
# systemctl edit postgresql-10.service
[Service]
Environment=PGDATA=/data/pgsql/11/data
- Crosscheck this file will be created
# cat /etc/systemd/system/postgresql-11.service.d/override.conf
[Service]
Environment=PGDATA=/data/pgsql/11/data
- Reload this setting
# systemctl daemon-reload
6. Initial PostgreSQL database
# /usr/pgsql-11/bin/postgresql-11-setup initdb
Initializing database ... OK
7. Tuning databs
# timescaledb-tune --pg-config=/usr/pgsql-11/bin/pg_config --conf-path=/data/pgsql/11/data/postgresql.conf
Using postgresql.conf at this path:
/data/pgsql/11/data/postgresql.conf
--> Answer yes for all questions.
8. Enable and Start PostgreSQL database
# systemctl enable postgresql-11
# systemctl start postgresql-11
# systemctl status postgresql-11
------ Zabbix Section ------
9. Preparing for Zabbix installation
# rpm -ivh https://repo.zabbix.com/zabbix/4.2/rhel/7/x86_64/zabbix-release-4.2-1.el7.noarch.rpm
# yum-config-manager --enable rhel-7-server-optional-rpms
# yum update
10. Installing Zabbix server
# yum install zabbix-server-pgsql
11. Installing Zabbix frontend (PHP 7.2 will be installing with this step)
# yum install zabbix-web-pgsql
12. Database preparation
- Create PG database user name zabbixdbusr
# sudo -u postgres createuser --pwprompt zabbixdbusr
- Create database in PG named zabbix
# sudo -u postgres createdb -O zabbixdbusr -E Unicode -T template0 zabbix
- Import schema to database
# zcat /usr/share/doc/zabbix-server-pgsql*/create.sql.gz | sudo -u zabbixdbusr psql zabbix
- Enable TimescaleDB extension for zabbix database
# echo "CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;" | sudo -u postgres psql zabbix
- Create TimescaleDB related table (Hypertable)
# zcat /usr/share/doc/zabbix-server-pgsql*/timescaledb.sql.gz | sudo -u zabbixdbusr psql zabbix
13. Setting database credentials to related configuration
# vi /etc/zabbix/zabbix_server.conf
DBHost=127.0.0.1
DBName=zabbix
DBUser=zabbixdbusr
DBPassword=<password>
14. Setting PG authentication
# vi /data/pgsql/11/data/pg_hba.conf
host zabbix zabbixdbusr 127.0.0.1/32 password
15. Restarting PostgreSQL for reloading above configuration
# systemctl stop postgresql-11
# systemctl start postgresql-11
# systemctl status postgresql-11
16. Enable and Start Zabbix server
# systemctl enable zabbix-server
# systemctl start zabbix-server
# systemctl status zabbix-server
17. Setting PHP configuration that requires Zabbix
# vi /etc/php.ini
max_execution_time 300
memory_limit 128M
post_max_size 16M
upload_max_filesize 2M
max_input_time 300
max_input_vars 10000
#always_populate_raw_post_data -1
date.timezone Asia/Bangkok
18. Enable and Start HTPD web server
# systemctl enable httpd
# systemctl start httpd
#systemctl status httpd
19. Goto URL http://YOURZABBIXIP/zabbix for completing frontend installation and following installed step.
Database type: PostgreSQL
Database host: 127.0.0.1
Database port: 5432
Database name: zabbix
User: zabbixdbusr
Password: <password>
*** Please considering SELinux ***
Reference:
[1] https://blog.zabbix.com/zabbix-time-series-data-and-timescaledb/6642/
[2] https://www.zabbix.com/documentation/4.2/manual/installation
[3] https://docs.timescale.com/v1.3/getting-started/installation/rhel-centos/installation-yum