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高可用的优势
- 减少服务中断时间
- 自动故障切换:当主数据库节点发生故障时,高可用方案(如 MySQL Cluster、MHA、Orchestrator 等)可自动检测并将服务切换到备用节点,确保业务不受影响。
- 业务连续性:避免因数据库故障导致的网站崩溃、交易中断等问题,尤其适合电商、金融、实时通信等对连续性要求高的场景。
- 高可用性:Keepalived 实现秒级故障切换,HAProxy健康检查确保流量仅路由到正常节点,避免单点故障。
- 读写扩展:主主架构支持双节点并发写入,提升写入性能:HAProxy可配置读写分离,利用备节点分担读压力。
- 灵活扩展:可横向扩展 HAProxy或 MySQL 节点,支持动态调整负载均衡策略(如轮询、权重)运维友好基于开源工具,无厂商锁定,社区支持丰富,适合自建数据库集群
- 提升数据可靠性
- 数据冗余:通过主从复制、多节点数据同步等机制,将数据副本存储在多个节点,防止单节点故障导致数据丢失。
- 容灾能力:支持异地多活或灾备中心部署,应对自然灾害、机房断电等极端情况,符合企业级数据备份与恢复策略。
- 支持弹性扩展
- 读写分离:高可用架构常结合读写分离(主库写、从库读),将读请求分流到多个从库,提升系统并发处理能力,降低主库压力。
- 水平扩展:通过分库分表或集群架构(如 MySQL InnoDB Cluster),可动态添加节点,支撑海量数据和高并发业务。
- 简化运维管理
- 自动化监控与管理:高可用方案通常集成监控工具(如 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,准备工作
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进行操作
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,在从设备进行操作
[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,配置从服务器
##在从服务器添加
[root@bogon ~]# vim /etc/my.cnf
log-bin=/usr/local/mysql/mysql-bin
binlog-format=MIXEDsystemclt 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,配置双主连接
##在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都要操作
systemctl stop firewalld ##不要忘记关闭防火墙和内核
setenforce 0dnf -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服务器进行操作
dnf -y install keepalived ##安装keepalivedcp /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 ##改为BACKUPnopreempt ##添加此命令,不抢占interface ens160 ##为自己的网卡名virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.10.100 ##这是vip}
}
- 在104服务器进行操作
dnf -y install keepalived ##安装keepalivedcp /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 ##改为BACKUPinterface ens160 ##为自己的网卡名virtual_router_id 51priority 90advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.10.100 ##这是vip}
}
- 103,104编写启动脚本
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
fisystemctl start keepalived ##启动服务
- 进行验证
ip add ##在103查看vip情况,192.168.10.100为vip2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlelink/ether 00:0c:29:1b:2a:2f brd ff:ff:ff:ff:ff:ffinet 192.168.10.103/24 brd 192.168.10.255 scope global noprefixroute ens160valid_lft forever preferred_lft foreverinet 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>