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

相关推荐
ss2732 小时前
为什么PostgreSQL适合AI场景?
数据库·人工智能·postgresql
瑞克-桑切斯2 小时前
7、MySQL 慢查询排查与优化实战指南
java·服务器·数据库
z06.3 小时前
MySQL索引
数据库·mysql
考虑考虑3 小时前
Posrgresql恢复.backup文件
数据库·后端·postgresql
云祺vinchin4 小时前
中小企业备份软件选型从恢复需求到总体成本评估
数据库·数据备份·中小企业备份·容灾备份软件
Zenova EdgeOS4 小时前
Go 工业边缘错误处理实战:用 errors 构建可追溯错误链
开发语言·数据库·golang
KKKlucifer4 小时前
国内数据安全服务的产品智能化转型:大模型赋能下的技术能力重构分析
大数据·数据库·重构
字节跳动开源5 小时前
OpenViking 上线原生 3D 内容理解模型
数据库·开源
CCIE-Yasuo7 小时前
网络安全-学习数据库-Mysql-2
数据库·学习·mysql
这个DBA有点耶7 小时前
内核级AI与多模融合:AI数据库在海外场景的落地要点
数据库·人工智能·架构