安装环境
单台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集群搭建相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!