一、集群介绍
集群的架构:集群就是使用网络将若干台计算机联通起来,并提供统一的管理方式,使其对外呈现单机的服务效果
集群的作用:
1、分散单台服务器的访问压力,实现负载均衡
2、分散单台服务器的存储压力,实现可扩展性
3、降低单台服务器宕机带来业务灾难
注:图片来源于小钟要学习!!!
Redis集群内部结构设计
数据存储设计
1、通过算法设计,计算出key应该保存的位置
2、将所有的存储空间计划切割成16384份,每台主机保存一部分,每份代表的是一个存储空间,不是一个key的保存空间
3、将key按照计算出的结果放到对应的存储空间
4、增强可扩展性(有新的存储空间加入,官方叫做槽)
集群内部通讯设计
1、各个数据库相互通信,保存各个库中槽的编号数据
2、一次命中,直接返回
3、一次未命中,告知具体位置
本次搭建Redis集群使用了IP尾数为100、101的两台服务器,然后按照Redis集群推荐的最低要求启动6个Redis服务实现三主三从的集群架构,安装完成后将会在100机器开启9000、9001、9002三个redis服务,在101机器开启9003、9004、9005三个redis服务.以下是redis集群安装步骤:
二、安装Redis
2.1、环境配置 -当前ip位数是100
Redis是c语言开发的,所以安装Redis 需要C语言的编译环境,即需要安装gcc
1、查看是否安装gcc
gcc -v
如果没有以上展示则需要在线安装
yum install gcc-c++
如果需要离线安装请百度一下
2.2、下载源码压缩包
先 进入 /usr/local/ 然后创建redis文件夹
cd /usr/local/
mkdir redis
cd redis
进入redis文件夹 输入pwd 展示如下就可以使用wget 拉取源码文件或者上传到此文件中
[root@localhost redis]# pwd
/usr/local/redis
下载源码文件可以在linux命令行中输入下面命令,也可以在自己电脑上下载好源码文件,并通过ftp工具上传到服务中。我这里使用的是redis7.0.14版本。
wget https://download.redis.io/releases/redis-7.0.14.tar.gz
2.3、解压并编译源码
编译源码,首先需要解压源码文件,然后进入源码根目录,然后执行make命令:
tar -xzvf redis-7.0.14.tar.gz
cd redis-7.0.14/
make
如下则编译成功
如果编译成功,你会发现目录下会生成src目录,并且在src目录下包含以下两个二进制文件:
redis-server: 服务器文件
redis-cli: 是与redis实现通讯的命令接口程序
安装二进制文件到**/usr/local/bin**目录下,执行:
make install
2.4、启动测试
进入src 目录使用 ./redis-server 看是否启动成功!
cd src
./redis-server
有以上界面表示redis单机部署成功,下面我们有要开始部署集群准备 使用 ctrl +c 关闭当前redis,因为redis 默认启动模式为前端启动
三、Redis集群搭建
3.1、在装好redis目录下新建一个redis-cluster目录
在当前目录输入 pwd 查看是否在/usr/local/redis目录下
如果不是 使用 cd命令进入redis目录
cd /usr/local/redis
然后创建redis-cluster目录
mkdir redis-cluster
ll
查看如下
3.2、在redis-cluster目录下创建3个文件夹
因为当前服务器ip尾数是100所以创建 9000、9001、9002 。如果ip尾数是101则创建9003、9004、9005
cd redis-cluster
mkdir 9000
mkdir 9001
mkdir 9002
创建完成后使用 ll 命令查看如下
3.3 进入文件夹编辑配置文件
分别进入每个文件夹 把redis解压文件里面的redis.conf 文件(/usr/local/redis/redis-7.0.14/redis.conf)复制到当前目录
cp /usr/local/redis/redis-7.0.14/redis.conf .
然后看配置文件是否复制过来了
然后修改 配置文件里面的相关类容 其余配置文件跟着更改只需要注意ip 端口号 pidfile cluster-config-file的对应更改就行了
daemonize yes //redis后台运行
bind 0.0.0.0 //改成你对应的IP
pidfile /var/run/redis_9000.pid //pidfile文件对应的端口
port 9000 //端口
cluster-enabled yes //开启集群 把注释#去掉
cluster-config-file nodes_9000.conf //集群的配置 配置文件首次启动自动生成
cluster-node-timeout 5000 //请求超时 设置5秒够了
appendonly yes //aof日志开启 有需要就开启,它会每次写操作都记录一条日志
protected-mode no //在redis3.2之后,redis增加了protected-mode,在这个模式下,即使注释掉了bind 127.0.0.1,再访问redisd时候还是报错
注:如何你觉得复制过来的配置文件有太多注释可以新建redis.conf 并编辑插入我提供的只需要改几个配置就行了,只需要更改需要更改的位置,配置如下:
# 绑定 Redis 监听的 IP 地址 需要更改
bind 192.168.10.100 -::1
# 监听端口号 你的端口号 需要更改
port 9000
# 守护进程的 PID 文件路径 你端口号对应的pid 需要更改
pidfile /var/run/redis_9000.pid
# Redis 集群配置文件名 需要更改
cluster-config-file nodes-9000.conf
# 是否启用保护模式
protected-mode yes
# TCP 连接的 backlog 长度
tcp-backlog 511
# 客户端空闲多长时间后关闭连接,0 表示永不超时
timeout 0
# TCP 连接的 keepalive 时间
tcp-keepalive 300
# 是否以守护进程方式运行 Redis
daemonize yes
# 日志级别
loglevel notice
# 日志文件路径,为空表示不输出日志到文件
logfile ""
# 数据库数量
databases 16
# 是否显示 Redis 的 ASCII 艺术字标志
always-show-logo no
# 是否设置进程标题
set-proc-title yes
# 进程标题的模板
proc-title-template "{title} {listen-addr} {server-mode}"
# 是否在 bgsave 出错时停止写入
stop-writes-on-bgsave-error yes
# 是否压缩 RDB 文件
rdbcompression yes
# 是否对 RDB 文件进行校验和计算
rdbchecksum yes
# RDB 文件名
dbfilename dump.rdb
# 是否在 RDB 文件保存时删除旧的 RDB 文件
rdb-del-sync-files no
# 是否在从节点上启用过期键的缓存
replica-serve-stale-data yes
# 是否在从节点上只读
replica-read-only yes
# 是否在无磁盘同步的情况下进行复制同步
repl-diskless-sync yes
# 无磁盘同步的延迟时间,单位为秒
repl-diskless-sync-delay 5
# 无磁盘同步的最大从节点数,0 表示不限制
repl-diskless-sync-max-replicas 0
# 是否禁用磁盘同步
repl-diskless-load disabled
# 是否禁用 TCP_NODELAY 选项
repl-disable-tcp-nodelay no
# 从节点的优先级
replica-priority 100
# 是否启用 lazyfree 模式
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
lazyfree-lazy-user-del no
lazyfree-lazy-user-flush no
# 是否启用 OOM_SCORE_ADJ
oom-score-adj no
# OOM_SCORE_ADJ 的取值
oom-score-adj-values 0 200 800
# 是否禁用 THP
disable-thp yes
# 是否开启 AOF 持久化
appendonly no
# AOF 文件名
appendfilename "appendonly.aof"
# AOF 文件所在目录名
appenddirname "appendonlydir"
# AOF 文件同步方式
appendfsync everysec
# 是否在 AOF 重写时禁止对新数据进行写入
no-appendfsync-on-rewrite no
# 触发 AOF 重写的比例阈值
auto-aof-rewrite-percentage 100
# 触发 AOF 重写的最小文件大小
auto-aof-rewrite-min-size 64mb
# 是否在 AOF 文件加载时自动修复截断的数据
aof-load-truncated yes
# 是否在 AOF 文件开头加入 RDB 文件的内容
aof-use-rdb-preamble yes
# 是否启用 AOF 时间戳
aof-timestamp-enabled no
# 是否启用 Redis 集群模式
cluster-enabled yes
# Redis 集群节点超时时间,单位为毫秒
cluster-node-timeout 5000
# 慢查询日志阈值,单位为微秒
slowlog-log-slower-than 10000
# 慢查询日志最大长度
slowlog-max-len 128
# 监控键的阈值,单位为微秒
latency-monitor-threshold 0
# 监控的键的事件类型
notify-keyspace-events ""
# 哈希表中 listpack 的最大节点数
hash-max-listpack-entries 512
# 哈希表中 listpack 的最大值大小
hash-max-listpack-value 64
# 列表中 listpack 的最大大小,-2 表示不限制
list-max-listpack-size -2
# 集合中 intset 的最大节点数
set-max-intset-entries 512
# 有序集合中 listpack 的最大节点数
zset-max-listpack-entries 128
# 有序集合中 listpack 的最大值大小
zset-max-listpack-value 64
# HyperLogLog 中稀疏编码的最大字节数
hll-sparse-max-bytes 3000
# Stream 节点的最大字节数
stream-node-max-bytes 4096
# Stream 节点的最大条目数
stream-node-max-entries 100
# 是否启用主动 rehash
activerehashing yes
# 客户端输出缓冲区限制
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
# 定时器频率
hz 10
# 是否启用动态定时器频率
dynamic-hz yes
# 是否在 AOF 重写时增量 fsync
aof-rewrite-incremental-fsync yes
# 是否在 RDB 持久化时增量 fsync
rdb-save-incremental-fsync yes
# 是否启用 jemalloc 后台线程
jemalloc-bg-thread yes
# 如果你的服务器内核是 arm的 就要放开下面配置
# ignore-warnings ARM64-COW-BUG
设置当前配置文件的权限
chmod 777 redis.conf
101三个reds参照 本目录方法重复一次就行
3.4、创建批量启动文件
- 创建启动命令集文件,执行命令
vi /usr/local/redis-cluster/redis-cluster-start.sh
,并填写如下内容:
cd /usr/local/redis/redis-cluster/9000
redis-server redis.conf &
cd /usr/local/redis/redis-cluster/9001
redis-server redis.conf &
cd /usr/local/redis/redis-cluster/9002
redis-server redis.conf &
以上是100的配置,101机器只需要修改响应的端口路径即可。
启动redis服务
sh /usr/local/redis/redis-cluster/redis-cluster-start.sh
查看redis是否启动成功 100 跟101 都看一下
ps aux|grep redis
3.5、配置防火墙白名单
redis集群中有两个必要重要的通讯端口,分别是配置文件中的port和port+10000端口,本次搭建集群使用了两台服务,所以搭建集群时必须保证redis集群使用到的端口可以互相访问,保证两台机器互相访问可以是关闭防火墙,也可以是设置白名单,这里选择设置白名单,具体配置过程如下:
100机器执行以下命令配置IP白名单:
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.10.101" port protocol="tcp" port="9003" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.10.101" port protocol="tcp" port="19003" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.10.101" port protocol="tcp" port="9004" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.10.101" port protocol="tcp" port="19004" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.10.101" port protocol="tcp" port="9005" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.10.101" port protocol="tcp" port="19005" accept"
firewall-cmd --reload
101机器执行以下命令配置IP白名单:
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.10.100" port protocol="tcp" port="9000" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.10.100" port protocol="tcp" port="19000" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.10.100" port protocol="tcp" port="9001" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.10.100" port protocol="tcp" port="19001" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.10.100" port protocol="tcp" port="9002" accept"
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.10.100" port protocol="tcp" port="19002" accept"
firewall-cmd --reload
你也可以选择2个服务防火墙把端口都放开或者关闭防火墙
以下是宝塔界面放开端口
也可以使用linux 防火墙端口开放命令
sudo firewall-cmd --zone=public --add-port=9000/tcp --permanent
重启防火墙
sudo systemctl restart firewalld
剩下的都是linux操作 这里不在描述了
3.6、集群创建
集群创建只需要在其中一台服务器执行即可,具体创建命令如下:
redis-cli --cluster create 192.168.10.100:9000 192.168.10.100:9001 192.168.10.100:9002 192.168.10.101:9003 192.168.10.101:9004 192.168.10.101:9005
--cluster-replicas 1
–cluster-replicas 1:这里的1代表为每个master节点分配1个从节点;
出现以下表示成功
3.7、集群验证
其实集群创建命令没有异常即代表成功,不过我们也可以通过登录和存储值来验证
这是没有设置密码的
redis-cli -c -h 192.168.10.100 -p 9000
查看集群信息
cluster info
查看节点列表
cluster nodes
已设置密码的
redis-cli -c -h 192.168.10.100 -p 9000 -a 'pawss&word'
我们从9000上发送的内容跳转到了9003上至此说明集群搭建成功,set name的时候计算了存在哪个hash槽上,会跳转到那个槽对应的节点
出现的问题:
如果在redis.conf里面requirepass设置了密码在建集群的时候就会报错
Sorry, can’t connect to node 127.0.0.1:9000
那么要给集群设置密码步骤如下
先登录集群
redis-cli -c -h 192.168.10.100 -p 9002
然后再设置密码
config set requirepass 'password'
config set masterauth 'password'
config rewrite
设置密码成功
退出当前集群模式进入9002的配置文件你会发现,配置文件里改变了:
剩下的 都按照 登录集群 设置密码 就行了。如
redis-cli -c -h 192.168.10.101 -p 9003 就只改端口号
注意个人建议所有集群的节点密码尽量一致,后续使用的时候不麻烦!!!
此到此redis集群就算完成了,收工。