Mysql 与 Nginx 双机高可用

数据库

方案一:三节点支持,两个运行节点加一个仲裁节点

节点组成:

|---------------|---------------|---------------|
| 数据库节点(Node1) | (数据库节点Node2) | 仲裁节点(Node3) |
| 192.168.10.12 | 192.168.10.13 | 192.168.10.18 |

1.增添支持wsrep的MariaDB(全机)

复制代码
vim /etc/yum.repos.d/MariaDB.repo
[mariadb]
name = MariaDB
baseurl = https://archive.mariadb.org/mariadb-10.5/yum/centos7-amd64/
gpgkey=https://archive.mariadb.org/PublicKey
gpgcheck=1
yum clean all && yum makecache

yum install -y MariaDB-server MariaDB-client galera-4

2.确认wsrep支持(全机)

mysqld --verbose --help 2>/dev/null | grep -i wsrep

可以看到很多wsrep*组件和参数

3.确认数据库初始化(全机)

ls /var/lib/mysql

4.配置Galera(Node1首节点)

复制代码
vim /etc/my.cnf.d/server.cnf
---------------------------------------------------------------
[mysqld]
bind-address=0.0.0.0
binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
# Galera
wsrep_on=ON
wsrep_provider=/usr/lib64/galera-4/libgalera_smm.so
wsrep_cluster_name=galera_cluster
wsrep_cluster_address=gcomm://   #初始创建集群这里为空
wsrep_node_name=node1
wsrep_node_address=192.168.10.12
wsrep_sst_method=rsync
-----------------------------------------------------------

5.启动集群(Node1)

在Node1上初始化集群:

systemctl set-environment MYSQLD_OPTS="--wsrep-new-cluster"

systemctl start mariadb

systemctl unset-environment MYSQLD_OPTS

6.配置galera(Node2)

复制代码
vim /etc/my.cnf.d/mariadb-server.cnf
--------------------------------------------------------------
[mysqld]
bind-address=0.0.0.0
binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
# Galera
wsrep_on=ON
wsrep_provider=/usr/lib64/galera-4/libgalera_smm.so
wsrep_cluster_name=galera_cluster
#这里是关键:写已有节点IP(Node1)
wsrep_cluster_address=gcomm://192.168.10.12
wsrep_node_name=node2
wsrep_node_address=192.168.10.13
wsrep_sst_method=rsync
-------------------------------------------------------------------

Node2 直接使用 systemctl start mariadb 加入集群

6.2 任意节点查看集群状态

复制代码
mysql -uroot -e "SHOW STATUS LIKE 'wsrep_cluster_size';"
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 2     |
+--------------------+-------+

mysql -uroot -e "SHOW STATUS LIKE 'wsrep_cluster_size';"
+----------------------+---------+
| Variable_name        | Value   |
+----------------------+---------+
| wsrep_cluster_status | Primary |
+----------------------+---------+

7.部署仲裁器gardb(Node3)

7.1 安装garbd:

yum install -y galera #注意! node3 必须到和 node1/node2 一样的 MariaDB+ galera,否则 garbd 加入就会把集群打散。

7.2 创建 systemd service /etc/systemd/system/garbd.service

复制代码
[Unit]
Description=Galera Arbitrator Daemon
After=network-online.target
[Service]
Type=simple
User=root
WorkingDirectory=/var/lib/garbd
ExecStart=/usr/bin/garbd --address "gcomm://192.168.10.12:4567,192.168.10.13:4567" --group "galera_cluster" --name "garbd1" --option "gmcast.listen_addr=tcp://192.168.10.18:4567"
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target

出来后创建目录 mkdir -p /var/lib/garbd

启动:

systemctl daemon-reload

systemctl enable --now garbd

Nginx

采用LVS+Keepalived做负载均衡以及高可用

|----------------|---------------|---------------|---------------|
| VIP(nginx) | Node1(nginx) | Node2(nginx) | Node3(tomcat) |
| 192.168.10.100 | 192.168.10.12 | 192.168.10.13 | 192.168.10.18 |

环境配置:
yum install -y nginx keepalived

keepalived配置(Node1)

复制代码
vim /etc/keepalived/keepalived.conf
----------------------------------------------------------------------
global_defs {
    router_id LVS_NODE1
    vrrp_skip_check_adv_addr
    vrrp_garp_interval 1
    vrrp_gna_interval 1
}

vrrp_script chk_nginx {
    script "/usr/local/bin/check_nginx.sh"
    interval 2
    weight -30
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass 1111
    }

    virtual_ipaddress {
        192.168.10.100/24
    }

    track_script {
        chk_nginx
    }
}
#LVS配置
virtual_server 192.168.10.100 80 {
    delay_loop 6
    lb_algo rr 
    lb_kind NAT
    persistence_timeout 50
    protocol TCP
    
    real_server 192.168.10.12 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }   
    }   
    
    real_server 192.168.10.13 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }   
    }   
}   

-------------------------------------------------------------------

keepalived配置(Node2)

复制代码
global_defs {
    router_id LVS_NODE2
    vrrp_skip_check_adv_addr
    vrrp_garp_interval 1
    vrrp_gna_interval 1
}

vrrp_script chk_nginx {
    script "/usr/local/bin/check_nginx.sh"
    interval 2
    weight -30
}

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/24
    }

    track_script {
        chk_nginx
    }
}

virtual_server 192.168.10.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.10.12 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }

    real_server 192.168.10.13 80 {
        weight 1
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

检测脚本 /usr/local/bin/chk_nginx.sh

复制代码
#!/bin/bash
curl -s http://127.0.0.1:80 > /dev/null
if [ $? -ne 0 ]; then
 exit 1
fi

赋权 chmod +x /usr/local/bin/chk_nginx.sh

启动:

systemctl enable keepalived --now

相关推荐
老纪的技术唠嗑局43 分钟前
超级干货分享:中小企业使用 OceanBase 实践经验汇总
数据库
CLOUD ACE1 小时前
谷歌云代理|零售商Target 如何利用 Spanner Graph 提升零售发现体验并将数据库维护成本降低 50%
数据库·零售
AI大模型-小雄1 小时前
Codex写分页接口为什么越翻越慢?用Cursor Pagination解决重复与漏数据
大数据·数据库·elasticsearch·搜索引擎·chatgpt·后端开发·codex
少晓年2 小时前
从 MySQL 迁移到人大金仓 KingbaseES:完整指南与实践
数据库·mysql
SelectDB2 小时前
Apache Doris AI RAG 实战:从基础 RAG 到知识图谱增强的技术能力与选型
数据库
SelectDB3 小时前
电商企业 PostgreSQL 迁移 Apache Doris:80TB 分析数据统一平台技术能力与实践
数据库
SelectDB3 小时前
阶跃星辰 Agent 可观测:Apache Doris / SelectDB 的技术能力与实践
数据库
国际云,接待3 小时前
Nginx 后面接负载均衡,502/504 到底该先查哪里?
运维·nginx·负载均衡
SelectDB3 小时前
ApacheDoris Iceberg V3 湖仓 DML:Apache Doris / SelectDB 的技术能力与实践
数据库
SelectDB3 小时前
ApacheDoris Python UDF:SQL 调用 Python 的技术能力、选型对比与实践
数据库