目标:zabbix集群高可用,master集群,proxy集群,数据库集群
规划:测试阶段需2个master(主备),1个proxy,2个mysql(主从)
先关闭防火墙,selinux等
systemctl disable firewalld
systemctl stop firewalld
setenforce 0
一、数据库高可用
192.168.13.56和192.168.13.57的mysql的root密码为root1234
安装的mysql-server版本为8.0,采用绿色安装
先下载mysql-8.0.25-linux-glibc2.12-x86_64.tar.xz至/opt目录下,然后安装数据库 可以一键执行
#!/bin/bash
############################
# 本程序用于一键安装mysql8 前提是将mysql安装包放入/opt目录下。
# 本程序调用方法:./mysql一键安装.sh
# 作者:huang 2021年6月3日
############################
echo "设置mysql_base"
MYSQL_BASE=/home/mysql-8.0.25
echo "设置server-id,请务必输入数字"
read -p "输入server_id的值" SERVER_ID
if [ -z "$SERVER_ID" ]
then
echo "为空,请重新执行脚本并输入正确的server-id"
exit 1
fi
echo $SERVER_ID | grep -q '[^0-9]'
n1=$?
if [ $n1 -eq 0 ]
then
echo "NOT NUMBER,请重新执行脚本并输入正确的server-id"
exit 1
fi
echo $SERVER_ID
echo "安装依赖"
yum -y install libaio
yum -y install ncurses-compat-libs
yum -y install gcc
echo "创建用户组"
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
cd /opt/
tar xvf /opt/mysql-8.0.25-linux-glibc2.12-x86_64.tar.xz -C /home
mv /home/mysql-8.0.25-linux-glibc2.12-x86_64 $MYSQL_BASE
cd $MYSQL_BASE
mkdir etc var
cd etc
echo "写入配置文件"
cat >> my.cnf <<EOF
[client]
port = 3306
socket = $MYSQL_BASE/mysql.sock
[mysqld]
port = 3306
socket = $MYSQL_BASE/mysql.sock
basedir = $MYSQL_BASE
datadir = $MYSQL_BASE/data
pid-file = $MYSQL_BASE/var/mysql.pid
user = mysql
bind-address = 0.0.0.0
server-id = $SERVER_ID #表示是本机的序号为1,一般来讲就是master的意思
skip-name-resolve
back_log = 600
max_connections = 1000
max_connect_errors = 6000
open_files_limit = 65535
table_open_cache = 128
max_allowed_packet = 4M
binlog_cache_size = 1M
max_heap_table_size = 8M
tmp_table_size = 16M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
sort_buffer_size = 8M
join_buffer_size = 8M
thread_cache_size = 8
#query_cache_size = 8M
#query_cache_limit = 2M
key_buffer_size = 4M
ft_min_word_len = 4
transaction_isolation = REPEATABLE-READ
log-bin = mysql-bin
binlog_format = mixed
expire_logs_days = 30 #超过30天的binlog删除
log_error = $MYSQL_BASE/var/mysql-error.log #错误日志路径
slow_query_log = 1
long_query_time = 1 #慢查询时间 超过1秒则为慢查询
slow_query_log_file = $MYSQL_BASE/var/mysql-slow.log
performance_schema = 0
explicit_defaults_for_timestamp
skip-external-locking #MySQL选项以避免外部锁定。该选项默认开启
default-storage-engine = InnoDB #默认存储引擎
innodb_file_per_table = 1
innodb_open_files = 500
innodb_data_file_path = ibdata1:1G:autoextend
innodb_buffer_pool_size = 4G
innodb_write_io_threads = 4
innodb_flush_method = O_DIRECT
innodb_read_io_threads = 4
innodb_thread_concurrency = 0
innodb_purge_threads = 1
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 2M
innodb_log_file_size = 32M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
bulk_insert_buffer_size = 8M
myisam_sort_buffer_size = 8M
myisam_max_sort_file_size = 10G
myisam_repair_threads = 1
interactive_timeout = 28800
wait_timeout = 28800
[mysqldump]
quick
max_allowed_packet = 16M #服务器发送和接受的最大包长度
[myisamchk]
key_buffer_size = 8M
sort_buffer_size = 8M
read_buffer = 4M
write_buffer = 4M
EOF
echo "修改用户属组"
chown -R mysql:mysql $MYSQL_BASE
chmod 750 etc var
echo "初始化myql defaults-file必须是第一个参数"
$MYSQL_BASE/bin/mysqld --defaults-file=$MYSQL_BASE/etc/my.cnf --initialize --user=mysql --basedir=$MYSQL_BASE --datadir=$MYSQL_BASE/data
sleep 10
echo "获取mysql初始密码"
PASSWORD=`cat $MYSQL_BASE/var/mysql-error.log |grep "temporary password"|awk -F"root@localhost: " '{print $2}'`
$MYSQL_BASE/bin/mysql_ssl_rsa_setup --datadir=$MYSQL_BASE/data/
$MYSQL_BASE/bin/mysqld_safe --defaults-file=$MYSQL_BASE/etc/my.cnf --user=mysql --basedir=$MYSQL_BASE --datadir=$MYSQL_BASE/data &
# Next command is optional
sleep 180
echo "修改mysql密码"
$MYSQL_BASE/bin/mysql --socket=$MYSQL_BASE/mysql.sock --connect-expired-password -uroot -p${PASSWORD} -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'root1234';"
$MYSQL_BASE/bin/mysql --socket=$MYSQL_BASE/mysql.sock -uroot -proot1234 -e "create database zabbix character set utf8 collate utf8_bin;"
$MYSQL_BASE/bin/mysql --socket=$MYSQL_BASE/mysql.sock -uroot -proot1234 -e "create user zabbix@localhost identified by 'zabbix';"
$MYSQL_BASE/bin/mysql --socket=$MYSQL_BASE/mysql.sock -uroot -proot1234 -e "create user zabbix@'%' identified by 'zabbix';"
$MYSQL_BASE/bin/mysql --socket=$MYSQL_BASE/mysql.sock -uroot -proot1234 -e "grant all privileges on *.* to zabbix@localhost;"
$MYSQL_BASE/bin/mysql --socket=$MYSQL_BASE/mysql.sock -uroot -proot1234 -e "grant all privileges on *.* to zabbix@'%';"
两个数据库server-id注意不能设置成一致
zabbix为复制账号
查看master状态
show master status\G
±-----------------±---------±-------------±-------------------------±------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
±-----------------±---------±-------------±-------------------------±------------------+
| mysql-bin.000001 | 154 | | mysql,information_schema | |
±-----------------±---------±-------------±-------------------------±------------------+
从库上配置
change master to
master_host=‘192.168.13.57’,
master_user=‘zabbix’,
master_password=‘zabbix’,
master_log_file=‘mysql-bin.000001’,
master_log_pos=154;
start slave;
show slave status\G
查看主从状态
并且主库可以建个test库测试
二、zabbix_server高可用
1、配置部署keepalived
在192.168.13.54和192.168.13.55上配置
apt-get install keepalived
apt-get install open-jdk
查看是否加载ip_vs模块到内核,如果没有加载会导致VIP转移失败
lsmod | grep ip_vs
modprobe ip_vs
modprobe ip_vs_wrr
vim /etc/keepalived/zabbix.sh
#!/bin/bash
#
#
status1=$(ps aux|grep -w "zabbix_server" | grep -v grep | grep -v bash | wc -l)
if [ "${status1}" = "0" ]; then
/etc/init.d/zabbix-server start
sleep 3
status2=$(ps aux|grep zabbix_server | grep -v grep | grep -v bash |wc -l)
if [ "${status2}" = "0" ]; then
/etc/init.d/keepalived stop
fi
fi
配置192.168.13.54的keepalived
vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
t1@t2.com
}
notification_email_from iot@iot.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id ZABBIX_HA
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 55
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.13.59
}
}
virtual_server 192.168.13.59 10051 {
delay_loop 2
persistence_timeout 50
protocol TCP
real_server 192.168.13.54 10051 {
weight 3
notify_down /etc/keepalived/zabbix.sh
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
配置192.168.13.55的keepalived
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
t1@t2.com
}
notification_email_from iot@iot.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id ZABBIX_HA
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 55
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.13.59
}
}
virtual_server 192.168.13.59 10051 {
delay_loop 2
persistence_timeout 50
protocol TCP
real_server 192.168.13.55 10051 {
weight 3
notify_down /etc/keepalived/zabbix.sh
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
为防止脑裂,在备机上运行一个检测脚本,主备之间做了SSH互信,也可以将此脚本放入keepalived中检测。此处略;
n2=`ps aux|grep zabbix|grep server |grep -v grep |wc -l`
n=`ssh 192.168.13.54 "ps aux|grep zabbix|grep server " |grep -v grep |wc -l`
echo $n
echo $n2
if [ $n2 -gt 1 ]
then
{
echo "192.168.13.55 BACKUP server is alived ,plz chech 192.168.13.54 MASTER STATUS"
if [ $n -gt 1 ]
then
{
echo $n
echo `date`
echo "192.168.13.54 master server is alived"
echo "Will shut down zabbix-server on localhost"
systemctl stop zabbix-server
}
else
{
echo "192.168.13.54 master server is not alived"
echo `date`
}
fi
}
fi
配置完keepalived,再分别两台服务器上安装zabbix-server
按照官方文档一步步安装
rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
yum clean all
yum install zabbix-server-mysql zabbix-agent
yum install centos-release-scl
sed -i ‘s/enabled=0/enabled=1/g’ /etc/yum.repos.d/zabbix.repo
yum install zabbix-web-mysql-scl zabbix-apache-conf-scl
导入数据库
zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix
修改/ect/zabbix/zabbix_server.conf配置文件,关键部分
DBHost=192.168.13.57
DBName=zabbix
DBSchema=zabbix
DBUser=zabbix
DBPassword=zabbix
修改php配置文件/etc/opt/rh/rh-php72/php-fpm.d/zabbix.conf
echo "php_value[date.timezone] = Asia/Shanghai" >> /etc/opt/rh/rh-php72/php-fpm.d/zabbix.conf
搞定
systemctl restart zabbix-server zabbix-agent httpd rh-php72-php-fpm
systemctl enable zabbix-server zabbix-agent httpd rh-php72-php-fpm
三、安装proxy,类似server
##https://www.zabbix.com/documentation/5.0/zh/manual/installation/install_from_packages/rhel_centos
rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
yum clean all
yum install -y zabbix-proxy-mysql
yum -y install mariadb mariadb-server
systemctl start mariadb
###mariadb 5.5 root 默认密码为空,也可以用上面的一键安装脚本(mysql8)
mysql -e "create database zabbix default character set utf8;"
mysql -e "grant all privileges on zabbix.* to zabbix@'localhost' identified by 'zabbix';"
mysql -e "grant all privileges on zabbix.* to zabbix@'%' identified by 'zabbix';"
zcat /usr/share/doc/zabbix-proxy-mysql*/schema.sql.gz | mysql -uzabbix -pzabbix zabbix
sed -i 's/Server=127.0.0.1/Server=192.168.13.59/g' /etc/zabbix/zabbix_proxy.conf
sed -i 's/ServerActive=127.0.0.1/ServerActive=192.168.13.59/g' /etc/zabbix/zabbix_proxy.conf
echo "Timeout=30" >>/etc/zabbix/zabbix_proxy.conf
sed -i "s/Hostname=Zabbix proxy/Hostname="`hostname`"/g" /etc/zabbix/zabbix_proxy.conf
sed -i 's/DBName=zabbix_proxy/DBName=zabbix/g' /etc/zabbix/zabbix_proxy.conf
sed -i 's/StatsAllowedIP=127.0.0.1/StatsAllowedIP=0.0.0.0/g' /etc/zabbix/zabbix_proxy.conf
cat >> /etc/zabbix/zabbix_proxy.conf <<EOF
StartPollers=500
StartPollersUnreachable=50
StartTrappers=30
StartDiscoverers=6
CacheSize=1G
StartDBSyncers=20
HistoryCacheSize=512M
DBPassword=zabbix
EOF
service zabbix-proxy start
systemctl enable zabbix-proxy
yum -y install wget telnet net-tools sysstat psmisc
yum -y install libaio
yum -y install ncurses-compat-libs
yum -y install gcc
systemctl disable firewalld
systemctl stop firewalld
setenforce 0
echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf
最后web页面添加代理,完成各种配置