[内容] Ansible playbook 的排错技巧

注意:

在使用 Playbook 之前,要先安装 Ansible、添加被 Ansible 管理的主机,并且需要 root 权限

正文:

内容一:playbook 语法检查的方法

# ansible-playbook --syntax-check <yaml>

内容二:playbook 测试运行的方法

# ansible-playbook -C <yaml>

内容三:playbook 显示执行内容的方法

# ansible-playbook <yaml> --list-tasks

[内容] Ansible 执行脚本 Playbook 的结构

注意:

在使用 Playbook 之前,要先安装 Ansible、添加被 Ansible 管理的主机,并且需要 root 权限

正文:

内容一:Playbook 的结构
1.1 Playbook 的结构介绍

1) playbook 是 yaml 结构
2) playbook 默认的执行顺序是从上往下一个层级接着一个层级地执行,若某个命令报错则不会再执行下面的命令

1.2 playbook 的常用目录层级种类

1) vars

变量层


2) tasks

任务层


3) handlers

触发条件层


4) files

文件层


5) template

模板层


6) default

优先级最低层

[步骤] Ansible 所管理的服务器的添加和分组

注意:

在添加被 Ansible 管理的服务器前要先安装 Ansible

正文:

步骤目录:

步骤一:规划拓扑
1.1 服务器列表
1.2 服务器列表简介

步骤二:实现管理服务器登陆被管理的服务器
2.1 在管理服务器上添加被管理服务器 IP 地址和服务器名的对应关系
2.2 实现管理服务器登陆被管理的服务器
2.2.1 让管理服务器无密钥登陆要被管理的服务器
2.2.1.1 在管理服务器上生成 ssh 公钥和私钥
2.2.1.2 将管理服务器生成的 ssh 公钥复制到要被管理的服务器里
2.3 让管理服务器通过密钥登陆要被管理的服务器
2.3.1 指定管理服务器的 Ansible 远程用户
2.3.2 在管理服务器上 Ansible 的服务器列表里给指定的服务器添加登陆密码

步骤三:在管理服务器的 Ansible 上添加服务器列表,并将其分组(从列表优先级的角度来思考)
3.1 Ansible 服务器列表分组的不同优先级(从列表优先级的角度来思考)
3.2 通过设置 Ansible 服务器配置文件的全局变量的方法来添加服务器列表
3.2.1 在管理服务器上修改系统环境变量文件
3.2.2 在管理服务器上让系统环境变量生效
3.2.3 在管理服务器上在环境变量指定的位置创建 Ansible 的配置文件
3.2.4 在管理服务器上指定 Ansible 的服务器列表文件
3.3 在管理服务器上添加 Ansible 的服务器列表,并将其分组
3.4 通过在当前目录下创建 Ansible 配置文件和服务器列表文件的方法来添加服务器列表
3.4.1 在管理服务器上进入到一个任意此用户有权限的目录
3.4.2 在管理服务器上的当前位置创建 Ansible 的配置文件
3.4.3 在管理服务器上指定 Ansible 的服务器列表文件
3.4.4 在管理服务器上添加 Ansible 的服务器列表,并将其分组
3.5 通过在家目录下创建 Ansible 配置文件和服务器列表文件的方法来添加服务器列表
3.5.1 在管理服务器上进入到家目录
3.5.2 在管理服务器上的家目录位置创建 Ansible 的配置文件
3.5.3 在管理服务器上指定 Ansible 的服务器列表文件
3.5.4 在管理服务器上添加 Ansible 的服务器列表,并将其分组
3.6 通过修改 Ansible 默认配置文件和默认服务器列表文件的方法来添加服务器列表
3.6.1 在管理服务器上指定 Ansible 服务器列表文件
3.6.2 在管理服务器上添加 Ansible 的服务器列表,并将其分组

步骤四:在管理服务器的 Ansible 上添加服务器列表,并将其分组(从列表种类的角度来思考)
4.1 让管理服务器的 Ansible 使用文本格式的服务器列表文件
4.1.1 分组的方式
4.1.1.1 单个服务器
4.1.1.2 一组服务器
4.1.1.3 一复合组服务器
4.1.2 列表的描述方式介绍
4.1.2.1 连续的数字
4.1.2.2 连续的字母
4.2 让管理服务器的 Ansible 使用 json 格式的服务器列表文件
4.2.1 在管理服务器上进入任意一个此用户有权限的目录
4.2.2 在管理服务器上的家目录位置创建 Ansible 的配置文件
4.2.3 在管理服务器上指定 Ansible 的服务器列表文件
4.2.4 在管理服务器上使用 Python3 编程语言生成 json 格式的服务器列表
4.2.4.1 在管理服务器上编写生成 json 格式的 Python 程序
4.2.4.2 给刚刚编写的 Python 程序相应的全权

步骤五:在管理服务器的 Ansible 上添加服务器列表,并将其分组(多个同优先级相同的列表,从管理的角度来思考)
5.2.1 在管理服务器上进入任意一个此用户有权限的目录
5.2.2 在管理服务器上的家目录位置创建 Ansible 的配置文件
5.2.3 在管理服务器上指定 Ansible 的服务器列表文件目录
5.2.4 创建 Ansible 的服务器列表文件目录
5.2.4.1 创建第一个 Ansible 的服务器列表文件目录
5.2.4.2 创建第一个 Ansible 的服务器列表文件目录
5.2.4.3 创建第三个 Ansible 的服务器列表文件目录

步骤六:测试管理服务器 Ansible 的服务器列表
6.1 显示默认服务器列表里的服务器列表
6.2 显示 web 组的服务器
6.3 显示 db 组的服务器
6.4 显示不属于任何组的服务器
6.5 显示所有服务器

具体的操作步骤:

步骤一:规划拓扑
1.1 服务器列表

管理服务器 IP 地址:192.168.100.100
被管理的服务器 1 IP 地址:192.168.100.101
被管理的服务器 2 IP 地址:192.168.100.102
被管理的服务器 3 IP 地址:192.168.100.103
被管理的服务器 4 IP 地址:192.168.100.104
被管理的服务器 3 IP 地址:192.168.100.105
被管理的服务器 4 IP 地址:192.168.100.106
被管理的服务器 4 IP 地址:192.168.100.107

1.2 服务器列表简介

1) 管理人员只用 ssh 到管理服务器就可以通过 Ansible 管理其他所有的被管理服务器
2) 将 192.168.100.101 至 192.168.100.110 视作 web1 至 web10 ,它们属于 web 组
3) 将 192.168.100.111 至 192.168.100.115 视作 db1 至 db5 ,它们属于 db 组
4) 将 192.168.100.107 视作新添加的要被管理的服务器 ,它不属于任何组

步骤二:实现管理服务器登陆被管理的服务器
2.1 在管理服务器上添加被管理服务器 IP 地址和服务器名的对应关系

# vim /etc/hosts

添加以下内容:

......
192.168.100.100 ansible
192.168.100.101 web1
192.168.100.102 web2
192.168.100.103 web3
192.168.100.104 db1
192.168.100.105 db2
192.168.100.106 db3

2.2 实现管理服务器登陆被管理的服务器
2.2.1 让管理服务器无密钥登陆要被管理的服务器
2.2.1.1 在管理服务器上生成 ssh 公钥和私钥

# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:GGqyQU4+u+eNTaWN4SILhm3QN08ZR3jPWC+quRlsP6c root@test1
The key's randomart image is:
+---[RSA 2048]----+
|       ..        |
|      ... .      |
|  o   o..= .     |
| *   . *. + .    |
|. B = = S. .     |
|.o O * *.        |
|o.* . Xo.        |
|.o +.Bo+. .      |
|  ooo =.E+       |
+----[SHA256]-----+

2.2.1.2 将管理服务器生成的 ssh 公钥复制到要被管理的服务器里

# for i in {100..107} ; do ssh-copy-id 192.168.100.$i ; done

2.3 让管理服务器通过密钥登陆要被管理的服务器
2.3.1 指定管理服务器的 Ansible 远程用户

# vim /etc/ansible/ansible.cfg

将以下内容:

......
# remote_user = root
......

修改为:

......
remote_user = root
......

2.3.2 在管理服务器上 Ansible 的服务器列表里给指定的服务器添加登陆密码

# vim /etc/ansible/hosts

创建以下内容:

[all:vars]
ansible_password=redhat

步骤三:在管理服务器的 Ansible 上添加服务器列表,并将其分组(从列表优先级的角度来思考)
3.1 Ansible 服务器列表分组的不同优先级(从列表优先级的角度来思考)

(最高优先级)设置 Ansible 服务器配置文件的全局变量,并在此变量指定的位置创建 Ansible 配置文件和服务器列表文件
(第二高优先级)在当前目录下创建 Ansible 配置文件和服务器列表文件
(第三高优先级)在当前下创建 Ansible 配置文件和服务器列表文件
(第四高优先级)修改 Ansible 在 /etc 目录下的默认配置文件和服务器列表文件

(注意:Ansible 会严格按照优先级,当有更高优先级的服务器列表时,绝对不会执行低等级的服务器列表)

3.2 通过设置 Ansible 服务器配置文件的全局变量的方法来添加服务器列表
3.2.1 在管理服务器上修改系统环境变量文件

# vim /etc/profile

添加以下内容:

......
export ANSIBLE_CONFIG=/opt/ansible.cfg

(补充:这里以 /opt 目录为例)

3.2.2 在管理服务器上让系统环境变量生效

# source /etc/profile

3.2.3 在管理服务器上在环境变量指定的位置创建 Ansible 的配置文件

# cp /etc/ansible/ansible.cfg /opt/

3.2.4 在管理服务器上指定 Ansible 的服务器列表文件

# vim /opt/ansible.cfg

将以下内容:

......
#inventory      = /etc/ansible/hosts
......

修改为:

......
inventory      = hosts
......

3.3 在管理服务器上添加 Ansible 的服务器列表,并将其分组

# vim /opt/hosts

创建以下内容:

192.168.100.107

[web]
web[1:3]

[db]
db1
db2
db3

(补充:这里以文本列表为例)

3.4 通过在当前目录下创建 Ansible 配置文件和服务器列表文件的方法来添加服务器列表
3.4.1 在管理服务器上进入到一个任意此用户有权限的目录

# cd /opt

(补充:这里以 /opt 目录为例)

3.4.2 在管理服务器上的当前位置创建 Ansible 的配置文件

# cp /etc/ansible/ansible.cfg /opt/

3.4.3 在管理服务器上指定 Ansible 的服务器列表文件

# vim /opt/ansible.cfg

将以下内容:

......
#inventory      = /etc/ansible/hosts
......

修改为:

......
inventory      = hosts
......

3.4.4 在管理服务器上添加 Ansible 的服务器列表,并将其分组

# vim /opt/hosts

创建以下内容:

192.168.100.107

[web]
web[1:3]

[db]
db1
db2
db3

(补充:这里以文本列表为例)

3.5 通过在家目录下创建 Ansible 配置文件和服务器列表文件的方法来添加服务器列表
3.5.1 在管理服务器上进入到家目录

# cd

3.5.2 在管理服务器上的家目录位置创建 Ansible 的配置文件

# cp /etc/ansible/ansible.cfg ~/

3.5.3 在管理服务器上指定 Ansible 的服务器列表文件

# vim ~/ansible.cfg

将以下内容:

......
#inventory      = /etc/ansible/hosts
......

修改为:

......
[defaults]
inventory      = hosts
......

3.5.4 在管理服务器上添加 Ansible 的服务器列表,并将其分组

# vim ~/hosts

创建以下内容:

192.168.100.107

[web]
web[1:3]

[db]
db1
db2
db3

(补充:这里以文本列表为例)

3.6 通过修改 Ansible 默认配置文件和默认服务器列表文件的方法来添加服务器列表
3.6.1 在管理服务器上指定 Ansible 服务器列表文件

# vim /etc/ansible/ansible.cfg

将以下内容:

......
#inventory      = /etc/ansible/hosts
......

修改为:

......
inventory      = /etc/ansible/hosts
......

3.6.2 在管理服务器上添加 Ansible 的服务器列表,并将其分组

# vim /etc/ansible/hosts

创建以下内容:

192.168.100.107

[web]
web[1:3]

[db]
db1
db2
db3

(补充:这里以文本列表为例)

步骤四:在管理服务器的 Ansible 上添加服务器列表,并将其分组(从列表种类的角度来思考)
4.1 让管理服务器的 Ansible 使用文本格式的服务器列表文件
4.1.1 分组的方式
4.1.1.1 单个服务器

# vim /etc/ansible/hosts

创建以下内容:

192.168.100.107

4.1.1.2 一组服务器

# vim /etc/ansible/hosts

创建以下内容:

192.168.100.107

[web]
web1
web2
web3

4.1.1.3 一复合组服务器

# vim /etc/ansible/hosts

创建以下内容:

192.168.100.107

[web]
web1
web2
web3

[db]
db1
db2
db3

[webdb:children]
web
db

(补充:在这里的 webdb 组会同时包含 web 和 db 里的服务器)

4.1.2 列表的描述方式介绍
4.1.2.1 连续的数字

192.168.[0:10].[0:255]

(补充:这里以从 192.168.0.0 到 192.168.10.255 为例)

4.1.2.2 连续的字母

web[a:c]

(补充:这里以从 weba 到 webc 为例)

4.2 让管理服务器的 Ansible 使用 json 格式的服务器列表文件
4.2.1 在管理服务器上进入任意一个此用户有权限的目录

# cd ~

(补充:这里以进入家目录为例)

4.2.2 在管理服务器上的家目录位置创建 Ansible 的配置文件

# cp /etc/ansible/ansible.cfg ~/

4.2.3 在管理服务器上指定 Ansible 的服务器列表文件

# vim ansible.cfg

将以下内容:

......
#inventory      = /etc/ansible/hosts
......

修改为:

......
inventory      = ./hosts.py
......

4.2.4 在管理服务器上使用 Python3 编程语言生成 json 格式的服务器列表
4.2.4.1 在管理服务器上编写生成 json 格式的 Python 程序

# vim hosts.py

创建以下内容:

#!/usr/libexec/platform-python
import json
hostlist = {}
hostlist["web"] = ["192.168.100.101", "192.168.100.103"]

hostlist["db"] = {
        "hosts" :["192.168.100.104", "192.168.100.106"],
        "vars" :{"ansible_ssh_user":"root", "ansible_ssh_pass":"1"}
        }

hostlist["192.168.100.7"] = {
        "ansible_ssh_user":"root", "ansible_ssh_pass":"pwd"
        }

print(json.dumps(hostlist))

4.2.4.2 给刚刚编写的 Python 程序相应的全权

# chmod 755 hosts.py


补充:
使用 Python3 出现报错的处理方法:
1) 显示 yum 的配置文件位置

# whereis yum
yum: /usr/bin/yum /etc/yum /etc/yum.conf /usr/share/man/man8/yum.8.gz

2) 确认 yum 所使用的 Python

# head -1 /usr/bin/yum 
#!/usr/libexec/platform-python

3) 将 hosts.py 第一行的 Python 位置修改成和 yum 所使用的一样

# vim hosts.py

将第一行修改为:

#!/usr/libexec/platform-python
......

步骤五:在管理服务器的 Ansible 上添加服务器列表,并将其分组(多个同优先级相同的列表,从管理的角度来思考)
5.2.1 在管理服务器上进入任意一个此用户有权限的目录

# cd ~

(补充:这里以进入家目录为例)

5.2.2 在管理服务器上的家目录位置创建 Ansible 的配置文件

# cp /etc/ansible/ansible.cfg ~/

5.2.3 在管理服务器上指定 Ansible 的服务器列表文件目录

将以下内容:

......
#inventory      = /etc/ansible/hosts
......

修改为:

......
inventory      = ~/hosts/
......

5.2.4 创建 Ansible 的服务器列表文件目录
5.2.4.1 创建第一个 Ansible 的服务器列表文件目录

# vim ~/hosts/hostsa

创建以下内容:

[web]
web1
web2
web3

5.2.4.2 创建第一个 Ansible 的服务器列表文件目录

# vim ~/hosts/hostsb

创建以下内容:

[db]
db1
db2
db3

5.2.4.3 创建第三个 Ansible 的服务器列表文件目录

# vim ~/hosts/others

创建以下内容:

192.168.100.7

步骤六:测试管理服务器 Ansible 的服务器列表
6.1 显示默认服务器列表里的服务器列表

# ansible all -i /etc/ansible/hosts --list-host
  hosts (20):
    web1
    web2
    web3
    db1
    db2
    db3
    192.168.100.107

6.2 显示 web 组的服务器

# ansible web --list-host
  hosts (10):
    web1
    web2
    web3

6.3 显示 db 组的服务器

# ansible db --list-host
  hosts (5):
    db1
    db2
    db3

6.4 显示不属于任何组的服务器

# ansible ungrouped --list-host
  hosts (1):
  192.168.100.7

6.5 显示所有服务器

# ansible all --list-host
  hosts (20):
    web1
    web2
    web3
    db1
    db2
    db3
    192.168.100.107

或者:

# ansible-inventory --graph

[步骤] Ansible 的安装

步骤一:服务器系统要求

1) 服务器的系统需要是 CentOS Linux 8 版本
2) 需要 python3(3.5 或以上) 或 python2(2.7或以上)
3) 服务器系统配置好可用的软件源

步骤二:安装 Ansible

# yum install epel-release
# yum install ansible

[实验] Redis 数据库集群 Redis 数据库的添加和删除

纪念:站主于 2019 年 11 月完成了此开源实验,并将过程中的所有命令经过整理和注释以后,形成以下教程

注意:

在给 Redis 数据库集群添加和删除 Redis 数据库之前要先搭建 Redis 数据库集群

软件准备:

在 Redis 的官网上下载软件 Redis:

https://redis.io/

在 rubygems 的官网上下载软件 rubygems

https://rubygems.org

正文:

步骤目录:

步骤一:规划拓扑
1.1 服务器列表
1.2 服务器列表简介

步骤二:系统环境要求

步骤三:所有数据库服务器安装 Redis 数据库
3.1 安装 Redis 数据库的相关依赖包
3.2 安装 Redis 数据库
3.2.1 解压安装包
3.2.2 进入安装包目录
3.2.3 编译安装包
3.2.4 安装软件包
3.2.5 进入配置目录
3.2.6 安装软件包

步骤四:将 Redis 数据库添加到别的集群
4.1 修改所有服务器上的 Redis 数据库配置文件
4.2 重启所有服务器上的 Redis 数据库
4.2.1 关闭 Redis 数据库
4.2.2 开启 Redis 数据库
4.3 将 redis7 和 redis8 添加到现有的 Redis 集群中
4.3.1 显示现有集群的状况
4.3.2 添加 redis7 并将其视为主数据库
4.3.3 添加 redis8 并将其视为从数据库
4.3.4 确认 redis7 和 redis8 已经加入到了集群中
4.4 让新加入的 redis 数据库也能存储数据
4.4.1 重新分配集群的存储块
4.4.2 确认集群的存储块已经覆盖所有主数据库

步骤五:将部分 Redis 数据库从集群中删除
5.1 将存储块从要被删除的 redis 主数据库里拿走
5.2 将部分 Redis 数据库从集群中删除
5.2.1 将作为主库的 Redis 数据库从集群中删除
5.2.2 将作为从库的 Redis 数据库从集群中删除
5.3 确认部分 Redis 数据库已经从集群中删除

具体的操作步骤:

步骤一:规划拓扑
1.1 服务器列表

现有的 Redis 集群
redis7 IP 地址:192.168.1.57 端口号:1057
redis8 IP 地址:192.168.1.58 端口号:1058

(补充:在本次实验中现有的 redis 集群管理服务器是 redis1,IP 地址是 192.168.1.57,端口号是 1057)

1.2 服务器列表简介

redis7 作为主库 redis8 作为从库加入到一个现有的 Redis 集群中

步骤二:系统环境要求

1) 所有服务器的系统都需要是 CentOS 7 版本
2) 所有服务器都要关闭防火墙
3) 所有服务器都要关闭 SELinux
4) 所有服务器系统都要配置好可用的软件源
5) 需要按照拓扑图给对应的服务器配置好 IP 地址和主机名
6) 所有服务器都要可以相互 ping 通自己和对方的 IP 地址和主机名

(注意:现有的 Redis 集群因为已经是创建好了的,所以不用执行以上操作)

步骤三:所有数据库服务器安装 Redis 数据库
3.1 安装 Redis 数据库的相关依赖包

(分别在 redis7 和 redis8 上执行以下步骤)

# yum -y install gcc gcc-c++ make

3.2 安装 Redis 数据库
3.2.1 解压安装包

(分别在 redis7 和 redis8 上执行以下步骤)

# tar -zxf redis-5.0.5.tar.gz

(补充:这里要安装的 Redis 版本是 5.0.5)

3.2.2 进入安装包目录

(分别在 redis7 和 redis8 上执行以下步骤)

# cd redis-5.0.5/

(补充:这里要安装的 Redis 版本是 5.0.5)

3.2.3 编译安装包

(分别在 redis7 和 redis8 上执行以下步骤)

# make

3.2.4 安装软件包

(分别在 redis7 和 redis8 上执行以下步骤)

# make install

3.2.5 进入配置目录

(分别在 redis7 和 redis8 上执行以下步骤)

# cd utils/

3.2.6 安装软件包

(分别在 redis7 和 redis8 上执行以下步骤)

# ./install_server.sh
Welcome to the redis service installer
This script will help you easily set up a running redis server
Please select the redis port for this instance: [6379] 
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf] 
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log] 
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379] 
Selected default - /var/lib/redis/6379
Please select the redis executable path [/usr/local/bin/redis-server] 
Selected config:
Port           : 6379
Config file    : /etc/redis/6379.conf
Log file       : /var/log/redis_6379.log
Data dir       : /var/lib/redis/6379
Executable     : /usr/local/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!

步骤四:将 Redis 数据库添加到别的集群
4.1 修改所有服务器上的 Redis 数据库配置文件

(只在 redis7 上执行以下步骤)

# vim /etc/redis/6379.conf

将部分内容修改如下:

......
#bind 127.0.0.1
bind 192.168.1.57
......
port 1057
......
daemonize yes
......
pidfile /var/run/redis_1057.pid
......
cluster-enabled yes
......
cluster-config-file nodes-1057.conf
......
cluster-node-timeout 5000
......


补充:
1) 这里的 #bind 127.0.0.1 代表取消数据库可以被本地登录
2) 这里的 bind 192.168.1.57 是本机的 IP 地址
3) 这里的 port 1057 代表数据库使用到的端口是 1057,集群里的各个数据库端口号不能一样
4) 这里的 daemonize yes 代表以进程的形式启动
5) 这里的 pidfile /var/run/redis_1057.pid 代表使用的 PID 文件是 /var/run/redis_1057.pid,集群里的各个数据库 PID 文件不能一样
6) 这里的 cluster-enabled yes 代表启用集群,但是前面的 daemonize 必须也启用
7) 这里的 cluster-config-file nodes-1057.conf 代表使用的数据库配置文件是 nodes-1057.conf,集群里的各个数据库的配置文件不能一样
8) 这里的 cluster-node-timeout 5000 代表集群通信超时时间为 5000

(只在 redis8 上执行以下步骤)

# vim /etc/redis/6379.conf

将部分内容修改如下:

......
#bind 127.0.0.1
bind 192.168.1.58
......
port 1058
......
daemonize yes
......
pidfile /var/run/redis_1058.pid
......
cluster-enabled yes
......
cluster-config-file nodes-1058.conf
......
cluster-node-timeout 5000
......


补充:
1) 这里的 #bind 127.0.0.1 代表取消数据库可以被本地登录
2) 这里的 bind 192.168.1.58 是本机的 IP 地址
3) 这里的 port 1058 代表数据库使用到的端口是 1058,集群里的各个数据库端口号不能一样
4) 这里的 daemonize yes 代表以进程的形式启动
5) 这里的 pidfile /var/run/redis_1058.pid 代表使用的 PID 文件是 /var/run/redis_1058.pid,集群里的各个数据库 PID 文件不能一样
6) 这里的 cluster-enabled yes 代表启用集群,但是前面的 daemonize 必须也启用
7) 这里的 cluster-config-file nodes-1058.conf 代表使用的数据库配置文件是 nodes-1058.conf,集群里的各个数据库的配置文件不能一样
8) 这里的 cluster-node-timeout 5000 代表集群通信超时时间为 5000

4.2 重启所有服务器上的 Redis 数据库
4.2.1 关闭 Redis 数据库

(分别在 redis7 和 redis8 上执行以下步骤)

# redis-cli shutdown

4.2.2 开启 Redis 数据库

(分别在 redis7 和 redis8 上执行以下步骤)

# /etc/init.d/redis_6379 start

4.3 将 redis7 和 redis8 添加到现有的 Redis 集群中
4.3.1 显示现有集群的状况

(只在 redis1 上执行以下步骤)

# redis-cli --cluster check 192.168.1.51:1051

4.3.2 添加 redis7 并将其视为主数据库

(只在 redis1 上执行以下步骤)

# redis-cli --cluster add-node 192.168.1.57:1057 192.168.1.51:1051

4.3.3 添加 redis8 并将其视为从数据库

(只在 redis1 上执行以下步骤)

# redis-cli --cluster add-node 192.168.1.58:1058 192.168.1.51:1051 --cluster-slave

4.3.4 确认 redis7 和 redis8 已经加入到了集群中

(只在 redis1 上执行以下步骤)

# redis-cli --cluster check 192.168.1.51:1051
192.168.1.51:1051 (5d030ec0...) -> 1 keys | 5461 slots | 1 slaves.
192.168.1.53:1053 (c4f884e7...) -> 2 keys | 5461 slots | 1 slaves.
192.168.1.52:1052 (7477c04d...) -> 1 keys | 5462 slots | 1 slaves.
192.168.1.57:1057 (10bb6a57...) -> 0 keys | 0 slots | 1 slaves.
[OK] 4 keys in 4 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.1.51:1051)
M: 5d030ec05f9de86ebeedc1b035b2122addaa61d8 192.168.1.51:1051
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: eac6a0586ad00375bea9aa352951c784be57e9ad 192.168.1.55:1055
   slots: (0 slots) slave
   replicates 5d030ec05f9de86ebeedc1b035b2122addaa61d8
S: 93d8988475c754a3b58d5172522163664c391da2 192.168.1.58:1058
   slots: (0 slots) slave
   replicates 10bb6a5732f629ee62801417cb44ddb670e99e86
S: a5cddda6c1bc7c6d3397e17e1ba29571bb7a1657 192.168.1.54:1054
   slots: (0 slots) slave
   replicates c4f884e7e4ce6adb4f5bc4f6eb398680beb26089
M: c4f884e7e4ce6adb4f5bc4f6eb398680beb26089 192.168.1.53:1053
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: 7477c04d8ebf9d498ed5586d5f4e6d513fdb3c30 192.168.1.52:1052
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: 10bb6a5732f629ee62801417cb44ddb670e99e86 192.168.1.57:1057
   slots: (0 slots) master
   1 additional replica(s)
S: fd973bbcc376bfccf5888ba06dba97feb9ef1273 192.168.1.56:1056
   slots: (0 slots) slave
   replicates 7477c04d8ebf9d498ed5586d5f4e6d513fdb3c30
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

4.4 让新加入的 redis 数据库也能存储数据
4.4.1 重新分配集群的存储块

(只在 redis1 上执行以下步骤)

# redis-cli --cluster reshard 192.168.1.51:1051
......
How many slots do you want to move (from 1 to 16384)? 4096
What is the receiving node ID? 10bb6a5732f629ee62801417cb44ddb670e99e86
......
Source node #1: all
......
Do you want to proceed with the proposed reshard plan (yes/no)? yes
......

4.4.2 确认集群的存储块已经覆盖所有主数据库

(只在 redis1 上执行以下步骤)

# redis-cli --cluster check 192.168.1.51:1051
192.168.1.51:1051 (5d030ec0...) -> 0 keys | 4096 slots | 1 slaves.
192.168.1.53:1053 (c4f884e7...) -> 1 keys | 4096 slots | 1 slaves.
192.168.1.52:1052 (7477c04d...) -> 1 keys | 4096 slots | 1 slaves.
192.168.1.57:1057 (10bb6a57...) -> 2 keys | 4096 slots | 1 slaves.
[OK] 4 keys in 4 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.1.51:1051)
M: 5d030ec05f9de86ebeedc1b035b2122addaa61d8 192.168.1.51:1051
   slots:[1365-5460] (4096 slots) master
   1 additional replica(s)
S: eac6a0586ad00375bea9aa352951c784be57e9ad 192.168.1.55:1055
   slots: (0 slots) slave
   replicates 5d030ec05f9de86ebeedc1b035b2122addaa61d8
S: 93d8988475c754a3b58d5172522163664c391da2 192.168.1.58:1058
   slots: (0 slots) slave
   replicates 10bb6a5732f629ee62801417cb44ddb670e99e86
S: a5cddda6c1bc7c6d3397e17e1ba29571bb7a1657 192.168.1.54:1054
   slots: (0 slots) slave
   replicates c4f884e7e4ce6adb4f5bc4f6eb398680beb26089
M: c4f884e7e4ce6adb4f5bc4f6eb398680beb26089 192.168.1.53:1053
   slots:[12288-16383] (4096 slots) master
   1 additional replica(s)
M: 7477c04d8ebf9d498ed5586d5f4e6d513fdb3c30 192.168.1.52:1052
   slots:[6827-10922] (4096 slots) master
   1 additional replica(s)
M: 10bb6a5732f629ee62801417cb44ddb670e99e86 192.168.1.57:1057
   slots:[0-1364],[5461-6826],[10923-12287] (4096 slots) master
   1 additional replica(s)
S: fd973bbcc376bfccf5888ba06dba97feb9ef1273 192.168.1.56:1056
   slots: (0 slots) slave
   replicates 7477c04d8ebf9d498ed5586d5f4e6d513fdb3c30
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

步骤五:将部分 Redis 数据库从集群中删除

(这里以删除 redis7 和 redis8 为例)

5.1 将存储块从要被删除的 redis 主数据库里拿走

(只在 redis1 上执行以下步骤)

# redis-cli --cluster reshard 192.168.1.51:1051
......
How many slots do you want to move (from 1 to 16384)? 4096
What is the receiving node ID? 5d030ec05f9de86ebeedc1b035b2122addaa61d8
......
Source node #1: 10bb6a5732f629ee62801417cb44ddb670e99e86
Source node #2: done
......
Do you want to proceed with the proposed reshard plan (yes/no)? yes
......

5.2 将部分 Redis 数据库从集群中删除
5.2.1 将作为主库的 Redis 数据库从集群中删除

(只在 redis1 上执行以下步骤)

# redis-cli --cluster del-node 192.168.1.57:1057 10bb6a5732f629ee62801417cb44ddb670e99e86
>>> Removing node 10bb6a5732f629ee62801417cb44ddb670e99e86 from cluster 192.168.1.57:1057
>>> Sending CLUSTER FORGET messages to the cluster...

5.2.2 将作为从库的 Redis 数据库从集群中删除

(只在 redis1 上执行以下步骤)

# redis-cli --cluster del-node 192.168.1.58:1058 023abbc600cd4fb1ca8bb7ce8c45099e186041f8
>>> Removing node 023abbc600cd4fb1ca8bb7ce8c45099e186041f8 from cluster 192.168.1.58:1058
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.

5.3 确认部分 Redis 数据库已经从集群中删除

# redis-cli --cluster check 192.168.1.51:1051
192.168.1.51:1051 (5d030ec0...) -> 0 keys | 4096 slots | 1 slaves.
192.168.1.53:1053 (c4f884e7...) -> 1 keys | 4096 slots | 1 slaves.
192.168.1.52:1052 (7477c04d...) -> 1 keys | 4096 slots | 1 slaves.
[OK] 4 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.1.51:1051)
M: 5d030ec05f9de86ebeedc1b035b2122addaa61d8 192.168.1.51:1051
   slots:[0-6826],[10923-12287] (4096 slots) master
   1 additional replica(s)
S: eac6a0586ad00375bea9aa352951c784be57e9ad 192.168.1.55:1055
   slots: (0 slots) slave
   replicates 5d030ec05f9de86ebeedc1b035b2122addaa61d8
   replicates 10bb6a5732f629ee62801417cb44ddb670e99e86
S: a5cddda6c1bc7c6d3397e17e1ba29571bb7a1657 192.168.1.54:1054
   slots: (0 slots) slave
   replicates c4f884e7e4ce6adb4f5bc4f6eb398680beb26089
M: c4f884e7e4ce6adb4f5bc4f6eb398680beb26089 192.168.1.53:1053
   slots:[12288-16383] (4096 slots) master
   1 additional replica(s)
M: 7477c04d8ebf9d498ed5586d5f4e6d513fdb3c30 192.168.1.52:1052
   slots:[6827-10922] (4096 slots) master
   1 additional replica(s)
S: fd973bbcc376bfccf5888ba06dba97feb9ef1273 192.168.1.56:1056
   slots: (0 slots) slave
   replicates 7477c04d8ebf9d498ed5586d5f4e6d513fdb3c30
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.