涨知识:SDN界超火应用——ODL集群到底怎样搭建

作者简介:鸿哥,硕士研究生,国内某通信设备公司软件研发工程师,主要从事云计算、SDN技术开发

一、 集群特性及相关说明

1、集群特性

  • Scaling(规模化):在集群模式下,如果多个控制器运行在集群模式下,那么可以在控制器上做更多工作或者存储更多数据。也可以将你的数据拆分成更小的块(这个相当于分片),并且在集群中分发数据,或对集群中某些特定成员进行操作。
  • High Availability(高可用性):如果在多控制器组成的集群中有一个控制器出现故障,其他的控制器仍然可以继续工作。
  • Data Persistence(数据持久性):重启或故障不会造成数据丢失。

2、 User-guide文档表示单个节点也可以做集群

3、 多节点做集群,推荐至少使用3台机器,虽然可以使用只有2个节点做集群,但是一旦其中一个宕机的话,剩下的控制器将不再受操控,即不保证高可用性(HA)。

4、 Shard,数据分片用于存储所有数据或者模块的某一段数据。例如,一个分片能够包含一个模块的所有库存信息,另一个分片可以包含一个模块的所有拓扑数据。如果你在modules.conf文件中未指定一个模块或者在module-shards.conf文件中未指定一个分片,所有的数据将会默认存储在默认的分片中(当然这个分片也必须在module-shards.conf文件中被定义)。每个分片会有备份的配置,当然这个配置也会在module-shards.conf中指定。

5、 在一个支持HA的三节点组成的集群中。每个节点都会运行默认数据分片的副本。这是因为OpenDaylight集群部署时需要大多数被定义分片副本运行在节点中才能实现相应功能。如果只在两个节点中定义数据分片副本并且其中一个宕机,那么相应的数据分片功能将不会实现。

二、 集群环境搭建

1、 准备3台vm,这里选择Ubuntu14.04_x64作为操作系统环境;

2、 基础环境搭建,odl控制器运行在jvm上,首先搭建jdk环境,可参考网上相关资料搭建好jdk以及maven;

3、 在ubuntu14.04上通过以下命令验证是否基础环境搭建好了,在linux终端使用。


4、准备好odl控制器,从官网下载Lithium-SR3的发行版控制器,解压至3台vm。

5、3台vm分别运行控制器,即进入控制器bin下,执行

6、3台vm分别安装必要集群组件odl-restconf-all、odl-mdsal-clustering、odl-openflowplugin-flow-services,odl-mdsal-clustering是集群模块,odl-restconf-all为北向restful api,odl-openflowplugin-flow-services是南向openflow服务,在控制器控制台输入:

7、3台vm分别安装特殊组件:

8、执行集群脚本configure_cluster(在/controller/distribution-karaf-0.3.3-Lithium-SR3/bin文件夹下),目的是修改/configuration/init/下的akka.conf,module-shards.conf文件相关参数,下文做相关解释,本例中3台vm(这3台vm分别运行odl控制器,组成odl控制器集群)的IP分别为:

在vm1上运行

在vm2上运行

在vm3上运行

9、验证/configuration/init/下的akka.conf,module-shards.conf文件的配置参数是否修改成功,打开vm1、vm2、vm3各自的akka.conf,查看roles,roles相当于某一个控制器的ID,也就是说在这个集群中,每一个控制器的roles是唯一的。

本例中设置vm1(192.168.7.106)为 "member-1"

同理设置vm2(192.168.7.107)为 "member-2"

同理设置vm3(192.168.7.108)为 "member-3"

10、打开vm1的akka.conf(vm2、vm3以此类推),查看hostname,该文件中有两处hostname,一处在odl-cluster-data,一处在odl-cluster-rpc中,将hostname修改为本机IP地址。如vm1中(vm2,vm3中也要修改为相应的IP地址):


11、查看vm1中的akka.conf(vm2、vm3以此类推)odl-cluster-data和odl-cluster-rpc中的seed-nodes,seed-nodes是用于告诉刚开启的控制器,他属于哪一个集群,例如vm1


12、检查module-shards.conf文件的配置参数是否正确,这其中有一个shard的概念,其实就是将MD-SAL的树拆分成很多小部分,每一个部分就是一个shard,然后在该文件中指定某个部分需要在哪几个控制器上留有备份replicas,详见https://wiki.opendaylight.org/view/OpenDaylight_Controller:MD-SAL:Architecture:Clustering#Shard。如vm1的module-shards.conf文件如下:


这就表示module-shards.conf中的所有shards都会在三台控制器中存在副本。

13、启动3台odl控制器之后,可以通过log:tail | grep clustering查看哪一台控制器被选举成为了主控制器(master),例如本例中vm3成为了Leader:

三、集群实验

1、查看哪一台是主控制器(master),通过发送GET请求获取,本例中再开一台linux虚拟机(192.168.7.109)作为GET客户端,在终端执行:

注意控制器ip与角色要对应起来,如vm1(192.168.7.106)对应的是member-1。这里选择
member-1-shard-inventory-config,也可以选择member-1-shard-topology-config或member-1-shard-default-operational。

2、得到

3、同理请求vm2(192.168.7.107得到的结果为):

4、放入json编辑器可以看到shard-inventory-config的主为member-1-shard-inventory-config

5、通过postman对集群做验证,主要验证当3台控制器中的一台down掉之后,集群控制器系统是否还能够正常运行,即下发添加流表的操作是否能够在剩下两台odl生效,如果生效,当刚刚down掉的控制器重新启动之后,流表数据是否会自动同步到这台odl控制器的数据shard上。

6、安装postman、mininet,启动mininet,随便连接到一台控制器(这里不考虑设备连接多个控制器,第二个实验会再验证这个问题),这里连接的odl控制器为192.168.7.107
mn --controller=remote,ip=192.168.7.107,port=6653

7、使用postman工具向192.168.7.106发送添加流表的操作,注意要在Basic Auth中先输入admin/admin,同时URL中的tableid和flowid要与xml中的一致,如下:

8、向192.168.7.107请求流表数据,如下(参考 https://www.sdnlab.com/15173.html):

9、可以看到对106的虚拟机添加流表操作,已经同步到了107的控制器上,在107上可以获取到106上添加的流表。

10、关闭Leader(192.168.7.108)控制器,查看系统是否正常工作

11、添加流表100

12、重启192.168.7.108控制器,查看id为100流表的数据是否已同步至新加入集群的108控制器。

附录:专业术语解释

1.Node - A logical member of a cluster.

2.Cluster - A set of member nodes joined together through a service.

3.Leader - A single node in the cluster that acts as a Master. When a node is the leader, it has full access to the switch, where it manages cluster convergence, partitions, fail-over, load balancing etc.

4.Shard - A process that contains some data and communicates through messages. Its status is maintained by the InMemoryDataStore object. The cluster sharding strategy determines the location of a shard, which is possibly based on the instance identifier of a data object and the collection of the cluster members.

5.Host Names - Host Names are defined as below in a file called akka.conf which is located in /odl/configuration/initial/akka.conf. It is usually set to local host address 127.0.0.1, change it to IP address of the machine where controller is running.


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。 本站中所有编译类文章仅用于学习和交流目的,编译工作遵照 CC 协议,如果有侵犯到您权益的地方,请及时联系我们。
  • 本文链接https://www.sdnlab.com/19832.html
分享到:
相关文章
条评论

登录后才可以评论

wellbeing 发表于17-09-07
1