第九章Redis集群
1.关系数据库与非关系型数据库
1.1关系型数据库
1)一个结构化的数据库,创建在关系模型基础上,一般面向于记录
2)包括Oracle、MySQL、SQL Server、Microsoft Access、DB2等
1.2 非关系型数据库
1)除了主流的关系型数据库以外的数据库,都认为是非关系型的
NoSQL,泛指非关系型的数据库,NoSQL即Not-Only SQL,它可以作为关系型数据库的良好补充。随着互联网web2.0网站的兴起,非关系型的数据库现在成了一个极其热门的新领域,非关系数据库产品的发展非常迅速。而传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,例如:
2)包括Redis、MongBD、Hbase、CouhDB等
2.非关系型数据库产生背景
2.1 High performance——对数据库高并发读写需求
web2.0网站要根据用户个性化信息来实时生成动态页面和提供动态信息,所以基本上无法使用动态页面静态化技术,因此数据库并发负载非常高,往往要达到每秒上万次读写请求。关系数据库应付上万次SQL查询还勉强顶得住,但是应付上万次SQL写数据请求,硬盘IO就已经无法承受了。其实对于普通的BBS网站,往往也存在对高并发写请求的需求,例如网站的实时统计在线用户状态,记录热门帖子的点击次数,投票计数等,因此这是一个相当普遍的需求。
2.2 Huge Storage——对海量数据高效存储与访问需求
类似Facebook,twitter,Friendfeed这样的SNS网站,每天用户产生海量的用户动态,以Friendfeed为例,一个月就达到了2.5亿条用户动态,对于关系数据库来说,在一张2.5亿条记录的表里面进行SQL查询,效率是极其低下乃至不可忍受的。再例如大型web网站的用户登录系统,例如腾讯,盛大,动辄数以亿计的帐号,关系数据库也很难应付。
2.3 High Scalability && High Availability——对数据库高可扩展性与高可用性需求
在基于web的架构当中,数据库是最难进行横向扩展的,当一个应用系统的用户量和访问量与日俱增的时候,你的数据库却没有办法像web server和app server那样简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。对于很多需要提供24小时不间断服务的网站来说,对数据库系统进行升级和扩展是非常痛苦的事情,往往需要停机维护和数据迁移,为什么数据库不能通过不断的添加服务器节点来实现扩展呢?
NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
3.Redis简介
3.1 Redis基于内存运行并支持持久化,采用key-value(键值对)的存储形式
3.2 优点
1)具有极高的数据读写速度
redis是将数据存放到内存中,由于内容存取速度快所以redis被广泛应用在互联网项目中,redis有点:存取速度快,官方称读取速度会达到30万次每秒,写速度在10万次每秒最有,具体限制于硬件。
2)支持丰富的数据类型
edis是用C语言开发的一个开源的高性能键值对(key-value)数据库。它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如下:
字符串类型 散列类型 列表类型 集合类型
3)支持数据的持久化
即可以将内存中的数据异步写入到硬盘中,同时不影响继续提供服务。
缺点:对持久化支持不够良好。
所以redis一般不作为数据的主数据库存储,一般配合传统的关系型数据库使用
.
4)原子性—redis的所有操作都是原子性的
5)支持数据备份—master-slave模式的数据备份
6)功能丰富
Redis可以为每个键设置生存时间,时间到期后该键被自动删除,这一功能配合出色的性能让Redis可以作为缓存系统来用。作为缓存系统,Redis还可以限定数据占用的最大内存空间,在数据达到空间限制后可以按照一定的规则自动淘汰不需要的键。
Redis的列表类型键可以用来实现队列,并且支持阻塞式读取,可以很容易的实现一个高性能的优先级队列。Redis还支持“发布/订阅”的消息模式。
3.3 redis的应用场景
缓存(数据查询、短连接、新闻内容、商品内容等等)。(最多使用) 分布式集群架构中的session分离。 聊天室的在线好友列表。 任务队列。(秒杀、抢购、12306等等) 应用排行榜。 网站访问统计。 数据过期处理(可以精确到毫秒)
实例:Redis安装部署
实验环境:
1.linux-1 redis服务器
192.168.10.1
实验步骤:
- redis的编译安装
[root@localhost ~]# tar xf redis-3.2.9.tar.gz -C /usr/src
[root@localhost ~]# cd /usr/src/redis-3.2.9/
[root@localhost redis-3.2.9]# ls
00-RELEASENOTES INSTALL runtest tests
BUGS Makefile runtest-cluster utils
CONTRIBUTING MANIFESTO runtest-sentinel
COPYING README.md sentinel.conf
deps redis.conf src
源码包提供了makefile文件,直接编译安装即可
[root@localhost redis-3.2.9]# make
[root@localhost redis-3.2.9]# make install
安装时需要更改默认路径时,使用此命令; make prefix=安装路径 install
上述只是安装了二进制文件,没有启动脚本和配置文件。可运行相关脚本进行创建
[root@localhost redis-3.2.9]# cd /usr/src/redis-3.2.9/utils/
[root@localhost utils]# ls
build-static-symbols.tcl lru
cluster_fail_time.tcl redis-copy.rb
corrupt_rdb.c redis_init_script
create-cluster redis_init_script.tpl
generate-command-help.rb redis-sha1.rb
hashtable releasetools
hyperloglog speed-regression.tcl
install_server.sh whatisdoing.sh
[root@localhost utils]# ./install_server.sh
Welcome to the redis service installer
This script will help you easily set up a running redis server
Please select the redis port for this instance: [6379] ##默认侦听端口
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf] ##默认配置文件
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log] ##日志文件
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379] ##数据库目录
Selected default - /var/lib/redis/6379
Please select the redis executable path [/usr/local/bin/redis-server] ##执行命令
Selected config:
Port : 6379
Config file : /etc/redis/6379.conf
Log file : /var/log/redis_6379.log
Data dir : /var/lib/redis/6379
Executable : /usr/local/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli ## 客户端命令
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf =>
[root@localhost utils]# /etc/init.d/redis_6379 start ##启动服务脚本
Installing service…
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server…
Installation successful!
查看服务运行侦听端口
[root@localhost utils]# netstat -anpt|grep redis
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 4235/redis-server 1
停止、启动、重启、查看服务状态
[root@localhost utils]# /etc/init.d/redis_6379 stop
[root@localhost utils]# /etc/init.d/redis_6379 start
[root@localhost utils]# /etc/init.d/redis_6379 restart
[root@localhost utils]# /etc/init.d/redis_6379 status
编辑redis主配置文件:绑定当前ip地址
[root@localhost ~]# vim /etc/redis/6379.conf
62行
bind 127.0.0.1 192.168.10.1
[root@localhost ~]# /etc/init.d/redis_6379 restart
查看redis主配置文件
[root@localhost ~]# grep -v “^#” /etc/redis/6379.conf |grep -v “^$”
bind 127.0.0.1 192.168.10.1
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile /var/log/redis_6379.log
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /var/lib/redis/6379
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfilename “appendonly.aof”
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events “”
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
配置参数
bind:监听的主机地址
port:端口
daemonize yes:启用守护进程
pidfile:指定PID文件
loglevel notice:日志级别
logfile:指定日志文件
redis配置文件详解
1.监听的网络接口
bind 127.0.0.1 192.168.10.1
2.是否开启保护模式,默认开启
1.1 已指定bind和密码:只会本地进行访问,拒绝外部访问
1.2 未指定bind和密码:最好关闭,设置为no
protected-mode yes
3.监听的端口号。
port 6379
4.TCP连接中已完成队列(完成三次握手之后)的长度
tcp-backlog 511
5.客户端空闲超过timeout,服务端会断开连接,为0则服务端不会主动断开连接
timeout 0
6.定时给对端端口发送ack。检测到对端关闭需要两倍的设置值。
tcp-keepalive 300
7.守护进程模式:启用
daemonize yes
8.可以通过upstart和systemd管理Redis守护进程.这个参数是和具体的操作系统相关的。
supervised no
9.redis的进程文件
pidfile /var/run/redis_6379.pid
10.指定了服务端日志的级别。级别包括:debug(很多信息,方便开发、测试),verbose(许多有用的信息,但是没有debug级别信息多),notice(适当的日志级别,适合生产环境),warn(只有非常重要的信息)
loglevel notice
11.指定了记录日志的文件
logfile /var/log/redis_6379.log
12.数据库的数量,默认使用的数据库是DB 0
databases 16
13.数据持久化配置,将内存中数据写入到数据库中
900秒(15分钟)内至少1个key值改变(则进行数据库保存–持久化)
save 900 1
300秒(5分钟)内至少10个key值改变(则进行数据库保存–持久化)
save 300 10
60秒(1分钟)内至少10000个key值改变(则进行数据库保存–持久化)
save 60 10000
14.当RDB持久化出现错误后,依然进行继续进行工作;(否则为no)
stop-writes-on-bgsave-error yes
15.使用压缩rdb文件,rdb文件压缩使用LZF压缩算法,yes:压缩,但是需要一些cpu的消耗。no:不压缩,需要更多的磁盘空间
rdbcompression yes
16.是否校验rdb文件。从rdb格式的第五个版本开始,在rdb文件的末尾会带上CRC64的校验和。这跟有利于文件的容错性,但是在保存rdb文件的时候,会有大概10%的性能损耗,所以如果你追求高性能,可以关闭该配置。
rdbchecksum yes
17.rdb文件的名称
dbfilename dump.rdb
18.数据目录,数据库的写入会在这个目录。rdb、aof文件也会写在这个目录
dir /var/lib/redis/6379
19.当从库同主机失去连接或者复制正在进行,从机库有两种运行方式:1) 如果slave-serve-stale-data设置为yes(默认设置),从库会继续响应客户端的请求。2) 如果slave-serve-stale-data设置为no,除去INFO和SLAVOF命令之外的任何请求都会返回一个错误”SYNC with master in progress”。
slave-serve-stale-data yes
20.作为从服务器,默认情况下是只读的(yes),可以修改成NO,用于写(不建议)。
slave-read-only yes
21.是否使用socket方式复制数据。目前redis复制提供两种方式,disk和socket。如果新的slave连上来或者重连的slave无法部分同步,就会执行全量同步,master会生成rdb文件。有2种方式:disk方式是master创建一个新的进程把rdb文件保存到磁盘,再把磁盘上的rdb文件传递给slave。socket是master创建一个新的进程,直接把rdb文件以socket的方式发给slave。disk方式的时候,当一个rdb保存的过程中,多个slave都能共享这个rdb文件。socket的方式就的一个个slave顺序复制。在磁盘速度缓慢,网速快的情况下推荐用socket方式。
repl-diskless-sync no
22.diskless复制的延迟时间,防止设置为0。一旦复制开始,节点不会再接收新slave的复制请求直到下一个rdb传输。所以最好等待一段时间,等更多的slave连上来。
repl-diskless-sync-delay 5
23.是否禁止复制tcp链接的tcp nodelay参数,可传递yes或者no。默认是no,即使用tcp nodelay。如果master设置了yes来禁止tcp nodelay设置,在把数据复制给slave的时候,会减少包的数量和更小的网络带宽。但是这也可能带来数据的延迟。默认我们推荐更小的延迟,但是在数据量传输很大的场景下,建议选择yes。
repl-disable-tcp-nodelay no
24.当master不可用,Sentinel会根据slave的优先级选举一个master。最低的优先级的slave,当选master。而配置成0,永远不会被选举。
slave-priority 100
25.默认redis使用的是rdb方式持久化,这种方式在许多应用中已经足够用了。但是redis如果中途宕机,会导致可能有几分钟的数据丢失,根据save来策略进行持久化,Append Only File是另一种持久化方式,可以提供更好的持久化特性。Redis会把每次写入的数据在接收后都写入 appendonly.aof 文件,每次启动时Redis都会先把这个文件的数据读入内存里,先忽略RDB文件。
appendonly no
26、aof文件名
appendfilename “appendonly.aof”
27.#aof持久化策略的配置
#no表示不执行fsync,由操作系统保证数据同步到磁盘,速度最快。
#always表示每次写入都执行fsync,以保证数据同步到磁盘。
#everysec表示每秒执行一次fsync,可能会导致丢失这1s数据。
appendfsync everysec
28.在aof重写或者写入rdb文件的时候,会执行大量IO,此时对于everysec和always的aof模式来说,执行fsync会造成阻塞过长时间,no-appendfsync-on-rewrite字段设置为默认设置为no。如果对延迟要求很高的应用,这个字段可以设置为yes,否则还是设置为no,这样对持久化特性来说这是更安全的选择。设置为yes表示rewrite期间对新写操作不fsync,暂时存在内存中,等rewrite完成后再写入,默认为no,建议yes。Linux的默认fsync策略是30秒。可能丢失30秒数据。
no-appendfsync-on-rewrite no
29.aof自动重写配置。当目前aof文件大小超过上一次重写的aof文件大小的百分之多少进行重写,即当aof文件增长到一定大小的时候Redis能够调用bgrewriteaof对日志文件进行重写。当前AOF文件大小是上次日志重写得到AOF文件大小的二倍(设置为100)时,自动启动新的日志重写过程。
auto-aof-rewrite-percentage 100
30.设置允许重写的最小aof文件大小,避免了达到约定百分比但尺寸仍然很小的情况还要重写
auto-aof-rewrite-min-size 64mb
31.aof文件可能在尾部是不完整的,当redis启动的时候,aof文件的数据被载入内存。重启可能发生在redis所在的主机操作系统宕机后,尤其在ext4文件系统没有加上data=ordered选项(redis宕机或者异常终止不会造成尾部不完整现象。)出现这种现象,可以选择让redis退出,或者导入尽可能多的数据。如果选择的是yes,当截断的aof文件被导入的时候,会自动发布一个log给客户端然后load。如果是no,用户必须手动redis-check-aof修复AOF文件才可以。
aof-load-truncated yes
32.如果达到最大时间限制(毫秒),redis会记个log,然后返回error。当一个脚本超过了最大时限。只有SCRIPT KILL和SHUTDOWN NOSAVE可以用。第一个可以杀没有调write命令的东西。要是已经调用了write,只能用第二个命令杀。
lua-time-limit 5000
33.slowlog用来记录redis运行中执行比较慢的命令耗时。当命令的执行超过了指定时间,就记录在slow log中,slowlog保存在内存中,所以没有I/O操作。执行时间比slowlog-log-slower-than大的请求记录到slowlog里面,单位是微秒,所以1000000就是1秒
slowlog-log-slower-than 10000
34.慢查询日志长度。当一个新的命令被写进日志的时候,最老的那个记录会被删掉。这个长度没有限制。只要有足够的内存就行。你可以通过 SLOWLOG RESET 来释放内存。
slowlog-max-len 128
35.延迟监控功能是用来监控redis中执行比较缓慢的一些操作,用LATENCY打印redis实例在跑命令时的耗时图表。只记录大于等于下边设置的值的操作。0的话,就是关闭监视。默认延迟监控功能是关闭的,如果你需要打开,也可以通过CONFIG SET命令动态设置。
latency-monitor-threshold 0
36.键空间通知使得客户端可以通过订阅频道或模式,来接收那些以某种方式改动了 Redis 数据集的事件。在默认配置下,该功能处于关闭状态。
notify-keyspace-events “”
37.数据量小于等于512的用ziplist,大于512的用hash
hash-max-ziplist-entries 512
38.value大小小于等于64的用ziplist,大于64用hash。
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
45.Redis将在每100毫秒时使用1毫秒的CPU时间来对redis的hash表进行重新hash,可以降低内存的使用。当你的使用场景中,有非常严格的实时性需要,不能够接受Redis时不时的对请求有2毫秒的延迟的话,把这项配置为no。如果没有这么严格的实时性要求,可以设置为yes,以便能够尽可能快的释放内存。
activerehashing yes
46.对客户端输出缓冲进行限制可以强迫那些不从服务器读取数据的客户端断开连接,用来强制关闭传输缓慢的客户端。
#对于normal client,第一个0表示取消hard limit,第二个0和第三个0表示取消soft limit,normal client默认取消限制,因为如果没有寻问,他们是不会接收数据的。
client-output-buffer-limit normal 0 0 0
47.对于slave client和MONITER client,如果client-output-buffer一旦超过256mb,又或者超过64mb持续60秒,那么服务器就会立即断开客户端连接。
client-output-buffer-limit slave 256mb 64mb 60
48.对于pubsub client,如果client-output-buffer一旦超过32mb,又或者超过8mb持续60秒,那么服务器就会立即断开客户端连接。
client-output-buffer-limit pubsub 32mb 8mb 60
49.redis执行任务的频率为1s除以hz。
hz 10
50.在aof重写的时候,如果打开了aof-rewrite-incremental-fsync开关,系统会每32MB执行一次fsync。这对于把文件写入磁盘是有帮助的,可以避免过大的延迟峰值。
aof-rewrite-incremental-fsync yes
2.Redis命令工具
[root@localhost ~]# ls /usr/local/bin/
redis-benchmark redis-check-rdb redis-sentinel
redis-check-aof redis-cli redis-server
redis-benchmark 用于检测redis在本机的运行效率
redis-check-rdb 修复RDB持久化文件
redis-sentinel redis-server的软连接
redis-check-aof 修复AOF持久化文件
redis-cli redis命令行工具
redis-server 用于启动redis的工具
1)redis-cli命令行工具
在数据库环境,获取命令帮助
help @:获取中的命令列表
help :获取某个命令的帮助
help :获取可能帮助的主题列表
连接本机的redis数据库
[root@localhost ~]# redis-cli
127.0.0.1:6379> ping ##检测redis服务是否启动
PONG
127.0.0.1:6379> exit
远程访问redis数据库
-h 远程主机
-p 服务端口
-a 用户密码
[root@localhost ~]# redis-cli -h 192.168.10.1 -p 6379
192.168.10.1:6379> info ##查看服务的统计信息
192.168.10.1:6379> help @list ##查看所有与list数据类型相关的命令
192.168.10.1:6379> help set ##查看set命令的帮助信息
2)redis-benchmark测试工具–可有效测试服务的性能
模拟 N 个客户端同时发出 M 个请求。 (类似于 Apache ab 程序)
用法 redis-benchmark [-h ][-p ] [-c ][-n ]> [-k ]
选项:
选项 说明
-h 主机名 (默认 127.0.0.1)
-p 主机端口 (默认 6379)
-s UNIX socket (会覆盖 -h -p 设置的内容)
-a 密码(密码错误之类不会直接保错,而是在操作时才会保错,这时可以使用 Redis 的 AUTH 命令再次认证)
-c 客户端的并发数量(默认是50)
-n 客户端请求总量(默认是100000)
-d 使用 SET/GET 添加的数据的字节大小 (默认 2)
-dbnum 选择一个数据库进行测试 (默认 0)
-k 客户端是否使用keepalive,1为使用,0为不使用,(默认为 1)
-r 使用 SET/GET/INCR 命令添加数据 key, SADD 添加随机数据,keyspacelen 指定的是添加 键的数量
-P 每个请求 pipeline 的数据量(默认为1,没有 pipeline )
-q 仅仅显示redis-benchmark的requests per second信息
–csv 将结果按照csv格式输出,便于后续处理
-l 循环测试
-t 可以对指定命令进行基准测试
-I 空闲模式 只打开N个空闲连接并等待。
向redis服务器发送100个并发连接与100000个请求
[root@localhost ~]# redis-benchmark -h 192.168.10.1 -p 6379 -c 100 -n 100000
====== PING_INLINE ======
100000 requests completed in 0.79 seconds
100 parallel clients
3 bytes payload
keep alive: 1
……………………
====== MSET (10 keys) ======汇总信息
10万个请求包在1.1秒完成
100000 requests completed in 1.10 seconds
100个并发连接统计
100 parallel clients
3 bytes payload
keep alive: 1
85.82% <= 1 milliseconds(毫秒)
99.49% <= 2 milliseconds
99.99% <= 3 milliseconds
100.00% <= 3 milliseconds
90744.10 requests per second 每秒处理90774个请求
测试存取大小为100B的数据包的性能
[root@localhost ~]# redis-benchmark -h 192.168.10.1 -p 6379 -q -d 100
测试本机上redis服务在进行set与lpush操作时的性能
[root@localhost ~]# redis-benchmark -t set,lpush -n 100000 -q
bull布尔值
3)Redis 数据库常用命令
set:存放数据
get:获取数据
key相关命令
keys、exists、del、type、rename、renamenx、dbsize
key-value键值对的数据存储形式
set 存放数据 set key value
get 获取数据 get key
[root@localhost ~]# redis-cli
在当前数据库存放一个key为teacher,value为ly
set teacher ly
查看刚才存放的数据
get teacher
其他数据管理命令
- key相关命令
1)keys—获取符合规则的键值列表(* ?)
*----表示任意字符
?—表示一个字符
set k1 1
set k2 2
set k3 3
set v1 4
set v5 5
查看当前数据库中所有键
keys *
set v22 5
查看以v开头的数据
keys v*
查看以v开头后面包含任意一位字符的数据
keys v?
查看以v开头后面包含任意二位字符的数据
keys v??
2)exists—判断键值是否存在
判断teacher键值是否存在
integer–返回值为1表示存在;为0表示不存在
exists teacher
exists tea
3)del—删除当前数据库的指定key
keys *
del v5
get v5
4)type —获取key对应的value值类型
type k1
string—字符串类型
5)rename 重命名
rename 源key 目标key
##直接覆盖目标key(无论是否存在);实际环境中,为了防止覆盖重要数据。先exists查看目标是否存在,然后决定是否执行rename
keys v*
rename v22 v2
keys v*
get v1
get v2
rename v1 v2
get v1
get v2
6)renamenx-----对已有key重命名,并检测新名是否存在。如果目标key已存在则不重命名
renamenx 源key 目标key
keys *
get teacher
get v2
renamenx v2 teacher
keys *
get teacher
get v2
7)dbsize —查看当前数据库中key的数量
dbsize
2.多数据库常用命令
redis默认16个数据库(0-15)
*默认连接的数据库为序号0
*select 数据库序号 ---- 数据库切换命令
多数据库间切换
1)select – 切换至序号为10的数据库
select 10
select 15
select 0
2)多数据库间移动数据
127.0.0.1:6379[15]> select 0
OK
127.0.0.1:6379> set k1 100
OK
127.0.0.1:6379> get k1
“100”
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> get k1
(nil)
多数据库间移动数据 move命令
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> get k1
“100”
移动键值k1到数据库1
127.0.0.1:6379> move k1 1
(integer) 1
127.0.0.1:6379> get k1
(nil)
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> get k1
“100”
清除数据库内数据
清空当前数据库的数据 flushdb
127.0.0.1:6379[1]> keys *
- “k1”
127.0.0.1:6379[1]> flushdb
OK
127.0.0.1:6379[1]> keys *
(empty list or set)
清空所有数据库的数据flushall,要慎重使用
127.0.0.1:6379> keys *
- “counter:rand_int”
- “key:rand_int”
- “mylist”
- “v2”
- “teacher”
- “k2”
- “k3”
- “k4”
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> keys *
(empty list or set)
Redis集群原理
Redis集群架构
Redis Cluster采用虚拟槽分区,将所有的数据根据算法映射到0~16383整数槽内
Redis Cluster是一个无中心的结构
每个节点都保存数据和整个集群的状态
集群角色
Master:Master之间分配slots
Slave:Slave向它指定的Master同步数据
集群节点使用的TCP端口
6379端口用于客户端的连接
16379端口用于群集总线
+
实例:
在单台PC服务器上部署Redis集群,通过不同的TCP端口启动多实例,模拟多台独立PC组成集群。
思路:在根目录下新建/redis_cluster目录,用于存放多实例配置文件,这里使用6个TCP端口,编写6001-6006共计6个配置文件,使用这6个配置文件启动实例,并搭建Redis集群。
!!!至少6个实例才能组成集群。3主3从会自动分配
[root@localhost ~]# /etc/init.d/redis_6379 stop
创建集群目录
[root@localhost ~]# mkdir -p /redis_cluster/{6001…6006}
[root@localhost ~]# ll /redis_cluster/
编辑配置文件(标注6001-6006的行分别进行修改)
[root@localhost ~]# vim redis.conf
##实例IP地址,默认为127.0.0.1,根据实际情况修改,集群节点间需要保证IP地址能相互通讯,网络层面需要放开相应端口的访问权限
bind 192.168.10.1
protected-mode yes
##6001-6006
##端口号,用于模拟不同主机不同实例
port 6001
tcp-backlog 511
timeout 0
tcp-keepalive 300
##允许Redis后台运行
daemonize yes
supervised no
##6001-6006##pidfile 文件,每个实例一个
pidfile /redis_cluster/redis_6001.pid
loglevel notice
##6001-6006
logfile /redis_cluster/6001/redis_6001.log
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
##6001-6006##每个实例一个目录
dir /redis_cluster/6001
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfilename “appendonly.aof”
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
##开启集群cluster
cluster-enabled yes
##6001-6006##集群配置文件,每个实例1个
cluster-config-file nodes-6001.conf
##请求超时时长,默认15秒,可依据网络情况自行修改配置
cluster-node-timeout 15000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events “”
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
复制配置文件到每个实例
[root@localhost ~]# cp redis.conf /redis_cluster/6001
[root@localhost ~]# cp redis.conf /redis_cluster/6002
[root@localhost ~]# cp redis.conf /redis_cluster/6003
[root@localhost ~]# cp redis.conf /redis_cluster/6004
[root@localhost ~]# cp redis.conf /redis_cluster/6005
[root@localhost ~]# cp redis.conf /redis_cluster/6006
树状查看命令
[root@localhost ~]# yum -y install tree
根据配置文件要求编辑每个实例的配置文件
[root@localhost ~]# tree /redis_cluster/
shell命令三剑客 grep awk sed
[root@localhost ~]# sed -i ‘s/6001/6002/g’ /redis_cluster/6002/redis.conf
[root@localhost ~]# sed -i ‘s/6001/6003/g’ /redis_cluster/6003/redis.conf
[root@localhost ~]# sed -i ‘s/6001/6004/g’ /redis_cluster/6004/redis.conf
[root@localhost ~]# sed -i ‘s/6001/6005/g’ /redis_cluster/6005/redis.conf
[root@localhost ~]# sed -i ‘s/6001/6006/g’ /redis_cluster/6006/redis.conf
启动6个实例
[root@localhost ~]# redis-server /redis_cluster/6001/redis.conf
[root@localhost ~]# netstat -anput |grep redis
[root@localhost ~]# redis-server /redis_cluster/6002/redis.conf
[root@localhost ~]# redis-server /redis_cluster/6003/redis.conf
[root@localhost ~]# redis-server /redis_cluster/6004/redis.conf
[root@localhost ~]# redis-server /redis_cluster/6005/redis.conf
[root@localhost ~]# redis-server /redis_cluster/6006/redis.conf
查看redis的进程和端口
[root@localhost ~]# ps -ef |grep redis|grep cluster
[root@localhost ~]# netstat -anput |grep redis
[root@localhost src]# yum -y install tree
[root@localhost src]# tree /redis_cluster/
配置Ruby环境-redis-trib.rb脚本
Redis3.0以后开始支持集群功能,官方推出了一个管理redis集群的工具–一个ruby脚本:redis-trib.rb
该脚本集成在redis的源码SRC目录下,所以,需要系统安装配置ruby环境,才能使用该脚本进行Redis集群的创建、配置和管理。
安装ruby工具
[root@localhost ~]# yum -y install ruby rubygems
需要上传软件redis-3.2.0.gem
[root@localhost ~]# ll
-rw-r–r-- 1 root root 71168 12月 19 16:47 redis-3.2.0.gem
[root@localhost ~]# gem install redis --version 3.2.0
[root@localhost ~]# cd /usr/src/redis-3.2.9/src/
使用脚本安装redis群集
[root@localhost ~]# ./redis-trib.rb create --replicas 1 192.168.10.1:6001 192.168.10.1:6002 192.168.10.1:6003 192.168.10.1:6004 192.168.10.1:6005 192.168.10.1:6006
[root@localhost src]# tree /redis_cluster/
查看集群状态
[root@localhost ~]# ./redis-trib.rb check 192.168.10.1:6001
登录redis群集,设置键值测试
-h 主机
-p 端口
-c 激活群集模式
[root@localhost ~]# redis-cli -h 192.168.10.1 -p 6001 -c
192.168.10.1:6001> set teacher ly
-> Redirected to slot [12541] located at 192.168.10.1:6003
OK
192.168.10.1:6003> get teacher
“ly”
192.168.10.1:6003> quit
结论:登录集群的任意一个实例,当创建键值时,重定向到其他的服务器上,是按照slot分配的
trib.rb脚本使用帮助