替代 Memcached 配置

默认情况下,Memcached 服务器部署在每个控制器主机上,作为 shared-infra_containers 组的一部分。驱动程序,例如 oslo_cache.memcache_pool 支持将 memcache 后端标记为已失效,但是并非所有服务都允许您选择用于与 Memcached 交互的驱动程序。与此同时,您可能会遇到服务 API 响应延迟,甚至在其中一个 memcached 后端发生故障时 API 无法响应的情况。

因此,您可能希望使用 HAProxy 来处理访问并检查后端的存活状态,或者始终使用“本地”的 Memcached 服务器。

通过 HAProxy 配置 Memcached

在 Memcached 服务器前面设置 haproxy 并依赖它来检查后端的存活状态,可以提供更可靠的故障转移并最大限度地减少后端故障时的延迟。我们需要在您的 user_variables.yml 中定义以下内容

haproxy_memcached_allowlist_networks: "{{ haproxy_allowlist_networks }}"
memcached_servers: "{{ internal_lb_vip_address ~ ':' ~ memcached_port }}"
haproxy_extra_services:
  - haproxy_service_name: memcached
    haproxy_backend_nodes: "{{ groups['memcached'] | default([]) }}"
    haproxy_bind: "{{ [internal_lb_vip_address] }}"
    haproxy_port: 11211
    haproxy_balance_type: tcp
    haproxy_balance_alg: source
    haproxy_backend_ssl: False
    haproxy_backend_options:
      - tcp-check
    haproxy_allowlist_networks: "{{ haproxy_memcached_allowlist_networks }}"

设置完成后,您需要更新 haproxy 和所有服务的配置以使用新的 memcached 后端

# openstack-ansible playbooks/haproxy-install.yml
# openstack-ansible playbooks/setup-openstack.yml

仅使用“本地”Memcached

其背后的想法是配置服务以使用 Memcached,该 Memcached 将仅驻留在本地控制平面上。这里“本地”意味着不仅在与服务本身相同的容器内有 memcached,而且在与服务位于同一控制器上的单独容器内也有 memcached。

这将降低延迟并提高稳定性,因为服务和 memcached 实例将在同一控制平面上运行,只是在通过相同的 L2 网桥连接的不同容器中。

这种方法的缺点是,如果 memcached 容器崩溃,将无法进行任何故障转移,因此该控制器的缓存将无法工作。优点是只有 1 个控制器会受到影响,而不是在远程 memcached 不可用时所有控制器都会受到影响。此外,API 响应延迟最常见的情况是整个控制器发生故障,因为连接中断会导致 memcache_pool 等待连接超时,而不是在 memcached 服务停止并 memcache_pool 立即切换到另一个后端时拒绝连接。

注意

如果某些服务没有“本地”的 memcached 服务器来运行该服务,则行为将回退到使用所有可用的 memcached 服务器,并且 memcached 客户端将决定使用哪个服务器。

为了始终使用“本地”memcached,您需要在 user_variables.yml 文件中定义以下内容

memcached_servers: |-
    {% set service_controller_group = group_names | select('regex', '.*-host_containers') | first | default('memcached') %}
    {{
      groups['memcached'] | intersect(groups[service_controller_group])
        | map('extract', hostvars, 'management_address')
        | map('regex_replace', '(.+)', '\1:' ~ memcached_port)
        | list | join(',')
    }}

设置完成后,您需要更新所有服务的配置以使用新的 memcached 后端

# openstack-ansible playbooks/setup-openstack.yml