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)]> 
相关推荐
姚远Oracle ACE1 小时前
解读Oracle AWR报告:Global Cache and Enqueue Services - Workload Characteristics
数据库·oracle
流星白龙1 小时前
【Qt】7.信号和槽_connect函数用法(2)
java·数据库·qt
Zzz 小生3 小时前
Claude Code学习笔记(四)-助你快速搭建首个Python项目
大数据·数据库·elasticsearch
nongcunqq6 小时前
abap 操作 excel
java·数据库·excel
rain bye bye7 小时前
calibre LVS 跑不起来 就将setup 的LVS Option connect下的 connect all nets by name 打开。
服务器·数据库·lvs
冻咸鱼7 小时前
MySQL的配置
mysql·配置
阿里云大数据AI技术8 小时前
云栖实录|MaxCompute全新升级:AI时代的原生数据仓库
大数据·数据库·云原生
不剪发的Tony老师9 小时前
Valentina Studio:一款跨平台的数据库管理工具
数据库·sql
weixin_307779139 小时前
在 Microsoft Azure 上部署 ClickHouse 数据仓库:托管服务与自行部署的全面指南
开发语言·数据库·数据仓库·云计算·azure
六元七角八分9 小时前
pom.xml
xml·数据库