欢迎光临
我们一直在努力

CentOS 7 企业级数据库高可用实战:MySQL MGR + Router + MHA 与 Redis 集群全栈部署指南

目录

  • 摘要
  • mysql路由
  • 组复制(MGR–MySQL Group Replication)单主模式配置
  • mysql shell
  • mysql router+keepalived 高可用
  • MHA部署
    • 准备工作
    • 详细配置
    • MHA部署
    • MHA故障手动切换
    • MHA故障自动切换
  • Redis
    • Redis安装
    • redis主从复制
    • redis高可用
      • redis+哨兵模式(Sentinel)
      • redis集群

摘要

本文详细介绍了在 CentOS 7 环境下构建高可用 MySQL 数据库及 Redis 缓存层的完整解决方案。主要内容包括:

  • MySQL Group Replication (MGR):配置单主模式集群,实现数据强一致性复制。
  • MySQL Router:部署读写分离代理,自动路由请求至 MGR 集群的正确节点。
  • Keepalived + LVS:为 MySQL Router 提供虚拟 IP (VIP) 漂移,消除单点故障,实现高可用访问入口。
  • MHA (Master High Availability):作为传统主从架构的自动故障切换方案,实现主库故障时的快速切换与从库重定向。
  • Redis:部署主从复制、哨兵模式及集群模式,满足不同规模下的高性能缓存与高可用需求。
  • 通过分步实操演示,从环境准备、服务配置到故障模拟切换,完整呈现了企业级数据库高可用架构的搭建与验证过程。

    关键词:MySQL 高可用,MGR,MySQL Router,MHA,Redis 集群

    mysql路由

    Mysql Router 部署 ·Router 通过读取元数据(来自MGR集群)自动感知节点角色,将写请求路由到主节点,读请求分发到从节点; ·使用 mysqlrouter –bootstrap 命令可自动生成配置文件,简化手工配置。

    #mysql路由部署
    rpm -ivh mysql-router-community-8.0.46-1.el7.x86_64.rpm
    cd /etc/mysqlrouter/
    vim mysqlrouter.conf

    在这里插入图片描述

    systemctl enable –now mysqlrouter.service
    yum install -y mariadb
    create user'lzc'@'%'identified by '654321';
    mysql -h 192.168.88.146 -P 7001 -u lzc -p654321 –default-auth=mysql_native_password

    在这里插入图片描述

    在这里插入图片描述 子节点查看网络连接

    yum install -y lsof
    lsof -i :3306

    在这里插入图片描述

    组复制(MGR–MySQL Group Replication)单主模式配置

    ·server-id 必须全局唯一,gtid_mode=ON 和 enforce-gtid-consistency=ON 开启GTID,便于故障恢复;

    ·group_replication_group_name 使用UUID格式,集群内所有节点必须一致;

    ·group_replication_local_address 和 group_replication_group_seeds 分别定义本节点通信地址和集群成员列表;

    ·启动第一个节点时需临时开启 group_replication_bootstrap_group=ON,后续节点仅需执行 START GROUP_REPLICATION;

    ·注意检查防火墙/安全组放行 33061 端口(组复制内部通信)和 3306 端口。 在这里插入图片描述

    systemctl stop mysqld
    rm -fr *
    vim /etc/mysql/my.cnf

    server1主节点

    disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
    server-id=1
    gtid_mode=ON
    enforce-gtid-consistency=ON
    binlog_checksum=NONE
    log_bin=binlog
    log_replica_updates=ON
    plugin_load_add='group_replication.so'
    group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
    group_replication_start_on_boot=off
    group_replication_local_address= "192.168.88.143:33061"
    group_replication_group_seeds= "192.168.88.143:33061,192.168.88.144/:33061,192.168.88.145:33061"
    group_replication_bootstrap_group=off
    group_replication_ip_whitelist="192.168.88.0/24,127.0.0.1/8"
    group_replication_single_primary_mode=ON;
    group_replication_enforce_update_everywhere_checks=OFF;

    mysqld –defaults-file=/etc/mysql/my.cnf –initialize

    mysql> SET GLOBAL group_replication_bootstrap_group=ON;
    Query OK, 0 rows affected (0.00 sec)

    mysql> START GROUP_REPLICATION;
    Query OK, 0 rows affected, 1 warning (2.09 sec)

    mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
    Query OK, 0 rows affected (0.00 sec)

    mysql> SELECT * FROM performance_schema.replication_group_members;
    +—————————+————————————–+————-+————-+————–+————-+—————-+—————————-+
    | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
    +—————————+————————————–+————-+————-+————–+————-+—————-+—————————-+
    | group_replication_applier | 01e2c8988c0611f1b570000c292077de | server1 | 3306 | ONLINE | PRIMARY | 8.0.36 | XCom |
    +—————————+————————————–+————-+————-+————–+————-+—————-+—————————-+
    1 row in set (0.03 sec)

    server2 slave

    mysql> START GROUP_REPLICATION;
    Query OK, 0 rows affected, 1 warning (2.02 sec)
    mysql> SELECT * FROM performance_schema.replication_group_members;
    +—————————+————————————–+————-+————-+————–+————-+—————-+—————————-+
    | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
    +—————————+————————————–+————-+————-+————–+————-+—————-+—————————-+
    | group_replication_applier | 01e2c8988c0611f1b570000c292077de | server1 | 3306 | ONLINE | PRIMARY | 8.0.36 | XCom |
    | group_replication_applier | cd3c83298c0911f1b547000c294eca46 | server2 | 3306 | RECOVERING | SECONDARY | 8.0.36 | XCom |
    +—————————+————————————–+————-+————-+————–+————-+—————-+—————————-+
    2 rows in set (0.12 sec)

    再添加一个slave,server3 server3与server2进行相同操作

    在这里插入图片描述

    mysql shell

    server4-mysql router

    yum install -y mysql-shell-8.0.46-1.el7.x86_64.rpm
    mysqlsh icadmin@192.168.88.143:3306

    server1–主节点

    mysql> CREATE USER icadmin@'%' IDENTIFIED BY '654321';
    Query OK, 0 rows affected (0.09 sec)

    mysql> GRANT ALL PRIVILEGES ON *.* TO icadmin@'%' WITH GRANT OPTION;
    Query OK, 0 rows affected (0.03 sec)

    mysql> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0.02 sec)

    server4:路由器接管MGR集群

    MySQL 192.168.88.143:3306 ssl JS > var cluster = dba.createCluster("mgr_single_cluster", {adoptFromGR:true, force:true});

    在这里插入图片描述

    #查看集群状态
    cluster.status();

    在这里插入图片描述

    mysqlrouter –bootstrap icadmin@192.168.88.143:3306 –user=mysqlrouter
    systemctl restart mysqlrouter.service

    在这里插入图片描述

    mysql router+keepalived 高可用

    在这里插入图片描述 ·在 server6 和 server7 上部署 Keepalived,通过 VRRP 虚拟出一个 IP(192.168.88.100),并配置 LVS 将流量分发至两台Router(server4, server5);master:server6

    ·lb_algo wrr 采用加权轮询调度,persistence_timeout 保持用户会话粘性;

    ·通过 TCP_CHECK 检测后端Router服务的存活状态,实现自动剔除故障节点。

    部署另一台路由器 在这里插入图片描述

    yum install -y keepalived

    vim /etc/keepalived/keepalived.conf

    global_defs {
    notification_email {
    root@localhost
    }
    notification_email_from keepalived@localhost
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
    router_id LVS_DEVEL
    vrrp_skip_check_adv_addr
    #vrrp_strict
    vrrp_garp_interval 0
    vrrp_gna_interval 0
    }

    vrrp_instance VI_1 {
    state MASTER
    interface ens32
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
    auth_type PASS
    auth_pass 1111
    }
    virtual_ipaddress {
    192.168.88.100
    }
    }

    virtual_server 192.168.88.100 6446 {
    delay_loop 3
    lb_algo wrr
    lb_kind DR
    persistence_timeout 300
    protocol TCP

    real_server 192.168.88.146 6446 {
    weight 1
    TCP_CHECK {
    connect_timeout 3
    connect_port 6446
    }
    }
    real_server 192.168.88.147 6446 {
    weight 1
    TCP_CHECK {
    connect_timeout 3
    connect_port 6446
    }
    }
    virtual_server 192.168.88.100 6447 {
    delay_loop 3
    lb_algo wrr
    lb_kind DR
    persistence_timeout 300
    protocol TCP

    real_server 192.168.88.146 6447 {
    weight 1
    TCP_CHECK {
    connect_timeout 3
    connect_port 6447
    }
    }
    real_server 192.168.88.147 6447 {
    weight 1
    TCP_CHECK {
    connect_timeout 3
    connect_port 6447
    }
    }

    }

    }

    backup:server7

    global_defs {
    notification_email {
    root@localhost
    }
    notification_email_from keepalived@localhost
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
    router_id LVS_DEVEL
    vrrp_skip_check_adv_addr
    #vrrp_strict
    vrrp_garp_interval 0
    vrrp_gna_interval 0
    }
    vrrp_instance VI_1 {
    state MASTER
    interface ens32
    virtual_router_id 51
    priority 90 #权重比master小
    advert_int 1
    authentication {
    auth_type PASS
    auth_pass 1111
    }
    virtual_ipaddress {
    192.168.88.100
    }
    }
    virtual_server 192.168.88.100 6446 {
    delay_loop 3
    lb_algo wrr
    lb_kind DR
    persistence_timeout 300
    protocol TCP

    real_server 192.168.88.146 6446 {
    weight 1
    TCP_CHECK {
    connect_timeout 3
    connect_port 6446
    }
    }
    real_server 192.168.88.147 6446 {
    weight 1
    TCP_CHECK {
    connect_timeout 3
    connect_port 6446
    }
    }
    virtual_server 192.168.88.100 6447 {
    delay_loop 3
    lb_algo wrr
    lb_kind DR
    persistence_timeout 300
    protocol TCP

    real_server 192.168.88.146 6447 {
    weight 1
    TCP_CHECK {
    connect_timeout 3
    connect_port 6447
    }
    }
    real_server 192.168.88.147 6447 {
    weight 1
    TCP_CHECK {
    connect_timeout 3
    connect_port 6447
    }
    }

    }

    MHA部署

    准备工作

    ·在 server1、server2、server3 上配置一主两从异步复制,均开启GTID,简化位置管理;

    ·创建用于复制的专用用户 repl 和 MHA管理用户 root(需具备管理权限);

    ·所有节点需配置SSH免密登录,MHA依赖SSH进行日志传输和故障切换。

    详细配置

    primary

    systemctl stop mysqld
    [root@server1 mysql]# cd /data/mysql
    [root@server1 mysql]# rm -fr *
    [root@server1 mysql]# vim /etc/mysql/my.cnf
    [mysqld]
    basedir=/usr/local/mysql
    datadir=/data/mysql
    socket=/data/mysql/mysql.sock
    log-bin=mysql-bin
    port=3306
    user=mysql
    pid-file=/data/mysql/mysql.pid
    character-set-server=utf8mb4
    collation-server=utf8mb4_unicode_ci
    log-error=/data/mysql/mysql-error.log
    innodb_buffer_pool_size=1G
    max_connections=1000
    default_authentication_plugin=mysql_native_password
    server_id=1
    gtid_mode=ON
    enforce_gtid_consistency=ON
    log_slave_updates=ON
    log_bin=binlog
    [client]
    socket=/data/mysql/mysql.sock

    [root@server1 mysql]# mysqld –defaults-file=/etc/mysql/my.cnf –initialize
    [root@server1 mysql]# systemctl start mysqld

    mysql> alter user root@localhost identified by ‘654321’; Query OK, 0 rows affected (0.01 sec)

    mysql> CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY '654321';
    Query OK, 0 rows affected (0.01 sec)

    mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
    Query OK, 0 rows affected (0.01 sec)

    mysql> show master status;
    +—————+———-+————–+——————+——————————————+
    | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +—————+———-+————–+——————+——————————————+
    | binlog.000002 | 950 | | | 30a2d7e48e7c11f1863a000c292077de:13 |
    +—————+———-+————–+——————+——————————————+
    1 row in set (0.00 sec)

    在这里插入图片描述 slave

    systemctl stop mysqld
    cd /data/mysql
    rm -fr *
    vim /etc/mysql/my.cnf
    mysqld –defaults-file=/etc/mysql/my.cnf –initialize
    grep 'temporary password' /data/mysql/mysql-error.log

    mysql> alter user root@localhost identified by '654321';
    Query OK, 0 rows affected (0.03 sec)
    mysql> change master to master_host='192.168.36.173', master_user='repl', master_password='654321', master_auto_position=1;
    Query OK, 0 rows affected, 7 warnings (0.03 sec)

    mysql> start slave;
    Query OK, 0 rows affected, 1 warning (0.03 sec)

    mysql> show slave status\\G;

    在这里插入图片描述

    mysql> create database westos;
    Query OK, 1 row affected (0.02 sec)

    mysql> use westos
    Database changed
    mysql> create table user_tb (username varchar(25) not null,
    > password varchar(50) not null);
    Query OK, 0 rows affected (0.08 sec)

    mysql> insert into user_tb values ('user1','111');
    Query OK, 1 row affected (0.21 sec)

    mysql> insert into user_tb values ('user2','222');
    Query OK, 1 row affected (0.01 sec)

    mysql> select * from westos.user_tb;

    在这里插入图片描述

    MHA部署

    server4

    systemctl stop mysqlrouter.service
    ssh-keygen
    ssh-copy-id server4
    scp -r .ssh/ server1:
    scp -r .ssh/ server2:
    scp -r .ssh/ server3:
    yum install -y ha4mysql-node-0.58-0.el7.centos.noarch.rpm
    #若果安装失败,添加epel源
    wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
    yum install -y mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
    #集群安装客户端软件
    scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm server1:
    scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm server2:
    scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm server3:
    mkdir /etc/masterha
    cd /etc/masterha
    vim /etc/masterha/app1.cnf
    [server default]
    user=root
    password=654321
    ssh_user=root
    repl_user=repl
    repl_password=654321
    master_binlog_dir=/data/mysql
    remote_workdir=/tmp
    secondary_check_script= masterha_secondary_check -s 192.168.88.144 -s 192.168.88.145
    ping_interval=3
    manager_workdir=/etc/masterha/app1
    manager_log=/etc/masterha/app1/manager.log
    [server1]
    hostname=192.168.88.143
    candidate_master=1
    check_repl_delay=0

    [server2]
    hostname=192.168.88.144
    no_master=1

    [server3]
    hostname=192.168.88.145
    candidate_master=1
    check_repl_delay=0
    检查免密连接
    masterha_check_ssh –conf=/etc/masterha/app1.cnf

    在这里插入图片描述 检查集群

    masterha_check_repl –conf=/etc/masterha/app1.cnf

    在这里插入图片描述

    MHA故障手动切换

    在这里插入图片描述

    MHA故障自动切换

    ·监控进程 masterha_manager 定期通过 ping_interval 检测主库健康;

    ·当主库故障时,MHA自动执行 master_ip_failover 脚本,将VIP漂移到新主库,并将所有从库重新指向新主;

    ·切换完成后,原主库恢复后可作为新的从库加入集群。 在这里插入图片描述

    授予可执行权限 chmod 755 master_ip_failover chmod 755 master_ip_online_change 在这里插入图片描述 vim master_ip_failover

    在这里插入图片描述 当 MHA 完成主库切换后,自动执行这些命令,将虚拟 IP(VIP)从旧主库漂移到新主库上。

    masterha_manager –conf=/etc/masterha/app1.cnf & 这条命令,启动了 MHA(Master High Availability)的核心监控进程,它根据 app1.cnf 配置文件,在后台静默运行。 查看从库状态已切换至新的主节点。

    在这里插入图片描述

    Redis

    Redis(Remote Dictionary Server)是一个开源的内存数据结构存储系统,支持网络访问,可用作数据库、缓存、消息代理和流处理引擎。

    特性说明
    内存存储 数据主要存在内存中,读写速度极快(10万+ QPS)
    数据结构丰富 不仅是 key-value,还支持 String、Hash、List、Set、Sorted Set、Bitmap、HyperLogLog、Stream、Geo 等
    持久化 支持 RDB(快照)和 AOF(日志)两种持久化方式
    单线程模型 核心命令处理是单线程的,避免锁竞争,保证原子性
    高可用 支持主从复制(Replication)、Sentinel 哨兵、Cluster 集群模式
    原子操作 所有命令都是原子的,适合并发场景

    Redis安装

    tar zxf redis-6.2.4.tar.gz
    cd redis-6.2.4
    make && make install
    cd utils/
    vim install_server.sh

    在这里插入图片描述

    #运行安装脚本
    ./install_server.sh

    在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

    改为监听所有端口

    在这里插入图片描述 在这里插入图片描述

    redis主从复制

    ·从节点通过配置 replicaof <master_ip> <master_port> 指向主库,启动后自动同步数据;

    ·主从复制为异步,适用于读多写少场景,可横向扩展读能力。

    server1

    rsync -a redis-* server2:/usr/local/bin
    rsync -a redis-6.2.4 server2:

    server2

    cd redis-6.2.4/utils
    ./install_server.sh

    在这里插入图片描述

    vim /etc/redis/6379.conf
    replicaof 192.168.88.143 6379

    在这里插入图片描述 在这里插入图片描述

    systemctl restart redis_6379

    测试

    redis-cli
    >info

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    redis高可用

    redis+哨兵模式(Sentinel)

    ·在 server1、server2、server3 上分别部署哨兵进程,监控主库状态;

    在这里插入图片描述

    在这里插入图片描述 ·哨兵之间相互通信,通过投票机制判断主库是否客观下线,并自动执行故障转移; 在这里插入图片描述

    server2

    在这里插入图片描述

    [root@server1 redis]# redis-cli shutdown

    在这里插入图片描述

    在这里插入图片描述

    redis集群

    ./create-cluster start

    在这里插入图片描述 ·集群通过哈希槽(16384个槽位)分区,数据自动分布在多个主节点上; ./create-cluster create

    在这里插入图片描述 连接集群

    redis-cli -c -p 30001 info
    127.0.0.1:30004> set name ljx
    > Redirected to slot [5798] located at 127.0.0.1:30002
    OK
    #添加新节点(30007、30008)后,需执行 reshard 迁移槽位,才能均匀数据分布;
    redis-cli –cluster add-node 127.0.0.1:30007 127.0.0.1:30001

    在这里插入图片描述 ·添加从节点时需指定主节点ID,实现副本备份。

    redis-cli –cluster add-node 127.0.0.1:30008 127.0.0.1:30001 –cluster-slave –cluster-master-id ef99a4fc501bce05f725ba926510c2816d1c9f46

    在这里插入图片描述

    redis-cli –cluster check 127.0.0.1:30001

    在这里插入图片描述

    #迁移hash槽
    redis-cli –cluster reshard 127.0.0.1:30001

    在这里插入图片描述 在这里插入图片描述

    赞(0)
    未经允许不得转载:171主机测评 » CentOS 7 企业级数据库高可用实战:MySQL MGR + Router + MHA 与 Redis 集群全栈部署指南
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址