linux搭建redis集群cluster模式

一、集群介绍

集群的架构:集群就是使用网络将若干台计算机联通起来,并提供统一的管理方式,使其对外呈现单机的服务效果
集群的作用:
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集群就算完成了,收工。

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值