Login
网站首页 > 文章中心 > 其它

Redis集群搭建_redis集群搭建和使用

作者:小编 更新时间:2023-09-30 13:23:16 浏览量:226人看过

?

安装环境

单台redis安装


wget?http://download.redis.io/releases/redis-④0.10.tar.gz

tar zxvf redis-0.10.tar.gz

mv redis-0.10?/usr/local/redis/

编译安装


cd?/usr/local/redis

make

make?install

安装完成,这时候会在/usr/local/bin/目录下看到redis-server、redis-cli等可执行脚本,进入看一下,如果没有,就要去解压目录复制进去了.

配置redis.conf

redis.conf在默认在安装目录下


$?vim /usr/local/redis/redis.conf

这里要修改两个地方,一个bind和daemonize就行.

要注意的点:

daemonize是设置是否后台启动 Redis,默认no,正常都需要以服务形式启动 Redis,所以这里设置为yes.

可以设置密码 requirepass mypassord

关于更多配置文件参数的解释,可以参考:

启动redis


cd?/usr/local/bin/

redis-server /usr/local/redis/redis.conf

测试redis服务

端口已开启:


netstat -anp |?grep?6379

命令行连接:


? ?redis?redis-cli

127.0.0.1:6379>?keys?*

1) "city"

2) "usage"

3) "idc"

4) "region"

127.0.0.1:6379>?set?name?jzhou

OK

127.0.0.1:6379>?get?name

"jzhou"

127.0.0.1:6379>

关闭服务

可以通过杀进程的方式强制关闭服务,也可以通过命令:


redis-cli shutdown

通过 netstat 可以看出来端口已经是TIME_WAIT状态了

redis集群搭建

简介

redis-cluster架构设计

架构细节:

所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.

节点的fail是通过集群中超过半数的节点检测失效时才生效.

环境准备

三台服务器


172.28.37.29

172.28.37.30

172.18.38.219

(每台服务器redis三个端口号 7000~7002)

按照上面搭建单台redis服务的方式在三台服务器分别安装redis,从配置文件开始会有所不同.下面会说明搭建过程.

依赖包安装

注意,下述均安装最新版本,否则会和redis版本不匹配


lib

zlib

ruby

rubugems

开始集群搭建

① 准备目录结构

三台机器一样,建立如下目录结构:


$?mkdir -p /usr/local/redis/redis-cluster/{7000,7001,7002}

分别进入每个端口目录创建配置文件:


cd?/usr/local/redis/redis-cluster/7000? touch redis.conf


port?7000?# 端口7000,7001,7002,与目录对应

bind?172.2⑧3⑦29?#默认ip为12⑦0.0.1,需要改为其他节点机器可访问的ip,否则创建集群时无法访问对应的端口,无法创建集群

daemonize?yes?#redis后台运行

cluster-enabled?yes?#开启集群

cluster-config-file nodes_7000.conf ?#集群的配置,配置文件首次启动自动生成 7000,7001,7002 ?

cluster-node-timeout?8000?#请求超时,默认15秒,可自行设置

appendonly?yes?#开启aof持久化模式,每次写操作请求都追加到appendonly.aof文件中

appendfsync always ?#每次有写操作的时候都同步

logfile?"/data/redis/logs/redis.log"?#redis服务日志

pidfile /var/run/redis_7000.pid ?#pidfile文件对应7000,7001,7002

注意,上述有些配置项要对应服务和目录,三个目录按照上述配置好后,启动服务

可以在每个服务器上写一个启动脚本start-redis.sh:


for((i=0;i<3;i◆◆));?

do?/usr/local/bin/redis-server /usr/local/redis/redis-cluster/700$i/redis.conf;?

done

关闭服务类似:


for((i=0;i<=2;i◆◆));

do?/usr/local/bin/redis-cli -c -h?$IP?-p 700$i?shutdown;?

done

$IP分别为三台服务器IP.

注意:在任意一台上运行 不要在每台机器上都运行,一台就够了

Redis 官方提供了 redis-trib.rb 这个工具,就在解压目录的 src 目录中

在其中一台执行:


$?cd?/root/redis-④0.10/src

$?./redis-trib.rb create --replicas 1 172.2⑧3⑦29:7000 172.2⑧3⑦29:7001 172.2⑧3⑦29:7002 172.2⑧3⑦30:7000 172.2⑧3⑦30:7001 172.2⑧3⑦30:7002 172.1⑧3⑧219:7000 172.1⑧3⑧219:7001 172.1⑧3⑧219:7002

敲完这个命令后会提示是否按照默认的推荐方式配置集群主从,一般选yes就行了


>>>?Creating?cluster

>>>?Performing?hash?slots?allocation?on?9?nodes...

Using?4?masters:

172.28.37.29:7000

172.28.37.30:7000

172.18.38.219:7000

172.28.37.29:7001

Adding?replica?172.18.38.219:7001?to?172.28.37.29:7000

Adding?replica?172.28.37.29:7002?to?172.28.37.30:7000

Adding?replica?172.28.37.30:7002?to?172.18.38.219:7000

Adding?replica?172.18.38.219:7002?to?172.28.37.29:7001

Adding?replica?172.28.37.30:7001?to?172.28.37.29:7000

下面这个显示了集群和slot分配结果

参数 -C 可连接到集群,因为 redis.conf 将 bind 改为了ip地址,所以 -h 参数不可以省略,-p 参数为端口号


[root@172-28-37-29 src]#?redis-cli?-c?-p?7000?-h?172.28.37.29

172.28.37.29:7000>?set?name?zhoujie

->?Redirected?to?slot?[5798]?located?at?172.28.37.30:7000

OK

172.28.37.30:7000>?get?name

"zhoujie"

172.28.37.30:7000>

友情提示:

当出现集群无法启动时,删除集群配置文件,再次重新启动每一个redis服务,然后重新构件集群环境.

redis-trib.rb命令常见用法

①.)列出集群节点-cluster nodes


[root@172-28-37-30?src]# redis-cli -h 172.2⑧3⑦30 ?-c -p 7000

172.2⑧3⑦30:7000>?cluster nodes

0d260c47f10ecbbfd9c3c1707da82a3dd7951313?172.1⑧3⑧219:7001@17001 slave f85a9a80aca5e4c4a1437c7b58abd5895ee66855?0?1531497002061?8?connected

6d3db545319a8d41f4ad0666885856257fc2ab5f?172.1⑧3⑧219:7002@17002 slave 0cdeba26690238582ad7705abac6de71d1817c9e?0?1531497002062?9?connected

3f6c1449e60fe0d868e0bdc655165419ed7cd193?172.1⑧3⑧219:7000@17000 master -?0?1531497003000?7?connected?8192-12287

4004ad507da2e7cbae465d7f01864d53972f595c?172.2⑧3⑦30:7002@17002 slave?3f6c1449e60fe0d868e0bdc655165419ed7cd193?0?1531497003062?7?connected

f85a9a80aca5e4c4a1437c7b58abd5895ee66855?172.2⑧3⑦29:7000@17000 master -?0?1531497004064?1?connected?0-4095

7fc5072406e47cd58822f17f5e1ce3b15328352e?172.2⑧3⑦30:7000@17000 myself,master -?0?1531497002000?4?connected?4096-8191

fb4554a4fa2bd4af1c213b90ec32d3f7fb12e87b?172.2⑧3⑦30:7001@17001 slave f85a9a80aca5e4c4a1437c7b58abd5895ee66855?0?1531497005066?5?connected

967243e807a1c0c32ad56db47007c54a2d1d6e2e?172.2⑧3⑦29:7002@17002 slave?7fc5072406e47cd58822f17f5e1ce3b15328352e?0?1531497004064?4?connected

0cdeba26690238582ad7705abac6de71d1817c9e?172.2⑧3⑦29:7001@17001 master -?0?1531497004064?2?connected?12288-16383

172.2⑧3⑦30:7000>

172.28.37.30:7000>?cluster?info

cluster_state:ok

cluster_slots_assigned:16384

cluster_slots_ok:16384

cluster_slots_pfail:0

cluster_slots_fail:0

cluster_known_nodes:9

cluster_size:4

cluster_current_epoch:9

cluster_my_epoch:4

cluster_stats_messages_ping_sent:2243335

cluster_stats_messages_pong_sent:2220197

cluster_stats_messages_meet_sent:4

cluster_stats_messages_sent:4463536

cluster_stats_messages_ping_received:2220192

cluster_stats_messages_pong_received:2243339

cluster_stats_messages_meet_received:5

cluster_stats_messages_received:4463536

172.28.37.30:7000>

[root@192-168-151-110 redis]# /root/redis-4.0.10/src/redis-trib.rb?check?192.168.151.110:7000

>>>?Performing?Cluster?Check?(using node?192.16⑧151.110:7000)

M:?7bf58adaafbfee1643785ea7b5da723d6595bbaf?192.168.151.110:7000

?slots:0-5460?(5461?slots)?master

additional?replica(s)

S:?90072487e6227544c079b2d8214ef5fd050575b5?192.168.151.110:7004

?slots: (0?slots)?slave

?replicates?f7374d1b48562c9e54523948915c99bb00a12ba7

M:?c6cf17370fc94aabc88e862fa72229ebd9b94166?192.168.151.110:7002

?slots:10923-16383?(5461?slots)?master

additional?replica(s)

S:?59d25294cbfb63f2d4d75410e66ce58899c65469?192.168.151.110:7003

?slots: (0?slots)?slave

?replicates?7bf58adaafbfee1643785ea7b5da723d6595bbaf

S:?6256051389337640691e4b44d7de2b7b8c8fa25f?192.168.151.110:7005

?slots: (0?slots)?slave

?replicates?c6cf17370fc94aabc88e862fa72229ebd9b94166

M:?f7374d1b48562c9e54523948915c99bb00a12ba7?192.168.151.110:7001

?slots:5461-10922?(5462?slots)?master

additional?replica(s)

[OK]?All?nodes?agree?about?slots?configuration.

>>>?Check?for?open?slots...

>>>?Check?slots?coverage...

[OK]?All?16384?slots?covered.

[root@192-168-151-110 redis]#

call:可以执行redis命令

add-node:将一个节点添加到集群里,第一个参数为新节点的ip:port,第二个参数为集群中任意一个已经存在的节点的ip:port

del-node:移除一个节点

reshard:重新分片

集群操作


//集群(cluster)

CLUSTER?INFO 打印集群的信息

CLUSTER?NODES 列出集群当前已知的所有节点(node),以及这些节点的Redis集群搭建相关咨询.

//节点(node)

CLUSTER?MEET 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子.

CLUSTER?FORGET 从集群中移除 node_id 指定的节点.

CLUSTER?REPLICATE 将当前节点设置为 node_id 指定的节点的从节点.

CLUSTER?SAVECONFIG 将节点的配置文件保存到硬盘里面.

//槽(slot)

CLUSTER?ADDSLOTS [slot ...] 将一个或多个槽(slot)指派(assign)给当前节点.

CLUSTER?DELSLOTS [slot ...] 移除一个或多个槽对当前节点的指派.

CLUSTER?FLUSHSLOTS 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点.

CLUSTER?SETSLOT NODE 将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派.

CLUSTER?SETSLOT MIGRATING 将本节点的槽 slot 迁移到 node_id 指定的节点中.

CLUSTER?SETSLOT IMPORTING 从 node_id 指定的节点中导入槽 slot 到本节点.

CLUSTER?SETSLOT STABLE 取消对槽 slot 的导入(import)或者迁移(migrate).

//键 (key)

CLUSTER?KEYSLOT 计算键 key 应该被放置在哪个槽上.

CLUSTER?COUNTKEYSINSLOT 返回槽 slot 目前包含的键值对数量.

CLUSTER?GETKEYSINSLOT 返回 count 个 slot 槽中的键.

向集群中添加节点或删除节点

我们新建两个服务,按照之前搭建的集群方式新增俩个节点:(一主一从 master、slave).

① 集群中添加一个主节点

步骤一:使用add-node命令:绿色为新增节点,红色为已知存在节点


[root@wlan124 local]# /usr/local/redis/src/redis-trib.rb?add-node?192.168.151.110:7007?

192.168.151.110:7001

注意:当添加节点成功以后,新增的节点不会有任何数据,因为他没有分配任何slot.需要为新节点手动分配slot.

步骤二:reshard命令,分配slot:


[root@wlan124?local]# /usr/local/redis-③0.0/src/redis-trib.rb reshard ?

192.16⑧151.110:7007

提示一


How many slots?do?you want?to?move?(from?1?to?16384)?2000

提示二


What?is?the receiving node ID?382634a4025778c040b7213453fd42a709f79e28

Please enter?all?the?source?node IDs.

?Type?'all'?to?use?all?the nodes?as?source?nodes?for?the hash slots.

?Type?'done'?once you entered?all?the?source?nodes IDs.

Source node #1:all

提示三


Do?you want?to?proceed?with?the proposed reshard plan (yes/no)? yes

提示三:输入yes确认开始执行分片任务


[root@wlan124 local]# /usr/local/redis/src/redis-trib.rb?add-node?192.168.151.110:7008?

192.168.151.110:7001

[root@wlan124 ~]# /usr/local/redis/bin/redis-cli -c -h 192.16⑧151.110 -p 7008

192.16⑧1.124:7008>?cluster replicate?4d4cb840519eef342a5730168b6c7e14dd811542

7007的id)

OK

如果主节点有从节点,将从节点转移到其他主节点.如果主节点有slot,先将主节点里的slot分配到其他可用节点中,然后再删除节点才行,否则会有数据的丢失.


[root@wlan124 ~]# /usr/local/redis/src/redis-trib.rb reshard?192.16⑧151.110:7007

How many slots?do?you want?to?move?(from?1?to?16384)?1999

(注释:这里不会是正好200个槽)

What?is?the receiving node ID?614d0def75663f2620b6402a017014b57c912dad

(注释:这里是需要把数据移动到哪?7001的主节点id)

Please enter?all?the?source?node IDs.

?Type?'all'?to?use?all?the nodes?as?source?nodes?for?the hash slots.

?Type?'done'?once you entered?all?the?source?nodes IDs.

Source node #1:4d4cb840519eef342a5730168b6c7e14dd811542

(注释:这里是需要数据源,也就是我们的7007节点id)

Source node #2:done

(注释:这里直接输入done 开始生成迁移计划)

Do you want?to?proceed with the proposed reshard plan (yes/no)? yes

(注释:这里输入yes开始迁移)

[root@wlan124 ~]# /usr/local/redis-③0.0/src/redis-trib.rb del-node 192.16⑧151.110:7007 4d4cb840519eef342a5730168b6c7e14dd811542


[root@wlan124 ~]# /usr/local/redis-③0.0/src/redis-trib.rb del-node 192.16⑧151.110:7008 a78c8a41f6430b51a7eca1fdb50092c463a8f1ac

nodejs连接redis集群示例

目前用得最多的 Node.js Redis 库是 node redis,不过这个库基本已经不再维护了,存在很多 bug(在生产环境中碰到过),也缺失了很多功能(如 pipeling 和脚本优化).而 ioredis 不仅支持了 Cluster 和 Sentinel,还在 API 层面和 node redis 保持了兼容.


const?Redis =?require('ioredis');

let?redis_members = [{

?port:?7000,

?host:?'172.2⑧3⑦29'

}, {

?port:?7001,

?host:?'172.2⑧3⑦29'

}, {

?port:?7002,

?host:?'172.2⑧3⑦29'

}, {

?port:?7000,

?host:?'172.2⑧3⑦30'

}, {

?port:?7001,

?host:?'172.2⑧3⑦30'

}, {

?port:?7002,

?host:?'172.2⑧3⑦30'

}, {

?port:?7000,

?host:?'172.1⑧3⑧219'

}, {

?port:?7001,

?host:?'172.1⑧3⑧219'

}, {

?port:?7002,

?host:?'172.1⑧3⑧219'

}]

var?cluster =?new?Redis.Cluster(redis_members);

cluster.set('foo',?'bar');

cluster.get('foo',?function?(err, res)?{

?console.log('=====',res)?//===== bar

});

你以为结束了?其实还没有!

集群搭建过程的各种奇葩错误这里汇总,当然下面错误不是一定会遇到,但不保证一定不会不遇到.生产环境我搭的挺顺利,但是测试环境几乎所有能遇到的问题全都遇到了,最后都解决了,特此记录!

以上就是土嘎嘎小编为大家整理的Redis集群搭建相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章