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

相关推荐
S1998_1997111609•X1 小时前
login:/-system.web,dex.dmp,b-scode:app·%
网络·数据库·百度·facebook·twitter
运气好好的1 小时前
mysql数据库日志文件过大如何清理_定期备份与重置日志文件
jvm·数据库·python
2401_831419441 小时前
如何防止MongoDB副本集被误初始化_副本集名称(replSetName)锁定
jvm·数据库·python
阿丰资源2 小时前
基于Spring Boot的美容院管理系统(附源码+数据库+文档)
数据库·spring boot·后端
徐子童2 小时前
复合索引会失效的场景
数据库·mysql·面试题·索引失效
abc123456sdggfd2 小时前
解决Socket图像传输中断问题:基于分块接收与可靠发送的完整教程
jvm·数据库·python
2401_833033622 小时前
SQL中RIGHT JOIN真的很少用吗_数据完整性检查与反向关联分析
jvm·数据库·python
摇滚侠2 小时前
sqlplus “/ as sysdba“ 什么意思
java·数据库·oracle
duangww2 小时前
OPEN SQL去掉文本中间的空格
数据库·abap