这一篇写如何使用demo代码对keystonemiddleware进行测试。
- 存储函数执行结果 keystone heat nova等项目把一些固定的属性和查询请求的结果放到cache里面,加速访问。
- 存储keystone token token创建完成之后,不需要修改,会有大量的读操作,适合放到cache中
- 存储keystonemiddleware token 为neutron,cinder,nova等各个项目缓存从keystone获得的token。
- 存储horizon用户会话数据 主要是django支持使用
存储函数执行结果
优势在于,很多查询函数的结果是固定的,但是又比较常用,查询一次之后,按照key-value存到cache中,再次查询时不需要访问数据库,直接从内存缓存中根据key将结果取出,可以提高很多速度。或者还有一些查询请求,查询的参数千变万化,但是结果只有固定的几类,这种更适合使用cache加速。
- sql 将token存放在数据库中,使用这种方法需要定期清理过期token,防止token表太大影响性能。
- memcache 将token存放到memcache中,token本身创建之后不会被修改,只会被读,所以很适合放到cache中,加速访问,放到cache中也不需要写脚本定期清理数据库中的过期token。
- memcache_pool 在memcache的基础上,实现了memcache的连接池,可以在线程之间复用连接。
使用memcache_pool的优势在于什么地方呢?
memcache driver的缺点在于,memcache本身是分布式的设计,但是并不是高可用的,如果controller-1上的的cache服务被重启,这个节点上的所有token都会丢失掉,会带来一些错误。
比这更糟糕的是,如果controller1网络不可达或者宕机,那么我们会观察到几乎每个openstack api请求都会有3s以上的卡顿。这是因为openstack默认使用python-memcached访问memcache,它提供的操作keystone的client继承自Thread.local类,和构建它的线程绑定。openstack服务启动后,会启动一定数量的子进程,每个http request到达,会有一个子进程接收,孵化一个线程去处理这个请求。如果用到memcache,线程会调用python-memcached
构建一个client类,通过这个client的实例对memcache进行操作。如果访问到网络不可达的memcache节点,卡住,操作超时,将这个节点标识为30秒内不可用,在这个线程内,不会再因此而卡住,但是这个http请求结束之后,下一个http请求过来,重新孵化的线程会reinit这个client,新的client丢失了旧的client的状态,还是可能会访问到卡住的memcache节点上。
社区之所以要做memcache_pool,就是为了解决这个问题,将client统一由pool管理起来,memcache节点的状态,也由pool管理起来,这样每个子进程里只会卡第一次,所以强烈推荐使用memcache_pool驱动而不是memcache。社区将memcache_pool的代码从keystone复制到oslo_cache项目中,希望所有使用memcache的项目都通过它的memcachepool去访问,避免这个问题。其中,nova在M版本支持,heat在L版本支持。
具体的各个服务如何配置使用memcache_pool driver这里不再赘述。
keystonemiddleware/opts.py文件是列出所有的配置项
[filter:authtoken]
paste.filter_factory = keystonemiddleware.auth_token:filter_factory
由于已经改好了代码,没法像oslo.cache那样直接写一个demo进行测试,只好把这些代码直接放到openstack环境中进行测试了!
但是直接放进去之后,出现nova list无法执行的错误,认证这边出现了问题
结果只能回退快照,对比环境中的keystonemiddleware代码和git下载下来的代码,发现在auth_token/_opts.py文件中有一些差异
改完差异之后,直接把改动的代码合进去之后,上面的错误就没有了!
配置文件修改:
/etc/nova/nova.conf:71:[keystone_authtoken]
/etc/nova/nova-cpu.conf:69:[keystone_authtoken]
/etc/cinder/cinder.conf:2:[keystone_authtoken]
/etc/placement/placement.conf:15:[keystone_authtoken]
/etc/glance/glance-registry.conf:20:[keystone_authtoken]
/etc/glance/glance-api.conf:24:[keystone_authtoken]
/etc/neutron/neutron.conf:873:[keystone_authtoken]
需要在上面的配置文件中,添加如下的配置信息才行:
memcache_sasl_enable = True
memcache_usrname = ***
memcache_password = ***
memcache_use_advanced_pool = True
可根据实际需要来选择是否开启memcache_use_advanced_pool = True选项,如果不开启,直接用bmemcached.Client连接,开启的话,则用用户池调用的是_bmemcached_pool文件
在调试的时候,在这个地方将参数打出来,看看是否有用户名和密码传进去,也可以依次判断用户名和密码是否正确,以及哪些服务的配置文件还没有配置用户名和密码
可以看出来,在服务没有配置用户名和密码的时候,访问memcache会出现Invalid magic的错误
同时这个日志是在n-api.service中打印出来的,所以可以看一下这个服务的配置文件是否正确配置了!