TH小破站

  • 首页
  • 容器
    • 认识Docker
    • DockerFile详解
  • k8s
    • 认识Kubernetes
    • Kubernetes部署--(kubeadm方式)
    • kubeasz部署k8s集群
    • Ansible-binary部署k8s集群-1.31.2
  • Ceph
    • 认识分布式存储
    • CPEH部署
  • CI/CD
    • DevOps认识
    • 部署--Gitlab
  • ELK
    • ELK简介
    • Elasticsearch
    • Kibana部署
    • Logstash
    • ELK--收集 tomcat 日志(实战)
  • HD
    • 认识--大数据
    • Hadoop-单机部署
    • Hadoop-伪分布部署
    • Hadoop-完全分布部署
    • Hadoop-(HA)完全分布部署
    • Ambari自动部署--Hadoop
  • Nginx
    • Nginx功能介绍
    • Nginx安全选项
    • Nginx配置文件简单介绍
    • 网站服务器部署
  • 监控
    • ZABBIX-部署(yum)
    • ZABBIX-编译安装
  • 云计算
    • KVM 概述
    • OpenStack企业级部署(T版)
    • OpenStack之dashboard部署
    • OpenStack-controller的高可用
    • openstack(Caracal版_ubuntu版本)部署
  • 数据库
    • mariadb与mysql
    • mysql主从
    • MySQL--冷备(实战)
    • MySQL--热备(dump表)
    • MySQL--热备(dump库)
    • 数据恢复实战案例
    • Xtrabackup实现MySql8.x全量备份
    • MyCat实现数据库读写分离
    • MHA实现数据库高可用
    • Percona XtraDB(PXC)实现数据库集群高可用
    • 数据库压力测试
    • PostgreSQL 基操
    • PostgreSQL备份恢复
    • PostgreSQL高可用
    • MongDB安装配置基础使用
    • MongoDB实现复制集
    • MongoDB备份还原
  • 自动化
    • ssh远程服务原理及配置
    • Ansible剧本文件应用
    • Ansible管理服务介绍
    • Ansible自动化部署node_exporter(包含升级,回滚)
    • Saltstack-部署安装
  • 脚本
    • 一键查看服务器资源利用率
    • 一键生成SSL证书
    • 保存指定数量的文件/目录
    • 初始化服务器
    • 扫描可用IP
    • 批量分发SSH密钥
    • 监控多主机磁盘脚本
    • 一键安装MySQL8.x脚本
    • Python脚本监控ES集群
    • 资源巡检脚本
    • 查看各用户使用的cpu占比
热衷于分享
架构师成长之路 !!!

MHA实现数据库高可用

数据库高可用

下载地址:

  • mananger: http://www.mysql.gr.jp/frame/modules/bwiki/index.php?plugin=attach&pcmd=open&file=mha4mysql-manager-0.56-0.el6.noarch.rpm&refer=matsunobu

  • node:http://www.mysql.gr.jp/frame/modules/bwiki/index.php?plugin=attach&pcmd=open&file=mha4mysql-node-0.56-0.el6.noarch.rpm&refer=matsunobu

架构

主机名 IP 角色
mysql-master 192.168.139.31 主MySQL
mysql-slave01 192.168.139.32 从MySQL
mysql-slave02 192.168.139.33 从MySQL
MHA 192.168.139.34 MHA管理端

1)各节点部署MHA

1.1)安装MHA

`mha节点`
[root@mha ~]# ll
total 116
-rw-r--r-- 1 root root 81024 Dec 30 21:11 mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
-rw-r--r-- 1 root root 36328 Dec 30 21:11 mha4mysql-node-0.58-0.el7.centos.noarch.rpm
[root@mha ~]# yum install -y mha*.rpm
`master节点`
[root@mysql-master ~]# ll
total 40
-rw-------. 1 root root  1717 Dec  2 23:45 anaconda-ks.cfg
-rw-r--r--  1 root root 36328 Dec 30 21:15 mha4mysql-node-0.58-0.el7.centos.noarch.rpm
[root@mysql-master ~]# yum install -y mha*.rpm
`slave01节点`
[root@mysql-slave01 ~]# ll
total 40
-rw-------. 1 root root  1717 Dec  2 23:45 anaconda-ks.cfg
-rw-r--r--  1 root root 36328 Dec 30 21:15 mha4mysql-node-0.58-0.el7.centos.noarch.rpm
[root@mysql-slave01 ~]# yum install -y mha*.rpm
`slave02节点`
[root@mysql-slave02 ~]# ll
total 40
-rw-------. 1 root root  1717 Dec  2 23:45 anaconda-ks.cfg
-rw-r--r--  1 root root 36328 Dec 30 21:16 mha4mysql-node-0.58-0.el7.centos.noarch.rpm
[root@mysql-slave02 ~]# yum install -y mha*.rpm

1.2)配置管理节点MHA

[root@mha ~]# mkdir /etc/mastermha
[root@mha ~]# vim /etc/mastermha/app1.cnf
[server default]
user=mhauser # 用于远程连接MySQL所有节点的用户,需要有管理员的权限
password=stangj
manager_workdir=/data/mastermha/app1/
manager_log=/data/mastermha/app1/manager.log
remote_workdir=/data/mastermha/app1/
ssh_user=root # 用于实现远程ssh基于KEY的连接,访问二进制日志
repl_user=repluser # 主从复制的用户信息
repl_password=stj123
ping_interval=1 # 健康性检查的时间间隔
[server1]
hostname=192.168.139.31
candidate_master=1  
[server2]
hostname=192.168.139.32
candidate_master=1 # 优先为新的master
[server3]
hostname=192.168.139.33
​

1.3)配置ssh免密

[root@mha ~]# ssh-keygen -t rsa -f /root/.ssh/id_rsa -N ''
[root@mha ~]# rm -f  /root/.ssh/known_hosts 
[root@mha ~]# cp /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys
[root@mha ~]# for i in 192.168.139.{31..33} ;do scp -r /root/.ssh $i:/root/ ; done 

2)主从的搭建

2.1)配置主

[root@mysql-master ~]# cat /etc/my.cnf
[mysqld]
server-id = 31 # 重要
log-bin # 重要
skip_name_resolve=1 # 重要
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
!includedir /etc/my.cnf.d
[root@mysql-master ~]# systemctl enable --now mariadb.service 
[root@mysql-master ~]# mysql
​
# 查看二进制位置
MariaDB [(none)]> show master logs;
+--------------------+-----------+
| Log_name           | File_size |
+--------------------+-----------+
| mariadb-bin.000001 |       245 |
+--------------------+-----------+
# 创建账号
MariaDB [(none)]> grant replication slave on *.* to repluser@'%' identified by 'stj123';
# 创建一个管理员账号
MariaDB [(none)]> grant all on *.* to mhauser@'%' identified by 'stangj';
# 刷新权限
MariaDB [(none)]> FLUSH PRIVILEGES;

2.2)配置从

# CHANGE MASTER TO
#    MASTER_HOST='192.168.139.31',
#    MASTER_USER='repluser',
#    MASTER_PASSWORD='stj123',
#    MASTER_PORT=3306,
#    MASTER_LOG_FILE='mariadb-bin.000001',
#    MASTER_LOG_POS=245;
`slave01配置`
[root@mysql-slave01 ~]# grep -E '^[^#]' /etc/my.cnf
[mysqld]
server-id = 32 # 重要
log-bin # 重要
read_only # 重要
relay_log_purge=0 # 重要
skip_name_resolve=1 # 重要
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
!includedir /etc/my.cnf.d
`slave02配置`
[root@mysql-slave02 ~]# grep -E '^[^#]' /etc/my.cnf
[mysqld]
server-id = 33 # 重要
log-bin # 重要
read_only # 重要
relay_log_purge=0 # 重要
skip_name_resolve=1 # 重要
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
!includedir /etc/my.cnf.d
`启动服务slave01和slave02都要配置`
[root@mysql-slave01/slave02 ~]# systemctl enable --now mariadb.service 
[root@mysql-slave01/slave02 ~]# mysql
# 连接同步主mysql
MariaDB [(none)]> CHANGE MASTER TO
        MASTER_HOST='192.168.139.31',
        MASTER_USER='repluser',
        MASTER_PASSWORD='stj123',
        MASTER_PORT=3306,
        MASTER_LOG_FILE='mariadb-bin.000001',
        MASTER_LOG_POS=245;
​
# 启动服务
MariaDB [(none)]> start slave;

2.3)查看主从是否配置成功

# 验证主从状态
MariaDB [(none)]> show slave status\G
...............................
...............................
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
            # 这两个值为YES则为主从配置成功
...............................
...............................

3)MHA验证与启动

3.1)检查Mha的环境

#检查环境
[root@mha ~]# masterha_check_ssh --conf=/etc/mastermha/app1.cnf
..........
Sat Dec 30 22:03:13 2023 - [debug]   ok.
Sat Dec 30 22:03:14 2023 - [info] All SSH connection tests passed successfully.
[root@mha ~]# masterha_check_repl --conf=/etc/mastermha/app1.cnf
.............
Sat Dec 30 23:12:40 2023 - [info]   Executing command : apply_diff_relay_logs --command=test --slave_user='mhauser' --slave_host=192.168.139.33 --slave_ip=192.168.139.33 --slave_port=3306 --workdir=/data/mastermha/app1/ --target_version=5.5.68-MariaDB --manager_version=0.56 --relay_log_info=/var/lib/mysql/relay-log.info  --relay_dir=/var/lib/mysql/  --slave_pass=xxx
Sat Dec 30 23:12:40 2023 - [info]   Connecting to root@192.168.139.33(192.168.139.33:22).. 
Creating directory /data/mastermha/app1/.. done.
  Checking slave recovery environment settings..
    Opening /var/lib/mysql/relay-log.info ... ok.
    Relay log found at /var/lib/mysql, up to mariadb-relay-bin.000003
    Temporary relay log file is /var/lib/mysql/mariadb-relay-bin.000003
    Testing mysql connection and privileges.. done.
    Testing mysqlbinlog output.. done.
    Cleaning up test file(s).. done.
Sat Dec 30 23:12:41 2023 - [info] Slaves settings check done.
Sat Dec 30 23:12:41 2023 - [info] 
192.168.139.31(192.168.139.31:3306) (current master)
 +--192.168.139.32(192.168.139.32:3306)
 +--192.168.139.33(192.168.139.33:3306)
​
Sat Dec 30 23:12:41 2023 - [info] Checking replication health on 192.168.139.32..
Sat Dec 30 23:12:41 2023 - [info]  ok.
Sat Dec 30 23:12:41 2023 - [info] Checking replication health on 192.168.139.33..
Sat Dec 30 23:12:41 2023 - [info]  ok.
Sat Dec 30 23:12:41 2023 - [warning] master_ip_failover_script is not defined.
Sat Dec 30 23:12:41 2023 - [warning] shutdown_script is not defined.
Sat Dec 30 23:12:41 2023 - [info] Got exit code 0 (Not master dead).

3.2)启动MHA

# 启动服务
[root@mha ~]# nohup masterha_manager --conf=/etc/mastermha/app1.cnf &> /dev/null
# 查看日志
[root@mha ~]# cat /data/mastermha/app1/manager.log 

4)验证服务

4.1)到主master人为造一些数据

[root@mysql-master ~]# mysql
MariaDB [(none)]> create database hellodb;
MariaDB [(none)]> use hellodb;
MariaDB [hellodb]> CREATE TABLE student (
        id int UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(20) NOT NULL,
        age tinyint UNSIGNED,
        gender ENUM('M','F') default 'M'
        ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
MariaDB [hellodb]>  insert student (name,age)values('xiaoming',20);
MariaDB [hellodb]> insert student (name,age)values('wangwu',36);
MariaDB [hellodb]> insert student (name,age)values('tanghao',18);

4.2)人为让master故障验证

`关闭master的数据库`
[root@mysql-master ~]# systemctl stop mariadb.service 
​
# mha日志输出
  Creating /data/mastermha/app1 if not exists..    ok.
  Checking output directory is accessible or not..
   ok.
  Binlog found at /var/lib/mysql, up to mariadb-bin.000001
Sat Dec 30 23:13:43 2023 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Sat Dec 30 23:13:43 2023 - [info] Reading application default configuration from /etc/mastermha/app1.cnf..
Sat Dec 30 23:13:43 2023 - [info] Reading server configuration from /etc/mastermha/app1.cnf..

4.3)验证slave01是否成为了新的主

[root@mysql-slave01 ~]# mysql
MariaDB [(none)]>  select * from hellodb.student;
+----+----------+------+--------+
| id | name     | age  | gender |
+----+----------+------+--------+
|  1 | xiaoming |   20 | M      |
|  2 | wangwu   |   36 | M      |
|  3 | tanghao  |   18 | M      |
+----+----------+------+--------+
MariaDB [(none)]> show slave status\G
Empty set (0.00 sec)  # 可以看出来 slave01 不是master的从节点了
​
[root@mysql-slave02 ~]# mysql
MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.139.32  # 可以看出来slave02的主节点是slave01
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mariadb-bin.000001
          Read_Master_Log_Pos: 245
               Relay_Log_File: mariadb-relay-bin.000002
                Relay_Log_Pos: 531
        Relay_Master_Log_File: mariadb-bin.000001

以上则是MHA的高可用部署实现

注意:当主切换以后一定要保证新的主在配置文件中删除read_only,因为万一重启数据库会加载配置文件

COPYRIGHT © 2025 TH小破站. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

渝ICP备2023013789号

渝公网安备50011702500926号