MySQL Galera Cluster部署如何实现负载均衡和高可用
目录
1、 环境准备
1.1、配置主机解析:
2、配置
2.1、配置 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 -ADatabase 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代理站点进行测试

