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)]> 
相关推荐
睡不醒男孩03082314 小时前
第二篇:深入探索开源数据库高可用:构建基于CLup的PostgreSQL生产级高可用与读写分离架构
数据库·postgresql·开源·clup
Micro麦可乐16 小时前
Spring Boot 实战:从零设计一个短链系统(含完整代码与数据库设计)
数据库·spring boot·后端·哈希算法·雪花算法·短链系统
码农阿豪16 小时前
从零到一:Spring Boot快速接入金仓数据库实战
数据库·spring boot·后端
鼎讯信通16 小时前
风电光缆运维提质增效:G-4000A 光缆故障追踪仪破解风场巡检难题
运维·网络·数据库
三十..17 小时前
MySQL 从入门到高可用架构实战精要
运维·数据库·mysql
cfm_291418 小时前
Redis五大基本数据结构底层了解
数据结构·数据库·redis
真实的菜18 小时前
Redis 从入门到精通(十二):典型业务场景实战 —— 排行榜、限流器、秒杀系统、Session 共享
数据库·redis·python
你想考研啊18 小时前
mysql数据库导出导入
数据库·mysql·oracle
十年编程老舅19 小时前
Linux DRM:底层逻辑与实践架构
数据库·mysql
The Sheep 202320 小时前
Vue复习
linux·服务器·数据库