MySQL高可用

1. 什么是 MySQL 高可用

MySQL 高可用(High Availability)是指通过冗余设计,确保数据库服务在单节点故障、网络中断或硬件损坏等异常情况下,仍能持续对外提供服务,同时保证数据一致性。其核心目标是实现 "零停机、零数据丢失"的业务连续性。

优势

  • **高可用性:**Keepalived 实现秒级故障切换,HAProxy健康检查确保流量仅路由到正常节点,避免单点故障。
  • **读写扩展:**主主架构支持双节点并发写入,提升写入性能;HAProxy可配置读写分离,利用各节点分担读压力。
  • **灵活扩展:**可横向扩展 HAProxy 或 MySQL 节点,支持动态调整负载均衡策略(如轮询、权重)。运维友好基于开源工具,无厂商锁定,社区支持丰富,适合自建数据库集群。

2. 实验步骤

此实验需要两台MySQL(双主)两台haproxy以及keepalived 一台客户机

MySQL高可用是建立于双主之间的

关闭防火墙 关闭内核

复制代码
systemctl stop firewalld
setenforce 0

01修改my.cnf

复制代码
[client] 
socket=/usr/local/mysql/data/mysql.sock 
[mysqld] 
socket=/usr/local/mysql/data/mysql.sock 
bind-address = 0.0.0.0 
 
server-id=1                                
log-bin=/usr/local/mysql/data/mysql-bin
binlog-format=MIXED
log-slave-updates=1                       
                       
skip-name-resolve 
port = 3306 
basedir=/usr/local/mysql 
datadir=/usr/local/mysql/data 
max_connections=2048 
character-set-server=utf8 
default-storage-engine=INNODB 
max_allowed_packet=16M
 
[mysqld_safe]
log-error=/usr/local/mysql/data/error.log
#pid-file=/var/run/mariadb/mariadb.pid

02修改/etc/my.cnf

复制代码
[client] 
socket=/usr/local/mysql/data/mysql.sock 
[mysqld] 
socket=/usr/local/mysql/data/mysql.sock 
bind-address = 0.0.0.0 
 
server-id=2
log-bin=/usr/local/mysql/data/mysql-bin
binlog-format=MIXED
log-slave-updates=1
 
skip-name-resolve 
port = 3306 
basedir=/usr/local/mysql 
datadir=/usr/local/mysql/data 
max_connections=2048 
character-set-server=utf8 
default-storage-engine=INNODB 
max_allowed_packet=16M
 
[mysqld_safe]
log-error=/usr/local/mysql/data/error.log
#pid-file=/var/run/mariadb/mariadb.pid

01、02登录MySQL并创建用户

复制代码
[root@localhost ~]# mysql -uroot -ppwd123      
 
mysql> create user 'myslave'@'%' identified by 'pwd123';  
 
mysql> grant replication slave on *.* to 'myslave'@'%';   
 
mysql> alter user 'myslave'@'%' identified with mysql_native_password by 'pwd123';  
 
mysql> flush privileges;        
 
mysql> show master status;          
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |     1249 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |     1048 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

01连接02

复制代码
mysql> change master to master_host='192.168.10.102',master_user='myslave',master_password='pwd123',master_log_file='mysql-bin.000001',master_log_pos=1048;
Query OK, 0 rows affected, 8 warnings (0.01 sec)

02连接01

复制代码
mysql> change master to master_host='192.168.10.101',master_user='myslave',master_password='pwd123',master_log_file='mysql-bin.000001',master_log_pos=1249;
Query OK, 0 rows affected, 8 warnings (0.01 sec)

安装haproxy以及keepalived

下载haproxy

复制代码
dnf -y install haproxy

修改haproxy配置文件

复制代码
vim /etc/haproxy/haproxy.cfg
defaults
    mode                    tcp		#更改tcp
    log                     global
    option                  tcplog		#更改tcp
    option                  dontlognull
    retries                 3
    timeout http-request    5s
    timeout queue           1m
    timeout connect         5s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 5s
    timeout check           5s
    maxconn                 3000
将frontend main模板(包括fronted)以后的全部删掉
listen mysql
bind 0.0.0.0:3306   #监听地址及端口号
balance leastconn   #最小连接数
server mysql1 192.168.10.101:3306 check port 3306 maxconn 300
server mysql2 192.168.10.102:3306 check port 3306 maxconn 300

启动haproxy

复制代码
systemctl start haproxy
netstat -anpt |grep haproxy	

下载keepalived

复制代码
dnf -y install keepalived

将keepalived的模板复制出来并换后缀

复制代码
cd /etc/keepalived/
cp keepalived.conf.sample keepalived.conf

修改配置文件

复制代码
vim keepalived.conf
 notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_01			#id
   vrrp_skip_check_adv_addr
   #vrrp_strict			
   vrrp_garp_interval 0
   vrrp_gna_interval 0
 
vrrp_instance VI_1 {
    state BACKUP		
    nopreempt
    interface ens33		
    virtual_router_id 51
    priority 100			
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
 
virtual_ipaddress {
        192.168.10.100			
        #192.168.200.17
       # 192.168.200.18
    }

notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_02			#id
   vrrp_skip_check_adv_addr
   #vrrp_strict			
   vrrp_garp_interval 0
   vrrp_gna_interval 0
 
vrrp_instance VI_1 {
    state BACKUP
    interface ens33			
    virtual_router_id 51
    priority 90			
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
 
virtual_ipaddress {
        192.168.10.100			
        #192.168.200.17
       # 192.168.200.18
    }

调用keepalived

复制代码
vim keepalived.conf
vrrp_script chk_haproxy {		
   script "/etc/keepalived/chk.sh"
   interval 2
}
 
    track_script {			
        chk_haproxy
        }

chmod +x chk.sh

客户机使用haproxy代理访问MySQL

复制代码
mysql -umyslave -ppwd123 -P3306 -h192.168.10.103
 
MySQL [(none)]> show databases;		
ERROR 2013 (HY000): Lost connection to MySQL server during query
MySQL [(none)]> show databases;		
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    18
Current database: *** NONE ***
 
+--------------------+
| Database           |
+--------------------+
| information_schema |
| performance_schema |
+--------------------+
2 rows in set (0.006 sec)
MySQL [(none)]> 
相关推荐
王柏龙几秒前
Entity Framework Core (EF Core) 中Database
数据库·microsoft
时序数据说4 分钟前
时序数据库IoTDB的优势场景分析
大数据·数据库·物联网·时序数据库·iotdb
MacroZheng15 分钟前
换掉Navicat!一款集成AI功能的数据库管理工具,功能真心强大!
java·后端·mysql
是阿建吖!17 分钟前
【Redis】初识Redis(定义、特征、使用场景)
数据库·redis·缓存
Leo.yuan18 分钟前
数据处理工具是做什么的?常见数据处理方法介绍
大数据·数据库·人工智能·python·信息可视化
旧时光巷27 分钟前
SQL基础⑫ | 视图篇
数据库·sql·学习·mysql·oracle·视图
阿里云大数据AI技术1 小时前
[VLDB 2025]面向云计算平台的多模态慢查询根因排序
大数据·数据库·人工智能
二向箔reverse1 小时前
在 CentOS 中安装 MySQL 的过程与问题解决方案
linux·mysql·centos
WJ.Polar2 小时前
Python与Mysql
开发语言·数据库·python·mysql
ssjnbnbnb2 小时前
数据库概述(学习笔记)
数据库·笔记·学习