DavidWittman.redis

ansible-redis

构建状态 Ansible Galaxy

  • Ansible 2.4+
  • 兼容大多数版本的 Ubuntu/Debian 和 RHEL/CentOS 6.x

内容

  1. 安装
  2. 入门
  3. 单个 Redis 节点
  4. 主从复制
  5. Redis 哨兵
  6. 高级选项
  7. 验证校验和
  8. 从本地压缩包安装
  9. 构建 32 位二进制文件
  10. 角色变量

安装

$ ansible-galaxy install davidwittman.redis

入门

以下是一些部署不同 Redis 架构的示例剧本和配置。

这个角色需要以 root 用户或具有 sudo 权限的用户身份运行。

单个 Redis 节点

部署单个 Redis 服务器节点非常简单;只需将角色添加到剧本中即可。这里有一个示例,我们通过将绑定地址设置为 127.0.0.1 来使其更有趣:

---
- hosts: redis01.example.com
  vars:
    - redis_bind: 127.0.0.1
  roles:
    - davidwittman.redis
$ ansible-playbook -i redis01.example.com, redis.yml

注意:您可能注意到我上面只是传入了一个主机名作为 Ansible 清单文件。这是一种方便的方法,可以在不创建清单文件的情况下运行 Ansible,只需在主机名后加一个逗号,让 Ansible 知道该怎么做。

就是这样!您现在将在 redis01.example.com 上有一个 Redis 服务器,监听 127.0.0.1。默认情况下,Redis 二进制文件安装在 /opt/redis 下,但可以通过设置 redis_install_dir 变量来覆盖。

主从复制

在 Redis 中配置复制是通过部署多个节点并在从节点上设置 redis_slaveof 变量来完成的,就像在 redis.conf 中一样。在接下来的示例中,我们将部署一个 Redis 主节点和三个从节点。

在这个例子中,我们将使用组来分开主节点和从节点。让我们从清单文件开始:

[redis-master]
redis-master.example.com

[redis-slave]
redis-slave0[1:3].example.com

这是剧本:

---
- name: 配置主 Redis 服务器
  hosts: redis-master
  roles:
    - davidwittman.redis

- name: 配置 Redis 从节点
  hosts: redis-slave
  vars:
    - redis_slaveof: redis-master.example.com 6379
  roles:
    - davidwittman.redis

在这种情况下,我假设您已经为 redis-master.example.com 设置了 DNS 记录,但并不总是如此。您可以将其设置为您所需要的任何值。在很多情况下,我告诉 Ansible 使用主节点的 eth1 IP 地址。以下是更灵活的值:

redis_slaveof: "{{ hostvars['redis-master.example.com'].ansible_eth1.ipv4.address }} {{ redis_port }}"

现在您准备好上路了!运行这个剧本应该让您的 Redis 主节点和三个从节点准备就绪。

Redis 哨兵

介绍

使用主从复制非常适合保证持久性和分布读取与写入,但对于高可用性则不太合适。如果主节点出现故障,则必须手动将从节点提升为主节点,并且需要将连接重定向到新的主节点。为了解决这个问题,可以使用Redis 哨兵,这是一个分布式系统,它使用 Redis 本身进行通信并处理 Redis 集群中的自动故障转移。

哨兵自身使用与 Redis 相同的 redis-server 二进制文件,但运行时带有 --sentinel 标志和不同的配置文件。当然,所有这些都通过这个 Ansible 角色进行了抽象,但了解它仍然有好处。

配置

要将哨兵节点添加到现有部署中,请将相同的 redis 角色分配给它,并在该主机上将变量 redis_sentinel 设置为 True。这可以通过多种方式完成,在这个例子中我将扩展上面主/从配置中使用的清单文件:

[redis-master]
redis-master.example.com

[redis-slave]
redis-slave0[1:3].example.com

[redis-sentinel]
redis-sentinel0[1:3].example.com redis_sentinel=True

上面,我们在 redis-sentinel 组中添加了三个主机(虽然这个组在角色中没有任何实际用途,仅仅是一个标识符),并在清单文件中内联设置了 redis_sentinel 变量。

现在,我们只需设置 redis_sentinel_monitors 变量来定义哨兵监控的 Redis 主节点。在这个例子中,我将在剧本中进行设置:

- name: 配置主 Redis 服务器
  hosts: redis-master
  roles:
    - davidwittman.redis

- name: 配置 Redis 从节点
  hosts: redis-slave
  vars:
    - redis_slaveof: redis-master.example.com 6379
  roles:
    - davidwittman.redis

- name: 配置 Redis 哨兵节点
  hosts: redis-sentinel
  vars:
    - redis_sentinel_monitors:
      - name: master01
        host: redis-master.example.com
        port: 6379
  roles:
    - davidwittman.redis

这将配置哨兵节点监控我们上面创建的主节点,标识符为 master01。默认情况下,哨兵将使用 2 的法定人数,这意味着至少需要 2 个哨兵同意主节点故障,故障转移才能发生。该值可以通过在监控定义中设置 quorum 键进行覆盖。有关更多详细信息,请参见哨兵文档

除了上面列出的变量外,哨兵还有一些自己的配置选项,就像 Redis 服务器一样。这些选项以 redis_sentinel_ 为前缀,已在下面的 角色变量 部分列出。

多个角色包含

如果您需要多次执行角色,请查看 test/test_all.yml 以了解如何进行。有关详细信息,请参见这里这里

高级选项

验证校验和

redis_verify_checksum 变量设置为 true,以使用 get_url 的校验和验证选项。请注意,这仅在从 URL 下载 Redis 时验证校验和,而在使用 redis_tarball 提供的压缩包时则不验证。

当使用 Ansible 2.x 时,此角色将验证下载的 sha1 校验和与 vars/main.yml 中定义的 redis_checksums 变量进行比对。如果您的版本未在此处定义或希望用您自己的校验和覆盖,只需设置 redis_checksum 变量。如以下示例所示,您需要在校验和前加上所使用哈希的类型。

- name:  ansible 1.x 上安装 redis 并验证校验和
  hosts: all
  roles:
    - role: davidwittman.redis
      redis_version: 3.0.7
      redis_verify_checksum: true
      redis_checksum: "sha256:b2a791c4ea3bb7268795c45c6321ea5abcc24457178373e6a6e3be6372737f23"

从本地压缩包安装

如果您的服务器所在的环境不允许下载(即如果机器位于 DMZ 中),请将变量 redis_tarball 设置为本地下载的 Redis 压缩包的路径,以替代从 redis.io 进行 HTTP 下载。

不要忘记将版本变量设置为与压缩包相同的版本,以避免混淆!例如:

vars:
  redis_version: 2.8.14
  redis_tarball: /path/to/redis-2.8.14.tar.gz

在这种情况下,源压缩包通过 SSH 复制到服务器,而不是通过下载。

构建 32 位二进制文件

要构建 Redis 的 32 位二进制文件(可用于内存优化),请设置 redis_make_32bit: true。这将在 RHEL/Debian/SuSE 上安装必要的依赖项(x86 glibc)并在运行 make 时设置选项 '32bit'。

带有 TLS 支持的构建

要使用TLS 支持构建 Redis(在版本 6 中添加),请设置 redis_make_tls: true。这需要 OpenSSL 开发库(例如 Debian/Ubuntu 上的 libssl-dev)。

角色变量

这是该角色的所有默认变量的列表,也可以在 defaults/main.yml 中找到。总有一天我会将这些格式化为表格或其他形式。

---
## 安装选项
redis_version: 2.8.24
redis_install_dir: /opt/redis
redis_dir: /var/lib/redis/{{ redis_port }}
redis_config_file_name: "{{ redis_port }}.conf"
redis_download_url: "http://download.redis.io/releases/redis-{{ redis_version }}.tar.gz"
# 将此设置为 true 以验证 redis 压缩包的校验和
redis_verify_checksum: false
# 将此值设置为使用的压缩包的本地路径,以用于安装,而不是下载
redis_tarball: false
# 将此设置为 true 以构建 Redis 的 32 位二进制文件
redis_make_32bit: false
# 将此设置为 true 以带 TLS 支持构建 Redis,仅适用于版本 >= 6(需要 OpenSSL 开发库)
redis_make_tls: false

redis_user: redis
redis_group: "{{ redis_user }}"

# Redis/Sentinel 的打开文件限制
redis_nofile_limit: 16384

## 角色选项
# 将 Redis 配置为服务
# 这将为 Redis 创建初始化脚本并确保进程正在运行
# 同样适用于 Redis Sentinel
redis_as_service: true
# 添加本地事实到 /etc/ansible/facts.d,用于 Redis
redis_local_facts: true
# 服务名称
redis_service_name: "redis_{{ redis_port }}"

## 网络/连接选项
redis_bind: false
redis_port: 6379
redis_password: false
# 从复制选项
redis_min_slaves_to_write: 0
redis_min_slaves_max_lag: 10
redis_tcp_backlog: 511
redis_tcp_keepalive: 0
# 最大连接客户端数量
redis_maxclients: 10000
redis_timeout: 0
# 套接字选项
# 设置 socket_path 为所需的套接字路径。 例如 /var/run/redis/{{ redis_port }}.sock
redis_socket_path: false
redis_socket_perm: 755

## 复制选项
# 像在 redis.conf 中那样设置 slaveof。 (例如 "redis01 6379")
redis_slaveof: false
# 使从节点只读。“是”或“否”
redis_slave_read_only: "yes"
redis_slave_priority: 100
redis_repl_backlog_size: false

## 日志
redis_logfile: '""'
# 启用 syslog。“是”或“否”
redis_syslog_enabled: "yes"
redis_syslog_ident: "{{ redis_service_name }}"
# syslog 设施。 必须为 USER 或 LOCAL0-LOCAL7
redis_syslog_facility: USER

## 一般配置
redis_daemonize: "yes"
redis_pidfile: /var/run/redis/{{ redis_port }}.pid
# 允许的数据库数量
redis_databases: 16
redis_loglevel: notice
# 记录比此更慢的查询。 使用 -1 以禁用
redis_slowlog_log_slower_than: 10000
# 要保存的慢查询最大数量
redis_slowlog_max_len: 128
# Redis 内存限制(例如 4294967296, 4096mb, 4gb)
redis_maxmemory: false
redis_maxmemory_policy: noeviction
redis_rename_commands: []
redis_db_filename: dump.rdb
# 多久将数据库快照存储到磁盘
# 例如 "900 1" => 1 当至少 1 个键更改
redis_save:
  - 900 1
  - 300 10
  - 60 10000
redis_stop_writes_on_bgsave_error: "yes"
redis_rdbcompression: "yes"
redis_rdbchecksum: "yes"
redis_appendonly: "no"
redis_appendfilename: "appendonly.aof"
redis_appendfsync: "everysec"
redis_no_appendfsync_on_rewrite: "no"
redis_auto_aof_rewrite_percentage: "100"
redis_auto_aof_rewrite_min_size: "64mb"
redis_notify_keyspace_events: '""'

## 其他配置选项
# 如果不需要,请留空。 使用块样式标量添加选项,例如
# redis_config_additional: |
#   io-threads 4
#   io-threads-do-reads yes
redis_config_additional: ""

## Redis 哨兵配置
# 在主机上将此设置为 true 以将其配置为哨兵
redis_sentinel: false
redis_sentinel_dir: /var/lib/redis/sentinel_{{ redis_sentinel_port }}
redis_sentinel_bind: 0.0.0.0
redis_sentinel_port: 26379
redis_sentinel_password: false
redis_sentinel_pidfile: /var/run/redis/sentinel_{{ redis_sentinel_port }}.pid
redis_sentinel_logfile: '""'
redis_sentinel_syslog_ident: sentinel_{{ redis_sentinel_port }}
redis_sentinel_monitors:
  - name: master01
    host: localhost
    port: 6379
    quorum: 2
    auth_pass: ant1r3z
    down_after_milliseconds: 30000
    parallel_syncs: 1
    failover_timeout: 180000
    notification_script: false
    client_reconfig_script: false
    rename_commands: []

事实

以下事实可以在您的清单或任务中访问,超出了此角色的范围。

  • {{ ansible_local.redis.bind }}
  • {{ ansible_local.redis.port }}
  • {{ ansible_local.redis.sentinel_bind }}
  • {{ ansible_local.redis.sentinel_port }}
  • {{ ansible_local.redis.sentinel_monitors }}

要禁用这些事实,请将 redis_local_facts 设置为 false。

关于项目

Highly configurable role to install Redis and Redis Sentinel from source

安装
ansible-galaxy install DavidWittman.redis
许可证
mit
下载
1.1M
拥有者
Dev, Ops, Security, Lens Flares