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)]> 
相关推荐
二进制漫游记7 小时前
FastAPI项目集成 Qdrant向量数据库+阿里云Embedding完整实战(工具封装+业务调用)
数据库·python·阿里云·embedding
2501_928996227 小时前
GPT-4o换DeepSeek迁移成本多少?中科热备解析API聚合平台技术账本
前端·数据库·人工智能
泡干脆面就番茄10 小时前
MySQL_子查询_分页查询与联合查询详解
数据库·mysql
devpotato11 小时前
缓存与数据库更新顺序不一致问题
java·数据库·redis
天若有情67311 小时前
Node+MySQL小型全栈笔记项目实战课程分享
数据库·笔记·mysql
wxwx_bscxy32211 小时前
基于springboot宠物领养系统的设计与实现
数据库·spring boot·后端·spring·宠物
九月要晚安12 小时前
达梦DW与AFC对比
数据库
实战派K8S&DB12 小时前
如何在内网配置 TiDB 数据库 Agent
数据库·人工智能·分布式·tidb
实战派K8S&DB12 小时前
《基于 Dify + FastAPI + PyTiDB 搭建大模型驱动的 TiDB 智能运维 Agent》
运维·数据库·分布式·云原生·tidb·fastapi
SelectDB12 小时前
Apache Doris 5.0 年度版本前瞻(一):构建统一的多模湖仓实时分析平台
大数据·数据库·数据分析