php redis扩展 Cluster集群

Redis Cluster主从模式

主节点存取数据,从节点拉取数据备份

当这个主节点挂掉后,就会有这个从节点选取一个来充当主节点,从而保证集群不会挂掉

 集群有ABC三个主节点, 如果这3个节点都没有加入从节点,如果B挂掉了,我们就无法访问整个集群了。A和C的slot也无法访问。.

所以我们在集群建立的时候,一定要为每个主节点都添加了从节点, 比如像这样, 集群包含主节点A、B、C, 以及从节点A1、B1、C1, 那么即使B挂掉系统也可以继续正确工作。

1.7        集群搭建 

1.7.1       准备工作 

1.安装ruby环境

yum install ruby

yum install rubygems

放到 /usr/local/ 目录下

gem install redis-4.6.0.gem

[root@bogon local]# gem install redis-4.6.0.gem

ERROR: Error installing redis-4.6.0.gem:

redis requires Ruby version >= 2.4.0.

提示ruby版本低。

解决方案:先安装rvm,再把ruby版本提升至2.3.0

1.安装curl

yum install curl

2.安装RVM

curl -L get.rvm.io | bash -s stable

3.source一下

source /usr/local/rvm/scripts/rvm #如果未找到rvm文件重新执行上面代码

4.查看rvm库中已知的ruby版本

rvm list known

5.安装一个ruby版本

rvm install 2.6.6

6.使用一个ruby版本

rvm use 2.6.6

7.设置默认版本

ruby --version

8.卸载一个已知版本

rvm remove 2.4.0

再执行安装, 就成功了。

将redis安装目录/usr/local/redis-6.2.6下的redis.conf文件拷贝至7001-7006文件夹,并修改以下配置:

daemonize yes #开启后台运行
port 7001 #工作端口
bind 192.168.103.107 #绑定机器的内网IP,一定要设置呀老铁,不要用127.0.0.1
dir /usr/local/redis-cluster/7001/ #指定工作目录,rdb,aof持久化文件将会放在该目录下,不同实例一定要配置不同的工作目录
cluster-enabled yes #启用集群模式
cluster-config-file nodes-7001.conf #生成的集群配置文件名称,集群搭建成功后会自动生成,在工作目录下
cluster-node-timeout 5000 #节点宕机发现时间,可以理解为主节点宕机后从节点升级为主节点时间
appendonly yes #开启AOF模式
pidfile /var/run/redis_8001.pid #pid file所在目录

3. 把8001文件夹下的redis.conf文件拷贝到其他5个目录,并重新修改port 、dir、cluster-config-file 三个属性

启动节点

[root@bogon redis-6.2.6]# ./src/redis-server /usr/local/redis-cluster/7001/redis.conf

[root@bogon redis-6.2.6]# ./src/redis-server /usr/local/redis-cluster/7002/redis.conf

[root@bogon redis-6.2.6]# ./src/redis-server /usr/local/redis-cluster/7003/redis.conf

[root@bogon redis-6.2.6]# ./src/redis-server /usr/local/redis-cluster/7004/redis.conf

[root@bogon redis-6.2.6]# ./src/redis-server /usr/local/redis-cluster/7005/redis.conf

[root@bogon redis-6.2.6]# ./src/redis-server /usr/local/redis-cluster/7006/redis.conf

查看服务是否启动起来

ps -ef|grep redis

ok,6个节点都已经正常启动。

由于4.0以后不再使用ruby命令,可以直接使用redis-cli 来创建集群

所以,

使用命令创建集群

redis-cli --cluster create 192.168.103.107:7001 192.168.103.107:7002 192.168.103.107:7003 192.168.103.107:7004 192.168.103.107:7005 192.168.103.107:7006 --cluster-replicas 1

任意进入一个节点,查询集群中的节点情况

说明:./redis-cli -c -h 192.168.103.107 -p 7001 ,其中: 

-c表示以集群方式连接redis,

-h指定ip地址,

-p指定端口号

至此,Redis Cluster集群就搭建完成了!

Tips :

1. 如果想重新创建集群,需要登录到每个节点,执行flushdb,然后执行cluster reset,重启节点;

2. 如果要批量杀掉Redis进程,可以使用pkill redis-server命令;

redis-cluster数据怎么存储

1.1 Redis-Cluster 数据存储

1.1.1 redis 会根据 crc16 (一个hash算法,hash的意思就是输入一个数,就返回一个数,一一对应)算法对要存储的数据的key计算hash值,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作

{1} slot就是一个数据存储空间,这个空间的数量是固定的。均匀disperse到每个master节点,

{2} 连接到redis-cluster中的任意节点,就相当于连接了所有节点,数据存储的位置是根据key的值进行的,也就是说,跟连接到哪个节点无关,有可能会存到别的节点上,

{3} 类似于HashMap,向redis集群存一个对象(data)时,尽量的做到均匀。 è 节点会平分槽 è 每个节点获得的存数据的机会是一样的。

假设已经建立了一个三主三从的redis-cluster架构,其中A、B、C节点都是redis-master节点,A1、B1、C1节点都是对应的redis-slave节点。在我们只有master节点A,B,C的情况下,对应redis-cluster如果节点B失败,则群集无法继续,因为我们没有办法再在节点B的所具有的约三分之一的hash slot集合范围内提供相对应的slot。然而,如果我们为每个主服务器节点添加一个从服务器节点,以便最终集群由作为主服务器节点的A,B,C以及作为从服务器节点的A1,B1,C1组成,那么如果节点B发生故障,系统能够继续运行。节点B1复制B,并且B失效时,则redis-cluster将促使B的从节点B1作为新的主服务器节点并且将继续正确地操作。但请注意,如果节点B和B1在同一时间发生故障,则Redis群集无法继续运行。

Redis群集配置参数:在继续之前,让我们介绍一下Redis Cluster在redis.conf文件中引入的配置参数。有些命令的意思是显而易见的,有些命令在你阅读下面的解释后才会更加清晰。

(1)cluster-enabled :如果想在特定的Redis实例中启用Redis群集支持就设置为yes。 否则,实例通常作为独立实例启动。

(2)cluster-config-file :请注意,尽管有此选项的名称,但这不是用户可编辑的配置文件,而是Redis群集节点每次发生更改时自动保留群集配置(基本上为状态)的文件。

(3)cluster-node-timeout :Redis群集节点可以不可用的最长时间,而不会将其视为失败。 如果主节点超过指定的时间不可达,它将由其从属设备进行故障切换。

(4)cluster-slave-validity-factor :如果设置为0,无论主设备和从设备之间的链路保持断开连接的时间长短,从设备都将尝试故障切换主设备。 如果该值为正值,则计算最大断开时间作为节点超时值乘以此选项提供的系数,如果该节点是从节点,则在主链路断开连接的时间超过指定的超时值时,它不会尝试启动故障切换。

(5)cluster-migration-barrier :主设备将保持连接的最小从设备数量,以便另一个从设备迁移到不受任何从设备覆盖的主设备。有关更多信息,请参阅本教程中有关副本迁移的相应部分。

(6)cluster-require-full-coverage :如果将其设置为yes,则默认情况下,如果key的空间的某个百分比未被任何节点覆盖,则集群停止接受写入。 如果该选项设置为no,则即使只处理关于keys子集的请求,群集仍将提供查询。

以下是最小的Redis集群配置文件:

port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

其中一个主节点挂掉,后,如何恢复。

原先7001为主节点,7004为从节点,

我kill掉了7001 后

图中可看出,7001为fail 状态,宕机

大概一分钟左右。

7004 被选为主节点,

多次查看 7001 都为fail,确认已经宕机。

现在准备恢复7001节点

1.先到7001 目录下删除nodes.conf:

[root@192-13-168-77 data]# ls

nodes.conf  dump_6379.rdb 

[root@192-13-168-77 data]# rm -rf nodes.conf 

2. 重新启动 7001

查看进程

发现7001还是无法加入集群。

3. 进入7001查看。发现是个独立,的并没有进入集群中、

4. 在每个节点执行之前集群中的7001的 node_id

635037c0e4dc9c38dee8897aa3a0e0fd8666924e

CLUSTER FORGET 635037c0e4dc9c38dee8897aa3a0e0fd8666924e

由于kill掉的是7001 顶替上来的是7004

所以只用在 7002 7003 7005 7006 中依次执行

执行后 显示 ok

5. 再次重新启动 7001

./src/redis-server /usr/local/redis-cluster/7001/redis.conf

6. 添加命令。增加7001为7004的从节点。(因为7001被kill掉,所以现在集群中7004为主节点)

redis4.0后 redis-trib 命令不能用。

提示用新的命令 redis-cli --clister

新命令添加集群

redis-cli --cluster add-node 192.168.103.107:7001 192.168.103.107:7004 --cluster-slave --cluster-master-id 183377719c516176be4581209591758b

上面的命令翻译,添加7001从节点,到7004这个主节点下。主节点的node_id 为 183377719c516176be4581209591758b

提示成功添加到集群中。

随便进入一个节点查看。,7001现在已经为7004的从节点。恢复成功。

至此 节点恢复,也成功。

完美配置。

1.redis 认证auth 密码是否要求一致

6个节点设置统一的密码123456后,数据读取不到,报错(error) ERR operation not permitted,必须输入密码,才能读到数据。

6个节点设置不同的密码后,,数据读取不到,读取数据依旧是需要密码。

在输入密码后,再次读取其他数据,如不再当前节点,跳转到其他节点后,还是需要再次输入密码。

另,在redis-cli 中如果不加-c 参数,则不会自动重定向,不执行命令,只返回信息,提示数据在哪个节点的某个slot中,。 但如果加了-c参数,则会自动连接到正确的节点并执行命令。例:进入某一节点后,查询 get key,要求输入第一次密码,正确后,会真正进入当前节点,再get key 提示数据在另一个节点的某一个slot中,并且会自动重定向到那个节点,需要再输入密码,再次get key 则显示数据。

2.php redis 扩展,是否支持redis cluster,如果支持,是否可以自动重定向;如果不支持,有没有php 第三方库可以支持

php redis 扩展,支持 redis cluster。用本地php代码进行连接,目前在无密码的情况下,可以自动重定向,直接获取到key,且直接在页面中显示key值,且无感知,无论连接哪一个节点redis,都可以获取到数据,测试证明redis内部会自动判断主从。

redis集群设置密码后,php代码连接直接报错,根据网上资料说的,在代码中也填入密码后,还是会连接报错,无法获取key值。

查资料,php redis扩展,不支持集群秘钥链接。

PhpRedis doesn't have any logic to handle encryption

  1. Cluster mode had to be properly enabled.
  2. Encryption in-transit and Redis AUTH had to be turned off.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王十一x

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值