转载自Redis5版本集群搭建html
Redis是一个开源的,使用ANSI C 编写,高性能的Key-Value的NoSQL数据库。node
Redis能灵活处理非关系型数据的读、写问题,是对MySQL等关系型数据库的补充。redis
新浪微博就是使用Redis集群作数据库。shell
所谓缓存,就是将数据加载到内存中后直接使用,而不是每次都经过IO流从磁盘上读取。好处:读写效率高。数据库
而Redis则是将数据直接存储在内存中,只有当内存空间不足时,将部分数据持久化到磁盘上。vim
Redis官方只提供了源码,并无提供通过编译以后的安装包。所以,安装Redis,要先编译、后安装。即源码安装方式缓存
# 安装步骤 cd /usr/local/src wget http://download.redis.io/releases/redis-5.0.4.tar.gz tar -zxv -f redis-5.0.4.tar.gz cd /usr/local/src/redis-5.0.4/ make MALLOC=libc (或者直接make,不用./configure) make install (安装到指定目录:make PREFIX=/usr/local/redis install,不指定的话默认安装到/usr/local/bin目录下,也能够执行该步骤,也就是安装) # 不安装的话命令执行文件路径是:/usr/local/src/redis-5.0.4/src # 配置文件:/usr/local/src/redis-5.0.4/redis.conf # 优化配置,使用root帐号操做 # vim /etc/sysctl.conf vm.overcommit_memory = 1 net.core.somaxconn = 2048 # sysctl -p # echo never > /sys/kernel/mm/transparent_hugepage/enabled # vim /etc/rc.d/rc.local if test -f /sys/kernel/mm/transparent_hugepage/enabled; then echo never > /sys/kernel/mm/transparent_hugepage/enabled fi if test -f /sys/kernel/mm/transparent_hugepage/defrag; then echo never > /sys/kernel/mm/transparent_hugepage/defrag fi # chmod +x /etc/rc.d/rc.local # vim /etc/security/limits.conf * soft nofile 65535 * hard nofile 65535 # 启动 [sandu@bogon ~]# ./src/redis-server ./redis.conf 1270:C 02 Aug 2019 16:27:19.274 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 1270:C 02 Aug 2019 16:27:19.275 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=1270, just started 1270:C 02 Aug 2019 16:27:19.275 # Configuration loaded _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 5.0.4 (00000000/0) 64 bit .-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in standalone mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379 | `-._ `._ / _.-' | PID: 1270 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-' 1270:M 02 Aug 2019 16:27:19.277 # Server initialized 1270:M 02 Aug 2019 16:27:19.277 * Ready to accept connections # 使用自带的客户端链接,默认没有密码直接链接 [sandu@bogon ~]# ./src/redis-cli 127.0.0.1:6379> ping # 检测redis服务是否启动 PONG 127.0.0.1:6379> set a 1111 OK 127.0.0.1:6379> get a "1111" 127.0.0.1:6379> quit # 退出 # 密码链接 # redis-cli -h host -p port -a password [sandu@bogon ~]# ./src/redis-cli 127.0.0.1:6379> auth foobar2000 OK 127.0.0.1:6379> set b 222222 OK 127.0.0.1:6379> get b "222222" 127.0.0.1:6379> exit
一、关闭protected-mode模式,此时外部网络能够直接访问bash
二、开启protected-mode保护模式,需配置bind ip或者设置访问密码,或者bind ip和密码都设置服务器
进入redis根目录,执行命令,加上‘&’号使redis之后台程序方式运行网络
./src/redis-server &
./src/redis-server /etc/redis/6379.conf
进入redis根目录,输入命令,若是更改了端口,使用redis-cli
客户端链接时,也须要指定端口,例如:
redis-cli -p 6380 # redis-cli -h host -p port -a password
启动脚本 redis_init_script 位于位于Redis的 /utils/ 目录下,redis_init_script脚本代码以下:
#!/bin/sh # # Simple Redis init.d script conceived to work on Linux systems # as it does use of the /proc filesystem. # chkconfig: 2345 90 10 ### BEGIN INIT INFO # Provides: redis_6379 # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Redis data structure server # Description: Redis data structure server. See https://redis.io ### END INIT INFO #redis服务器监听的端口 REDISPORT=6379 #服务端所处位置 EXEC=/usr/local/bin/redis-server #客户端位置 CLIEXEC=/usr/local/bin/redis-cli #redis的PID文件位置,根据实际状况修改 PIDFILE=/var/run/redis_${REDISPORT}.pid #redis的配置文件位置,需将${REDISPORT}修改成文件名 CONF="/etc/redis/${REDISPORT}.conf" case "$1" in start) if [ -f $PIDFILE ] then echo "$PIDFILE exists, process is already running or crashed" else echo "Starting Redis server..." $EXEC $CONF fi ;; stop) if [ ! -f $PIDFILE ] then echo "$PIDFILE does not exist, process is not running" else PID=$(cat $PIDFILE) echo "Stopping ..." $CLIEXEC -p $REDISPORT shutdown while [ -x /proc/${PID} ] do echo "Waiting for Redis to shutdown ..." sleep 1 done echo "Redis stopped" fi ;; *) echo "Please use start or stop as first argument" ;; esac
将启动脚本复制到/etc/init.d目录下,本例将启动脚本命名为redisd(一般都以d结尾表示是后台自启动服务)
cd cp redis_init_script /etc/init.d/redisd chkconfig redisd on service redisd start|stop
# 断电,非正常关闭,容易致使数据丢失 ps -ef | grep redis kill -9 PID
# 正常关闭,数据保存 redis-cli shutdown # 关闭redis服务,经过客户端进行shutdown # 若是redis设置了密码,则须要先用客户端登陆,而后再进行shutdown redis-cli -a password 127.0.0.1:6379> shutdown # 从新启动redis服务,使用客户端链接,会发现数据还在
Redis持久化,就是将内存中的数据,永久保存到磁盘上。
Redis持久化有两种方式:RDB(Redis DB)、AOF(AppendOnlyFile)
Redis 能够同时使用 AOF 持久化和 RDB 持久化。 在这种状况下, 当 Redis 重启时, 它会优先使用 AOF 文件来还原数据集, 由于 AOF 文件保存的数据集一般比 RDB 文件所保存的数据集更完整。
在默认状况下,Redis 将数据库快照保存在名字为dump.rdb的二进制文件中,能够在redis.conf配置文件中修改持久化信息。
save 900 1 表示在900秒内,至少更新了1条数据。Redis就将数据持久化到硬盘 save 300 10 表示在300内,至少更新了10条数据,Redis就会触发将数据持久化到硬盘 save 60 10000 表示60秒内,至少更新了10000条数据,Redis就会触发将数据持久化到硬盘
按照配置文件中的条件知足就执行BGSAVE;
非阻塞,Redis服务正常接收处理客户端请求;
Redis会folk()一个新的子进程来建立RDB文件,子进程处理完后会向父进程发送一个信号,通知它处理完毕;
父进程用新的dump.rdb替代旧文件。
客户端(redis-cli)发起SAVE命令;
阻塞Redis服务,没法响应客户端请求;
建立新的dump.rdb替代旧文件。
AOF默认关闭,须要在配置文件中手动开启。
记录全部的写操做命令,在服务启动的时候使用这些命令就能够还原数据库。
Append only file,采用追加的方式保存,默认文件appendonly.aof。
AOF机制,添加了一个内存缓冲区(buffer):
appendfsync选项,这个选项的值能够是always、everysec或者no
运行速度:always的速度慢,everysec和no都很快
AOF文件过大,合并重复的操做,AOF会使用尽量少的命令来记录
(1)folk一个子进程负责重写AOF文件
(2)子进程会建立一个临时文件写入AOF信息
(3)父进程会开辟一个内存缓冲区接收新的写命令
(4)子进程重写完成后,父进程会得到一个信号,将父进程接收到的新的写操做由子进程写入到临时文件中
(5)新文件替代旧文件
重写的本质:就是将操做同一个键的命令,合并。从而减少AOF文件的体积
(1)手动:
客户端向服务器发送BGREWRITEAOF命令
(2)自动:
配置文件中的选项,自动执行BGREWRITEAOF命令
所谓的集群,就是经过添加服务器的数量,提供相同的服务,从而让服务器达到一个稳定、高效的状态。
问题:咱们已经部署好了redis,而且能启动一个redis,实现数据的读写,为何还要学习redis集群?
答:(1)单个redis存在不稳定性。当redis服务宕机了,就没有可用的服务了。
(2)单个redis的读写能力是有限的。
总结:redis集群是为了强化redis的读写能力。
说明:(1)redis集群中,每个redis称之为一个节点。
(2)redis集群中,有两种类型的节点:主节点(master)、从节点(slave)。
(3)redis集群,是基于redis主从复制实现。
因此,学习redis集群,就是从学习redis主从复制模型开始的。
主从复制模型中,有多个redis节点。
其中,有且仅有一个为主节点Master。从节点Slave能够有多个。
只要网络链接正常,Master会一直将本身的数据更新同步给Slaves,保持主从同步。
(1)主节点Master可读、可写.
(2)从节点Slave只读。(read-only)
所以,主从模型能够提升读的能力,在必定程度上缓解了写的能力。由于能写仍然只有Master节点一个,能够将读的操做所有移交到从节点上,变相提升了写能力。
(1)在/usr/local目录下,建立一个/redis/master-slave目录
mkdir -p /usr/local/redis/master-slave
(2)在master-slave目录下,建立三个子目录6380、638一、6382
mkdir 6380 6381 6382
(3)依次拷贝redis解压目录下的redis.conf配置文件,到这三个子目录中
cp /usr/local/src/redis-5.0.4/redis.conf 6380/ cp /usr/local/src/redis-5.0.4/redis.conf 6381/ cp /usr/local/src/redis-5.0.4/redis.conf 6382/
(4)进入6380目录,修改redis.conf,将port端口修改为6380便可
(5)进入6381目录,修改redis.conf,将port端口改为6381,同时指定开启主从复制
# 主节点ip 主节点端口 replicaof 127.0.0.1 6380
(6)进入6382目录,修改redis.conf,将port端口改为6382,同时指定开启主从复制
(1)打开三个shell窗口,在每个窗口中,启动一个redis节点。查看日志输出。(不要改为后台模式启动,看不到日志,不直观)
(2)另外再打开三个shell窗口,在每个窗口中,登录一个redis节点
(3)在主节点6380上,进行读写操做,操做成功
(4)在从节点6381上,读操做执行成功,而且成功从6380上同步了数据;写操做执行失败。(从节点,只能读,不能写)
# 写操做执行失败提示 (error) READONLY You can't write against a read only replica.
当主节点宕机了,整个集群就没有可写的节点了。
问:因为从节点上备份了主节点的全部数据,那在主节点宕机的状况下,若是可以将从节点变成一个主节点,是否是就能够解决这个问题了呢?
答:是的,这个就是Sentinel哨兵的做用。
Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行如下三个任务:
(1)Sentinel能够监控任意多个Master和该Master下的Slaves。(即多个主从模式)
(2)同一个哨兵下的、不一样主从模型,彼此之间相互独立。
(3)Sentinel会不断检查Master和Slaves是否正常。
监控同一个Master的Sentinel会自动链接,组成一个分布式的Sentinel网络,互相通讯并交换彼此关于被监视服务器的信息。
疑问:为何要使用sentinel网络呢?
答:当只有一个sentinel的时候,若是这个sentinel挂掉了,那么就没法实现自动故障切换了。
在sentinel网络中,只要还有一个sentinel活着,就能够实现故障切换。
(1)投票(半数原则)
当任何一个Sentinel发现被监控的Master下线时,会通知其它的Sentinel开会,投票肯定该Master是否下线(半数以上,因此sentinel一般配奇数个)。
(2)选举
当Sentinel肯定Master下线后,会在全部的Slaves中,选举一个新的节点,升级成Master节点。
其它Slaves节点,转为该节点的从节点。
(3)原Master从新上线
当原Master节点从新上线后,自动转为当前Master节点的从节点。
前提:已经存在一个正在运行的主从模式。
另外,配置三个Sentinel实例,监控同一个Master节点
(1)在/usr/local目录下,建立/redis/sentinels/目录
cd /usr/local/redis mkdir sentinels
(2)在sentinels目录下,依次建立s一、s二、s3三个子目录中
cd sentinels mkdir s1 s2 s3
(3)依次拷贝redis解压目录下的sentinel.conf文件,到这三个子目录中
cp /usr/local/src/redis-5.0.4/sentinel.conf s1/ cp /usr/local/src/redis-5.0.4/sentinel.conf s2/ cp /usr/local/src/redis-5.0.4/sentinel.conf s3/
(4)依次修改s一、s二、s3子目录中的sentinel.conf文件,修改端口,并指定要监控的主节点。(从节点不须要指定,sentinel会自动识别)
# s1 哨兵配置 port 26379 sentinel monitor mymaster 127.0.0.1 6380 2 # mymaster为主节点别名,127.0.0.1为主节点IP,6380为主节点端口,2为触发故障切换的最少哨兵数量 # s2 哨兵配置 port 26380 sentinel monitor mymaster 127.0.0.1 6380 2 # s3 哨兵配置 port 26381 sentinel monitor mymaster 127.0.0.1 6380 2
(5)再打开三个shell窗口,在每个窗口中,启动一个哨兵实例,并观察日志输出
进入redis的安装目录,/usr/local/bin/,也能够不用进,由于前面的那个目录在环境变量中。
对于用redis-server启动哨兵的方式以下:
核心日志输出:
(1)先关闭6380节点(kill掉)。发现,确实从新指定了一个主节点
(2)再次上线6380节点。发现,6380节点成为了新的主节点的从节点。
Sentinel哨兵模式,确实能实现自动故障切换。提供稳定的服务。
若是哨兵和redis节点不在同一台服务器上,注意IP绑定的问题。
(1)主从模型,全部的节点,使用ip绑定
(2)全部的哨兵,也都使用ip去绑定主机
(3)全部的哨兵,都是经过主节点的ip,去监控主从模型
在哨兵模式中,仍然只有一个Master节点。当并发写请求较大时,哨兵模式并不能缓解写压力。
咱们知道只有主节点才具备写能力,那若是在一个集群中,可以配置多个主节点,是否是就能够缓解写压力了呢?
答:是的。这个就是redis-cluster集群模式。
(1)由多个Redis服务器组成的分布式网络服务集群;
(2)集群之中有多个Master主节点,每个主节点均可读可写;
(3)节点之间会互相通讯,两两相连;
(4)Redis集群无中心节点。
在Redis-Cluster集群中,能够给每个主节点添加从节点,主节点和从节点直接遵循主从模型的特性。
当用户须要处理更多读请求的时候,添加从节点能够扩展系统的读性能。
Redis集群的主节点内置了相似Redis Sentinel的节点故障检测和自动故障转移功能,当集群中的某个主节点下线时,集群中的其余在线主节点会注意到这一点,并对已下线的主节点进行故障转移。
集群进行故障转移的方法和Redis Sentinel进行故障转移的方法基本同样,不一样的是,在集群里面,故障转移是由集群中其余在线的主节点负责进行的,因此集群没必要另外使用Redis Sentinel。
Redis-cluster分片策略,是用来解决key存储位置的。
集群将整个数据库分为16384个槽位slot,全部key-value数据都存储在这些slot中的某一个上。一个slot槽位能够存放多个数据,key的槽位计算公式为:slot_number=crc16(key)%16384,其中crc16为16位的循环冗余校验和函数。
集群中的每一个主节点均可以处理0个至16383个槽,当16384个槽都有某个节点在负责处理时,集群进入上线状态,并开始处理客户端发送的数据命令请求。
因为Redis集群无中心节点,请求会随机发给任意主节点;
主节点只会处理本身负责槽位的命令请求,其它槽位的命令请求,该主节点会返回客户端一个转向错误;
客户端根据错误中包含的地址和端口从新向正确的负责的主节点发起命令请求。
redis5.0版本以后能够直接使用redis-cli
命令建立集群,不使用redis-trib.rb
命令了。
(1)Redis集群最少须要6个节点,3主3从,能够分布在一台或者多台主机上。
真集群:6台主机,每台主机的redis服务使用的IP不一样,端口号随意,同样不同均可以
假集群,一台主机,redis服务使用的IP相同,端口号不一样
本例子是在一台主机上建立假集群,不一样的端口表示不一样的redis节点,以下:
主节点:127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003
从节点:127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
后期新加的主节点:127.0.0.1:7007
后期新家的从节点:127.0.0.1:7008
(2)在/usr/local/src/redis-5.0.4/下建立cluster目录,其下建立700一、7002…7006目录,以下:
(3)将redis解压路径下的配置文件redis.conf,依次拷贝到每一个700X目录内,并修改每一个700X目录下的redis.conf配置文件:
# cd /usr/local/src/redis-5.0.4/cluster # mkdir {7001,7002,7003,7004,7005,7006} # mkdir -p /var/log/redis/{7001,7002,7003,7004,7005,7006} # redis.conf文件示例 bind 127.0.0.1 port 7001 daemonize yes pidfile /var/run/redis_7001.pid dir "./" # node.conf文件保存路径 logfile "/var/log/redis/7001/redis.log" appendonly yes appendfsync always cluster-enabled yes cluster-config-file nodes-7001.conf # 该文件中包含集群信息 # 其余配置文件相似,把端口号修改一下就好了
批量启动脚本:
# vim s/usr/local/src/redis-5.0.4/cluster/ctart_cluster.sh #!/bin/bash cd ./7001 && /usr/local/src/redis-5.0.4/src/redis-server ./redis.conf cd ../7002 && /usr/local/src/redis-5.0.4/src/redis-server ./redis.conf cd ../7003 && /usr/local/src/redis-5.0.4/src/redis-server ./redis.conf cd ../7004 && /usr/local/src/redis-5.0.4/src/redis-server ./redis.conf cd ../7005 && /usr/local/src/redis-5.0.4/src/redis-server ./redis.conf cd ../7006 && /usr/local/src/redis-5.0.4/src/redis-server ./redis.conf cd .. # chmod +x start_cluster.sh
注意:必定要进入700X目录中启动,由于它会自动在当前目录中建立cluster-config,即nodes.conf。由于你在哪一个目录下执行这个命令,则node.conf文件就会在该目录下建立。
可是如果在配置文件中配置dir
为其余目录,则该文件会建立在dir
指定目录下
或者把redis-server程序文件依次拷贝到每一个700x目录下,而后使用不一样目录的redis-server程序文件启动
关闭脚本:
# vim /usr/local/src/redis-5.0.4/cluster/shutdown_cluster.sh #!/bin/bash pgrep redis-server | xargs -exec kill -9 # chmod +x shutdown_cluster.sh
执行启动脚本批量启动:
# ./start_cluster.sh
进入到redis源码存放目录/usr/local/src/redis-5.0.4/src下,把redis-cli文件拷贝到/usr/local/bin/目录下
cd /usr/local/src/redis-5.0.4/cluster /usr/local/src/redis-5.0.4/src/redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1 # --cluster-replicas 1 表示主从配置比,1表示的是1:1,前三个是主,后三个是从 # 若配置文件中设置的密码,则还须要加上-a passwod ...... Can I set the above configuration? (type 'yes' to accept): yes ...... [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
注意:查询集群信息须要加上-c
参数
或者直接执行命令查询,以下面所示;或者登录到其中一个集群节点,使用命令cluster nodes
进行查询
# /usr/local/src/redis-5.0.4/src/redis-cli -c -h 127.0.0.1 -p 7001 cluster nodes 7d388cc31df969d3e1715ce9644318bfd48317b1 127.0.0.1:7004@17004 slave 59b6597448b668a355d85dcc7a0623bc36263e5f 0 1564918712465 4 connected bbe8b7035bfd31c47bec7d612acc112cd2869368 127.0.0.1:7003@17003 master - 0 1564918714483 3 connected 10923-16383 456921ae96af71d8183101f798cf5ceda4b0381e 127.0.0.1:7005@17005 slave bbe8b7035bfd31c47bec7d612acc112cd2869368 0 1564918713000 5 connected 5612ffbb0407dbda50828b505a16b39ede51168b 127.0.0.1:7006@17006 slave 4dad696ede24995a57c5fd790faa95c72c187a22 0 1564918713474 6 connected 4dad696ede24995a57c5fd790faa95c72c187a22 127.0.0.1:7001@17001 myself,master - 0 1564918713000 1 connected 0-5460 59b6597448b668a355d85dcc7a0623bc36263e5f 127.0.0.1:7002@17002 master - 0 1564918712000 2 connected 5461-10922
参数说明:
其余查询方法:
# /usr/local/src/redis-5.0.4/src/redis-cli --cluster check 127.0.0.1:7001 127.0.0.1:7001 (4dad696e...) -> 0 keys | 5461 slots | 1 slaves. 127.0.0.1:7003 (bbe8b703...) -> 0 keys | 5461 slots | 1 slaves. 127.0.0.1:7002 (59b65974...) -> 0 keys | 5462 slots | 1 slaves. [OK] 0 keys in 3 masters. 0.00 keys per slot on average. >>> Performing Cluster Check (using node 127.0.0.1:7001) M: 4dad696ede24995a57c5fd790faa95c72c187a22 127.0.0.1:7001 slots:[0-5460] (5461 slots) master 1 additional replica(s) S: 7d388cc31df969d3e1715ce9644318bfd48317b1 127.0.0.1:7004 slots: (0 slots) slave replicates 59b6597448b668a355d85dcc7a0623bc36263e5f M: bbe8b7035bfd31c47bec7d612acc112cd2869368 127.0.0.1:7003 slots:[10923-16383] (5461 slots) master 1 additional replica(s) S: 456921ae96af71d8183101f798cf5ceda4b0381e 127.0.0.1:7005 slots: (0 slots) slave replicates bbe8b7035bfd31c47bec7d612acc112cd2869368 S: 5612ffbb0407dbda50828b505a16b39ede51168b 127.0.0.1:7006 slots: (0 slots) slave replicates 4dad696ede24995a57c5fd790faa95c72c187a22 M: 59b6597448b668a355d85dcc7a0623bc36263e5f 127.0.0.1:7002 slots:[5461-10922] (5462 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. # /usr/local/src/redis-5.0.4/src/redis-cli --cluster info 127.0.0.1:7001 127.0.0.1:7001 (4dad696e...) -> 0 keys | 5461 slots | 1 slaves. 127.0.0.1:7003 (bbe8b703...) -> 0 keys | 5461 slots | 1 slaves. 127.0.0.1:7002 (59b65974...) -> 0 keys | 5462 slots | 1 slaves. [OK] 0 keys in 3 masters. 0.00 keys per slot on average.
由于集群已经建立过了,如果关机等缘由关闭了redis服务,则只须要执行批量启动脚本便可,就会自动开启集群,由于有node.conf文件的存在
# /usr/local/src/redis-5.0.4/src/redis-cli --cluster help Cluster Manager Commands: create host1:port1 ... hostN:portN --cluster-replicas <arg> check host:port --cluster-search-multiple-owners info host:port fix host:port --cluster-search-multiple-owners reshard host:port --cluster-from <arg> --cluster-to <arg> --cluster-slots <arg> --cluster-yes --cluster-timeout <arg> --cluster-pipeline <arg> --cluster-replace rebalance host:port --cluster-weight <node1=w1...nodeN=wN> --cluster-use-empty-masters --cluster-timeout <arg> --cluster-simulate --cluster-pipeline <arg> --cluster-threshold <arg> --cluster-replace add-node new_host:new_port existing_host:existing_port --cluster-slave --cluster-master-id <arg> del-node host:port node_id call host:port command arg arg .. arg set-timeout host:port milliseconds import host:port --cluster-from <arg> --cluster-copy --cluster-replace help For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.
redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-master-id node_id
添加完新节点后,须要对新添加的主节点进行hash槽从新分配,这样该主节点才能存储数据,redis共有16384个槽。
redis-cli --cluster reshard host:port --cluster-from node_id --cluster-to node_id --cluster-slots <args> --cluster-yes
redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-slave --cluster-master-id node_id
redis-cli --cluster del-node host:port node_id
# 建立集群 redis-cli --cluster create host1:port1 ... hostN:portN --cluster-replicas <arg> # 例子 redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1 # 例子说明 host1:port1 ... hostN:portN表示的是要添加的集群的节点IP和端口, --cluster-replicas <arg>表示的是主从节点比例,参数1表示前三个是主节点,后三个是从节点 也就是说7001,7002,7003端口对应的节点是主节点,7004,7005,7006对应的节点是从节点 # 查询集群节点信息 redis-cli -c -p 7001 cluster nodes 7d388cc31df969d3e1715ce9644318bfd48317b1 127.0.0.1:7004@17004 slave 59b6597448b668a355d85dcc7a0623bc36263e5f 0 1564923261350 4 connected bbe8b7035bfd31c47bec7d612acc112cd2869368 127.0.0.1:7003@17003 master - 0 1564923263366 3 connected 10923-16383 456921ae96af71d8183101f798cf5ceda4b0381e 127.0.0.1:7005@17005 slave bbe8b7035bfd31c47bec7d612acc112cd2869368 0 1564923262000 5 connected 5612ffbb0407dbda50828b505a16b39ede51168b 127.0.0.1:7006@17006 slave 4dad696ede24995a57c5fd790faa95c72c187a22 0 1564923260000 6 connected 4dad696ede24995a57c5fd790faa95c72c187a22 127.0.0.1:7001@17001 myself,master - 0 1564923263000 1 connected 0-5460 59b6597448b668a355d85dcc7a0623bc36263e5f 127.0.0.1:7002@17002 master - 0 1564923262358 2 connected 5461-10922 # 说明:如下的操做均是以上面这个为参数示例 # 给集群添加一个新主节点 redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-master-id node_id # 例子 redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7003 --cluster-master-id bbe8b7035bfd31c47bec7d612acc112cd2869368 # 例子说明 new_host:new_port为要新添加的主节点IP和端口,此处是127.0.0.1:7007 existing_host:existing_port表示的是已存在的最后一个主节点的IP和端口,这个能够从上述的节点信息中查看到,根据slots槽数,7003端口对应的节点槽数是10923-16383,16383表示的是最后的槽数 --cluster-master-id表示的是最后一个主节点的节点id,表示的是新添加的主节点要在这个节点后面 # 再次查看集群信息 redis-cli -c -p 7001 cluster nodes 7d388cc31df969d3e1715ce9644318bfd48317b1 127.0.0.1:7004@17004 slave 59b6597448b668a355d85dcc7a0623bc36263e5f 0 1564923261350 4 connected bbe8b7035bfd31c47bec7d612acc112cd2869368 127.0.0.1:7003@17003 master - 0 1564923263366 3 connected 10923-16383 7020c8df9423686727783c60bd2f0e367634ba84 127.0.0.1:7007@17007 master - 0 1564923260344 0 connected 456921ae96af71d8183101f798cf5ceda4b0381e 127.0.0.1:7005@17005 slave bbe8b7035bfd31c47bec7d612acc112cd2869368 0 1564923262000 5 connected 5612ffbb0407dbda50828b505a16b39ede51168b 127.0.0.1:7006@17006 slave 4dad696ede24995a57c5fd790faa95c72c187a22 0 1564923260000 6 connected 4dad696ede24995a57c5fd790faa95c72c187a22 127.0.0.1:7001@17001 myself,master - 0 1564923263000 1 connected 0-5460 59b6597448b668a355d85dcc7a0623bc36263e5f 127.0.0.1:7002@17002 master - 0 1564923262358 2 connected 5461-10922 # 会发现7007端口对应的节点已经加入到集群中,是主节点,可是没有从节点,也没有分配槽数 # 给新添加的主节点分配slots槽数 redis-cli --cluster reshard host:port --cluster-from node_id --cluster-to node_id --cluster-slots 500 --cluster-yes # 例子 redis-cli --cluster reshard 127.0.0.1:7007 --cluster-from 4dad696ede24995a57c5fd790faa95c72c187a22 --cluster-to 7020c8df9423686727783c60bd2f0e367634ba84 --cluster-slots 500 # 例子说明 host:port表示的是新添加的那个主节点IP和端口,此处表示的是127.0.0.1:7007 --cluster-from node_id表示的是集群第一个主节点的节点id,这个能够现有集群的slots槽数分配看出,此处表示的是7001端口对应的节点 --cluster-to node_id表示的是集群最后一个主节点的节点id,也就是新添加的那个主节点id,此处表示的是7007端口对应的节点 --cluster-slots 500表示的是给新主节点分配多少,此处500表示是分配从0-499个slots槽数,若不加上这个会让手动输入 --cluster-yes表示的是自动应答为yes,若不加上这个会让手动输入yes,表示赞成这次分配 # 再次查看集群信息 /redis-cli -c -p 7001 cluster nodes 7d388cc31df969d3e1715ce9644318bfd48317b1 127.0.0.1:7004@17004 slave 59b6597448b668a355d85dcc7a0623bc36263e5f 0 1564924042000 4 connected bbe8b7035bfd31c47bec7d612acc112cd2869368 127.0.0.1:7003@17003 master - 0 1564924042157 3 connected 10923-16383 7020c8df9423686727783c60bd2f0e367634ba84 127.0.0.1:7007@17007 master - 0 1564924040140 7 connected 0-499 456921ae96af71d8183101f798cf5ceda4b0381e 127.0.0.1:7005@17005 slave bbe8b7035bfd31c47bec7d612acc112cd2869368 0 1564924040000 5 connected 5612ffbb0407dbda50828b505a16b39ede51168b 127.0.0.1:7006@17006 slave 4dad696ede24995a57c5fd790faa95c72c187a22 0 1564924041149 6 connected 4dad696ede24995a57c5fd790faa95c72c187a22 127.0.0.1:7001@17001 myself,master - 0 1564924040000 1 connected 500-5460 59b6597448b668a355d85dcc7a0623bc36263e5f 127.0.0.1:7002@17002 master - 0 1564924043166 2 connected 5461-10922 # 会发现7007端口对应的主节点已经有slots槽数了,而且是从0开始的 # 给集群中某个主节点再添加一个从节点 redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-slave --cluster-master-id node_id # 例子 redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7008 --cluster-slave --cluster-master-id 7020c8df9423686727783c60bd2f0e367634ba84 # 例子说明 new_host:new_port表示的是要添加的那个从节点的IP和端口,此处表示的是127.0.0.1:7008 existing_host:existing_port表示的是要给哪一个主节点添加从节点,此处表示的是127.0.0.1:7007 --cluster-slave表示的是要添加从节点,不然则是添加主节点了 --cluster-master-id node_id表示要给哪一个主节点添加从节点的该主节点节点id # 再次查看集群信息 redis-cli -c -p 7001 cluster nodes 7020c8df9423686727783c60bd2f0e367634ba84 127.0.0.1:7007@17007 master - 0 1564924845000 7 connected 0-499 4dad696ede24995a57c5fd790faa95c72c187a22 127.0.0.1:7001@17001 myself,master - 0 1564924843000 1 connected 500-5460 5612ffbb0407dbda50828b505a16b39ede51168b 127.0.0.1:7006@17006 slave 4dad696ede24995a57c5fd790faa95c72c187a22 0 1564924845214 6 connected 7d388cc31df969d3e1715ce9644318bfd48317b1 127.0.0.1:7004@17004 slave 59b6597448b668a355d85dcc7a0623bc36263e5f 0 1564924843195 4 connected bbe8b7035bfd31c47bec7d612acc112cd2869368 127.0.0.1:7003@17003 master - 0 1564924844205 3 connected 10923-16383 456921ae96af71d8183101f798cf5ceda4b0381e 127.0.0.1:7005@17005 slave bbe8b7035bfd31c47bec7d612acc112cd2869368 0 1564924845000 5 connected 415db07121ba946b202bca98e15cbdffc60bc18a 127.0.0.1:7008@17008 slave 7020c8df9423686727783c60bd2f0e367634ba84 0 1564924846224 7 connected c3e04f0e8710c25d59703374a224ee8bec776e43 :0@0 master,fail,noaddr - 1564924804548 1564924802833 0 disconnected 59b6597448b668a355d85dcc7a0623bc36263e5f 127.0.0.1:7002@17002 master - 0 1564924844000 2 connected 5461-10922 # 会发现7008端口对应的节点已是7007端口对应的从节点 # 从集群中删除一个从节点 redis-cli --cluster del-node host:port node_id # 例子 redis-cli --cluster del-node 127.0.0.1:7008 415db07121ba946b202bca98e15cbdffc60bc18a # 例子说明 host:port表示的是要删除的那个节点的IP和端口,此处是127.0.0.1:7008 node_id表示的是删除的那个节点的节点id # 其余命令有待补充
如果容许Redis集群被外网用户访问,除了须要修改配置文件外,还须要修改防火墙,开放集群中reids节点的端口。
说明:若是要开放一个范围的端口,可使用冒号来分割,即: 7001:7004,表示开放7001-7004之间全部的端口
如果登陆的是集群中的节点,须要加上-c
参数;不然不用加该参数
# 登陆集群节点的命令 redis-cli -c -h ip -p port -a password # 登陆通常节点或者从节点的命令 redis-cli -h ip -p port -a password
redis-cli -c -p 7001 cluster nodes 7020c8df9423686727783c60bd2f0e367634ba84 127.0.0.1:7007@17007 master - 0 1564925352648 7 connected 0-499 4dad696ede24995a57c5fd790faa95c72c187a22 127.0.0.1:7001@17001 myself,master - 0 1564925349000 1 connected 500-5460 5612ffbb0407dbda50828b505a16b39ede51168b 127.0.0.1:7006@17006 slave 4dad696ede24995a57c5fd790faa95c72c187a22 0 1564925351000 6 connected 7d388cc31df969d3e1715ce9644318bfd48317b1 127.0.0.1:7004@17004 slave 59b6597448b668a355d85dcc7a0623bc36263e5f 0 1564925354665 4 connected bbe8b7035bfd31c47bec7d612acc112cd2869368 127.0.0.1:7003@17003 master - 0 1564925353657 3 connected 10923-16383 456921ae96af71d8183101f798cf5ceda4b0381e 127.0.0.1:7005@17005 slave bbe8b7035bfd31c47bec7d612acc112cd2869368 0 1564925349000 5 connected c3e04f0e8710c25d59703374a224ee8bec776e43 :0@0 master,fail,noaddr - 1564924804548 1564924802833 0 disconnected 59b6597448b668a355d85dcc7a0623bc36263e5f 127.0.0.1:7002@17002 master - 0 1564925352000 2 connected 5461-10922 # 如上集群中有一个无效的节点信息,要如何删除,这个还不知道咋操做。