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代理站点进行测试

相关推荐
哈哈老师啊40 分钟前
Springboot学生综合测评系统hxtne(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·数据库·spring boot
小小8程序员1 小时前
Redis-10
数据库·redis·缓存
liuzhilongDBA1 小时前
从collation mismatch异常到其原理
数据库·version·glibc·postgres·collation
梁萌1 小时前
MySQL数据库分库分表介绍
数据库·mysql·shardingsphere·分库分表
占疏2 小时前
dify API访问工作流/聊天
开发语言·数据库·python
Cat God 0073 小时前
SQL使用及注意事项
数据库·sql·mysql
华仔啊3 小时前
如何避免MySQL死锁?资深DBA的9条黄金法则
后端·mysql
@老蝴4 小时前
MySQL数据库 - 约束和联合查询
android·数据库·mysql
程序猿20234 小时前
MySQL索引使用--最左前缀法则
数据库·mysql
老华带你飞4 小时前
列车售票|基于springboot 列车售票系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·学习·spring