监控共享高可用数据库主从

目录

一.准备工作

二.nfs服务端部署与配置

三.nfs客户端配置与部署

四.配置keepalived高可用

五.部署MySQL主从

配置主从数据库

测试数据库共享目录效果

六.模拟主节点宕机效果

七.zabbix监控主节点mysql服务宕机


一.准备工作

服务机说明服务机名称ip系统
zabbix_server端c83.example.com192.168.187.134centos8
NFS服务端nfs.example.com192.168.187.150centos8
NFS客户端,数据库主机1M1.example.com192.168.187.128centos8
NFS客户端,数据库主机2M2.example.com192.168.187.131centos8
数据库从机S1.example.com192.168.187.129centos8

所有服务机关闭防火墙与selinux 

二.nfs服务端部署与配置

# 1.安装nfs与rpc服务
[root@nfs ~]# yum -y install nfs-utils rpcbind

# 2.启动服务并设置开机自启
[root@nfs ~]# systemctl enable --now nfs-server rpcbind
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.

# 3.创建共享存储文件夹
[root@nfs ~]# mkdir -p /nfs/mysql

# 4.配置nfs
# 表示所有客户端可挂载
[root@nfs ~]# echo "/nfs/mysql *(rw,sync,no_root_squash)" >> /etc/exports
# 使nfs配置生效
[root@nfs ~]# exportfs -r
# 重启nfs服务
[root@nfs ~]# systemctl restart nfs-server

# 5.查看是否成功和可用的nfs地址
[root@nfs ~]# showmount -e localhost
Export list for localhost:
/nfs/mysql *

三.nfs客户端配置与部署

两台客户端部署同样的操作
# 1.安装nfs服务与rpc服务
[root@M1 ~]# yum -y install nfs-utils rpcbind

# 2.创建挂载目录
[root@M1 ~]# mkdir -p /opt/data

# 3.挂载共享目录为服务端的/nfs/mysql与本地的/opt/data
[root@M1 ~]# mount -t nfs 192.168.187.150:/nfs/mysql /opt/data

# 挂载成功,这时可以用df查看
[root@M1 nfs]# df -h
Filesystem                 Size  Used Avail Use% Mounted on
devtmpfs                   1.8G     0  1.8G   0% /dev
tmpfs                      1.8G     0  1.8G   0% /dev/shm
tmpfs                      1.8G   17M  1.8G   1% /run
tmpfs                      1.8G     0  1.8G   0% /sys/fs/cgroup
/dev/mapper/cs-root         17G  5.0G   12G  30% /
/dev/sda1                 1014M  227M  788M  23% /boot
tmpfs                      364M     0  364M   0% /run/user/0
192.168.187.150:/nfs/data   17G  2.0G   16G  12% /data/nfs

# 4.测试,这时往任一端上写入文件,另外的服务机都会同步
[root@nfs ~]# cd /nfs/mysql/
[root@nfs mysql]# ls
[root@nfs mysql]# touch 666
[root@nfs mysql]# ls
666
[root@M1 ~]# cd /data/nfs
[root@M1 nfs]# ls
666

四.配置keepalived高可用


# 1.配置epel源,两台MySQL主机上都要配置
[root@M1 ~]# yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
[root@M1 ~]# sed -i 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
[root@M1 ~]# sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*
[root@M1 ~]# yum makecache

# 2.安装keepalived,两台MySQL主机上都要安装
[root@M1 ~]# yum -y install keepalived

# 3.配置主节点配置文件
[root@M1 ~]# vim /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
   router_id haproxy01
}

vrrp_instance VI_1 {
    state MASTER
    interface ens160
    virtual_router_id 99  ----- 这里主备一致
    priority 100     ----- 主节点比备用节点的优先级要高
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456789   ---- 密码一致
    }
    virtual_ipaddress {
        192.168.187.200      ----- 设置的同一网段的vip
    }
}

virtual_server 192.168.187.200 3306 {   --- 端口号改为3306
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.187.128 3306 {
        weight 1
        TCP_CHECK {
            connect_port 3306    ----- 下面都是3306
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.187.131 3306 {
        weight 1
        TCP_CHECK {
            connect_port 3306
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

# 设置keepalived服务开机自启
[root@M1 ~]# systemctl enable --now keepalived

# 3.配置备用节点配置文件
[root@M2 ~]# vim /etc/keepalived/keepalived.conf 
[root@M2 ~]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived
 
global_defs {
   router_id haproxy01
}
 
vrrp_instance VI_1 {
    state BACKUP
    interface ens160
    virtual_router_id 99
    priority 90       ----- 比主节点低,其它一致
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456789
    }
    virtual_ipaddress {
        192.168.187.200
    }
}
 
virtual_server 192.168.187.200 3306 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP
 
    real_server 192.168.187.128 3306 {
        weight 1
        TCP_CHECK {
            connect_port 3306
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
 
    real_server 192.168.187.131 3306 {
        weight 1
        TCP_CHECK {
            connect_port 3306
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
[root@M2 ~]# systemctl enable --now keepalived
Created symlink /etc/systemd/system/multi-user.target.wants/keepalived.service → /usr/lib/systemd/system/keepalived.service.

# 查看vip
[root@M1 scripts]# ip a
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:d8:60:da brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    inet 192.168.187.128/24 brd 192.168.187.255 scope global dynamic noprefixroute ens160
       valid_lft 1652sec preferred_lft 1652sec
    inet 192.168.187.200/32 scope global ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fed8:60da/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[root@M1 scripts]# 

五.部署MySQL主从

配置主从数据库

                     三台数据库的部署步骤一致
# 1.下载mysql5.7二进制软件包
[root@M1 ~]#  wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.42-el7-x86_64.tar.gz
[root@M1 ~]# ls
anaconda-ks.cfg  mysql-5.7.42-el7-x86_64.tar.gz 
[root@M1 ~]# tar xf mysql-5.7.42-el7-x86_64.tar.gz -C /usr/local
[root@M1 ~]# ls /usr/local/
bin  games    lib    libexec                  sbin   src
etc  include  lib64  mysql-5.7.42-el7-x86_64  share

# 安装依赖
[root@M1 ~]# yum -y install ncurses-compat-libs

# 2.创建mysql用户与组
[root@M1 ~]# groupadd -r -g 306 mysql
[root@M1 ~]# useradd -r -M -s /sbin/nologin -g 306 -u 306 mysql

# 做个软链接
[root@M1 ~]# cd /usr/local
[root@M1 local]# ln -sv mysql-5.7.42-el7-x86_64 mysql 
'mysql' -> 'mysql-5.7.42-el7-x86_64'

# 修改/usr/local/mysql的属主属组
[root@M1 local]# chown -R mysql.mysql /usr/local/mysql

# 设置环境变量
[root@M1 local]# echo 'export PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
[root@c81 local]# . /etc/profile.d/mysql.sh 
[root@c81 local]# ldconfig

# 3.初始化数据库
[root@M1 local]# /usr/local/mysql/bin/mysqld --initialize --user=mysql --datadir=/opt/data/
# 注意:这里指定数据库文件存放地点,待会要用来nfs挂载同步文件
# 记住初始化密码,下面用来登录

# 4.配置数据库
[root@M1 local]# ln -sv /usr/local/mysql/include/ /usr/local/include/mysql
[root@M1 local]# echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf
[root@M1 local]# ldconfig

# 生成配置文件
[root@M1 local]# cat > /etc/my.cnf <<EOF
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
pid-file = /opt/data/mysql.pid
user = mysql
skip-name-resolve
EOF

# 配置服务启动脚本
[root@M1 local]# cp -a /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
[root@M1 local]# sed -ri 's#^(basedir=).*#\1/usr/local/mysql#g' /etc/init.d/mysqld
[root@M1 local]# sed -ri 's#^(datadir=).*#\1/opt/data#g' /etc/init.d/mysqld

# 启动服务
[root@M1 ~]# service mysqld start

# 5.用临时密码登录数据库并重新设置密码
[root@M1 ~]# /usr/local/mysql/bin/mysql -uroot -pFdW#Q_/kX52t
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.42

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> set password = password("2664218545Z")
    -> ;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> exit
Bye

# 6.主数据库配置
# 创建一个授权用户repl从数据库使用,可以访问187网段的所有ip
# 只在一台上做
mysql> grant replication slave on *.* to 'repl'@'192.168.187.%' identified by '123456789';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

# 7.配置主数据库
[root@c81 ~]# vim /etc/my.cnf
[root@c81 ~]# cat /etc/my.cnf 
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
pid-file = /opt/data/mysql.pid
user = mysql
skip-name-resolve
log-bin=mysql_bin   ---- 添加上这俩行
server-id=10        ---- 主数据库id小于从数据库,另外一台主数据库id可以设为10,也可以设为其它,但是要小于从数据库

# 重启mysql服务
[root@c81 ~]# service mysqld stop
Shutting down MySQL.. SUCCESS! 
[root@c81 ~]# service mysqld start
Starting MySQL. SUCCESS! 

# 查看主库的状态
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql_bin.000003 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)


# 8.配置从库
[root@S1 local]# cat /etc/my.cnf 
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
pid-file = /opt/data/mysql.pid
user = mysql
skip-name-resolve
server-id=20              ---- 加上这俩行,从库id大于主库
relay-log=mysql-relay-bin

# 配置从库认主
[root@S1 local]# /usr/local/mysql/bin/mysql -uroot -p2664218545Z

mysql> change master to
    -> master_host='192.168.187.200',    ------- 这里是vip
    -> master_user='repl',
    -> master_password='123456789',
    -> master_log_file=' mysql_bin.000003',
    -> master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.00 sec)


# 启动主从复制
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

# 查看状态
mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.187.200
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql_bin.000003
          Read_Master_Log_Pos: 154
               Relay_Log_File: mysql-relay-bin.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql_bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes       ---- 看到这两个yes表示成功
 

测试数据库共享目录效果

在主节点的主库上创建一个数据库
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)

mysql> create database zz;
Query OK, 1 row affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| zz                 |
+--------------------+
5 rows in set (0.01 sec)

# 在从库上查看
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| zz                 |
+--------------------+
5 rows in set (0.00 sec)

# 关闭主节点的数据库,在备用节点的主数据库查看
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| zz                 |
+--------------------+

六.模拟主节点宕机效果

# 1.现在,主节点上keepalived与mysql服务都是开启的
# 编写脚本,当mysql服务停止时,关闭keepalived服务
[root@M1 ~]# mkdir /scripts
[root@M1 ~]# cd /scripts
[root@M1 scripts]# vim mysql.sh 
[root@M1 scripts]# cat mysql.sh 
#! /bin/bash
if [ `ps -ef | grep -Ev "grep|$0" | grep mysql | wc -l` -lt 2 ];then
        systemctl stop keepalived
fi

# 2.编辑keepalived服务配置文件
[root@M1 scripts]# vim /etc/keepalived/keepalived.conf 
[root@M1 scripts]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived

global_defs {
   router_id haproxy01
}
vrrp_script mysql_check {       ---- mysql_check为事件名
    script "/scripts/mysql.sh"  ----- 时间内容为 interval 1 / 每秒执行一次脚本
    interval 1
}

vrrp_instance VI_1 {
    state MASTER
    interface ens160
    virtual_router_id 99
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456789
    }
    virtual_ipaddress {
        192.168.187.200
    }
    track_script {       --  追踪脚本
        mysql_check
    }
}


virtual_server 192.168.187.200 3306 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.187.128 3306 {
        weight 1
        TCP_CHECK {
            connect_port 3306
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.187.131 3306 {
        weight 1
        TCP_CHECK {
            connect_port 3306
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

# 重启keepalived服务
[root@M1 scripts]# systemctl restart keepalived

测试: 关闭主节点的mysql服务,keepalived服务是否关闭

[root@M1 scripts]# service mysqld stop
Shutting down MySQL............ SUCCESS! 
[root@M1 scripts]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor pres>
   Active: inactive (dead) since Sun 2023-10-15 07:19:36 EDT; 16s ago
  Process: 201683 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, >
 Main PID: 201684 (code=exited, status=0/SUCCESS)

# 关闭mysql服务,keepalived服务被脚本关闭

# 注意
# 另外一台主机虽然可以编写获得vip后启动mysql服务的脚本
# 但是不能够编写失去vip关闭mysqld服务的脚本,因为失去vip意味着主节点mysql服务启动,但是两台主机的mysql服务不能够同时启动

七.zabbix监控主节点mysql服务宕机

zabbix监控端部署详情参考前面的博客

zabbix服务部署

zabbix监控主节点mysql服务宕机可参考前面的博客

zabbix监控实战

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值