如何在Ubuntu 16.04 LTS上使用Heartbeat和DRBD设置MariaDB高可用性

在本教程中,我们将学习如何在Ubuntu 16.04服务器上使用Heartbeat和DRBD实现MariaDB的高可用性。心跳和DRBD都是...

如何在Ubuntu 16.04 LTS上使用Heartbeat和DRBD设置MariaDB高可用性

Heartbeat和DRBD都可用于任何使用两台服务器的应用程序的群集解决方案。 两台服务器都工作在主动和被动模式下,一台服务器将同时工作,另一台服务器作为备份服务器。 DRBD(分布式复制块设备)是一种内核级服务,可以实时同步两台服务器之间的数据。 Heartbeat是一个开放源代码程序,它允许主服务器和备用Linux服务器确定其他服务器是否“活动”,并且如果主服务器不是,则将资源故障切换到备份。 它还将管理服务器中的IP高可用性和其他服务。

在本教程中,我们将学习如何在Ubuntu 16.04服务器上使用Heartbeat和DRBD实现MariaDB的高可用性。

要求

  • 两个安装了Ubuntu 16.04服务器的节点。
  • 两个网卡安装在每个节点上。
  • 额外的未分区硬盘安装在每个节点上。
  • 非root用户在每个节点上设置sudo权限。

入门

在开始之前,您需要在每个节点上设置IP地址。 在每个节点上使用以下IP地址:

节点1:

在eth0上为172.16.0.1,在eth1上为192.168.0.101

节点2:

在eth0上为172.16.0.2,在eth1上为192.168.0.102

IP 192.168.0.103将是高可用性IP。

接下来,您还需要在每个节点上设置主机名和主机名解析。 所以每个节点都可以相互通信。 在第一个节点上,打开/ etc / hosts文件和/ etc / hostname文件:

sudo nano /etc/hosts

在文件末尾添加以下行:

172.16.0.1  Node1
172.16.0.2  Node2

sudo nano /etc/hostname

如下所示更改文件:

Node1

完成后保存并关闭文件。

在第二个节点上,打开/ etc / hosts文件和/ etc / hostname文件:

sudo nano /etc/hosts

在文件末尾添加以下行:

172.16.0.1  Node1
172.16.0.2  Node2

sudo nano /etc/hostname

如下所示更改文件:

Node2

完成后保存并关闭文件。

接下来,使用以下命令更新每个节点的最新版本:

sudo apt-get update -y
sudo apt-get upgrade -y

系统更新后,重新启动系统以应用这些更改。

安装DRBD和心跳

接下来,您需要在两个节点上安装DRBD和Heartbeat。 默认情况下,两者都可在Ubuntu 16.04默认存储库中使用。 只需在两个节点上运行以下命令即可安装它们:

sudo apt-get install drbd8-utils heartbeat -y

接下来,启动DRBD和Heartbeat服务并使其在启动时启动:

sudo systemctl start drbd
sudo systemctl start heartbeat
systemctl enable drbd
systemctl enable heartbeat

配置DRBD和心跳

接下来,您需要在每个节点上安装DRBD设备。 在每个节点上的第二个未分区驱动器/ dev / sdb上创建一个分区。

您只需在每个节点上运行以下命令即可完成此操作:

sudo echo -e 'n\np\n1\n\n\nw' | fdisk /dev/sdb

接下来,您需要在两个节点上配置DRBD。 您可以通过在每个节点上创建/etc/drbd.d/r0.res文件来完成此操作。

sudo nano /etc/drbd.d/r0.res

添加以下行:

global {
usage-count no;
}
resource r0 {
protocol C;
startup {
degr-wfc-timeout 60;
}
disk {
}
syncer {
rate 100M;
}
net {
cram-hmac-alg sha1;
shared-secret "aBcDeF";
}
on Node1 {
device /dev/drbd0;
disk /dev/sdb1;
address 172.16.0.1:7789;
meta-disk internal;
}
on Node2 {
device /dev/drbd0;
disk /dev/sdb1;
address 172.16.0.2:7789;
meta-disk internal;
}
}

完成后保存并关闭文件,然后在每个节点上打开另一个配置文件:

sudo nano /etc/ha.d/ha.cf

添加以下行:

# Check Interval
keepalive 1
# Time before server declared dead
deadtime 10
# Secondary wait delay at boot
initdead 60
# Auto-failback
auto_failback off
# Heartbeat Interface
bcast eth1
# Nodes to monitor
node Node1
node Node2

保存并关闭文件。

接下来,在每个节点上打开资源文件/etc/ha.d/haresources

sudo nano /etc/ha.d/haresources

添加以下行:

Node1 192.168.0.103/24 drbddisk::r0 Filesystem::/dev/drbd0::/var/lib/mysql::ext4::noatime

这里, Node1是主要活动节点的主机名, 192.168.0.103是浮点IP地址, / var / lib / mysql是挂载点, / dev / drbd0是DRBD设备。

接下来,您将需要在两个节点上定义和存储相同的授权密钥。 您可以通过每个节点上的/etc/ha.d/authkeys文件来完成此操作:

sudo nano /etc/ha.d/authkeys

添加以下行:

auth1
1 sha1 your-secure-password

在这里,你的安全密码是你的安全密码。 在两个节点上使用相同的密码。

接下来,通过在Node1上运行以下命令来创建并启动DRBD:

sudo drbdadm create-md r0
sudo systemctl restart drbd
sudo drbdadm outdate r0
sudo drbdadm -- --overwrite-data-of-peer primary all
sudo drbdadm primary r0
sudo mkfs.ext4 /dev/drbd0
sudo chmod 600 /etc/ha.d/authkeys
sudo mkdir /var/lib/mysql

在Node1上创建DRBD磁盘后,使用以下命令在Node2上创建DRBD磁盘:

sudo drbdadm create-md r0
sudo systemctl restart drbd
sudo chmod 600 /etc/ha.d/authkeys
sudo mkdir /var/lib/mysql

现在,您可以通过运行以下命令来验证DRBD磁盘已连接并正在同步:

sudo cat /proc/drbd

如果一切正常,您应该看到以下输出:

version: 8.4.5 (api:1/proto:86-101)
srcversion: F446E16BFEBS8B115AJB14H
0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
ns:210413 nr:0 dw:126413 dr:815311 al:35 bm:0 lo:0 pe:11 ua:0 ap:0 ep:1 wo:f oos:16233752
[>....................] sync'ed: 3.3% (14752/14350)M
finish: 0:12:23 speed: 12,156 (16,932) K/sec

接下来,在两个节点上启动心跳,以启用安装的故障切换部分。

sudo systemctl start heartbeat

接下来,在Node1上使用以下命令验证已安装的DRBD分区:

sudo mount | grep drbd

您应该看到以下输出:

/dev/drbd0 on /var/lib/mysql type ext4 (rw,noatime,data=ordered)

接下来,使用以下命令验证浮动IP仅绑定到Node1:

sudo ip addr show | grep 192.168.0.103

您应该看到以下输出:

inet 192.168.0.103/24 brd 192.168.0.255 scope global secondary eth1:0

安装和配置MariaDB

一旦在两个节点上正确配置了所有内容,现在就可以在两个节点上安装MariaDB服务器了。

在两个节点上运行以下命令以安装MariaDB服务器:

sudo apt-get install mariadb-server -y

接下来,您需要在两个节点上禁用MariaDB服务:

sudo systemctl disable mysql

在这里,我们将使用Node1作为主节点,Node2上的数据库应该通过与Node1同步来创建和填充。 因此,您需要停止MariaDB服务并删除Node2上的/ var / lib / mysql内的内容。 你可以用下面的命令来做到这一点:

sudo systemctl stop mysql
sudo rm -rf /var/lib/mysql/*

接下来,您需要将MySQL维护配置文件从Node1复制到Node2。 您可以通过运行以下命令来完成此操作:

sudo scp /etc/mysql/debian.cnf root@172.16.0.2:/etc/mysql/debian.cnf

接下来,您将需要创建一个root用户来远程管理和访问高可用性MySQL实例上的数据库。

您可以通过在Node1上运行以下命令来完成此操作:

mysql -u root -p

输入您的root密码,然后使用以下命令创建一个root用户:

MariaDB [(none)]> CREATE USER 'root'@'192.168.0.%' IDENTIFIED BY 'password';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.0..%' WITH GRANT OPTION;
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> QUIT;

接下来,使用以下命令在两个节点上为MySQL设置绑定地址:

sudo sed -i 's/127.0.0.1/0.0.0.0/g' /etc/mysql/mariadb.conf.d/*.cnf

为MariaDB服务启动心跳

接下来,您需要在两个节点上的心跳实例中添加MariaDB服务。 你可以通过编辑/etc/ha.d/haresources文件来做到这一点:

sudo nano /etc/ha.d/haresources

修改以下几行:

Node1 192.168.0.103/24 drbddisk::r0 Filesystem::/dev/drbd0::/var/lib/mysql::ext4::noatime mysql

完成后保存并关闭文件。

一旦配置了心跳,您将需要在两个节点上重新启动它。

首先,在Node1上重新启动heartbea:

sudo systemctl restart heartbeat

接下来,等待50秒,然后重新启动Node2上的心跳服务:

sudo systemctl restart heartbeat

测试心跳和DRBD

现在,所有配置都正确,是时候执行一系列测试来验证活动服务器以某种方式失败时,心跳将实际上触发从活动服务器到被动服务器的传输。

首先,在Node1上使用以下命令验证Node1是主drbd节点:

sudo cat /proc/drbd

您应该看到以下输出:

version: 8.4.5 (api:1/proto:86-101)
srcversion: F446E16BFEBS8B115AJB14H
O cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:22764644 nr:256 dw:529232 dr:22248299 al:111 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

接下来,我们将验证DRBD磁盘是否使用以下命令进行挂载:

sudo mount | grep drbd

/dev/drbd0 on /var/lib/mysql type ext4 (rw,noatime,data=ordered)

接下来,使用以下命令验证MariaDB服务:

sudo systemctl status mysql

接下来,使用浮动IP从远程计算机访问MariaDB服务器并创建一个测试数据库:

mysql -h 192.168.0.103 -u root -p

MariaDB [(none)]> create database test;
MariaDB [(none)]> quit

接下来,在Node1上重新启动心跳:

sudo systemctl restart heartbeat

现在,心跳会将此重新启动解释为Node1上MariaDB的故障,并应触发故障转移以使Node2成为主服务器。

您可以检查DRBD是否正在使用Node1上的以下命令将Node1视为辅助服务器:

sudo cat /proc/drbd

您应该看到以下输出:

version: 8.4.5 (api:1/proto:86-101)
srcversion: F446E16BFEBS8B115AJB14H
0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
ns:22764856 nr:388 dw:529576 dr:22248303 al:112 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

现在,通过在Node2上运行以下命令来验证Node2是主drbd节点:

sudo cat /proc/drbd

您应该看到以下输出:

version: 8.4.5 (api:1/proto:86-101)
srcversion: F446E16BFEBS8B115AJB14H
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:412 nr:20880892 dw:20881304 dr:11463 al:7 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0

接下来,检查以确保MariaDB在Node2上运行:

sudo systemctl status mysql

现在,使用Node2上的浮动IP从远程用户连接到MariaDB服务器。

mysql -h 192.168.0.103 -u root -p

接下来,查看我们之前创建的测试数据库,而Node1是主服务器。

MariaDB [(none)]> show databases;

您应该看到以下输出:

 +--------------------+
| Database |
+--------------------+
| test |
| information_schema |
| lost+found |
| mysql |
| performance_schema |
+--------------------+
5 rows in set (0.04 sec)