openstack multi-region管理

rxra5030 9年前

openstack多集群管理

 背景介绍

由于有些物理集群处于不同的地点,或者某一些物理集群规模太大,就需要创建多个openstack集群对其进行管理。而每个openstack集群是单独管理的,这就导致管理入口太多,不方便统一管理。那么就需要一种统一管理的机制。

方案对比

2.1 nova AZ

针对多个集群处于不同地点的情况,这时每个集群可以作为一个(或者多个)AZ,但是由于AZ之间还是会共享很多服务,比如neutron,glance,mariadb,rabbitMQ等,需要跨机房访问这些服务,时延比较大,也会消耗较多的机房间带宽,会影响用户体验。 当单个物理集群太大时,即使划分了多个AZ,从逻辑上分割开了,但是rabbitMQ,glance,neutron,mariadb等服务的压力还是会比较大,同样会影响用户体验,划分多个AZ是无法解决这类问题的,AZ只是一个逻辑范围的划分。

2.2 multi-region

一个region可以对应一个物理集群,region与region可以是不同地点的物理集群,也可以是单个大规模物理机集群分割后的多个物理集群。region之间只共享dashboard service(horizon)和identity service(keystone),也就是说使用统一的管理界面和认证,其他服务(例如,nova,neutron,glance,cinder,mariadb,rabbitMQ等)都是各个region独立拥有的,这样可以有效避免region间的交互开销。 该方案如下图所示

openstack multi-region管理

在上图中,左边的集群是RegionOne,右边的集群是RegionTwo,可以使用任何一个region的horizon和keystone service来行使dashboard和identity功能。为了便于后面进行说明,需要选定一个region提供dashboard和identity service,这里就选定RegionOne了。

下面对上图中的几个关键点做下说明,

1)keystone数据库设置主从

RegionOne中keystone连接的数据库作为master,RegionTwo中keystone连接的数据库作为slave,他们之间做主从,以实现keystone数据库之间的同步。 这么做的目的是当RegionOne的keystone service无法给RegionTwo的各个service提供访问认证服务时(比如,当RegionOne和RegionTwo之间的网络中断时),RegionTwo上的keystone service可以使用slave keystone数据库中的信息给RegionTwo上的各个service提供访问认证服务。

2)keystone token driver配置为memcache

keystone除了token对象存放在memcache中,其他对象(例如,user,role,credential,endpoint,service,region等)全都存放在mariadb中。 之所以把token存在memcache中,是因为token是有使用期限的(例如,24h),如果把token存在mariadb中,当RegionOne上的keystone service无法给RegionTwo上的各个service提供访问认证服务时,这时就要使用RegionTwo上的keystone,那么当slave keystone数据库中存放的token过期了,就无法把新的token存储到slave keystone数据库中,因为slave数据库不允许写。那么如果把token存放在memcache中,当RegionOne上的keystone service无法给RegionTwo上的各个service提供访问认证服务时,RegionTwo上的keystone service只需要把把新生成的token存放到memcache中即可,后面就可以使用memcache中的token进行访问。

3)RegionOne上的keystone service无法给RegionTwo上的各个service提供访问认证服务时,RegionTwo仍可以管理

RegionTwo的dashboard和identity service平常不再起作用,其实这时RegionTwo上各个service的访问认证已经不通过RegionTwo上的keystone了,而是通过RegionOne上的keystone进行认证,上图的RegionTwo中的两条虚线就代表这个意思。当RegionOne上的keystone service无法给RegionTwo上的各个service提供访问认证服务时,就需要使用RegionTwo上的horizon和keystone重新提供dashboard和identity服务。通过修改RegionTwo上各个service的配置使其重新使用RegionTwo上的keystone进行访问认证。

4)dashboard支持multi-region

openstack dashboard是支持multi-region的,它通过keystone service可以发现所有的Region,然后再界面上提供Region切换功能,如下图所示

openstack multi-region管理

5)openstack其他组件

region之间只共享horizon和keystone service,其余service(例如nova,neutron,glance,cinder,ceilometer,mariadb,rabbitMQ等),各个region都是用自己的,这些service如果要做HA,那么各个region自己做自己的。

方案实施

通过上面的方案介绍可以知道,该方案总共有四个关键点,一是提供dashboard和identity service的Region和其他Region之间,keystone数据库要做主从;二是各个Region的keystone token driver要使用memcache;三是创建多Region;四是当RegionOne上的dashboard和identity service无法给其他Region提供服务时,要保证其他Region仍可管理。下面就围绕这四点进行实施。

3.1 多集群环境准备

选用的软件版本如下

openstack:rdo-liberty

OS:centos-7.2.1511(3.10.0-327.el7.x86_64)

qemu:2.3.0-31.el7_2.7

libvirt:1.2.17-13.el7

总共搭建了两个openstack集群,每个集群有两个节点,controller和compute节点,controller同时也作为compute节点,如下表所示

openstack multi-region管理

我是使用packstack部署的openstack,默认都是只有一个RegionOne。下面计划把cluster-1作为RegionOne,cluster-2作为RegionTwo,然后使用RegionOne上的horizon和keystone service给这两个Region提供dashboard和identity服务。

3.2 keystone token driver配置为memcache

所有region的token driver都要配置为memcache,默认情况下token driver使用的是sql数据库。

3.2.1 修改token driver

编辑/etc/keystone/keystone.conf [token] section,将

driver = keystone.token.persistence.backends.sql.Token

修改为

driver = keystone.token.persistence.backends.memcache.Token

并且确认enable caching功能,

caching=true

3.3.2 启动memcached服务

yum install memcached python-memcached

systemctl enable memcached.service

systemctl start memcached.service

3.3.3 修改keystone [memcache] section配置

先查询memcache使用的端口,

[root@juanniu032019 ~(keystone_admin)]# netstat -antp | grep memcache

tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 8159/memcached

默认情况下,memcache监听的端口都是11211,这是在

/etc/sysconfig/memcached配置文件中进行配置的。

然后修改/etc/keystone/keystone.conf的[memcache] sectionservers = localhost:11211

3.3.4 restart keystone service

systemctl restart httpd.service

3.3.5 确认是否修改成功

在确认是否修改成功前,先重新登录下dashboard,这样会产生新的token。

有多种方式都可以确认是否修改成功,下面列举了四种

1)telnet 127.0.0.1 11211

openstack multi-region管理

2)lsof -i :11211

如果输出中有服务跟memcache建立了连接,如下图所示

openstack multi-region管理

然后再查询keystone service使用的port是否可以对上

openstack multi-region管理

3)netstat -antp | grep memcache如果已经有服务跟memcache建立连接,并且建立连接的keystone服务,那么就说明memcache生效了。

openstack multi-region管理

4)不断的登录/退出dashboard,然后查看keystone数据中token表中的记录数是否变化

select count(*) from keystone.token;

不断的登录/退出dashboard,如果token表中的记录数没有变化,就说明keystone token driver不再使用mysql,此时又可以正常的登录,间接地说明memcache生效了。

3.3 创建multi-region

3.3.1 备份keystone database

因为后面要修改两个region的keystone数据库,为了出现问题后可以恢复,这里先把备份下两个cluster的keystone数据库。

cluster-1:

mysqldump -uroot keystone > keystone.cluster-1_bak.sql

cluster-2:

mysqldump -uroot keystone > keystone.cluster-2_bak.sql

3.3.2 修改cluster-2的region name为RegionTwo

1)在region table中插入一个'RegionTwo'记录

insert into keystone.region(id,extra) values ('RegionTwo','{}');

2)修改endpoint table中的所有记录的region_id为'RegionTwo'

update keystone.endpoint set region_id='RegionTwo';

3)删除region table中的'RegionOne'记录

delete from keystone.region where id='RegionOne';

在验证是否修改成功之前,需要修改/root/keystonerc_admin,将OS_REGION_NAME修改为RegionTwo,然后重新source /root/keystonerc_admin,

验证region name是否修改成功,如下图所示

openstack multi-region管理

3.3.3 备份RegionTwo的endpoint、service table

备份RegionTwo上的keystone数据中的endpoint、service table是为了将这两个table中的记录导入到RegionOne上的keystone数据库中的endpoint、service table。

mysqldump -uroot keystone endpoint > keystone.endpoint_RegionTwo.sql

mysqldump -uroot keystone service > keystone.service_RegionTwo.sql

其实,endpoint table可以不备份,因为在RegionOne上执行以下命令也会在RegionOne的keystone数据中的endpoint table中插入RegionTwo上的各个service的endpoint记录

openstack endpoint create --publicurl --internalurl --adminurl --region RegionTwo

并且以上命令,还会在RegionOne的keystone数据库的region table中插入'RegionTwo'记录。但是由于命令操作比较麻烦,每个service都要创建endpoint,还是直接导数据库简单。

另外,需要把导出的endpoint、service table文件中的‘判断是否存在endpoint(service) table,如果存在就删除,以及后面紧跟着的创建endpoint(service) table’ 的处理删除,如下截图所示(以endpoint table为例)

openstack multi-region管理

因为这两个table的导出文件是要导入到RegionOne的keystone的endpoint、service table中的,因为在RegionOne的keystone数据库中已经有endpoint、service table了,并且也有记录了,是不可以删除的,我们只是要合并两个region的keystone的endpoint、service table。

3.3.4 RegionOne的keystone的region table插入RegionTwo记录

insert into region(id,extra) values ('RegionTwo','{}');在3.3.3中也注明过,通过openstack endpoint create --region RegionTwo也可以在region table增加'RegionTwo'记录。

3.3.5 在RegionOne上导入RegionTwo上导出的endpoint、service table

1)将RegionTwo上导出的endpoint、service table拷贝到RegionTwo的controller node上

2)将拷贝的endpoint、service table导入到10.13.32.19的keystone的相应的endpoint service table中

mysql -uroot keystone < keystone.endpoint_RegionTwo.sqlmysql -uroot keystone < keystone.service_RegionTwo.sql

3)修改RegionTwo的identity的三个endpoint(publicurl,internalurl,admin url)

update endpoint set url='http://10.13.32.19:5000/v2.0' where id='6e114696c6464a879d08fef46fd7b9cc';

update endpoint set url='http://10.13.32.19:5000/v2.0' where id='aa5496200239498485257761026e825e';

update endpoint set url='http://10.13.32.19:35357/v2.0' where id='a3b4da535c09421c93f3da257fa2cae5';

其中6e114696c6464a879d08fef46fd7b9cc、aa5496200239498485257761026e825e、a3b4da535c09421c93f3da257fa2cae5对应的是RegionTwo的identity service的 三个endpoint(public,internal,admin)的id

4)验证是否修改成功

①确认endpoint list中是否都已经添加进去

openstack multi-region管理

②确认RegionTwo的identity service的三个url是否已经修改成功

openstack multi-region管理

3.3.6 修改RegionTwo的所有节点的各个service的authencation endpoint

修改RegionTwo上所有service访问认证endpoint为RegionOne的keystone service。

默认情况下,keystone service提供服务的两个端口为5000和35357,可以通过以下命令搜到到修改点

service-auth-endpoint.png

openstack multi-region管理

其中,/etc/openstack-dashboard/local_settings是不需要修改的,因为RegionTwo上的dashboard服务是不需要跟RegionTwo上的keystone service交互的。然后逐个去修改,将10.13.131.137修改为10.13.32.19。另外,上图中搜索出来的内容之所以被注释掉了,是因为我已经做了修改。

需要额外注意的就是/etc/cinder/cinder.conf [keymgr] section,

需要将 #encryptionauthurl = http://localhost:5000/v3

修改为

encryptionauthurl = http://10.13.32.19:5000/v3

如果在dashboard上修改project的quota时会报以下错误

“Error: Unable to retrieve volume limit information”

请参考

Bug 1272572 - Error: Unable to retrieve volume limit information when accessing System Defaults in Horizon

3.3.9 修改RegionTwo的各个service的admin pass

需要修改RegionTwo上的各个service的admin pass,跟RegionOne上相应service的admin pass保持一致。 可以通过find /etc/ -type f | xargs grep admin_pass搜到相关的修改点,以nova为例进行说明,编辑/etc/nova/nova.conf

openstack multi-region管理

3.3.10 重启RegionTwo上的各个service

需要重启RegionTwo上的各个service,让上面的修改生效。

3.4 keystone数据库配置master-slave

请参考 Openstack Mysql 主备服务器搭建

3.5 keystone service无法给其他region上的各个service提供访问认证服务时,其他Region仍可管理

RegionOne上的keystone service无法给RegionTwo上的各个service提供访问认证服务的场景很多,最典型的就是RegionOne和RegionTwo之间的网络中断了,这时就要考虑如何单独的管理RegionTwo。这时需要revert3.3.6中做的修改,然后重启各个service,让RegionTwo上各个service重新使用RegionOne上的keystone service进行访问认证。这时就可以使用RegionTwo上的dashboard来管理RegionTwo,不过有一点需要注意,由于现在RegionTwo上的keystone数据库是read-only的,是不可以创建user,project,service等操作的。

遗留问题

4.1 memcache size

可以使用memcached-tool 127.0.0.1:11211 stats来查看memcache的空间是否紧张,如下图所示

openstack multi-region管理

如果touchmisses持续增加,可以适当调大memcache size,可以通过编辑/etc/sysconfig/memcached,改大CACHESIZE的值。当调大cache size后,如果发现totalitems, total_connections有所增加,就说明调大cache size是有效果的。

来自: http://mogu.io/178-178