Galera Cluster编译安装

2025-08-25  本文已影响0人  dhz120

Galera Cluster 是一个基于同步复制的、多主架构的 MySQL/MariaDB 数据库集群解决方案。它提供高可用性、高一致性,并且所有节点都可读写。

一、准备

系统:

源码:

二、依赖安装

1. 安装基础依赖

yum groupinstall -y "Development Tools"
yum install -y cmake3
yum install -y openssl-devel
yum install -y libaio-devel
yum install -y ncurses-devel
yum install -y check-devel
yum install -y boost-devel
yum install -y bison
yum install -y wget
yum install -y libtirpc-devel
yum install -y openldap-devel
yum install -y libudev-devel
yum install -y rpcgen
yum install -y pam-devel

# 需要使用 scons 工具编译galera lib
yum install -y scons

2. 安装其它源码依赖

2.1 安装libmongoc-static-1.0.a

如果libmongoc-static-1.0.a不存在(可以通过find / -name "libmongoc-static-1.0.a" 2>/dev/null找一下安装位置,一般在/usr/local/lib64/libmongoc-static-1.0.a),则需要安装一下,否则编译galera时会报错。

这里先的版本是:mongo-c-driver-1.30.5.tar.gz(https://github.com/mongodb/mongo-c-driver/archive/refs/tags/1.30.5.tar.gz

cd mongo-c-driver-1.30.5
# 创建构建目录
mkdir cmake-build
cd cmake-build
# 配置构建选项,启用静态库
cmake .. -DCMAKE_BUILD_TYPE=Release \
         -DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF \
         -DENABLE_STATIC=ON \
         -DENABLE_BSON=ON

# 编译
make -j$(nproc)
# 安装
make install

2.2 安装boost_1_77_0

将boost_1_77_0解压到/usr/local/src/

cd /usr/local/src/
tar xavf boost_1_77_0.tar.bz2

三、编译安装Galera Cluster

1、编译安装Galera

注意: 需要提前修改 wsrep/tests/wsrep_loader_test.c, 将52行abort()注释掉,否则会报错:Provider version string '4.23(r6d8c35db)' not expected

cd galera-4.26.4.23

# 编译
scons -j $(nproc)

# 将libgalera_smm.so拷贝到/usr/local/lib目录下,后序配置的时候用这个目录下的
cp libgalera_smm.so /usr/local/lib

2、编译安装 MySQL-WSREP

cd mysql-wsrep-8.0.42-26.23

mkdir build && cd build

# -DCMAKE_INSTALL_PREFIX=/usr/local/mysql :指定mysql的安装路径
# -DWITH_BOOST=/usr/local/src/boost_1_77_0 :指定boost的路径
# -DWITH_WSREP=ON -DWITH_INNODB_DISALLOW_WRITES=ON:enable the patch through the wsrep API
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DWITH_WSREP=ON -DWITH_INNODB_DISALLOW_WRITES=ON -DWITH_BOOST=/usr/local/src/boost_1_77_0

# 编译
make -j$(nproc)

# 安装
make install

3. 清理 Mariadb

rpm -qa | grep mariadb
rpm -qa | grep -i mariadb | xargs rpm -e --nodeps
rpm -qa | grep mariadb

四、配置

1. 配置用户

# 创建 mysql 组
groupadd mysql
# 创建 mysql 用户(系统用户,无家目录,不可登录)
useradd -r -g mysql -s /bin/false mysql
# 验证用户是否创建成功
id mysql

# 创建数据目录并设置权限
mkdir -p /var/lib/mysql
chown -R mysql:mysql /var/lib/mysql

2. 修改my.cnf

创建并修改/etc/my.cnf

注意:每个节点的配置必须唯一,特别是 wsrep_node_namewsrep_node_address

[mysqld]
bind-address=0.0.0.0
datadir=/var/lib/mysql
user=mysql

# Galera Provider Configuration
wsrep_on=ON
# 同样替换为你的路径
wsrep_provider=/usr/local/lib/libgalera_smm.so
wsrep_provider_options="gcache.size=1G; gcache.page_size=1G"

# Galera Cluster Configuration
wsrep_cluster_name="galeracluster"
wsrep_cluster_address="gcomm://"

# Galera Synchronization Configuration
wsrep_sst_method=rsync
wsrep_sst_auth=bigdata:bigdata123456

# Galera Node Configuration
# 本节点的IP
wsrep_node_address="192.168.154.23"
wsrep_node_name=master

binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
max_connections=1000
mysqlx_max_connections=1000
max_connect_errors = 1000
max_binlog_size = 500M
binlog_expire_logs_seconds = 3
max_allowed_packet = 100M
lower_case_table_names = 1

[mysqld_safe]
log-error=/var/log/mysqld.log

3. 初始化 MySQL

# 切换到MySQL安装目录
cd /usr/local/mysql

# 初始化数据库
bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/var/lib/mysql

# 记录生成的临时密码(在输出末尾)
# 示例:A temporary password is generated for root@localhost: xxxxxx

4. 配置MYSQL为系统服务

配置为系统服务:

cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
ldconfig
chmod 755 /etc/init.d/mysqld
chkconfig --add mysqld

配置环境变量:

echo "PATH=$PATH:/usr/local/mysql/bin" > /etc/profile.d/mysql.sh
source /etc/profile
chkconfig mysqld on

5. 配置防火墙

# 开放MySQL端口(3306)
firewall-cmd --permanent --add-port=3306/tcp

# 开放Galera通信端口(4567, 4568, 4444)
firewall-cmd --permanent --add-port=4567/tcp
firewall-cmd --permanent --add-port=4568/tcp
firewall-cmd --permanent --add-port=4444/tcp

# 开放IST端口(默认为4567-4568)
firewall-cmd --permanent --add-port=4567-4568/udp

# 重新加载防火墙
firewall-cmd --reload

# 确认开放的端口
firewall-cmd --list-ports

五、启动MYSQL集群

1. 启动第一个节点

# 启动第一个节点(引导集群)
/usr/local/mysql/bin/mysqld_safe --wsrep-new-cluster --user=mysql &

# 或者使用systemd(需要修改服务文件以支持--wsrep-new-cluster)

注意:

第一个节点第一次启动时需要/usr/local/mysql/bin/mysqld_safe --wsrep-new-cluster --user=mysql &

启动之后,修改/etc/my.cnf中的wsrep_node_address为各节点实际地址(如果是单节点,还是空着就行)。

之后就可以在各节点上使用systemctl start mysqld来启动mysql集群了

可以使用mysqladmin -u root -p shutdown关闭mysql服务后,再用systemctl start mysqld来启动mysql,来进行测试

2. 启动其他节点

在其他节点上启动 MySQL 服务:

# 启动服务
systemctl start mysqld

# 检查状态
systemctl status mysqld

3. 登录测试

# 使用初始化时的临时密码登录
./bin/mysql --user=root --password='wwI6p6#QkfGl'
# 登录后首先需要修改root密码,否则其它啥也干不了
ALTER USER 'root'@'localhost' IDENTIFIED BY 'your_new_password';

# 之后只可以查看一下集群状态
# 查看集群大小
SHOW STATUS LIKE 'wsrep_cluster_size';
# 查看节点状态
SHOW STATUS LIKE 'wsrep_ready';

# 创建一个能远程访问的用户
# 创建用户
CREATE USER 'bigdata'@'%' IDENTIFIED BY 'bigdata123456';
# 如果需要给用户创建数据库的权限,则可以这样设置
GRANT ALL PRIVILEGES ON *.* to bigdata@'%';

六、问题

1. /usr/lib64/libmongoc-static-1.0.a not exist

问题描述:

CMake Error at /usr/lib64/cmake/mongoc-1.0/mongoc-targets.cmake:132 (message):
  The imported target "mongo::mongoc_static" references the file

     "/usr/lib64/libmongoc-static-1.0.a"

  but this file does not exist.  Possible reasons include:

  * The file was deleted, renamed, or moved to another location.

  * An install or uninstall procedure did not complete successfully.

  * The installation package was faulty and contained

     "/usr/lib64/cmake/mongoc-1.0/mongoc-targets.cmake"

  but not all the files it references.

Call Stack (most recent call first):
  /usr/lib64/cmake/mongoc-1.0/mongoc-1.0-config.cmake:16 (include)
  /usr/share/cmake/Modules/CMakeFindDependencyMacro.cmake:76 (find_package)
  /usr/lib64/cmake/libmongoc-1.0/libmongoc-1.0-config.cmake:26 (find_dependency)
  storage/connect/CMakeLists.txt:336 (FIND_PACKAGE)

解决方案:

源码编译mongo-c-driver,这里先的版本是:mongo-c-driver-1.30.5.tar.gz(https://github.com/mongodb/mongo-c-driver/archive/refs/tags/1.30.5.tar.gz

cd mongo-c-driver-1.30.5
# 创建构建目录
mkdir cmake-build
cd cmake-build
# 配置构建选项,启用静态库
cmake .. -DCMAKE_BUILD_TYPE=Release \
         -DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF \
         -DENABLE_STATIC=ON \
         -DENABLE_BSON=ON

# 编译
make -j$(nproc)
# 安装
make install

安装完成后,可以通过find / -name "libmongoc-static-1.0.a" 2>/dev/null找一下安装位置,一般在/usr/local/lib64/libmongoc-static-1.0.a

2. [Server] Different lower_case_table_names settings for server ('1') and data dictionary ('0')

使用/usr/local/mysql/bin/mysqld_safe --wsrep-new-cluster &启动时报错

2025-08-26T08:50:20.766863Z 1 [ERROR] [MY-011087] [Server] Different lower_case_table_names settings for server ('1') and data dictionary ('0'). 
2025-08-26T08:50:20.767068Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed. 
2025-08-26T08:50:20.767087Z 0 [ERROR] [MY-010119] [Server] Aborting

原因:

MySQL 8.0+ 将系统表结构(如表名、列名)存储在内部数据字典中,该字典在 初始化时固化 lower_case_table_names 值。若后续修改此参数(e.g. 修改my.cnf),MySQL 会拒绝启动以避免元数据混乱 。Linux 系统初始化时默认为 0

解决办法:

因数据字典不可修改,唯一解决方案是重新初始化数据目录并保持参数一致

rm -rf /var/lib/mysql/*         # 清空数据目录(勿删目录本身)

# 方式 1:初始化命令指定
sudo mysqld --initialize --user=mysql --lower-case-table-names=1

# 方式 2:首次启动前在 my.cnf 的 [mysqld] 段添加
[mysqld]
lower_case_table_names = 1

3.3306端口未开放

问题描述:

别的主机无法访问数据库

解决方案:

firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload
firewall-cmd --list-ports

4.非正常关闭导致集群状态异常

问题描述:

使用kill 或 kill -9 强制关闭数据库,导致后续无法正常启动数据库

解决方案:

单机环境,删除/var/lib/mysql/* 下的所有数据,然后重新初始化数据库然后创建集群。

注意:正常情况应该使用以下命令关闭数据库

/usr/local/mysql/bin/mysqladmin -u root -p shutdown
上一篇 下一篇

猜你喜欢

热点阅读