Automate Install Redis Master-Slave Sentinel with Ansible Playbook

集群概述

请先在目标服务器创建 redis 用户,此脚本在此用户下使用源代码编译的方式安装一主两从三哨兵的集群

安装计划

服务器规划

IPSSH 端口SSH 用户名SSH 密码ROOT 密码OS
10.1.207.18022022redisredis123root123CentOS Linux release 7.9.2009
10.1.207.18122022redisredis123root123CentOS Linux release 7.9.2009
10.1.207.18222022redisredis123root123CentOS Linux release 7.9.2009

提示: 可以参考批量自动化创建用户

集群节点规划

IPRedisSentinel
10.1.207.180master
10.1.207.181slave
10.1.207.182slave

节点安装路径

路径描述
/opt/redis源代码上传路径
~/redis_uninstall.sh集群卸载脚本
~/redis.shRedis 启停脚本
~/sentinel.shSentinel 启停脚本
/data01/redis/binredis 编译后的程序
/data01/redis/log日志目录
/data01/redis/data数据目录
/data01/redis/conf配置文件目录

下载安装包和 Playbook 脚本

在客户机上创建 playbook 脚本存放目录

mkdir -p ~/my-docker-volume/ansible-playbook

下载 playbook 脚本

cd ~/my-docker-volume/ansible-playbook
git clone https://github.com/coolbeevip/ansible-playbook.git

下载 redis 安装包到 ~/my-docker-volume/ansible-playbook/packages 目录

wget -P ~/my-docker-volume/ansible-playbook/packages https://download.redis.io/releases/redis-6.2.6.tar.gz --no-check-certificate

配置安装脚本

你可以编辑如下文件修改默认配置

main-install.yml

您可以在此处定义目标服务器,您可以看到这里定义了三个目标服务器,使用 redis 用户登录。

- hosts: 10.1.207.180
  user: redis
  ...
- hosts: 10.1.207.181
  user: redis
  ...
- hosts: 10.1.207.182
  user: redis
  ...

var_redis.yml

您可以在此处定义安装目录,版本,端口,默认主节点地址等配置信息。

# 源码包
redis_tar: "redis-6.2.6.tar.gz"       # 源码包文件名
redis_tar_unzip_dir: "redis-6.2.6"    # 源码包解压后的目录名

# 安装目录
redis_home_dir: "/opt/redis"          # 源码包上传目录
redis_bin_dir: "/data01/redis/bin"    # 编译后程序文件
redis_log_dir: "/data01/redis/logs"   # 运行日志,PID 文件
redis_data_dir: "/data01/redis/data"  # 数据文件
redis_conf_dir: "/data01/redis/conf"  # 配置文件

# 操作系统用户和组
redis_user: "redis"                   # 操作系统用户名
redis_group: "redis"                  # 操作系统组名

# redis configuration
redis_password: "redis"               # redis 密码
redis_network_host: "0.0.0.0"         # 服务绑定 IP 地址
redis_port: 7000                      # Redis 服务端口
redis_maxmemory: 31457280             # 最大内存
redis_maxclients: 1000                # 客户端最大连接数
redis_io_threads_do_reads: "yes"      # 开启多线程支持
redis_io_threads: 4                   # 线程数,线程数一定要小于机器核数并且不要大于 8
redis_master_ip: 10.1.207.180         # 主节点 IP 地址

# sentinel configuration
redis_sentinel_port: 27000            # Sentinel 端口
redis_sentinel_master: "mymaster"     # 监控 master 名称
redis_sentinel_master_quorum: 2       # master 切换投票数,当集群中有 N 个sentinel 认为 master 宕机后就切换
redis_sentinel_down_after_milliseconds: 5000  # master ping 检测超时时间
redis_sentinel_failover_timeout: 10000        # 故障切换超时时间
redis_sentinel_parallel_syncs: 2              # 故障切换后,每次向新的主节点发起复制操作的从节点个数

您可以在 redis/config/redis.conf.j2redis/config/sentinel.conf.j2 文件中找到更多的默认配置

开始安装

启动 ansible 容器工具连接目标服务器,并将 ~/my-docker-volume/ansible-playbook 目录挂在到容器中。

提示: ANSIBLE_SSH_USERS,ANSIBLE_SSH_PASSS 配置成您之前在目标服务器上创建的用户名 redis 和密码 redis123

提示: ANSIBLE_SU_PASSS 为 root 用户的密码

docker run --name ansible --rm -it \
  -e ANSIBLE_SSH_HOSTS=10.1.207.180,10.1.207.181,10.1.207.182 \
  -e ANSIBLE_SSH_PORTS=22022,22022,22022 \
  -e ANSIBLE_SSH_USERS=redis,redis,redis \
  -e ANSIBLE_SSH_PASSS=redis123,redis123,redis123 \
  -e ANSIBLE_SU_PASSS=root123,root123,root123 \
  -v ~/my-docker-volume/ansible-playbook:/ansible-playbook \
  coolbeevip/ansible:2.8.11-alpine \
  /bin/bash
bash-5.0#  

安装集群

这个脚本将自动化完成如下操作:

  • 安装 Redis 编译用依赖库
  • 上传 Redis 源码包到每个服务器
  • 配置 Redis 执行文件 PATH 路径
  • 配置 Redis 和 Sentinel 配置文件
  • 启动 Redis 和 Sentinel 服务
bash-5.0# ansible-playbook -C /ansible-playbook/redis/main-install.yml /ansible-playbook/redis/main-start-redis.yml /ansible-playbook/redis/main-start-sentinel.yml

如果你看到如下信息,说明安装完成

TASK [Install Succeed] ********************************************************************************************************************************************************************************************************
ok: [10.1.207.180] => {
    "msg": "Install Succeed!"
}

提示: 因为第一次执行脚本时,会上传 Redis 源码包(约 2.5MB)到所有服务器并在服务器上编译(每服务器约 1分钟)。在我本地环境首次安装大概耗时 5 分钟

提示: 此脚本只适合初始化安装,重复执行此命令可能会收到 Redis has been installed, please uninstall and then reinstall 提示,此时需要先要使用 ansible all -m shell -a '~/redis_uninstall.sh' 命令卸载之前的安装。

验证集群

查看每个目标服务器 redis 进程信息,可以看到每个节点 redis 和 sentinel 进程都已经启动

bash-5.0# ansible all -m shell -a 'ps -ef | grep [b]in/redis-'
10.1.207.180 | CHANGED | rc=0 >>
redis    19121     1  0 18:59 ?        00:00:00 /data01/redis/bin/redis-server 0.0.0.0:7000
redis    20011     1  0 19:01 ?        00:00:00 /data01/redis/bin/redis-sentinel 0.0.0.0:27000 [sentinel]

10.1.207.182 | CHANGED | rc=0 >>
redis    22537     1  0 18:55 ?        00:00:00 /data01/redis/bin/redis-server 0.0.0.0:7000
redis    23467     1  0 18:59 ?        00:00:00 /data01/redis/bin/redis-sentinel 0.0.0.0:27000 [sentinel]

10.1.207.181 | CHANGED | rc=0 >>
redis    10009     1  0 18:55 ?        00:00:00 /data01/redis/bin/redis-server 0.0.0.0:7000
redis    11187     1  0 18:59 ?        00:00:00 /data01/redis/bin/redis-sentinel 0.0.0.0:27000 [sentinel]

查看每个节点的复制信息

bash-5.0# ansible all -m shell -a 'redis-cli -h 0.0.0.0 -p 7000 -a redis info Replication'

10.1.207.182 | CHANGED | rc=0 >>
# Replication
role:slave
master_host:10.1.207.180
master_port:7000
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_read_repl_offset:73780
slave_repl_offset:73780
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:4dc6d9bc49043bc1bc8c495f88c470523af3b030
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:73780
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:73780Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.

10.1.207.181 | CHANGED | rc=0 >>
# Replication
role:slave
master_host:10.1.207.180
master_port:7000
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_read_repl_offset:73919
slave_repl_offset:73919
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:4dc6d9bc49043bc1bc8c495f88c470523af3b030
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:73919
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:73919Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.

10.1.207.180 | CHANGED | rc=0 >>
# Replication
role:master
connected_slaves:2
slave0:ip=10.1.207.182,port=7000,state=online,offset=73502,lag=0
slave1:ip=10.1.207.181,port=7000,state=online,offset=73502,lag=1
master_failover_state:no-failover
master_replid:4dc6d9bc49043bc1bc8c495f88c470523af3b030
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:73780
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:73780Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.

bash-5.0#

连接任意哨兵节点获取 Redis Master 地址

bash-5.0# ansible all -m shell -a 'redis-cli -h 10.1.207.182 -p 27000 sentinel get-master-addr-by-name mymaster | head -n 1'
10.1.207.181 | CHANGED | rc=0 >>
10.1.207.180

10.1.207.182 | CHANGED | rc=0 >>
10.1.207.180

10.1.207.180 | CHANGED | rc=0 >>
10.1.207.180

常用运维命令

提示: 哨兵模式集群需要按 Master->Slave->Sentinel 顺序启动各个节点

启动 Redis

bash-5.0# ansible all -m shell -a '~/redis.sh start'

停止 Redis

bash-5.0# ansible all -m shell -a '~/redis.sh stop'

重启 Redis

bash-5.0# ansible all -m shell -a '~/redis.sh restart'

启动 Sentinel

bash-5.0# ansible all -m shell -a '~/sentinel.sh start'

停止 Sentinel

bash-5.0# ansible all -m shell -a '~/sentinel.sh stop'

重启 Sentinel

bash-5.0# ansible all -m shell -a '~/sentinel.sh restart'

Q & A

如何彻底删除 Redis 主从哨兵集群

A: ~/redis_uninstall.sh 脚本将 kill Redis 和 Sentinel,删除程序文件和所有数据文件

bash-5.0# ansible all -m shell -a '~/redis_uninstall.sh'
10.1.207.182 | CHANGED | rc=0 >>
Kill Redis Process
Kill Sentinel Process
Delete Redis Data Files
Delete Redis Package
Delete redis_uninstall.sh

10.1.207.181 | CHANGED | rc=0 >>
Kill Redis Process
Kill Sentinel Process
Delete Redis Data Files
Delete Redis Package
Delete redis_uninstall.sh

10.1.207.180 | CHANGED | rc=0 >>
Kill Redis Process
Kill Sentinel Process
Delete Redis Data Files
Delete Redis Package
Delete redis_uninstall.sh