如何在 Ubuntu 16.04 上安装 MariaDB Galera 集群
本教程适用于这些操作系统版本
- Ubuntu 20.04(Focal Fossa)
- Ubuntu 16.04(Xenial Xerus)
在此页
- 要求
- 开始
- 安装 MariaDB Galera
- 在 Node1 上设置 MariaDB 集群
- 在 Galera 集群上添加 Node2
- 在 Galera 集群上添加 Node3
- 配置防火墙
- 启动 MariaDB Galera 集群
- 测试数据库复制
- 结论
MariaDB Galera 是 MariaDB 的多主集群。从 MariaDB 10.1 开始,MariaDB Server 和 MariaDB Galera Server 包已经合并,Galera 包及其依赖项在安装 MariaDB 时自动安装。目前,MariaDB Galera Cluster 仅支持 InnoDB/XtraDB 存储引擎。在 MariaDB 10.0 和 5.5 中,您需要单独下载。 MariaDB Galera 为站点数据库添加了冗余。在MariaDB Galera Cluster 中,多个数据库服务器相互连接并保持同步。
MariaDB Galera 提供了很多功能,下面列出了其中的一些功能:
- 同步复制。
- 自动加入节点。
- 主动-主动多主拓扑。
- 真正的行级并行复制。
- 读取和写入可扩展性、更小的客户端延迟。
- 失败的节点,自动从集群中删除。
在本教程中,我们将解释如何在 Ubuntu 16.04 服务器上运行 3 个节点来设置 MariaDB Galera Cluster 10.1。我们还将测试所有节点之间的数据库复制。
要求
- 三个节点运行 Ubuntu 16.04 服务器。
- 在您的服务器上配置静态 IP 地址为 192.168.0.102 的节点 1、静态 IP 地址为 192.168.0.103 的节点 2 和静态 IP 地址为 192.168.0.104 的节点 3。
- 在所有节点上设置具有 sudo 权限的非根用户。
入门
首先,您需要使用最新版本更新所有节点。您可以使用以下命令更新所有这些:
sudo apt-get update -y
sudo apt-get upgrade -y
接下来,重新启动所有节点以应用这些更改。然后,使用 sudo 用户登录并继续下一步。
安装 MariaDB Galera
MariaDB Server 和 MariaDB Galera Server 包合并在 MariaDB 10.1 版本中。默认情况下,MariaDB 10.1 在默认的 Ubuntu 存储库中不可用,因此您需要在所有节点上添加 MariaDB 存储库。
首先,使用以下命令添加 MariaDB 存储库密钥:
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
接下来,使用以下命令添加存储库并更新 APT 缓存:
sudo add-apt-repository 'deb [arch=amd64,i386,ppc64el] http://ftp.utexas.edu/mariadb/repo/10.1/ubuntu xenial main'
sudo apt-get update -y
更新存储库后,使用以下命令安装 MariaDB:
sudo apt-get install mariadb-server rsync -y
上面的命令将安装带有 Galera 和几个依赖项的 MariaDB。 Galera 部分在配置之前保持休眠状态,就像插件或存储引擎一样。在所有节点上安装 MariaDB 后,您可以继续保护 MariaDB。
默认情况下,MariaDB 安装是不安全的,因此您需要确保 MariaDB 安装安全。您可以通过运行 mysql_secure_installation 脚本来执行此操作:
sudo mysql_secure_installation
在此过程中,您将被要求设置 root 密码、删除匿名用户、禁止 root 远程登录以及删除测试数据库。如下图所示回答所有问题:
Enter current password for root (enter for none):
Change the root password? [Y/n] n
Remove anonymous users? [Y/n] Y
Disallow root login remotely? [Y/n] Y
Remove test database and access to it? [Y/n] Y
Reload privilege tables now? [Y/n] Y
一旦 MariaDB 在所有节点上都受到保护,您就可以继续下一步。
在 Node1 上设置 MariaDB 集群
首先,转到 Node1 并为 Galera 创建一个配置文件。默认情况下,MariaDB 从 /etc/mysql/conf.d/ 目录中读取配置。为此,请运行以下命令:
sudo nano /etc/mysql/conf.d/galera.cnf
添加以下行:
[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
# Galera Provider Configuration
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
# Galera Cluster Configuration
wsrep_cluster_name="galera_cluster"
wsrep_cluster_address="gcomm://192.168.0.102,192.168.0.103,192.168.0.104"
# Galera Synchronization Configuration
wsrep_sst_method=rsync
# Galera Node Configuration
wsrep_node_address="192.168.0.102"
wsrep_node_name="Node1"
完成后保存文件。
注:192.168.0.102为Node1的IP地址
在 Galera 集群上添加 Node2
接下来,转到 Node2 并为 Galera 创建一个配置文件:
sudo nano /etc/mysql/conf.d/galera.cnf
添加以下行:
[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
# Galera Provider Configuration
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
# Galera Cluster Configuration
wsrep_cluster_name="galera_cluster"
wsrep_cluster_address="gcomm://192.168.0.102,192.168.0.103,192.168.0.104"
# Galera Synchronization Configuration
wsrep_sst_method=rsync
# Galera Node Configuration
wsrep_node_address="192.168.0.103"
wsrep_node_name="Node2"
完成后保存文件。
注:192.168.0.103为Node2的IP地址。
在 Galera 集群上添加 Node3
接下来,转到 Node3 并为 Galera 创建一个配置文件:
sudo nano /etc/mysql/conf.d/galera.cnf
添加以下行:
[mysqld]
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0
# Galera Provider Configuration
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
# Galera Cluster Configuration
wsrep_cluster_name="galera_cluster"
wsrep_cluster_address="gcomm://192.168.0.102,192.168.0.103,192.168.0.104"
# Galera Synchronization Configuration
wsrep_sst_method=rsync
# Galera Node Configuration
wsrep_node_address="192.168.0.104"
wsrep_node_name="Node3"
完成后保存文件。
注:192.168.0.104为Node3的IP地址。
配置防火墙
Galera Cluster 使用四个端口 3306 用于 MySQL 客户端连接,4444 用于状态快照传输,4567 用于 Galera 集群复制流量,4568 用于增量状态传输。因此,您需要使用 UFW 防火墙允许所有这些端口。您可以通过在所有节点上运行以下命令来执行此操作:
首先,使用以下命令启用 UFW 防火墙:
sudo ufw enable
接下来,使用以下命令允许所有端口:
sudo ufw allow 3306/tcp
sudo ufw allow 4444/tcp
sudo ufw allow 4567/tcp
sudo ufw allow 4568/tcp
sudo ufw allow 4567/udp
然后,您可以使用以下命令检查防火墙的状态:
sudo ufw status
在所有节点上配置 UFW 防火墙后,您可以继续下一步。
启动 MariaDB Galera 集群
成功配置所有节点后,转到 Node1 并启动 Galera Cluster。
在 Galera 启动之前,您需要确保所有节点上的 MariaDB 服务都已停止。
在所有节点上运行以下命令:
sudo systemctl stop mysql
现在,使用以下命令在 Node1 上启动 Galera 集群:
sudo galera_new_cluster
现在,使用以下命令检查集群是否正在运行:
mysql -u root -p -e "show status like 'wsrep_cluster_size'"
如果一切正常,您应该会看到以下输出:
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 1 |
+--------------------+-------+
在Node2上,启动MariaDB服务:
sudo systemctl start mysql
您可以使用以下命令检查 MariaDB 服务的状态是否正常工作:
sudo systemctl status mysql
如果一切正常,您应该会看到以下输出:
?? mariadb.service - MariaDB database server
Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2017-09-17 10:11:20 EDT; 10min ago
Process: 715 ExecStartPost=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
Process: 713 ExecStartPost=/etc/mysql/debian-start (code=exited, status=0/SUCCESS)
Process: 545 ExecStartPre=/bin/sh -c [ ! -e /usr/bin/galera_recovery ] && VAR= || VAR=`/usr/bin/galera_recovery`; [ $? -eq 0 ] && systemctl set
Process: 535 ExecStartPre=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
Process: 514 ExecStartPre=/usr/bin/install -m 755 -o mysql -g root -d /var/run/mysqld (code=exited, status=0/SUCCESS)
Main PID: 661 (mysqld)
Status: "Taking your SQL requests now..."
Tasks: 26 (limit: 4915)
CGroup: /system.slice/mariadb.service
??????661 /usr/sbin/mysqld
Sep 17 10:11:11 debian systemd[1]: Starting MariaDB database server...
Sep 17 10:11:15 debian mysqld[661]: 2017-09-17 10:11:15 140287134630464 [Note] /usr/sbin/mysqld (mysqld 10.1.26-MariaDB-0+deb9u1) starting as process
Sep 17 10:11:20 debian systemd[1]: Started MariaDB database server.
现在,您的第二个节点应该自动链接到集群。您可以使用以下命令验证这一点:
mysql -u root -p -e "show status like 'wsrep_cluster_size'"
如果一切正常,集群大小应该设置为两个:
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 2 |
+--------------------+-------+
在Node3上,启动MariaDB服务:
sudo systemctl start mysql
mysql -u root -p -e "show status like 'wsrep_cluster_size'"
如果一切正常,集群大小应该设置为三个:
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 3 |
+--------------------+-------+
您的集群现在正在工作并相互通信。
测试数据库复制
现在,所有节点都在线了,是时候测试跨 Galera 集群的数据库复制了。让我们首先在 Node1 上创建一个数据库,然后检查它是否在所有节点上都被复制了。
首先,使用以下命令登录到 MariaDb 控制台:
mysql -u root -p
输入你的 root 密码并创建一个名为 test_db 的数据库:
MariaDB [(none)]> create database test_db;
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| test_db |
+--------------------+
现在转到 Node2 和 Node3,然后检查复制是否正常工作:
mysql -u root -p
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| test_db |
+--------------------+
恭喜!您已经在 Ubuntu 16.04 服务器上成功安装和配置了 MariaDB Galera Cluster。
结论
我希望您现在有足够的知识在 Ubuntu 16.04 上安装和配置 MariaDB Galera Cluster。您现在可以轻松地扩展到几个甚至几十个不同的节点。如果您有任何疑问或更多疑问,请参考链接 Galera Cluster Doc