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 [email protected] 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 [email protected] 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)]>