MySQL Galera Cluster部署如何实现负载均衡和高可用

目录

[1、 环境准备](#1、 环境准备)

1.1、配置主机解析:

2、配置

[2.1、配置 galera1 主机的my.cnf的文件](#2.1、配置 galera1 主机的my.cnf的文件)

[2.2、在给galera1 主机的my.cnf的文件增加节点](#2.2、在给galera1 主机的my.cnf的文件增加节点)

2.3、写入数据验证同步

2.7、配置nginx反向代理

1、 环境准备

关闭防火墙和selinux,进行时间同步

systemctl disable --now firewalld

setenforce 0

1.1、配置主机解析:

四台主机依次配置

复制代码
[root@galera1 ~]# cat <<e >/etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.150.17 galera1
192.168.150.18 galera2
192.168.150.19 galera3
192.168.150.20 galera4
e

四台虚拟机都导入创建该服务的yum源

复制代码
[root@galera1 ~]# cat  <<e >> /etc/yum.repos.d/mysql-wsrep.repo
[galera]
name=galera
baseurl=http://releases.galeracluster.com/mysql-wsrep-8.0/redhat/8/x86_64/
enabled=1
gpgcheck=0
e

四台虚拟机需要禁用本地mysql模块

复制代码
[root@galera1 ~]# dnf module disable -y mysql

四台虚拟机都下载mysql-wsrep-8.0和galera

复制代码
[root@galera1 ~]# yum install -y mysql-wsrep-8.0 galera
  • mysql-wsrep-8.0:

    • mysql-wsrep-8.0 是 MySQL 8.0 版本的一个变体,集成了 WSREP(Write Set Replication)协议。这是一个用于数据库集群的复制协议,允许 MySQL 数据库节点之间的同步复制。

    • 这个版本的 MySQL 是通过 WSREP 协议来实现数据的一致性和高可用性。WSREP 协议确保了所有节点的数据库状态保持一致,支持事务的自动同步和冲突解决。

    • 通常,这种版本的 MySQL 是在集群配置中使用的,旨在提高系统的容错能力和可扩展性。

  • Galera:

    • Galera 是一个用于 MySQL 数据库的同步复制插件,它实现了 WSREP 协议。Galera 提供了一个多主节点的数据库集群方案,允许所有节点同时进行读写操作,并且确保数据在所有节点之间保持一致。

    • 它主要用于提高数据库的可用性、容错性和扩展性。Galera 使得所有节点都能够同时处理读写请求,这比传统的主从复制模式更具灵活性。

    • Galera 可以与 MySQL 以及 MariaDB 配合使用,它的主要特点包括全同步复制、自动节点加入、冲突检测和解决等。

2、配置

四台虚拟器都启动服务,并修改密码

复制代码
# 获取数据库初始化密码的步骤
[root@galera1 ~]# cat /var/log/mysqld.log |grep password
2025-10-22T11:23:35.283719Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: R0efj;qNC9A#
2025-10-22T11:23:41.233878Z 0 [Note] [MY-010733] [Server] Shutting down plugin 'caching_sha2_password'
2025-10-22T11:23:41.233892Z 0 [Note] [MY-010733] [Server] Shutting down plugin 'sha256_password'
2025-10-22T11:23:41.233902Z 0 [Note] [MY-010733] [Server] Shutting down plugin 'mysql_native_password'

#修改密码
[root@galera1 ~]# mysqladmin -uroot -p password 'Q1w2e3@123!!!!!'
Enter password: 
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.

四台服务都配置一个远程用户并授权,采用脚本方式执行

复制代码
#!/bin/bash

# MySQL 连接参数

MYSQL_USER="root"
MYSQL_PASS='Q1w2e3@123!!!!!'  # 替换为实际的 root 密码
MYSQL_HOST="localhost"           # 或者使用 IP 地址

# 创建远程用户和授予权限的 SQL 命令

SQL_COMMANDS="
CREATE USER 'syncuser'@'%' IDENTIFIED BY 'Q1w2e3@123!!!!!';
GRANT ALL PRIVILEGES ON *.* TO 'syncuser'@'%';
FLUSH PRIVILEGES;
"

# 执行 SQL 命令

mysql -u "$MYSQL_USER" -p"$MYSQL_PASS" -h "$MYSQL_HOST" -e "$SQL_COMMANDS"

四台虚拟机服务都先停止

复制代码
[root@galera1 ~]# systemctl stop mysqld
2.1、配置 galera1 主机的my.cnf的文件
复制代码
server-id=1  # 服务器 ID,用于唯一标识 MySQL 服务器
binlog_format=row  # 二进制日志格式,行级别
innodb_file_per_table=1  # 为每个 InnoDB 表使用一个独立的表空间文件
innodb_autoinc_lock_mode=2  # 自增锁模式,2表示更高效的锁模式

wsrep_on=ON  # 启用 Galera 集群
wsrep_provider=/usr/lib64/galera/libgalera_smm.so  # Galera 提供者库的路径
wsrep_cluster_name='galera'  # Galera 集群的名称
wsrep_cluster_address='gcomm://'  # Galera 集群的地址,通常为 `gcomm://` 表示集群初始节点
wsrep_node_name='galera1'  # 当前节点的名称
wsrep_node_address='192.168.150.17'  # 当前节点的 IP 地址
wsrep_sst_auth=syncuser:'Q1w2e3@123!!!!!'  # SST(状态快照传输)认证信息
wsrep_sst_method=rsync  # SST 方法,使用 rsync 进行状态快照传输

依次配置galera2、galera3、galera4并启动mysql

2.2、在给galera1 主机的my.cnf的文件增加节点
复制代码
server-id=1  # 服务器 ID,用于唯一标识 MySQL 服务器
binlog_format=row  # 二进制日志格式,行级别
innodb_file_per_table=1  # 为每个 InnoDB 表使用一个独立的表空间文件
innodb_autoinc_lock_mode=2  # 自增锁模式,2表示更高效的锁模式

wsrep_on=ON  # 启用 Galera 集群
wsrep_provider=/usr/lib64/galera/libgalera_smm.so  # Galera 提供者库的路径
wsrep_cluster_name='galera'  # Galera 集群的名称
wsrep_cluster_address='gcomm://galera2,galera3,galera4'  # Galera 集群的地址,通常为 `gcomm://` 表示集群初始节点
wsrep_node_name='galera1'  # 当前节点的名称
wsrep_node_address='192.168.150.17'  # 当前节点的 IP 地址
wsrep_sst_auth=syncuser:'Q1w2e3@123!!!!!'  # SST(状态快照传输)认证信息
wsrep_sst_method=rsync  # SST 方法,使用 rsync 进行状态快照传输
2.3、写入数据验证同步

在 galera1主机写入数据,创建一个库

复制代码
mysql> create database jx;
Query OK, 1 row affected (0.02 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| jx                 |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

在其他主机上查看

复制代码
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| jx                 |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

可以看到在 galera1主机创建的库,同步写入到了其他节点的mysql中。

2.4、在galera1中创建数据库用户并进行赋权

2.5、在web服务上搭建两个discuz站点,并将它们的数据库指向mysql galera 集群的其中一个站点

##2.4,2.5具体步骤查看博客https://blog.csdn.net/zzh_wj/article/details/153696288?spm=1001.2014.3001.5502

2.6、进入galera站点的数据库,可以看到同步的数据表

复制代码
mysql> use discuzdb;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+------------------------------------+
| Tables_in_discuzdb                 |
+------------------------------------+
| pre_common_admincp_cmenu           |
| pre_common_admincp_group           |
| pre_common_admincp_member          |
| pre_common_admincp_menu_platform   |
| pre_common_admincp_perm            |
| pre_common_admincp_session         |
| pre_common_admingroup              |
| pre_common_adminnote               |
2.7、配置nginx反向代理

配置ip_hash算法,指向两台discuz站点的web服务器

复制代码
    include /etc/nginx/conf.d/*.conf;
    upstream discuz {
        ip_hash;
        server 192.168.150.1:80;
        server 192.168.150.4:80;
        }
    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
#        root         /usr/share/nginx/html;
        location / {
        proxy_pass      http://discuz;
        proxy_set_header Host $host;
        }

2.8、浏览器上访问nginx代理站点进行测试

相关推荐
user_admin_god1 小时前
企业级管理系统的站内信怎么轻量级优雅实现
java·大数据·数据库·spring boot
百***22121 小时前
mysql的分区表
数据库·mysql
星光一影2 小时前
废品回收系统小程序源码
mysql·php·html5
humors2212 小时前
服务端开发案例(不定期更新)
java·数据库·后端·mysql·mybatis·excel
Wang's Blog2 小时前
MySQL: 服务器性能优化全面指南:参数配置与数据库设计的最佳实践
服务器·数据库·mysql
码农101号2 小时前
Mysql主从架构的搭建
数据库·mysql·架构
cqsztech2 小时前
ORACLE数据库中如何找到过去某个时间某个表被谁修改了
数据库·oracle
好记忆不如烂笔头abc3 小时前
sql评估存储的速度和稳定性
数据库·sql
小鹏linux3 小时前
《openGauss安全架构与数据全生命周期防护实践:从技术体系到行业落地》
数据库·opengauss·gaussdb
朝新_3 小时前
【实战】动态 SQL + 统一 Result + 登录校验:图书管理系统(下)
xml·java·数据库·sql·mybatis