ZABBIX 數據庫高可用部署
- 2019 年 12 月 11 日
- 筆記
本篇文章只介紹 ZABBIX 數據庫高可用的實現方式,ZABBIX前端的高可用將在後續文章中實現
ZABBIX 數據庫高可用組網

ZABBIX-DB1和ZABBIX-DB2都已經安裝好Mariadb,系統版本和數據版本均相同
# mysql --version mysql Ver15.1 Distrib 10.3.13-MariaDB, for Linux (x86_64)using readline5.1 # cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core)
ZABBIX 數據庫高可用實現方式
keepalived+數據庫雙主複製
兩台MySQL互為主從關係,即雙主模式,通過Keepalived配置虛擬IP,實現當其中的一台數據庫故障時,自動切換VIP到另外一台MySQL數據庫,備機快速接管業務來保證數據庫的高可用。
Mysql主從複製

Mysql主從複製過程描述
(1)master記錄二進制日誌:在每個事務更新數據完成之前,master在二進制日誌記錄這些改變。MySQL將事務寫入二進制日誌。在事務寫入二進制日誌完成後,master通知存儲引擎提交事務。
(2)slave將master的binarylog拷貝到自己的中繼日誌:首先,slave開始一個工作線程——I/O線程。I/O線程在master上打開一個普通的連接,然後開始binlogdump process。Binlogdump process從master的二進制日誌中讀取事務,如果已經同步了master,它會睡眠並等待master產生新的事件。I/O線程將這些事務寫入中繼日誌。
(3)SQL slave thread處理該過程的最後一步:SQL線程從中繼日誌讀取事務,並重放其中的事務而更新slave的數據,使其與master中的數據一致。只要該線程與I/O線程保持一致,中繼日誌通常會位於OS的緩存中,所以中繼日誌的開銷很小。
主主同步就是兩台機器互為主的關係,在任何一台機器上寫入都會同步至備端。
為了便於後續數據庫服務器的擴展,且在整個複製環境中能夠自動地切換,降低運維成本,引入了當前主流的基於MysqlGTID的複製特性。
GTID工作原理
(1)master更新數據時,會在事務前產生GTID,一同記錄到Binlog日誌中。
(2)slave的I/O線程將變更的binlog寫入到本地的relaylog中。
(3)slave的sql線程從relaylog中獲取GTID,然後對比slave端的binlog是否有記錄。
(4)如果有記錄說明該GTID的事務已經執行,slave會忽略。
(5)如果沒有記錄,slave就會從relaylog中執行該GTID的事務,並記錄到binlog。
(6)在解析的過程中會判斷是否有主鍵,如果有就用索引,如果沒有就用全部掃描。
GTID優點
(1)一個事務對應一個唯一的ID,一個GTID在一個服務器上 只會執行一次。
(2)GTID是用來替代傳統複製的方法,GTID複製與普通複製模式的最大不同就是不需要指定二進制文件名和位置。
(3)減少手工干預和降低服務故障時間,當主機宕機之後會通過軟件從眾多的備機中提升一台備機為新的master。
GTID也存在一些限制
(1)不支持非事務引擎。
(2)不支持createtable … select 語句複製(主庫直接報錯)。
(3)不允許一個sql同時更新一個事務引擎表和非事務引擎表。
(4)在一個複製組中,必須要求統一開啟GTID或者是統一關閉GTID。
(5)開啟GTID需要重啟(5.7版本除外)。
(6)開啟GTID後,就不再使用原理的傳統複製方式。
(7)不支持createtemporary table 和 drop temporary table語句。
(8)不支持sql_slave_skip_counter。
ZABBIX 數據庫創建
創建ZABBIX數據庫和用戶授權
mysql> create database zabbix character set utf8c ollate utf8_bin; mysql> grant all privileges on zabbix.*tozabbix@localhost identified by'zabbix'; mysql> grant all PRIVILEGES on *.*to'root'@'%'IDENTIFIED BY'zabbix@zabbix'WITHGRANTOPTION; mysql> grant all PRIVILEGES on *.*to'zabbix'@'%'IDENTIFIEDBY'zabbix'WITHGRANTOPTION; mysql> flush privileges; mysql> show databases;
ZABBIX 高可用數據庫複製配置
ZABBIX-DB1 my.cnf 配置文件
———————————————————————–
[mysqld] #開啟二進制日誌 log-bin=mysql-bin log-bin=/mariadb/binlogs/mysql-bin #id標識唯一 server-id=82 #不同步的數據庫,可設置多個 binlog-ignore-db=information_schema binlog-ignore-db=performance_schema binlog-ignore-db=mysql #指定需要同步的數據庫(和slave是相互匹配的),可以設置多個 binlog-do-db=zabbix replicate-do-db=zabbix log-slave-updates slave-skip-errors=all slave-net-timeout=60 ###設置存儲模式不設置默認 binlog_format=MIXED #####日誌清理時間 expire_logs_days=7 #####日誌大小 max_binlog_size=100m #####緩存大小 binlog_cache_size=4m #####最大緩存大小 max_binlog_cache_size=512m
———————————————————————–
ZABBIX-DB2 my.cnf 配置文件
———————————————————————–
[mysqld] #開啟二進制日誌 log-bin=mysql-bin log-bin=/mariadb/binlogs/mysql-bin #id標識唯一 server-id=89 #不同步的數據庫,可設置多個 binlog-ignore-db=information_schema binlog-ignore-db=performance_schema binlog-ignore-db=mysql #指定需要同步的數據庫(和slave是相互匹配的),可以設置多個 binlog-do-db=zabbix replicate-do-db=zabbix log-slave-updates slave-skip-errors=all slave-net-timeout=60 ###設置存儲模式不設置默認 binlog_format=MIXED #####日誌清理時間 expire_logs_days=7 #####日誌大小 max_binlog_size=100m #####緩存大小 binlog_cache_size=4m #####最大緩存大小 max_binlog_cache_size=512m
———————————————————————–
兩個數據庫除server-id 外其他配置相同
修改完配置,重啟數據庫
systemctl restart mariadb
ZABBIX-DB2數據庫數據導入
由於主庫ZABBIX Server 已經在使用,從庫需要導入主庫的zabbix表項和數據(保證主從數據庫表結構和數據相同),使用mysqldump對主庫數據進行備份,從庫進行導入
主數據庫操作
mysqldump -uzabbix -pzabbix@zabbix zabbix > /opt/zabbix.sql [root@ZABBIX-DB1opt]# mysqldump -uroot -proot@centos zabbix > /opt/zabbix.sql [root@ZABBIX-DB1opt]# ll total 93988 -rw-r--r--. 1 root root 96240019 Mar 26 13:06 zabbix.sql
備數據庫操作
[root@ZABBIX-DB2opt]# scp [email protected]:/opt/zabbix.sql /opt/ [root@ZABBIX-DB2opt]# ls zabbix.sql [root@ZABBIX-DB2opt]# mysql -uzabbix-pzabbixt@zabbix MariaDB [(none)]> use zabbix; MariaDB[zabbix]>source /opt/zabbix.sql
ZABBIX-DB2 上查看數據導入
查看zabbix數據有多少張表,驗證從數據庫數據導入是否成功
SELECT COUNT(*) TABLES, table_schema FROM information_schema.TABLES where table_schema ='zabbix';

ZABBIX-DB1數據庫同步賬戶授權配置
#主從同步用戶授權 grant replication slave on *.* to 'zabbixslave'@'21.254.248.89' identified by 'zabbixslave' ; #查看是否修改成功 select host,user,password from mysql.user; #刷新 flush privileges; #查看主庫信息 show master status; 注意:由於Position值會不斷發生變化, Slave在進行數據同步是需要鎖表操作; flushtables with read lock; (會話關閉後自動解鎖) unlocktables;當前會話解鎖;

ZABBIX-DB2數據庫同步配置
#關閉Slave stop slave; #設置連接主庫信息 change master to master_host='21.254.248.82', master_user='zabbixslave', master_password='zabbixslave', master_log_file='mysql-bin.000002',master_log_pos= 83829956; #開啟Slave start slave;
注:上面的master_log_file是在配置Master的時候的File字段, master_log_pos是在配置Master的Position字段。 Master上使用show master status; 查看;一定要一一對應(不要忘記對matster進行鎖表)
#查看信息
show slave status G; stopslave;//停止 resetslave; //清空 startslave;//開啟

ZABBIX-DB2數據庫同步賬戶授權配置
#主從同步用戶授權 grant replication slave on *.* to 'zabbixslave'@'21.254.248.82'identified by 'zabbixslave' ; #查看是否修改成功 select host,user,password from mysql.user; #刷新 flush privileges; #查看主庫信息 show master status;
注意:由於Position值會不斷發生變化, Slave在進行數據同步是需要鎖表操作;
flush tables with read lock; (會話關閉後自動解鎖) unlock tables;當前會話解鎖;

ZABBIX-DB1數據庫同步配置
#關閉Slave stopslave; #設置連接主庫信息change master to master_host='21.254.248.89', master_user='zabbixslave',master_password='zabbixslave', master_log_file='mysql-bin.000002',master_log_pos= 101228163; #開啟Slave start slave;
注:上面的master_log_file是在配置Master的時候的File字段, master_log_pos是在配置Master的Position字段。 Master上使用show master status; 查看;一定要一一對應(不要忘記對matster進行鎖表)
#查看信息 show slave status G; stop slave;//停止 reset slave; //清空 start slave;//開啟

keepalived介紹
keepalived是集群管理中保證集群高可用的一個軟件解決方案,其功能類似於heartbeat,用來防止單點故障
keepalived是以VRRP協議為實現基礎的,VRRP全稱Virtual Router Redundancy Protocol,即虛擬路由冗餘協議。
虛擬路由冗餘協議,可以認為是實現路由器高可用的協議,即將N台提供相同功能的路由器組成一個路由器組,這個組裏面有一個master和多個backup,master上面有一個對外提供服務的vip,master會發組播(組播地址為224.0.0.18),當backup收不到vrrp包時就認為master宕掉了,這時就需要根據VRRP的優先級來選舉一個backup當master,這樣的話就可以保證路由器的高可用了。
keepalived主要有三個模塊,分別是core 、check和vrrp。core模塊為keepalived的核心,負責主進程的啟動、維護以及全局配置文件的加載和解析。check負責健康檢查,包括常見的各種檢查方式。vrrp模塊是來實現VRRP協議的。同時為了避免出現腦裂,應關閉防火牆或者開啟防火牆但允許接收VRRP協議。
選舉算法 keepalived中優先級高的節點為MASTER。MASTER其中一個職責就是響應VIP的arp包,將VIP和mac地址映射關係告訴局域網內其他主機,同時,它還會以多播的形式(目的地址224.0.0.18)向局域網中發送VRRP通告,告知自己的優先級。網絡中的所有BACKUP節點只負責處理MASTER發出的多播包,當發現MASTER的優先級沒自己高,或者沒收到MASTER的VRRP通告時,BACKUP將自己切換到MASTER狀態,然後做MASTER該做的事:1.響應arp包,2.發送VRRP通告。
MASTER和BACKUP節點的優先級如何調整? 首先,每個節點有一個初始優先級,由配置文件中的priority配置項指定,MASTER節點的priority應比BAKCUP高。運行過程中keepalived根據vrrp_script的weight設定,增加或減小節點優先級。規則如下:
- 當weight > 0時,vrrp_script script腳本執行返回0(成功)時優先級為priority+ weight, 否則為priority。當BACKUP發現自己的優先級大於MASTER通告的優先級時,進行主從切換。
- 當weight< 0時,vrrp_script script腳本執行返回非0(失敗)時優先級為priority + weight, 否則為priority。當BACKUP發現自己的優先級大於MASTER通告的優先級時,進行主從切換。
- 當兩個節點的優先級相同時,以節點發送VRRP通告的IP作為比較對象,IP較大者為MASTER。
數據庫服務監控腳本
注意:監控腳本的權限 755
———————————————————————–
[root@ZABBIX-DB1keepalived]# more chkmysql.sh #!/bin/bash mysqld=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l) if [ "${mysqld}" -eq 0 ];then systemctl stop keepalived killall keepalived fi ping 21.254.248.82 -w1 -c1 &>/dev/null if [ $? -ne 0 ]; then systemctl stop keepalived killall keepalived fi
[root@ZABBIX-DB2keepalived]# more chkmysql.sh #!/bin/bash mysqld=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l) if [ "${mysqld}" -eq 0 ];then systemctl stop keepalived killall keepalived fi ping 21.254.248.89 -w1 -c1 &>/dev/null if [ $? -ne 0 ]; then systemctl stop keepalived killall keepalived fi
keepalived配置
ZABBIX-DB1 keepalived配置
[root@ZABBIX-DB1keepalived]# more keepalived.conf !Configuration File for keepalived global_defs{ router_id lvs-mysql01 } vrrp_script chkmysql { script"/etc/keepalived/chkmysql.sh" fall 2 rise 2 } vrrp_instance mysql-ha { state MASTER interface ens33 virtual_router_id 100 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress{ 21.254.248.121 } track_script{ chkmysql } }
ZABBIX-DB2 keepalived配置
[root@ZABBIX-DB2keepalived]# more keepalived.conf !Configuration File for keepalived global_defs{ router_id lvs-mysql02 } vrrp_scriptchk mysql { script "/etc/keepalived/chkmysql.sh" fall 2 rise 2 } vrrp_instance mysql-ha { state BACKUP interface ens33 virtual_router_id 100 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress{ 21.254.248.121 } track_script{ chkmysql } }
ZABBIX 數據庫高可用切換驗證
ZABBIX-DB1網卡VIP為21.254.248.121,執行systemctl stop mariadb後,執行chkmysql.sh 腳本stopkeepalived服務,在ZABBIX-DB2 驗證VIP遷移到ZABBIX-DB2。



ZABBIX數據庫回切
ZABBIX-DB1服務確認順序
啟動本地數據庫
啟動keepalived
[root@ZABBIX-DB1/]# systemctl start mariadb [root@ZABBIX-DB1/]# systemctl start keepalived
查看ip address show ,ip vip address 完成回切

ZABBIX 數據庫備份 定期清理
ZABBIX數據庫定期備份腳本
[root@ZABBIX-DB2]# more bkzabbix.sh #!/bin/bash /usr/bin/mysqldump-uzabbix -pzabbix zabbix | gzip > /mysql-backup/zabbix_$(date+%Y%m%d_%H%M%S).sql.gz [root@ZABBIX-DB2mysql-backup]# ./bkzabbix.sh [root@ZABBIX-DB2mysql-backup]# ls bkzabbix.sh zabbix_20190327_155247.sql.gz
ZABBIX數據庫定期清理腳本
[root@DC-2mysql-backup]# more rmysql.sh #!/bin/bash find /mysql-backup -name zabbix"*.sql.gz" -type f -mtime +20 -exec rm-rf {} ; > /dev/null 2>&1
添加計劃任務
root@ZABBIX-DB2mysql-backup]# crontab -l */10* * * * root /usr/sbin/ntpdate 21.254.248.81;/sbin/hwclock -w 30 11 * * * /mysql-backup/bkzabbix.sh 30 11 * * * /mysql-backup/rmysql.sh [root@ZABBIX-DB2mysql-backup]# systemctl restart crond
以上文章來源於有故事的宋師傅,作者songhongpeng