linux——mysql高可用

目录

一,了解什么是mysql高可用

1,mysql高可用的组成

2,mysql高可用的优势

二,搭建mysql高可用

2,配置主主复制

3,安装heproxy

4,安装keepalived

一,了解什么是mysql高可用

MySQL 高可用是通过技术手段确保 MySQL 数据库在面临硬件故障、软件错误、网络问题或其他异常情况时,仍能持续提供服务,减少停机时间,保证业务连续性的解决方案。其核心目标是提升数据库系统的可靠性、稳定性和容错能力。

1,mysql高可用的组成

  • **MySQL 主主复制:**两台 MySQL 实例互为主从,双向同步数据,均支持读写操作提供几余和扩展能力。
  • **Keepalived:**通过 VRRP 协议管理虚拟IP(VIP),监控 MySQL 状态,故障时自动将 VIP 漂移至存活节点,确保服务地址不变。
  • **HAProxy:**作为反向代理和负载均衡器,将流量分发至 MySQL 节点,支持健康检查、读写分离(可选)和故障节点自动剔除。

2,mysql高可用的优势

  1. 减少服务中断时间
  • 自动故障切换:当主数据库节点发生故障时,高可用方案(如 MySQL Cluster、MHA、Orchestrator 等)可自动检测并将服务切换到备用节点,确保业务不受影响。

  • 业务连续性:避免因数据库故障导致的网站崩溃、交易中断等问题,尤其适合电商、金融、实时通信等对连续性要求高的场景。

  • 高可用性:Keepalived 实现秒级故障切换,HAProxy健康检查确保流量仅路由到正常节点,避免单点故障。

  • 读写扩展:主主架构支持双节点并发写入,提升写入性能:HAProxy可配置读写分离,利用备节点分担读压力。

  • 灵活扩展:可横向扩展 HAProxy或 MySQL 节点,支持动态调整负载均衡策略(如轮询、权重)运维友好基于开源工具,无厂商锁定,社区支持丰富,适合自建数据库集群

  1. 提升数据可靠性
  • 数据冗余:通过主从复制、多节点数据同步等机制,将数据副本存储在多个节点,防止单节点故障导致数据丢失。
  • 容灾能力:支持异地多活或灾备中心部署,应对自然灾害、机房断电等极端情况,符合企业级数据备份与恢复策略。
  1. 支持弹性扩展
  • 读写分离:高可用架构常结合读写分离(主库写、从库读),将读请求分流到多个从库,提升系统并发处理能力,降低主库压力。
  • 水平扩展:通过分库分表或集群架构(如 MySQL InnoDB Cluster),可动态添加节点,支撑海量数据和高并发业务。
  1. 简化运维管理
  • 自动化监控与管理:高可用方案通常集成监控工具(如 Prometheus、Zabbix),实时监测节点状态、复制延迟、性能指标等,自动触发告警或故障处理流程。
  • 降低运维复杂度:减少人工干预故障恢复的成本,例如无需手动切换 IP、重新配置连接池等,提升运维效率。

二,搭建mysql高可用

1,准备工作

实验需求:在master1,master2服务器上安装mysql数据库,模拟master故障切换,使用haproxy软件并配置复制均衡,使用keepalived软件配置故障转移。

|-----------------|-------------|--------------------|------------------------|
| 主机 | 操作系统 | IP地址 | 服务 |
| master1 | centos8 | 192.168.10.101 | mysql8 |
| master2 | centos8 | 192.168.10.102 | mysql8 |
| keepalived1 | centos8 | 192.168.10.103 | keepalived,haproxy |
| keepalived2 | centos8 | 192.168.10.104 | keepalived,haproxy |

2,配置主主复制

  • 配置主从复制

1,准备工作

cs 复制代码
dnf -y install ntpdate          ##安装时间同步软件包
date                            ##查看时间是否同步

systemctl stop firewalld        ##关闭防火墙
setenforce 0                    ##关闭linux内核

##修改mysql配置文件,添加以下内容(mysqld模块中添加)
[root@localhost local]# vim /etc/my.cnf
log-bin=/usr/local/mysql/mysql-bin            ##指定二进制文件位置
server-id=1                                   ##设置mysql服务id
binlog-format=MIXED                           ##用于控制二进制日志的记录格式为混合模式

systemclt restart mysqld     ##重启mysql数据库

2,登陆mysql进行操作

cs 复制代码
create user 'myslave'@'%' identified by 'pwd123';	##创建用户

grant replication slave on *.* to 'myslave'@'%';	##给复制权限
alter user 'myslave'@'%' identified with mysql_native_password by 'pwd123';   ##为myslave设置密码为pwd123.

flush privileges;       ##更新用户信息



mysql> show master status;            ##查看主服务区状态信息,等会要用
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      342 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

3,在从设备进行操作

cs 复制代码
[root@localhost local]# vim /etc/my.cnf
server-id=2                ##在从服务器添加id(不能与主服务器重复)
systemclt restart mysqld     ##重启mysql数据库



##在从服务器进行操作
change master to master_host='192.168.10.101',master_user='myslave',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=1438;


start slave;              ##启动slave
show slave status\G       ##查看主从状态
         Slave_IO_Running: Yes                  ##找到此部分为两个yes就成功了
            Slave_SQL_Running: Yes
  • 配置主主复制

1,配置从服务器

cs 复制代码
##在从服务器添加
[root@bogon ~]# vim /etc/my.cnf
log-bin=/usr/local/mysql/mysql-bin
binlog-format=MIXED


systemclt restart mysqld     ##重启mysql数据库


create user 'myslave'@'%' identified by 'pwd123'; ##创建用户
grant replication slave on *.* to 'myslave'@'%';  ##修改权限
alter user 'myslave'@'%' identified with mysql_native_password by 'pwd123';  ##该密码
flush privileges;    ##刷新

 show master status;	      ##查看状态信息
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |     1149 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)


stop slave;	                ##一定要关闭slave

2,配置双主连接

cs 复制代码
##在101操作
change master to master_host='192.168.10.102',master_user='myslave',master_ppassword='pwd123',master_log_file='mysql-bin.000001',master_log_pos=1149;	

##查看102的状态
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |     1149 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)



##在102操作
change master to master_host='192.168.10.101',master_user='myslave',master_password='pwd123',master_log_file='mysql-bin.000001',master_log_pos=342;	


##查看101的状态
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      342 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

3,安装heproxy

  • 在103,104都要操作
cs 复制代码
systemctl stop firewalld   ##不要忘记关闭防火墙和内核
setenforce 0


 dnf -y install haproxy          ##安装haproxy
vim /etc/haproxy/haproxy.cfg     ##编辑haproxy配置文件
    mode                    tcp       ##修改这两行
    option                  tcplog 

##defaults模块后面的内容全部删掉
##后面添加当前内容
listen mysql
bind 0.0.0.0:3306              ##显示指定监听地址和端口
balance leastconn              ##复制均衡算法
server mysql1 192.168.10.101:3306 check port 3306 maxconn 300   ##这两和为mysql服务器的ip地址
server mysql2 192.168.10.102:3306 check port 3306 maxconn 300


##启动haproxy服务
haproxy -c -f /etc/haproxy/haproxy.cfg       ##检查haproxy配置文件是否有问题
systemctl restart haproxy                   ##启动haproxy

4,安装keepalived

  • 103服务器进行操作
cs 复制代码
 dnf -y install keepalived                 ##安装keepalived
 cp /etc/keepalived/keepalived.conf.sample /etc/keepalived/keepalived.conf   ##将配置文件复制过来并重命名

 vim /etc/keepalived/keepalived.conf        ##编辑配置文件
global_defs {                      ##此模块内容全部删掉添加此行
   router_id r1
   }

   router_id LVS_01            ##修改id不能和104重复

   #vrrp_strict                ##注释掉此行

vrrp_instance VI_1 {
    state BACKUP            ##改为BACKUP
    nopreempt               ##添加此命令,不抢占
    interface ens160        ##为自己的网卡名
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.100       ##这是vip
    }
}
  • 在104服务器进行操作
cs 复制代码
 dnf -y install keepalived                 ##安装keepalived
 cp /etc/keepalived/keepalived.conf.sample /etc/keepalived/keepalived.conf   ##将配置文件复制过来并重命名

 vim /etc/keepalived/keepalived.conf        ##编辑配置文件
global_defs {                      ##此模块内容全部删掉添加此行
   router_id r2
   }

   router_id LVS_02            ##修改id不能和104重复

   #vrrp_strict                ##注释掉此行

vrrp_instance VI_1 {
    state BACKUP            ##改为BACKUP
    interface ens160        ##为自己的网卡名
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.10.100       ##这是vip
    }
}
  • 103,104编写启动脚本
cs 复制代码
vim /etc/keepalived/chk.sh
chmod +x /etc/keepalived/chk.sh    ##授予执行权限

#!/bin/bash
if [ $(ps -C haproxy --no-header | wc -l ) -eq 0 ];then
        /etc/init.d/keepalived stop
fi


systemctl start keepalived   ##启动服务
  • 进行验证
cs 复制代码
ip add  ##在103查看vip情况,192.168.10.100为vip

2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qle
    link/ether 00:0c:29:1b:2a:2f brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.103/24 brd 192.168.10.255 scope global noprefixroute ens160
       valid_lft forever preferred_lft forever
    inet 192.168.10.100/32 scope global ens160




##在105客户机进行验证
[root@localhost ~]# mysql -umyslave -p123456 -P3306 -h192.168.10.100    ##可以登陆
mysql> 



##关机mysql1服务器再次进行登陆
[root@localhost ~]# mysql -umyslave -p123456 -P3306 -h192.168.10.100    ##可以登陆
mysql> 




##关闭103keepalived在次进行登陆
[root@localhost ~]# mysql -umyslave -p123456 -P3306 -h192.168.10.100    ##可以登陆
mysql> 
相关推荐
小码农豪大大几秒前
windows服务器部署jenkins工具
运维·jenkins
hellolxb8 分钟前
Unreal Engine: Windows 下打包 AirSim项目 为 Linux 平台项目
linux·游戏引擎·虚幻
双层木屋34 分钟前
使用GoLang版MySQLDiff对比表结构
mysql·golang
RLG_星辰44 分钟前
SHELL练习题(1-11题)记录(牛客)
linux·运维·服务器·shell
敲上瘾1 小时前
企业开发工具git的使用:从入门到高效团队协作
linux·git·gitee·github·开发工具
时光飞逝的日子1 小时前
Ubuntu搭建TFTP服务器的方法
linux·ubuntu·tftp
code monkey.1 小时前
【寻找Linux的奥秘】第六章:环境变量
linux·操作系统·环境变量
进击的CJR2 小时前
MySQL 8.0 OCP 英文题库解析(五)
数据库·mysql·开闭原则
✿ ༺ ོIT技术༻3 小时前
Linux:网络层的重要协议或技术
linux·服务器·网络
ICT系统集成阿祥4 小时前
负载均衡—会话保持技术详解
运维·负载均衡