宝塔 Linux Redis集群搭建与集群客户端实现

Redis/缓存系统
784
0
0
2022-09-04
标签   Redis

宝塔上的Redis已经成功安装,安装路径为 /www/server/redis

我们要在单台机器上搭建Redis集群,方式是通过不同的TCP端口启动多个实例,然后组成集群。

1.启动Redis多个实例

我们在Redis安装目录下创建目录 redis_cluster,并创建9001~9006 6个文件夹,这6个配置文件用来启动6个实例,后面将使用这6个实例组成集群。

以9001目录中的redis.conf为例,配置文件需要填写如下几项。

#端口
port 9001
#启用集群模式
cluster-enabled yes 
#集群的配置  配置文件首次启动自动生成 9001,9002,9003
cluster-config-file /www/server/redis/redis_cluster/log/nodes_9001.conf
#默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群
bind 172.28.131.245
#超时时间
cluster-node-timeout 5000 
appendonly yes
#后台运行
daemonize yes
#非保护模式
protected-mode no 
pidfile  /www/server/redis/redis_cluster/log/redis_9001.pid
logfile /www/server/redis/redis_cluster/log/redis_9001.log

我本人的目录结构如下

宝塔 Linux Redis集群搭建与集群客户端实现

宝塔 Linux Redis集群搭建与集群客户端实现

2.启动集群,我是全部6条启动命令写在start.sh脚本里面,免去了一条一条执行的启动集群,执行 start.sh 命令:

/www/server/redis/redis_cluster/start.sh
#!/bin/bash
/www/server/redis/src/redis-server  /www/server/redis/redis_cluster/9001/redis.conf
/www/server/redis/src/redis-server  /www/server/redis/redis_cluster/9002/redis.conf
/www/server/redis/src/redis-server  /www/server/redis/redis_cluster/9003/redis.conf
/www/server/redis/src/redis-server  /www/server/redis/redis_cluster/9004/redis.conf
/www/server/redis/src/redis-server  /www/server/redis/redis_cluster/9005/redis.conf
/www/server/redis/src/redis-server  /www/server/redis/redis_cluster/9006/redis.conf
#启动集群

然后会看到以下启动内容,会弹出 Can I set the above configuration? (意思:我可以设置上述配置吗?) 输入: yes 就行了

宝塔 Linux Redis集群搭建与集群客户端实现

然后继续

宝塔 Linux Redis集群搭建与集群客户端实现

3 . 创建集群:

/www/server/redis/redis_cluster/create.sh
#!/bin/bash
/www/server/redis/src/redis-cli --cluster create 172.28.131.245:9001 172.28.131.245:9002 172.28.131.245:9003 172.28.131.245:9004 172.28.131.245:9005 172.28.131.245:9006 --cluster-replicas 1

–replicas 1表示为集群的master节点创建1个副本。那么6个实例里,有三个master,有三个是slave。

后面跟上6个实例就好了,形式就是ip:port

4.可以看到建立了3个 master 和对应的 slave (三主三从) 可以看到建立了3个 master 和对应的 slave (三主三从)

宝塔 Linux Redis集群搭建与集群客户端实现

5 . 验证集群状态,登录集群客户端,-c标识以集群方式登录(可以看到16384个slot都已经创建完成,状态也是ok的):

redis-cli -h 172.28.131.245 -p 9001 -c

宝塔 Linux Redis集群搭建与集群客户端实现

6.看一下进程

ps -ef | grep redis | grep cluster

宝塔 Linux Redis集群搭建与集群客户端实现

7.进入集群客户端查看设置了那些数据,与设置数据

(-> Redirected to slot [1890] located at 172.28.131.245:9001:插入一条信息,集群会自动计算hash槽值,看将值保存到那个节点上,会自动跳转到那个节点,发现从9003自动跳转到了9001)

宝塔 Linux Redis集群搭建与集群客户端实现

查看集群运行数量:

ps -ef | grep redis | grep cluster |grep -v grep|wc -l

关闭集群:

/www/server/redis/utils/create-cluster/create-cluster stop

重启动集群

/www/server/redis/utils/create-cluster/create-cluster start

一些原理

redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。

Redis集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽(hash slot)的方式来分配的,一致性哈希对向集群中新增和删除实例的支持很好,但是哈希槽对向集群新增实例或者删除实例的话,需要额外的操作,需要手动的将slot重新平均的分配到新集群的实例中。

redis cluster 默认分配了 16384 个slot,当我们set一个key时,会用CRC16算法来取模得到所属的slot,然后将这个key分到哈希槽区间的节点上,具体算法就是:CRC16(key)%16384。

Redis 集群会把数据存在一个master节点,然后在这个master和其对应的salve之间进行数据同步。当读取数据时,也根据一致性哈希算法到对应的master节点获取数据。只有当一个master 挂掉之后,才会启动一个对应的salve节点,充当master。

需要注意的是:必须要3个或以上的主节点,否则在创建集群时会失败,并且当存活的主节点数小于总节点数的一半时,整个集群就无法提供服务了。