MySQL(179)如何设计MySQL的高可用架构?

设计MySQL的高可用架构涉及多个方面,包括数据冗余、负载均衡、自动故障转移、读写分离等。以下是一个详细的高可用架构设计方案,并结合代码进行解释。

一、架构设计概述

我们将采用以下组件来构建高可用的MySQL架构:

  1. 主从复制:用于数据冗余和读写分离。
  2. Keepalived:用于VIP(虚拟IP)管理,实现主从节点的自动故障转移。
  3. ProxySQL或HAProxy:用于负载均衡和读写分离。

二、具体实施步骤

1. 配置主从复制

首先,配置MySQL主服务器(Master)和从服务器(Slave)。

1.1 配置Master节点

编辑/etc/my.cnf(或/etc/mysql/my.cnf)文件:

ini 复制代码
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-format=ROW

重新启动MySQL服务:

bash 复制代码
sudo systemctl restart mysql

创建复制用户并赋予权限:

sql 复制代码
CREATE USER 'replica'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%';
FLUSH PRIVILEGES;

获取Master的二进制日志文件和位置:

sql 复制代码
SHOW MASTER STATUS;

这将输出类似如下的信息:

diff 复制代码
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      154 |              |                  |
+------------------+----------+--------------+------------------+

记下FilePosition值。

1.2 配置Slave节点

编辑Slave节点的/etc/my.cnf文件:

ini 复制代码
[mysqld]
server-id=2
relay-log=relay-log

重新启动MySQL服务:

bash 复制代码
sudo systemctl restart mysql

将Master的数据导入到Slave节点:

bash 复制代码
mysqldump -u root -p --all-databases --master-data > db_dump.sql
mysql -u root -p < db_dump.sql

配置Slave节点以开始复制:

sql 复制代码
CHANGE MASTER TO
MASTER_HOST='Master节点IP',
MASTER_USER='replica',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',  -- 从SHOW MASTER STATUS获得
MASTER_LOG_POS=154;  -- 从SHOW MASTER STATUS获得

START SLAVE;

检查复制状态:

sql 复制代码
SHOW SLAVE STATUS\G

确保Slave_IO_RunningSlave_SQL_Running都为Yes

2. 配置Keepalived

Keepalived用于管理VIP,实现Master节点故障自动切换到Slave节点。

2.1 安装Keepalived

在Master和Slave节点上安装Keepalived:

bash 复制代码
sudo apt-get install keepalived  # Ubuntu
sudo yum install keepalived  # CentOS
2.2 配置Keepalived

在Master节点上编辑/etc/keepalived/keepalived.conf

conf 复制代码
vrrp_instance VI_1 {
    state MASTER
    interface eth0  # 网络接口名称
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.0.100  # 虚拟IP
    }
    track_script {
        chk_mysql
    }
}

vrrp_script chk_mysql {
    script "pidof mysqld"  # 检查MySQL是否运行
    interval 2
    weight 2
}

在Slave节点上编辑/etc/keepalived/keepalived.conf

conf 复制代码
vrrp_instance VI_1 {
    state BACKUP
    interface eth0  # 网络接口名称
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.0.100  # 虚拟IP
    }
    track_script {
        chk_mysql
    }
}

vrrp_script chk_mysql {
    script "pidof mysqld"  # 检查MySQL是否运行
    interval 2
    weight 2
}

启动Keepalived服务:

bash 复制代码
sudo systemctl start keepalived
sudo systemctl enable keepalived

3. 配置ProxySQL或HAProxy

ProxySQL或HAProxy用于实现读写分离和负载均衡。

3.1 安装ProxySQL
bash 复制代码
sudo apt-get install proxysql  # Ubuntu
sudo yum install proxysql  # CentOS
3.2 配置ProxySQL

编辑ProxySQL配置文件/etc/proxysql.cnf

ini 复制代码
datadir="/var/lib/proxysql"
admin_variables=
{
    admin_credentials="admin:admin"
    mysql_ifaces="0.0.0.0:6032"
}
mysql_variables=
{
    threads=4
}
mysql_servers =
(
    { address = "192.168.0.100", port = 3306, hostgroup = 0, max_connections = 1000 }
)
mysql_users =
(
    { username = "proxyuser", password = "proxypass", default_hostgroup = 0, active = 1 }
)
mysql_query_rules =
(
    { rule_id = 1, active = 1, match_pattern = "^SELECT.*", destination_hostgroup = 1, apply = 1 }
)

启动ProxySQL:

bash 复制代码
sudo systemctl start proxysql
sudo systemctl enable proxysql
3.3 配置HAProxy

如果选择HAProxy,可以使用以下配置:

安装HAProxy:

bash 复制代码
sudo apt-get install haproxy  # Ubuntu
sudo yum install haproxy  # CentOS

编辑HAProxy配置文件/etc/haproxy/haproxy.cfg

ini 复制代码
global
    log /dev/log    local0
    log /dev/log    local1 notice
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
    stats timeout 30s
    user haproxy
    group haproxy
    daemon

defaults
    log     global
    option  httplog
    option  dontlognull
    timeout connect 5000
    timeout client  50000
    timeout server  50000
    errorfile 400 /etc/haproxy/errors/400.http
    errorfile 403 /etc/haproxy/errors/403.http
    errorfile 408 /etc/haproxy/errors/408.http
    errorfile 500 /etc/haproxy/errors/500.http
    errorfile 502 /etc/haproxy/errors/502.http
    errorfile 503 /etc/haproxy/errors/503.http
    errorfile 504 /etc/haproxy/errors/504.http

frontend mysql_front
    bind *:3306
    mode tcp
    default_backend mysql_back

backend mysql_back
    mode tcp
    balance roundrobin
    server mysql1 192.168.0.100:3306 check  # Master节点的VIP
    server mysql2 192.168.0.101:3306 check  # 备用节点的IP

启动HAProxy:

bash 复制代码
sudo systemctl start haproxy
sudo systemctl enable haproxy

三、总结

通过上述步骤,我们设计并实现了一个高可用的MySQL架构。这个架构包括以下关键组件:

  1. 主从复制:实现数据冗余和读写分离。
  2. Keepalived:管理VIP,实现主从节点自动故障转移。
  3. ProxySQL或HAProxy:实现负载均衡和读写分离。

这种架构确保了MySQL数据库的高可用性,能够在节点故障时自动切换,保证业务的连续性。同时,通过读写分离,可以有效提升数据库的读写性能。

相关推荐
Cisyam27 分钟前
使用Bright Data API轻松构建LinkedIn职位数据采集系统
后端
float_六七28 分钟前
Spring Boot 3为何强制要求Java 17?
java·spring boot·后端
bobz96541 分钟前
ovs arp
后端
_風箏1 小时前
SpringBoot【集成ElasticSearch 01】2种方式的高级客户端 RestHighLevelClient 使用(依赖+配置+客户端API测试源码
后端
用户21411832636021 小时前
dify案例分享-零基础上手 Dify TTS 插件!从开发到部署免费文本转语音,测试 + 打包教程全有
后端
架构师沉默1 小时前
Java 开发者别忽略 return!这 11 种写法你写对了吗?
java·后端·架构
EndingCoder1 小时前
React 19 与 Next.js:利用最新 React 功能
前端·javascript·后端·react.js·前端框架·全栈·next.js
RainbowJie11 小时前
Gemini CLI 与 MCP 服务器:释放本地工具的强大潜力
java·服务器·spring boot·后端·python·单元测试·maven
ITMan彪叔2 小时前
Nodejs打包 Webpack 中 __dirname 的正确配置与行为解析
javascript·后端
用户89535603282202 小时前
告别重复,用Go泛型精简Gin代码
后端·gin