在Debian系统上搭建MySQL集群主要有两种方案:MySQL Cluster(NDB Cluster)(原生分布式事务型集群)和Galera Cluster(多主同步复制集群)。以下分别介绍具体搭建步骤:
MySQL Cluster是基于NDB(Network Database)存储引擎的实时事务型集群,支持高可用性和线性扩展,适合需要强一致性的场景。
sudo apt update && sudo apt upgrade -y
。在所有节点上执行:
sudo apt install mysql-cluster-community-server mysql-cluster-community-client -y
这会安装MySQL Server及NDB Cluster组件。
在管理节点上创建配置目录并编辑配置文件(/var/lib/mysql-cluster/config.ini
):
[ndb_mgmd] # 管理节点配置
hostname=管理节点IP
datadir=/var/lib/mysql-cluster # 数据存储路径
[ndbd] # 数据节点配置(每行对应一个数据节点)
hostname=数据节点1IP
hostname=数据节点2IP
[mysqld] # SQL节点配置(每行对应一个SQL节点)
hostname=SQL节点1IP
hostname=SQL节点2IP
启动管理节点:
sudo ndb_mgmd --config-file=/var/lib/mysql-cluster/config.ini --initial # --initial仅首次启动使用
验证管理节点状态:
ndb_mgm -e "show" # 应显示管理节点状态为"running"
在每个数据节点上启动数据节点服务:
sudo ndbd --initial # 首次启动用--initial,后续用ndbd
验证数据节点状态:
ndb_mgm -e "show" # 应显示数据节点状态为"connected"或"running"
在每个SQL节点上安装MySQL Server(若未安装),编辑配置文件(/etc/mysql/my.cnf
):
[mysqld]
ndbcluster # 启用NDB存储引擎
ndb-connectstring=管理节点IP # 指向管理节点
重启MySQL服务:
sudo systemctl restart mysql
验证SQL节点是否连接集群:
mysql -uroot -p -e "SHOW STATUS LIKE 'ndb_cluster%';" # 应显示ndb_cluster_connection_status为"connected"
在SQL节点上创建测试表并插入数据:
USE test;
CREATE TABLE cluster_table (id INT PRIMARY KEY, name VARCHAR(50)) ENGINE=NDBCLUSTER; # 必须指定NDBCLUSTER引擎
INSERT INTO cluster_table VALUES (1, 'test');
在其他SQL节点查询数据,确认数据同步:
SELECT * FROM test.cluster_table;
Galera Cluster是基于多主同步复制的集群,支持多点写入,适合需要高可用性和读写扩展的场景(如InnoDB引擎)。
ntp
或chrony
);在所有节点上执行:
sudo apt install mysql-server galera-3 -y
galera-3
是Galera库,提供同步复制功能。
在第一个节点(node1)上编辑配置文件(/etc/mysql/my.cnf
):
[mysqld]
wsrep_provider=/usr/lib/galera/libgalera_smm.so # Galera提供者路径
wsrep_cluster_address="gcomm://node1IP,node2IP,node3IP" # 集群节点地址
wsrep_node_address=node1IP # 当前节点IP
wsrep_node_name=node1 # 当前节点名称
wsrep_sst_method=xtrabackup-v2 # 数据同步方法(推荐xtrabackup)
binlog_format=ROW # 必须为ROW格式
default_storage_engine=InnoDB # 必须使用InnoDB
innodb_autoinc_lock_mode=2 # 解决自增冲突
注意:首次启动集群时,wsrep_cluster_address
需设置为gcomm://
(单节点启动),后续节点加入时再改为完整地址。
在node1上启动MySQL服务(会自动初始化集群):
sudo systemctl start mysql
验证集群状态:
mysql -uroot -p -e "SHOW STATUS LIKE 'wsrep_cluster_size';" # 应显示cluster_size为1
在node2、node3上重复配置步骤3,将wsrep_cluster_address
改为完整地址(如gcomm://node1IP,node2IP,node3IP
),然后启动服务:
sudo systemctl start mysql
等待节点同步完成(可通过wsrep_cluster_size
确认所有节点已加入)。
在任意节点插入数据,检查其他节点是否同步:
-- 在node1上执行
USE test;
CREATE TABLE galera_table (id INT PRIMARY KEY, name VARCHAR(50));
INSERT INTO galera_table VALUES (1, 'galera_test');
-- 在node2/node3上执行
SELECT * FROM test.galera_table; # 应查询到插入的数据
NDBCLUSTER
存储引擎,适合高频事务场景,但对硬件要求较高;innodb_autoinc_lock_mode=2
解决);ndb_mgm
监控MySQL Cluster、wsrep_local_state_comment
监控Galera状态)、备份(如xtrabackup
)及安全策略(SSL加密)。