TaoCloud SSAN是一款分布式块存储产品(即Server SAN),它遵循软件定义存储的理念,可从X86服务器硬件平台的本地存储资源中创建基于服务器的SAN,以便按需提供具有弹性的、可扩展的存储容量和性能。除了具备高性能、高弹性、高可靠、高融合性、高开放性的特点以外,SSAN最大的特点就是简单,坚持KISS的设计哲学。SSAN采用去中心化的全对等Share-nothing架构,可从两个节点动态扩展至数百甚至上千节点,实现海量存储容量和大规模I/O并行的存储性能。
从软件技术架构看,SSAN由存储节点和管理节点组成,其中管理节点部署CLI/WebGUI管理平台,使系统管理员更加高效便捷地管理整个SSAN存储资源,诸如集群主机、物理硬盘、存储资源池、虚拟磁盘等管理以及系统信息监控等。SSAN基于Zookeeper实现分布式集群管理功能,每个节点有若干OSD管理硬盘资源,从而构成SSAN分布式存储资源池。
SSAN具有很高的系统可用性,整个系统不存在任何故障单点。数据可靠性由多副本和纠删码冗余机制保证,集群管理高可用由Zookeeper集群(通常部署3或5个)保证,访问高可用由iSCSI多路径机制保证,管理节点高可用则由HA机制来保证。通常情况下,SSAN集群建议3个节点起配,Zookeeper部署3个,采用3副本冗余策略。然而,一些客户出于应用规模和降低成本考虑,尤其是SMB中小企业客户,两个节点的SSAN高可用集群方案是否可行呢?这个是必须行的。SSAN高可用双机技术方案,采用双副本冗余策略,iSCSI多路径采用两条路径,这里主要讨论管理节点高可用和zookeeper集群高可用方案,同时简要介绍基于Ansible的SSAN集群自动化部署。
一、SSAN双节点管理高可用
SSAN管理节点主要包括MySQL数据库服务和HTTP服务,该类节点的高可用就是由MySQL高可用和HTTP高可用共同构成。我们采用双节点模式部署SSAN管理节点,尽量遵循KISS原则,利用MySQL主从复制功能保证数据库服务的高可用,使用Pacemaker IPAddr2为管理节点提供虚拟IP,从主机级别保证HTTP Web服务的可用性。当其中一个节点发生故障时,虚拟IP会自动漂移至另外一个节点,仍可正常提供SSAN集群管理功能。
SSAN高可用双机技术方案
1.1 MySQL服务高可用
MySQL是广泛使用的开源数据库,社区有很多关于MySQL高可用的解决方案,比如基于MySQL Replication、基于MySQL NDB集群以及基于Galera协议等。目前最常见的是MySQL Galera集群,如日中天的OpenStack就是采用此方案。该方案实现了MySQL多活集群以及数据的实时同步,不过Galera Cluster节点数必须是三以上的奇数,只能使用带有wsrep patch的mysql-server软件包,只对InnoDB引擎的数据库表起作用,此外还有很多使用限制,可以参考官方给出的列表。遵循KISS原则,双节点MySQL部署我们选择了MySQL Replication方案,部署和后期运维都很简单。
这里简述一下MySQL Replication的工作原理(如下图)。首先Master开启了log-bin功能,将数据库的变更写入二进制日志中;Slave的IO线程同步Master二进制日志文件并写入自己的中继日志中,同时Slave SQL线程重放中继日志,实现与Master数据同步。此过程是异步的,也就是说Master在写入二进制日志后就返回了,并不会等待Slave同步数据。值得注意的是,在配置的MySQL 主从复制之前必须保证Master 与 Slave的数据库保持一致,不然复制数据时可能会产生Duplicate Key错误。
MySQL Replication 原理
在我们的MySQL Replication高可用方案中,两个节点的MySQL被配置成互为主从模式,彼此同步数据。但任意时刻只有一个MySQL在写入数据,依然是主从模式,不会导致数据库一致性问题。这样的好处是,任何一个MySQL节点都可以是Master,提高使用的灵活度;同时在一个Master宕机恢复后,会自动同步另一个MySQL的数据,无需调整它们之间的主从关系,更无需人工介入。
1.2 HTTP服务高可用
Web服务是无状态的,可以部署成多活模式,基于虚拟IP实现服务的使用切换,这样既可实现Web服务的高可用性。虚拟IP和普通IP没什么两样,唯一的区别就是一个虚拟IP可以在节点间自动的浮动,也就是说当节点宕机后,虚拟IP会自动地漂移到另一个正常节点上。最常见的集群高可用技术方案就是keeplived以及pacemaker的ocf:heartbeat:IPAddr2资源,在我们的方案中采用的是pacemaker技术,不仅可以提供基本的虚拟IP漂移,也可以管理其他类型的资源。Pacemaker高可用技术这里不再赘述,请参考相关技术资料。
二、SSAN双节点Zookeeper高可用
Zookeeper通常是以奇数点(2n+1)集群方式部署的,任何n个节点宕机都不会影响zookeeper的正常服务,也就是说zookeeper集群自身提供了高可用性。这里主要讨论的是两个节点的zookeeper如何实现高可用的。
通常情况下,两个节点zookeeper集群无法正常提供服务,所以我们在两个节点上启动了三个zookeeper服务,将其配置成三个节点伪集群,这就需要有一个服务能够在两个节点间来回的自动浮动保证任何时候都有两个zookeeper服务运行着,我们这里暂且称之为zookeeper-float。如下图当Node1宕机后,zookeeper-float服务会自动在Node2上启动。在Pacemaker中将zookeeper-float和虚拟IP放置于一个group内,保证zookeeper-float随VIP漂移而漂移,简而言之,就是VIP漂到哪里,zookeeper-float就在哪里运行。
基于pacemaker实现zookeeper伪集群
三、SSAN集群Ansible自动化部署
我们使用Ansible自动化部署SSAN服务以及配置相应的高可用方案,并且可以根据zookeeper节点数量智能地选择部署方案。如果是两个节点将会选择伪集群方案,如果是三节点则部署三节点集群,真正实现一键部署,有效提高集群部署效率。
3.1 Ansible简介
Ansible是最热门的开源devops项目之一,redhat花费上亿美金将其纳入麾下,可见其地位。Ansible是用python编写的,容易拓展自定义模块,社区庞大且活跃度高,在github上有1500人左右的贡献者,接近20000人star了该项目。适用于应用自动部署,配置管理,持续交付,任务编排等,有如下特点:
(1) 无Agent架构,利用ssh执行远程命令;
(2) 简单易学易用,使用yml文件描述任务;
(3) 自动部署以及配置管理;
(4) 以角色为中心的部署模式;
3.2 Ansible编程模式
Ansible有一个核心概念叫角色(role),基本所有的编程工作都是围绕角色进行的,是实现Ansible代码复用的核心,社区有大量开源的角色。说白了,角色就是一组任务的集合,用来完成某工作,比如部署MySQL、配置pacemaker等,通过不同角色的组合就可以轻易自定义部署的流程。下面以SSAN的自动化部署项目为例,简述Ansible的编程模式。一个典型的Ansible目录结构如下图:
Ansible目录结构
hosts文件是一个部署节点的清单文件,其中包括主机分组、主机变量和组变量等信息,如下图定义了ssanwebcluster、ssancluster主机组以及virtual_ip变量:
hosts清单文件
site.yml文件相当是一个总入口,在此文件会导入其他的文件或者role,所有自定义的目录都会存放roles目录下, 在ssan项目中定义了十来种角色,用来完成不同的工作,比如common角色主要是用来做一些通用的设置,比如关闭防防火墙、设置ntp server,ssan角色用来部署ssan服务,ssanweb角色用来部署ssanweb服务,整个部署流程就是通过组合这几种不同的角色实现的。
site文件
ssan角色
通过顺序部署mysql、httpd、ssanweb三个角色,就可以在ssan管理节点上启动管理服务。
3.3 SSAN自动化部署
在整个过程中Ansible首先会创建本地yum仓库,把所有的rpm包同步置其中,为后续安装组件做准备;其次配置节点的系统环境,比如关闭防火墙、selinux;最后依次配置zookeeper、ssan、mysql、ssanweb、pacemaker服务。
基于Ansible的SSAN自动化部署
(1)部署前准备
所有节点安装centos-6.7-minal系统,之后将SSAN部署包拷贝到任意个节点上,该节点就是Ansible管理节点。配置SSH免密码登录,把此节点public key拷贝到所有远程节点(包括本节点)的authorized_keys中。
(2)配置部署参数
主机清单以及必要的变量都在hosts文件中,根据实际情况进行更改,配置十分简单。ssanwebcluster主机组表示部署ssanweb服务的主机,数量为两个;ssancluster主机组表示部署ssan服务的主机,数量为任意个;
zookeepercluster主机组表示zookeeper主机,可以是两个或者奇数个;mysqlnode1、mysqlnode2,分别表示第一、第二个数据库节点,必须是ssanwebcluster组下的主机;virtual_ip变量表示虚拟IP,不能是已经使用的IP。
双节点SSAN集群部署配置文件
(3)一键自动化部署
在Ansible部署包下运行下面命令安装ansible组件:
ansible-install.sh
使用下面命令部署整个SSAN集群:
ansible-playbook –i hosts site.yml
部署过程中,有几种不同的输出,绿色表示task名,红色表示错误,黄色表示发生改变的内容。在最后将会输出部署的结果,failed和unreached均为0,表示集群部署成功,没有任何错误输出。如果部署未成功,部署过程是幂等的,可以多次部署。
使用pcs status命令查看服务的运行状态,ssanweb_vip、ssanweb_httpd、ssan_zookeeper_float资源状态应该都是started。通过虚拟IP地址登录管理平台,检验SSAN各个功能是否正常可用。
四、SSAN高可用双机测试验证
我们的方案用是主机级别的高可用,也就是说任何一个节点宕机都不会影响服务的正常提供,主要包括MySQL数据库的一致性,zookeeper集群的可用性,虚拟IP自动漂移。这里通过宕机来测试服务的可用性。
(1)通过pcs status命令找到zookeeper_float的运行节点,并登陆到给节点上检测zookeeper-float服务的状态,这里zookeeper-float运行在192.168.33.2上,状态正常,mode是follower。通过ssanweb管理平台添加一条用户信息, 这里添加的是test-ha用户。
(2)检查数据的主从状态,在MySQL两个节点都执行show slave status指令查看,如果Slave_IO_Running, Slave_SQL_Running均为yes,表示mysql主主同步正常。
(3)通过pacemaker管理的服务只运行在一个主机上,通过pcs status命令就可以看到这些服务运行于哪个主机上,这里是192.168.33.2。
(4)模拟宕机。找到运行pacemaker资源的主机,并直接拔掉电源,模拟宕机事件。检查宕机后pacemaker管理的资源是否漂移以及其状态是否正常,ssanweb_vip、ssanweb_httpd、ssan_zookeeper_float原先运行在192.168.33.2上,宕机后漂移到192.168.33.3上,状态均为started,说明运行正常。检查管理平台是否可用并查看之前创建的测试用户是否存在,如果存在表示数据库已经同步,mysql主主高可用已经生效。
(5)将宕机节点重新开机,检测mysql主从是否自动恢复,zookeeper服务是否自动恢复。Slave_IO_Running, Slave_SQL_Running均为yes表示恢复正常。
五、小结
TaoCloud SSAN分布式存储系统,采用多副本和纠删码冗余策略保证数据高可用性。SSAN双机高可用技术方案则基于MySQL Replication机制、zookeeper伪集群、pacemaker虚拟机IP保证了SSAN管理平台和管理集群高可用性,能够容任意一个节点宕机,故障恢复时间仅在数秒以内,可以为业务连续性提供可靠保障。另外,基于Ansible自动化部署工具,真正地实现了SSAN集群一键部署,数分钟之内即可部署一个完整集群,使得部署更加简单高效。
(作者:姜泽华@TaoCloud,2016.10)