2026/3/11 8:31:49
网站建设
项目流程
上海网站的优化,万能模板,天津网站建设哪家公司好,网站速度测速MariaDB 10.6 Galera Cluster 部署
文档参考#xff1a;MariaDB Galera Cluster 10.6 集群部署#xff0c; 豆包ai
MariaDB 10.6 Galera Cluster是基于MariaDB 10.6社区版与Galera 4同步复制技术深度整合的高可用、多主复制集群解决方案#xff0c;专为解决传统异步复制的…MariaDB 10.6 Galera Cluster 部署文档参考MariaDB Galera Cluster 10.6 集群部署 豆包aiMariaDB 10.6 Galera Cluster是基于MariaDB 10.6社区版与Galera 4同步复制技术深度整合的高可用、多主复制集群解决方案专为解决传统异步复制的数据一致性问题和单点故障风险设计核心价值在于数据强一致性、零数据丢失及对应用透明的高可用服务。一、工作原理1.1、基础特性同步多主复制Multi-Master集群中所有节点均为可读写节点无主从角色区分支持并发写入多个节点避免传统主从架构的主节点单点瓶颈。写入操作在所有节点同步确认后才返回成功确保集群数据强一致性无复制延迟导致的数据不一致问题。自动节点故障检测与恢复通过组通信协议GCS实时监控节点状态故障节点自动被剔除不影响集群服务故障节点恢复后可自动重新加入集群并增量同步缺失数据实现无缝回归无需手动干预备份恢复。无数据丢失RPO0基于同步复制机制仅当写入操作被集群中大多数节点quorum法定人数持久化到磁盘后才向客户端返回成功响应。即使部分节点宕机只要法定人数节点存活数据就不会丢失满足核心业务零数据丢失需求。对应用透明应用程序无需大量改造可像访问单个MariaDB实例一样访问集群节点切换、数据同步等操作对应用层屏蔽降低迁移和运维成本。MariaDB 10.6 专属增强继承MariaDB 10.6的全部特性如性能优化、JSON功能增强、窗口函数完善、安全性提升等同时针对Galera做版本适配修复低版本兼容性问题提升大事务处理效率和集群稳定性。简单说几乎同步复制主动-主动多主拓扑读取和写入任何群集节点自动成员资格控制故障节点从群集中删除自动节点连接行级别的真正并行复制直接客户端连接本机MariaDB的外观和感觉1.2、架构与工作原理采用无中心分布式架构无专门管理节点所有节点地位平等。集群规模建议为3、5等奇数个节点便于达成法定人数规避脑裂最小可用规模为2个节点需额外配置仲裁节点。每个节点包含两个核心组件架构说明MariaDB 10.6 数据库实例负责处理SQL请求、数据存储等基础数据库功能。Galera Pluginwsrep补丁实现组通信、同步复制、节点状态同步等集群核心功能是集群运行的关键驱动。工作流程写入操作客户端向集群任意节点提交写入请求INSERT/UPDATE/DELETE等。发起节点对SQL操作进行语法校验、事务预处理生成写集Write Set含事务修改数据及元数据。通过Galera组通信协议GCS将写集广播到集群所有其他节点。所有节点对写集进行冲突检测避免多节点并发写入同一数据冲突检测通过后持久化到本地磁盘。发起节点收到大多数节点的持久化确认后执行本地事务提交并向客户端返回写入成功。其他节点收到法定人数确认后自动提交该事务完成全集群数据同步。流程图┌─────────────────┐ │ 客户端 │ └─────────┬───────┘ │1. 提交写入请求INSERT/UPDATE/DELETE ┌─────────▼───────┐ │ 集群任意节点发起节点 │ └─────────┬───────┘ │2. 语法校验 事务预处理 ┌─────────▼───────┐ │ 生成写集Write Set │ └─────────┬───────┘ │3. 通过 GCS 组通信协议广播 ┌─────────▼───────┐ │ 集群所有其他节点 │ └─────────┬───────┘ ┌─────────┴───────┐ │ 所有节点执行冲突检测 │ └─────────┬───────┘ │4. 检测通过不通过则终止事务 ┌─────────▼───────┐ │ 写集持久化到本地磁盘 │ └─────────┬───────┘ │5. 各节点向发起节点反馈持久化确认 ┌─────────▼───────┐ │ 发起节点收集确认结果 │ └─────────┬───────┘ │6. 收到大多数节点法定人数确认 ┌─────────▼───────┐ │ 发起节点提交本地事务 │ └─────────┬───────┘ │7. 向客户端返回「写入成功」 ┌─────────▼───────┐ │ 其他节点收到法定人数确认 │ └─────────┬───────┘ │8. 其他节点自动提交事务 ┌─────────▼───────┐ │ 全集群数据同步完成 │ └─────────────────┘1.3、缺点加入新节点时开销大,需要复制完整数据不能有效地解决写扩展的问题,所有的写操作都发生在所有的节点有多少个节点,就有多少份重复的数据由于事务提交需要跨节点通信,即涉及分布式事务操作,因此写入会比主从复制慢很多,节点越多,写入越慢,死锁和回滚也会更加频繁;对网络要求比较高,如果网络出现波动不稳定,则可能会造成两个节点失联,Galera Cluster集群会发生脑裂,服务将不可用仅支持InnoDB/XtraDB存储引擎,任何写入其他引擎的表,包括mysql.*表都不会被复制,DDL语句可以复制,但是insert into mysql.user(MyISAM存储引擎)之类的插入数据不会被复制Delete操作不支持没有主键的表,因为没有主键的表在不同的节点上的顺序不同,如果执行select … limit …将出现不同的结果集整个集群的写入吞吐量取决于最弱的节点限制,集群要使用同一的配置二、安装2.1、环境准备节点规划三个节点统一执行节点编号节点IP节点名称系统版本内核节点110.4.50.163node1中科方德4.19.113-16节点210.4.50.164node2中科方德4.19.113-16节点310.4.50.165node3中科方德4.19.113-16配置时间同步# 手动同步阿里云时间服务器ntpdate ntp.aliyun.com# 添加定时任务每天凌晨3点自动同步echo0 3 * * * /usr/sbin/ntpdate ntp.aliyun.com /dev/null 21/var/spool/cron/rootchmod600/var/spool/cron/root关闭防火墙与SELinux# 避免端口拦截或权限限制确保集群节点间通信正常# 关闭防火墙永久生效systemctl stop firewalld systemctl disable firewalld# 关闭SELinux临时永久setenforce0sed-is/^SELINUXenforcing/SELINUXdisabled//etc/selinux/config核心端口开放端口号协议端口用途所属组件说明与注意事项3306或自行定义TCP数据库客户端连接MariaDB 10.61. 仅需开放 TCP 协议无需 UDP。4567TCP/UDPGalera 集群节点间组通信Galera 41. 必须同时开放TCP 和 UDP 协议缺一不可否则集群节点无法建立通信、无法同步数据2. 默认端口不可修改4568TCPIST增量状态传输同步Galera 41. 默认端口 4568建议保持默认。4444TCPSST全量状态传输同步Galera 41. 仅需开放 TCP 协议所有节点统一该端口为 SST 同步的默认通信端口无需额外修改。防火墙配置# 1. 开放3306端口TCPfirewall-cmd --permanent --add-port3306/tcp# 2. 开放4567端口TCPUDP核心集群通信firewall-cmd --permanent --add-port4567/tcp firewall-cmd --permanent --add-port4567/udp# 3. 开放4568端口TCPIST增量同步firewall-cmd --permanent --add-port4568/tcp# 4. 开放4444端口TCPSST全量同步firewall-cmd --permanent --add-port4444/tcp# 重新加载firewall-cmd --reload# 查看所有永久开放的端口firewall-cmd --permanent --list-ports# 富策略firewall-cmd --permanent --add-rich-rulerule familyipv4 source address${ip} port protocoltcp port${port} acceptfirewall-cmd --zonepublic --list-rich-rules2.2、编译部署为啥要编译方便后续平台迁移一次构建N次迁移最后编译完打成rpm包安装目录说明 -后补充的下面安装的时候注意目录mkdir/opt/mariadb/lib# galeramkdir/opt/mariadb/mairadb# mariadb服务galera 下载源码包 只需要一台编译其它机器直接压缩cp过去就行galera说明选择对应的maraidb版本x86可直接用arm需要编译【x86实在编译不出来先用官方的arm mips就需要在研究一下了先跑逻辑】参考-- arm编译可行获取libgalera_smm.so# x86实在编译不出来先用官方的arm mips就需要在研究一下了先跑逻辑wgethttps://mirrors.neusoft.edu.cn/mariadb///mariadb-10.6.24/bintar-linux-systemd-x86_64/mariadb-10.6.24-linux-systemd-x86_64.tar.gz# 解压后找到 在解压的lib目录下 libgalera_smm.solib]# ldd libgalera_smm.solibssl.so.1.0.0not found libcrypto.so.1.0.0not found# 可能会缺这两个so文件 继续找opensslwgethttps://github.com/openssl/openssl/releases/download/OpenSSL_1_0_2a/openssl-1.0.2a.tar.gz# 略过解压步骤./config --prefix/opt/ssl --openssldir/opt/ssl shared zlib enable-ssl3 enable-ssl3-methodmake-j32make-j32installls-l /opt/ssl/lib/ -r-xr-xr-x1root root26774401月509:46 libcrypto.so.1.0.0 -r-xr-xr-x1root root5448401月509:46 libssl.so.1.0.0# 进lib目录下 用ldd命令查看依赖关系[rootlocalhost lib]# ldd libcrypto.so.1.0.0[rootlocalhost lib]# ldd libssl.so.1.0.0libcrypto.so.1.0.0not found依赖缺失# 直接放 /lib64可能会破坏国产化系统我们用patchelf打入rpath# 下载patchelf# https://gitcode.com/gh_mirrors/pa/patchelf/tags 找到最新版本# 国产可能不登陆就没法下载自行手动下载吧wgethttps://raw.gitcode.com/gh_mirrors/pa/patchelf/archive/refs/heads/0.15.5.zip ./bootstrap.sh ./configuremakemakechecksudomakeinstall# 将在放到统一的目录如 /opt/mysql/mysqlso 下libgalera_smm.so libcrypto.so.1.0.0 libssl.so.1.0.0依赖处理patchelf --set-rpath /opt/mysql/mysqlso libssl.so.1.0.0 patchelf --set-rpath /opt/mysql/mysqlso libgalera_smm.so[rootlocalhost mysqlso]# readelf -d libgalera_smm.so0x000000000000001d(RUNPATH)Library runpath:[/opt/mysql/mysqlso][rootlocalhost mysqlso]# readelf -d libssl.so.1.0.00x000000000000001d(RUNPATH)Library runpath:[/opt/mysql/mysqlso][rootlocalhost mysqlso]# ldd libgalera_smm.soldd: warning: youdonot have execution permissionfor./libgalera_smm.so# 这种可以忽略./libgalera_smm.so: /略过/libcrypto.so.1.0.0: no version information available(required by ./libgalera_smm.so)./libgalera_smm.so: /略过/libssl.so.1.0.0: no version information available(required by ./libgalera_smm.so)libssl.so.1.0.0/opt/mysql/mysqlso/libssl.so.1.0.0(0x00007f8ba56bf000)libcrypto.so.1.0.0/opt/mysql/mysqlso/libcrypto.so.1.0.0(0x00007f8ba4a83000)maraidb10.6.24编译下载并添加rpathwgethttps://mirrors.neusoft.edu.cn/mariadb///mariadb-10.6.24/source/mariadb-10.6.24.tar.gztarxf mariadb-10.6.24.tar.gzcdmariadb-10.6.24vimCMakeLists.txt# 修改在Internal/CPack下添加自定义rpath路径SET(CMAKE_MODULE_PATH${CMAKE_MODULE_PATH}${CMAKE_SOURCE_DIR}/cmake${CMAKE_SOURCE_DIR}/cmake/Internal/CPack)SET(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)SET(CMAKE_INSTALL_RPATH/opt/mysql/mysqlso)处理依赖yum -yinstallgnutls-devel ncurses-devel bison-devel boost boost-devel flex flex-devel libxml2 libxml2-devel snappy snappy-devel curl-devel lz4-devel pcre2 pcre2-devel pcre pcre-develwgethttps://github.com/facebook/zstd/releases/download/v1.5.7/zstd-1.5.7.tar.gztar-xzvf zstd-1.5.7.tar.gzcdzstd-1.5.7# 32是cpu核数make-j32make-j32install开始编译cmake\-DCMAKE_INSTALL_PREFIX/opt/mariadb\-DMYSQL_DATADIR/opt/mariadb/data\-DSYSCONFDIR/opt/mariadb\-DWITH_MYISAM_STORAGE_ENGINE1\-DWITH_INNOBASE_STORAGE_ENGINE1\-DWITH_MEMORY_STORAGE_ENGINE1\-DWITH_READLINE1\-DMYSQL_UNIX_ADDR/opt/mariadb/data/mysql.sock\-DMYSQL_TCP_PORT3306\-DENABLED_LOCAL_INFILE1\-DWITH_PARTITION_STORAGE_ENGINE1\-DDEFAULT_CHARSETutf8\-DDEFAULT_COLLATIONutf8_general_ci -DWITH_ROCKSDBOFF\-DWITH_GALERA1\-DGALERA_INCLUDE_DIR/opt/mysql/mysqlso\-DGALERA_LIBRARY/opt/mysql/mysqlso/libgalera_smm.so\-DMYSQL_USERmysql\-DWITHOUT_MYISAM_STORAGE_ENGINE1make-j8make-j8installDMYSQL_TCP_PORT# 端口编译可以用其它的避免冲突初始化cd/opt/mariadb scripts/mysql_install_db --userroot --datadirdata/my.cnf配置# vi /opt/mariadb/my.cnf[rootlocalhost etsdb106]# cat my.cnf[client]port3306socket/opt/mariadb/data/mysql.sock[mysqld]port3306socket/opt/mariadb/data/mysql.sock lower_case_table_names1character-set-serverutf8 key_buffer_size64M max_allowed_packet10M table_open_cache256sort_buffer_size512K net_buffer_length8K read_buffer_size1M read_rnd_buffer_size512K myisam_sort_buffer_size16Mmax_connections3000thread_cache_size1000max_connect_errors200interactive_timeout600wait_timeout3600innodb_buffer_pool_size1000M read_buffer_size256K query_cache_type1query_cache_limit512K query_cache_min_res_unit2kquery_cache_size32Mtmp_table_size64M open_files_limit65535#加载密码复杂度审计插件plugin-loadsimple_password_check.so#密码长度默认8位simple_password_check_minimal_length8#特殊符号1代表至少1位#simple_password_check_other_characters1#同时包含大小写#simple_password_check_letters_same_case1#字母数1代表至少1位#simple_password_check_letters_same_case1#数字数1代表至少1位#simple_password_check_digits1# 最大生效时间default_password_lifetime90#最大错误登录次数max_password_errors5############## 这部分在下面要修改 ###### unix_socketOFF# log-binmysql-bin# binlog_formatmixedserver-id1expire_logs_days30##############[mysqldump]quick max_allowed_packet16M[mysql]no-auto-rehash[myisamchk]key_buffer_size20M sort_buffer_size20M read_buffer2M write_buffer2M[mysqlhotcopy]interactive-timeout自启脚本# cat /usr/lib/systemd/system/mariadb.service# 添加完之后才能cat[Unit]DescriptionMariaDBserver database serverAftersyslog.targetAfternetwork.target[Service]TypesimpleExecStart/opt/mariadb/bin/mysqld_safe --defaults-file/opt/mariadb/my.cnf --userrootTimeoutSec300PrivateTmptrue[Install]WantedBymulti-user.target# 启动systemctl start mariadb修改密码之类的./bin/mysql# 不用密码直接登陆selectuser, host, plugin from mysql.user;SET GLOBALsimple_password_check_other_characters0;SET PASSWORD FORrootlocalhostPASSWORD(新密码);SET PASSWORD FORmariadb.syslocalhostPASSWORD(新密码);grant all on *.* toroot%identified by新密码;delete from mysql.user whereuser ;selectUser,Host,Password from mysql.user;FLUSH PRIVILEGES;此时再用 ./mysql还是免密进入# vi /opt/mariadb/my.cnf[rootlocalhost etsdb106]# cat my.cnf[mysqld]unix_socketOFF# 把注释打开禁止用unix_socket登陆# 重启再登陆 就要密码了[rootlocalhost mariadb]# systemctl restart mariadb# 验证[rootlocalhost mariadb]# ./bin/mysqlERROR1524(HY000): Pluginunix_socketis not loaded[rootlocalhost mariadb]# ./bin/mysql -uroot -pEnter password:# 直接回车ERROR1524(HY000): Pluginunix_socketis not loaded# 在登陆[rootlocalhost mariadb]# ./bin/mysql -uroot -pEnter password:# 敲密码Server version:10.6.24-MariaDB Source distribution MariaDB[(none)]基础准备完成systemctl stop mariadbrm-rf mysql-test# 把 maraidb跟 mysqlso压缩好/opt/mariadb, /opt/mysql/mysqlso/# 节点1,2,3 三台机器保持一样。三、Galera集群配置3.1、节点配置三个节点都共同的部分 参考配置expire_logs_days7# log-binmysql-bin# 强制要求binlog_format二进制日志格式必须设置为ROW行级格式binlog_formatrow# 禁用语句级复制相关优化适配ROW格式log_slave_updatesON# 关闭二进制日志校验Galera已做相关校验避免冲突binlog_checksumNONE# 存储引擎必须InnoDBdefault-storage-engineInnoDBinnodb_autoinc_lock_mode2innodb_flush_log_at_trx_commit1innodb_buffer_pool_size1G# Galera核心配置wsrep_onON# 注意libgalera_smm.so路径wsrep_provider/opt/mysql/mysqlso/libgalera_smm.so# 随便敲,具有唯一性就行wsrep_cluster_nameESCSASSEEQwsrep_cluster_addressgcomm://10.4.50.163,10.4.50.164,10.4.50.165# 优化配置wsrep_slave_threads4wsrep_sync_wait1# 日志配置slow_query_logONslow_query_log_file/opt/EETRUST/common/etsdb106/logs/slow_query.loglog_error/opt/EETRUST/common/etsdb106/logs/error.log通用命令useradd-r -s /sbin/nologin mysqlmkdir/opt/mariadb/logschmod777/opt/mariadb -Rchmod644/opt/mariadb/my.cnfchownmysql:mysql /opt/mariadb -R节点1server-id1# 节点名称wsrep_node_namegalera-node-1# 节点IPwsrep_node_address10.4.50.163# 同步方式wsrep_sst_methodrsyncwsrep_provider_optionsgcache.size1G;ist.recv_addr10.4.50.163:4568;gmcast.listen_addrtcp://0.0.0.0:4567节点2server-id2# 节点名称wsrep_node_namegalera-node-2# 节点IPwsrep_node_address10.4.50.164# 同步方式wsrep_sst_methodrsyncwsrep_provider_optionsgcache.size1G;ist.recv_addr10.4.50.164:4568;gmcast.listen_addrtcp://0.0.0.0:4567节点3server-id3# 节点名称wsrep_node_namegalera-node-3# 节点IPwsrep_node_address10.4.50.165# 同步方式wsrep_sst_methodrsyncwsrep_provider_optionsgcache.size1G;ist.recv_addr10.4.50.165:4568;gmcast.listen_addrtcp://0.0.0.0:4567参数说明系统变量/选项描述wsrep_provider设置 wsrep 提供程序的路径。这是文件的路径。。每个版本可能不太一样。wsrep_cluster_address启动时要连接到的群集节点的地址。为每个群集节点的 IP 地址或域名的逗号分隔列表。最佳做法是在此列表中包括所有群集节点。格式 gcomm://wsrep_node_name设置当前节点名称wsrep_node_address设置当前节点的IP地址wsrep_cluster_name设置群集的逻辑名称。所有群集节点上必须相同。binlog_format设置为ROW MariaDB Galera Cluster 不支持其他二进制日志格式。innodb_autoinc_lock_mode设置为 2MariaDB Galera 集群不支持其他自动增量锁定模式。wsrep_on设置为ON 以启用 MariaDB Galera 集群。wsrep_provider_options选项变量gcache.size1G 可以指定群集缓存提高性能。可根据服务器内存调整。3.2、集群初始化节点1# 第一次种子节点必须要手动初始化/opt/maraidb/bin/mysqld\--defaults-file/opt/maraidb/my.cnf\--usermysql\--wsrep-new-cluster检查# 注意看以下几个值[rootlocalhost mariadb]# ./bin/mysql -uroot -pMariaDB[(none)]SHOW STATUS LIKEwsrep%;|wsrep_incoming_addresses|10.4.50.163:8105||wsrep_cluster_size|1||wsrep_cluster_status|Primary||wsrep_connected|ON|# 此时 kill mysqld进程在重启或者继续下面操作都行节点2、节点3# 直接启动就行 systemctl start maraidbcd/opt/mariadb/tail-f logs/error.log# 确认没有异常 正常日志2026-01-0516:17:262[Note]WSREP:View: id: 2b6525ab-ea0e-11f0-ac32-4f86af15e710:3 status: primary protocol_version:4capabilities: MULTI-MASTER, CERTIFICATION, PARALLEL_APPLYING, REPLAY, ISOLATION, PAUSE, CAUSAL_READ, INCREMENTAL_WS, UNORDERED, PREORDERED, STREAMING, NBO final: no own_index:1members(3):0: 2b5f5932-ea0e-11f0-a7ed-f38027b426cc, galera-node-11: b5b8d6be-ea0e-11f0-9a42-1b3dcf176a85, galera-node-22: f77948be-ea0e-11f0-8145-7af6d199179d, galera-node-3检查# 注意看以下几个值[rootlocalhost mariadb]# ./bin/mysql -uroot -pMariaDB[(none)]SHOW STATUS LIKEwsrep%;|wsrep_incoming_addresses|10.4.50.163:8105,10.4.50.164:8105,10.4.50.165:8105||wsrep_cluster_size|3||wsrep_cluster_status|Primary||wsrep_connected|ON|3.3、验证任意一个节点 如 164cd/opt/mariadb/bin ./mysql -uroot -p# 创建数据库和表CREATE DATABASE galera_test_db DEFAULT CHARACTER SET utf8mb4;USE galera_test_db;CREATE TABLE user_info(idINT AUTO_INCREMENT PRIMARY KEY, user_name VARCHAR(50)NOT NULL, create_time DATETIME DEFAULT CURRENT_TIMESTAMP)ENGINEInnoDB DEFAULTCHARSETutf8mb4;# 插入数据INSERT INTO user_info(user_name)VALUES(test_user_01),(test_user_02);# 查询验证SELECT * FROM user_info;此时 163或165上连接, 数据很快就会同步cd/opt/mariadb/bin ./mysql -uroot -p USE galera_test_db;SELECT * FROM user_info;四、注意事项与总结注意事项存储引擎限制仅支持InnoDBMyISAM等非事务引擎不支持同步复制会导致数据不一致生产环境严禁使用。大事务限制避免超大事务如百万级批量插入会占用大量带宽和内存导致集群阻塞建议拆分为小事务。DDL操作注意DDL操作CREATE/ALTER TABLE会触发全量同步高并发场景建议在业务低峰期执行。节点数量建议优先选择3、5等奇数节点避免脑裂2节点需额外配置仲裁节点。手动部署路径适配所有配置必须指定手动创建的目录数据、配置、日志登录时需指定socket文件否则会连接失败。备份策略定期备份/usr/local/mariadb10.6/data目录避免集群整体遭遇逻辑错误如误删库导致数据丢失。端口开放生产环境需开放3306MySQL、4567Galera通信、4568IST同步、4444SST同步端口而非直接关闭防火墙。总结MariaDB 10.6 Galera Cluster的核心优势的是同步多主复制、数据强一致性和自动故障恢复适配核心业务高可用需求手动部署的核心是路径适配与权限配置二进制解压方案优先于源码编译适合快速落地集群部署的关键是节点1初始化–wsrep-new-cluster和其余节点自动加入配置时需确保集群名称一致、节点IP正确生产环境需严格遵守存储引擎限制、节点数量建议及备份策略确保集群稳定性和数据安全性。