Date: 1月 6, 2019
循序渐进:如何在没有共享存储的情况下在Google Cloud Platform(Google Compute Engine)上配置Linux故障转移群集#google #gce #sanless #cluster
在本分步指南中,我将向您介绍在Google Cloud Platform(Google Compute Engine,又名GCE)中配置高可用性2节点MySQL群集(以及见证服务器)所需的所有步骤。 该指南包括适当的屏幕截图,shell命令和代码片段。 我假设您对Google Cloud Platform有点熟悉并且已经拥有一个帐户。 如果没有,您今天就可以报名参加免费试用。 我还将假设您具有基本的Linux系统管理技能,并了解基本的故障转移群集概念,如虚拟IP,仲裁等。
免责声明:云是一个快速发展的目标。 因此,功能/屏幕/按钮必然会随着时间的推移而发生变化,因此您的体验可能会与您在下面看到的略有不同。 虽然本指南将向您展示如何使MySQL数据库具有高可用性,但您当然可以调整此信息和流程以保护其他应用程序或数据库,如SAP,PostgreSQL,Oracle,WebSphere MQ,NFS文件服务器等。以下是在Google Compute Engine中创建高可用性MySQL数据库的高级步骤:
- 创建一个项目
- 创建实例(虚拟机)
- 创建实例组
- 创建防火墙规则以允许VNC访问
- Linux OS配置
- 安装和配置MySQL
- 安装和配置群集
- 创建内部负载均衡器
- 为内部负载均衡器创建防火墙规则
- 测试群集连接
概观
本文将介绍如何在单个Google Cloud区域内创建群集。 群集节点(node1,node2和见证服务器)将全部驻留在“us-central1”区域(10.128.0.0/20网络)中,但您可以相应地选择您的区域。配置如下所示:将使用以下IP地址:
- node1:10.128.0.2
- node2:10.128.0.3
- 见证人:10.128.0.4
- 内部负载均衡器IP:10.128.0.99
- MySQL端口:3306
创建一个项目
首次登录时,您将看到一个空的Home Dashboard,并将被要求创建一个Project。 我们将创建的所有Google Compute Engine资源都属于此Google Cloud Platform项目。 在这里,我们将调用我们新创建的项目“LinuxCluster”:
创建实例(虚拟机)
我们将在本指南中配置3台虚拟机。 前两个VM(我称之为“node1”和“node2”)将作为集群节点运行,能够将MySQL数据库及其相关资源联机。 第三个VM将充当群集的见证服务器,以增强对裂脑的保护。为确保最大可用性,所有3个VM将驻留在该区域内的不同区域中(在此示例中:us-central1-a,us-central1-b,us-central1-c)。
创建“节点1”实例
创建第一个VM实例(“node1”)。 如果这是您第一次创建实例,则屏幕将如下图所示。单击屏幕中央的“创建实例”按钮:如果您已在GCE中运行其他实例,则您的屏幕看起来会有所不同。 仍然,单击“创建实例”继续:默认情况下,默认情况下通常会选择Debian linux。 我们*不要*因为我们将在本指南中使用CentOS 6.X。为实例命名(“node1”),选择我们区域内的第一个区域(a)(us-central1),并确保单击“更改”以选择正确的引导映像。 您可以根据工作负载要求调整实例的大小,但出于本指南的目的,我们将使用默认大小来最小化成本,这是一个相当小的VM(1个vCPU,只有3.75GB RAM)在Boot disk pop中在屏幕上,选择CentOS 6,在底部我们将使用SSD启动盘。 对于本指南而言,10GB就足够了。 您可以相应地调整系统大小:单击“选择”后,您将返回“创建实例”屏幕。 在底部,单击“管理,磁盘,网络,SSH密钥”,因为我们将向VM添加第二个磁盘。 第二个磁盘将用于存储我们的数据库,它将在以后由集群软件复制/同步。 选择“Disks”选项卡,然后单击“Add item”将第二个磁盘添加到此实例:单击“Create disk”:为新磁盘命名,选择所需类型,然后从空白磁盘开始。 在此示例配置中,10 GB应该足以满足我们的需求。 注意:记住您在此处设置的值。 两个群集节点(node1和node2)都需要是SAME SIZE:最后,单击“Networking”选项卡,并为node1提供客户内部IP。 单击“创建”以启动新实例:
创建“node2”
重复上述步骤两次以创建第二个群集节点(“node2”)。 像创建node1一样创建此实例,包括添加第二个磁盘。重要提示:确保它位于不同的区域(us-central1-b)并为其提供唯一的IP(10.128.0.3)
创建“见证”VM
创建第三个VM(“见证”)并确保它位于前两个实例的不同区域(us-central1-c)中。注意:此实例不需要添加额外的磁盘。 您的3个VM实例可能需要一段时间才能进行配置。 完成后,您将在Google云端控制台的VM Instances屏幕上看到您的VM。 验证是否已将每个VM正确启动到其他区域:
创建实例组
在本指南的后面部分,我们将创建一个内部负载均衡器,以将流量路由到活动群集节点。 Google Cloud Platform上可用的所有可能的负载均衡器配置都需要实例组来为负载均衡器发送的流量提供服务。将创建两个实例组,每个实例组将包含一个群集节点。
创建实例组1
为您的第一个实例组命名(“instance-group-1a”),选择“Single-zone”并确保正确选择第一个VM实例所在的区域。 在这里,我们选择us-central-1a,因为那是部署“node1”的地方。 在下面,选择“选择现有实例”并从VM实例下拉列表中选择“node1”:
创建实例组2
再次重复上一步,这次选择第二个节点所在的区域。 us-central-1b和node2:
创建防火墙规则以允许VNC访问
您可以通过导航到以下内容来查看所有现有防火墙规则:网络 – >防火墙规则默认情况下,从外部世界打开到您的VM的“Google防火墙”中打开的唯一端口是ping,SSH(端口22)和RDP(港口3389)。 在本指南的后面,我们将使用VNC访问“node1”的桌面并使用GUI配置集群。 创建防火墙规则以允许VNC访问。 在该指南中使用端口5902。 根据您的VNC配置进行调整。
Linux OS配置
接下来,我们需要配置我们实例的Linux操作系统并在命令行上弄脏,作为Linux管理员,您现在应该习惯这样做。有许多方法可以连接到Linux VM的控制台。 您可以直接从GCE Web界面启动SSH连接,也可以在笔记本电脑/工作站上本地安装Google Cloud SDK。要使用浏览器进行SSH,只需转到计算 – > VM实例,然后转到要连接的VM的右侧,在“连接”下选择“在浏览器窗口中打开”。 如果您希望在笔记本电脑/工作站上本机安装Google Cloud命令行工具,请参阅此处的文档:https://cloud.google.com/sdk/docs/quickstarts连接后,使用“sudo”命令获得root权限:
$ sudo su -
编辑/ etc / hosts
除非您已经设置了DNS服务器,否则您需要在所有3台服务器上创建主机文件条目,以便它们可以通过名称正确地相互解析。将以下行添加到/ etc / hosts文件的末尾:
10.128.0.2 node1 10.128.0.3 node2 10.128.0.4证人 10.128.0.99 mysql-vip
禁用SELinux
编辑/ etc / sysconfig / linux并设置“SELINUX = disabled”:
#vi / etc / sysconfig / selinux #此文件控制系统上SELinux的状态。 #SELINUX =可以采用以下三个值中的一个: #enforcing - 强制执行SELinux安全策略。 #permissive - SELinux打印警告而不是强制执行。 #disabled - 未加载SELinux策略。 SELINUX =禁用 #SELINUXTYPE =可以采用以下两个值之一: #targeted - 目标进程受到保护, #mls - 多级安全保护。 SELINUXTYPE =针对性
安装各种RPM包
接下来,安装一些rpm软件包,稍后将需要这些软件包作为我们的集群软件的先决条件:
#yum install redhat-lsb补丁
安装和配置VNC(及相关软件包)
要访问我们的Linux服务器的GUI,以便稍后配置我们的集群,请在您的集群节点上安装VNC服务器。 在我的设置中,我只在“node1”上执行此操作
#yum install tigervnc-server xterm #vncpasswd #vi / etc / sysconfig / vncservers VNCSERVERS = “2:根” VNCSERVERARGS [2] =“ - 几何1024x768” #service vncserver start #chkconfig vncserver on
通过在笔记本电脑/台式机上打开VNC客户端并连接到群集节点的公共IP来测试连接性
重新启动群集节点
重新启动以禁用SELinux。需要重新启动所有3个系统(node1,node2,见证)。
分区和格式化“数据”磁盘
在VM实例创建期间,为每个群集节点添加了一个额外的磁盘,以存储我们将要保护的应用程序数据。 在这种情况下,它恰好是MySQL数据库。我们的VM的磁盘配置如下:
- / dev / sda – 操作系统磁盘
- / dev / sdb – 数据磁盘
在实例创建/ dev / sdb期间添加了第二个磁盘。 您可以运行“fdisk -l”命令进行验证。 您将看到/ dev / sda(OS)已经有一个磁盘分区并正在使用。
#fdisk -l 磁盘/ dev / sda:10.7 GB,10737418240字节 255个头,63个扇区/轨道,1305个气缸 单位= 16065 * 512 = 8225280字节的柱面 扇区大小(逻辑/物理):512字节/ 4096字节 I / O大小(最小/最佳):4096字节/ 4096字节 磁盘标识符:0x00035e98 设备启动开始结束块ID系统 / dev / sda1 * 1 1306 10484736 83 Linux 磁盘/ dev / sdb:10.7 GB,10737418240字节 64个头,32个扇区/轨道,10240个气缸 单位= 2048 * 512 = 1048576字节的柱面 扇区大小(逻辑/物理):512字节/ 4096字节 I / O大小(最小/最佳):4096字节/ 4096字节 磁盘标识符:0x762b810b
这里我们将创建一个分区(/ dev / sdb1),对其进行格式化,并将其挂载到MySQL的默认位置,即/ var / lib / mysql。 在“node1”和“node2”上执行以下步骤:
#fdisk / dev / sdb 命令(m求助):n 命令行动 扩展 p主分区(1-4) p 分区号(1-4):1 第一个柱面(1-1305,默认值1):<enter> 使用默认值1 最后一个气缸,气缸或尺寸{K,M,G}(1-1305,默认1305):<enter> 使用默认值1305 命令(m求助):w 分区表已被更改! 调用ioctl()重新读取分区表。 同步磁盘。 [root @ node1~]# #mkfs.ext4 / dev / sdb1 #mkdir / var / lib / mysql
在node1上,挂载文件系统:
#mount / dev / sdb1 / var / lib / mysql
安装和配置MySQL
接下来,安装安装MySQL包,初始化示例数据库,并为MySQL设置“root”密码。
在“node1”上:
#yum -y install mysql mysql-server #/ usr / bin / mysql_install_db --datadir =“/ var / lib / mysql /” - user = mysql #mysqld_safe --user = root --socket = / var / lib / mysql / mysql.sock --port = 3306 --datadir = / var / lib / mysql --log& # ##注意:下一个命令允许来自任何主机的远程连接。生产不是一个好主意! #echo“update user set Host ='%'where host ='node1'; flush privileges”| mysql mysql # ##将MySQL的root密码设置为'SIOS' #echo“update user set Password = PASSWORD('SIOS')其中User ='root'; flush特权”| mysql mysql
创建MySQL配置文件。我们将它放在数据磁盘上(稍后将被复制 – /var/lib/mysql/my.cnf)。 例:
#vi /var/lib/mysql/my.cnf 的[mysqld] DATADIR =的/ var / lib中/ MySQL的 插座=的/ var / lib中/ MySQL的/的mysql.sock PID文件=的/ var / lib中/ MySQL的/ mysqld.pid 用户=根 端口= 3306 #建议禁用符号链接以防止出现各种安全风险 符号链接= 0 [mysqld_safe的] 对数误差=的/ var /数/ mysqld.log PID文件= / var / run中/ mysqld的/ mysqld.pid [客户] 用户=根 密码= SIOS
删除位于/ etc中的原始MySQL配置文件(如果存在):
#rm /etc/my.cnf
在“node2”上:
在“node2”上,您只需要安装MySQL软件包。 其他步骤不是必需的:
[root @ node2~] #yum -y install mysql mysql-server
安装和配置群集
此时,我们已准备好安装和配置我们的集群。 SIOS Protection Suite for Linux(又名SPS-Linux)将在本指南中用作群集技术。 它在单个集成解决方案中提供高可用性故障转移群集功能(LifeKeeper)以及实时,块级数据复制(DataKeeper)。 SPS-Linux使您能够部署“SANLess”群集,即“无共享”群集,这意味着群集节点没有任何共享存储,就像Azure VM一样。
安装适用于Linux的SIOS Protection Suite
在所有3个VM(node1,node2,见证)上执行以下步骤:下载SPS-Linux安装映像文件(sps.img),并获取试用许可证或购买永久许可证。 有关更多信息,请联系SIOS。您将环回安装它并以root身份运行“setup”脚本(或首先“sudo su – ”以获取根shell)例如:
#mkdir / tmp / install #mount -o loop sps.img / tmp / install #cd / tmp / install # 。/建立
在安装脚本期间,系统会提示您回答一些问题。 您将在几乎每个屏幕上按Enter键以接受默认值。 请注意以下例外情况:
- 在标题为“High Availability NFS”的屏幕上,您可以选择“n”,因为我们不会创建高可用性NFS服务器
- 在安装脚本结束时,您可以选择立即或稍后安装试用许可证密钥。我们稍后会安装许可证密钥,因此您可以安全地选择“n”
- 在“设置”的最后一个屏幕中,从屏幕上显示的列表中选择要安装的ARK(应用程序恢复工具包,即“群集代理”)。
- 仅在“node1”和“node2”上需要ARK。 你不需要在“见证”上安装
- 使用向上/向下箭头导航列表,然后按空格键选择以下内容:
- lkDR – 适用于Linux的DataKeeper
- lkSQL – LifeKeeper MySQL RDBMS恢复工具包
- 这将导致在“node1”和“node2”上安装以下附加RPM:
- SteelEye公司 – LKDR-9.0.2-6513.noarch.rpm
- SteelEye公司 – lkSQL-9.0.2-6513.noarch.rpm
安装Witness / Quorum包
LifeKeeper(steeleye-lkQWK)的Quorum / Witness服务器支持包与LifeKeeper核心的现有故障转移过程相结合,可以在总体网络故障常见的情况下以更大的可信度进行系统故障转移。这实际上意味着可以在大大降低“裂脑”情况的风险的同时进行故障转移。在所有3个节点(node1,node2,见证)上安装Witness / Quorum rpm:
#cd / tmp / install / quorum #rpm -Uvh steeleye-lkQWK-9.0.2-6513.noarch.rpm
在所有3个节点(node1,node2,见证)上,编辑/ etc / default / LifeKeeper,设置NOBCASTPING = 1仅打开见证服务器(“见证”),编辑/ etc / default / LifeKeeper,设置WITNESS_MODE = off / none
安装许可证密钥
在所有3个节点上,使用“lkkeyins”命令安装从SIOS获取的许可证文件:
#/ opt / LifeKeeper / bin / lkkeyins <path_to_file> / <filename> .lic
启动LifeKeeper
在所有3个节点上,使用“lkstart”命令启动集群软件:
#/ opt / LifeKeeper / bin / lkstart
设置LifeKeeper GUI的用户权限
在所有3个节点上,编辑/ etc / group并将“tony”用户(或您登录的任何用户名)添加到“lkadmin”组以授予对LifeKeeper GUI的访问权限。 默认情况下,只有“root”是该组的成员,并且我们没有root密码:
#vi / etc / group lkadmin:X:502:根,贝
打开LifeKeeper GUI
与node1的公共IP地址建立VNC连接。 根据上面的VNC和防火墙规则配置,您将使用之前指定的VNC密码连接到<Public_IP>:2。 登录后,打开终端窗口并使用以下命令运行LifeKeeper GUI:
#/ opt / LifeKeeper / bin / lkGUIapp&
系统将提示您连接到第一个群集节点(“node1”)。 输入在VM创建期间指定的linux用户标识和密码:接下来,通过单击以下屏幕截图中突出显示的“连接到服务器”按钮连接到“node2”和“witness”:您现在应该看到GUI中的所有3个服务器,一个绿色的复选标记图标,表明他们在线和健康:
创建沟通路径
右键单击“node1”并选择Create Comm Path选择BOTH“node2”和“witness”,然后按照向导进行操作。 这将创建以下之间的通信路径:
- node1和node2
- node1&witness
仍然需要在node2和witness之间创建comm路径。 右键单击“node2”并选择Create Comm Path。 按照向导选择“见证”作为远程服务器:此时已创建以下通信路径:
- node1 < – > node2
- node1 < – >见证
- node2 < – >见证
服务器前面的图标已从绿色“复选标记”更改为黄色“危险标记”。 这是因为我们在节点之间只有一条通信路径。如果VM具有多个NIC(可以在此处找到有关创建具有多个NIC的Azure VM的信息,但本文不会介绍这些信息),则可以在每个服务器之间创建冗余通信路径。 要删除警告图标,请转到“查看”菜单,然后取消选择“Comm Path Redundancy Warning”:结果:
验证通信路径
使用“lcdstatus”命令查看群集资源的状态。 运行以下命令以验证您是否已在每个节点上正确创建了与其他两个服务器相关的通信路径:#/ opt / LifeKeeper / bin / lcdstatus -q -d node1 MACHINE NETWORK ADDRESSES / DEVICE STATE PRIO node2 TCP 10.128.0.2/ 10.128.0.3 ALIVE 1见证TCP 10.128.0.2/10.128.0.4 ALIVE 1#/ opt / LifeKeeper / bin / lcdstatus -q -d node2 MACHINE NETWORK ADDRESSES / DEVICE STATE PRIO node1 TCP 10.128.0.3/10.128.0.2 ALIVE 1见证TCP 10.128.0.3/10.128.0.4 ALIVE 1#/ opt / LifeKeeper / bin / lcdstatus -q -d witness MACHINE NETWORK ADDRESSES / DEVICE STATE PRIO node1 TCP 10.128.0.4/10.128.0.2 ALIVE 1 node2 TCP 10.128.0.4/10.128.0.3活着1
创建数据复制群集资源(即 镜子)
接下来,创建数据复制资源以将/ var / lib / mysql分区从node1(source)复制到node2(target)。 单击“绿色加号”图标以创建新资源:按照向导进行以下选择:
请选择恢复工具包:数据复制 转换类型:智能 服务器:node1 层次结构类型:复制退出文件系统 现有的挂载点:/ var / lib / mysql 数据复制资源标记:datarep-mysql 文件系统资源选项卡:/ var / lib / mysql 位图文件:(默认值) 启用异步复制:否
创建资源后,将出现“扩展”(即定义备份服务器)向导。 使用以下选项:
目标服务器:node2 转换类型:智能 模板优先级:1 目标优先级:10 目标磁盘:/ dev / sdb1 数据复制资源标记:datarep-mysql 位图文件:(默认值) 复制路径:10.128.0.2/10.128.0.3 挂载点:/ var / lib / mysql 根标签:/ var / lib / mysql
创建MySQL资源层次结构
接下来,创建一个MySQL集群资源。 MySQL资源负责停止/启动/监视MySQL数据库。 要创建,请单击“绿色加号”图标以创建新资源:按照向导使用以下选项创建IP资源:
选择Recovery Kit:MySQL Database 转换类型:智能 服务器:node1 my.cnf的位置:/ var / lib / mysql MySQL可执行文件的位置:/ usr / bin 数据库标签:mysql
使用以下选项扩展IP资源:
目标服务器:node2 转换类型:智能 模板优先级:1 目标优先级:10
因此,您的群集将如下所示。 请注意,数据复制资源已自动移动到数据库下(自动创建依赖关系),以确保它始终在数据库之前联机:
创建内部负载均衡器
如果这是使用物理或虚拟服务器的典型本地群集,那么此时您就完成了。 客户端和应用程序将连接到群集的虚拟IP(10.128.0.99)以到达活动节点。 在Google Cloud中,如果没有其他一些配置,这将无效。要连接到群集,Google提供了一项功能,您可以设置内部负载均衡器(ILB)。 基本上,当您连接到ILB的IP地址(我们将设置为10.128.0.99)时,您将路由到当前活动的群集节点。创建TCP负载均衡器:这将是内部负载均衡器,因此选择“仅在我的VM之间”:接下来,为负载均衡器命名(“internal-lb”),然后单击后端配置:确保选择正确的region(“us-central1”)并配置后端。 单击“添加后端”并添加两个实例组(instance-group-1a AND instance-group-1b):负载均衡器根据运行状况检查确定将流量路由到哪个节点。 在此示例中,将配置运行状况检查以查看MySQL是否正在运行(检查默认端口3306)。 选择“创建运行状况检查”:为新运行状况检查命名(“mysql-health-check”)并为TCP端口3306配置它:接下来,配置负载均衡器的前端。 选择“前端配置”,在IP地址下,定义自定义静态内部IP 10.128.0.99。 端口应为3306,这是MySQL的默认端口:最后,查看并最终确定负载均衡器。 单击“创建”:结果。 您将看到负载均衡器处于联机状态,但是,它并未将实例组显示为正常!(如0/0所示)。 我们将在下一节中解决这个问题:
为内部负载均衡器创建防火墙规则
根据Google文档(请参阅“配置防火墙规则以允许内部负载平衡”部分),需要创建两个防火墙规则。 第一个允许流量到负载均衡器,从负载均衡器到实例。第二个允许来自健康检查器的健康检查探针。创建新的防火墙规则:为新规则指定名称(allow-internal-lb)并指定“10.128.0.0/20”作为源IP范围。 允许的协议和端口应为“tcp:3306”:单击“创建”后,您将返回到防火墙规则页面,并可在列表中看到新创建的规则。 再次单击“创建防火墙规则”,以便我们可以创建第二个必需规则:为第二个规则命名(“allow-health-check”)。 需要定义两个不同的源IP范围:
- 130.211.0.0/22
- 35.191.0.0/16
注意:最好仔细检查google云文档,以确保这些IP范围仍然有效。 您现在应该在列表中看到两个新创建的防火墙规则:
测试群集连接
此时,我们所有的Google云端和群集配置都已完成!群集资源当前在node1上处于活动状态:您还会注意到内部负载均衡器正在显示node1,它是instance-group-1a的成员“健康”,因此路由流量进入虚拟IP(10.128.0.99) )到node1:SSH进入见证服务器,“sudo su – ”获得root访问权限。 如果需要,安装mysql客户端:
[root @ witness~] #yum -y install mysql
测试MySQL与群集的连接:
[root @ witness~] #mysql --host = 10.128.0.99 mysql -u root -p
执行以下MySQL查询以显示活动集群节点的主机名:
mysql> select @@ hostname; ------------ | @@ hostname | ------------ | node1 | ------------ 1排(0.00秒) MySQL的>
使用LifeKeeper GUI,从Node1 – > Node2进行故障转移。 右键单击node2下面的mysql资源,然后选择“In Service …”:故障转移后,资源在node2上联机:现在您将看到内部负载均衡器显示实例组1b,其中包含node2,为健康状态。 流量现在路由到node2:故障转移完成后,重新运行MySQL查询。 您会注意到MySQL客户端已检测到会话丢失(在故障转移期间)并自动重新连接:执行以下MySQL查询以显示活动群集节点的主机名,验证现在“node2”是否处于活动状态:
mysql> select @@ hostname; ERROR 2006(HY000):MySQL服务器已经消失 没联系。试图重新连接...... 连接ID:48 当前数据库:mysql ------------ | @@ hostname | ------------ | node2 | ------------ 1排(0.56秒) MySQL的>