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

相关推荐
桌面运维家11 小时前
校园机房vDisk IDV云桌面建设方案价格参考
linux·服务器·数据库
念越11 小时前
SQL 基础语法复习
数据库·sql·数据库系统概论
ULIi096kr11 小时前
MySQL磁盘爆满快速排查方案:一键查询库表空间、定位占用大户(RDS/自建通用)
数据库·mysql
华山令狐虫11 小时前
告别手写 SQL——DBAPI 企业版 v4.6.0 推出 AI 助手
数据库·人工智能·sql·dbapi
Cx330❀11 小时前
【MySQL基础】库与表的全面操纵指南
linux·服务器·网络·数据库·c++·mysql
天丁o11 小时前
企业 AI Agent 工程化落地:从需求边界到系统集成的 6 个环节
数据库·人工智能
涛思数据(TDengine)11 小时前
从时序数据库到工业AI:涛思数据参编“人工智能+工业软件”评价规范,推动工业数据标准
大数据·数据库·人工智能·时序数据库·tdengine·涛思数据·工业数据库
Database_Cool_12 小时前
AI 时代的数据仓库:阿里云 AnalyticDB MySQL 向量检索 + SQL 分析一体化实战
数据仓库·人工智能·mysql·阿里云
点灯小铭12 小时前
基于51单片机的LED点阵汉字显示系统设计
数据库·单片机·嵌入式硬件·毕业设计·51单片机·课程设计·期末大作业
SilentSamsara12 小时前
DuckDB + Python:嵌入式 OLAP 数据库的轻量分析实战
开发语言·数据库·python·微服务