Redis如何单机版集群

一:redis的启动方式

1:在基础篇已经介绍过redis的安装了

前端启动reids后默认会出现这样情况,一旦启动了就不能干别的事,需要一直保持redis才能正常使用


up_redis_01.png
2: 所以要改成后端启动:编辑/usr/local/redis/redis.conf文件
把daemonize设置为yes
把/root/redis-3.0.0/redis.conf复制到/usr/local/redis/bin目录下
up_redis_02.png
3: 后端启动redis命令(切换到bin目录下): ./bin/redis-server ./redis.conf
zhengcx:bin apple$ ls
dump.rdb        redis-check-rdb     redis-sentinel.conf
redis-benchmark     redis-cli       redis-server
redis-check-aof     redis-sentinel      redis.conf
zhengcx:bin apple$ ./redis-server redis.conf
26968:C 11 Aug 2020 14:39:47.465 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
26968:C 11 Aug 2020 14:39:47.465 # Redis version=5.0.7, bits=64, commit=00000000, modified=0, pid=26968, just started
26968:C 11 Aug 2020 14:39:47.465 # Configuration loaded
4: 后端关闭redis命令:./bin/redis-cli shutdown
5: 打开redis客户端,做一些基本操作如下图, 需要启动redis才能做操作
./redis-cli
[root@localhost bin]# ./redis-cli 
默认连接localhost运行在6379端口的redis服务。
[root@localhost bin]# ./redis-cli -h 192.168.1.77 -p 6379
-h:连接的服务器的地址
-p:服务的端口号
关闭redis:[root@localhost bin]# ./redis-cli shutdown

二:Redis五种数据类型

Redis 字符串(String)
String:key-value(做缓存)
Redis中所有的数据都是字符串。命令不区分大小写,key是区分大小写的。Redis是单线程的。Redis中不适合保存内容大的数据
set、get
127.0.0.1:6379> set name zcx
OK
127.0.0.1:6379> get name
"zcx"
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379>
incr:加一(生成id)
Decr:减一
127.0.0.1:6379> SET page_view 20
OK
127.0.0.1:6379> INCR page_view
(integer) 21
127.0.0.1:6379>  GET page_view
"21"
127.0.0.1:6379> DECR page_view
(integer) 20
127.0.0.1:6379>  GET page_view
"20"
127.0.0.1:6379>
Redis 哈希(Hash)
Hash:key-fields-values(做缓存)
相当于一个key对于一个map,map中还有key-value
使用hash对key进行归类。
Hset:向hash中添加内容
Hget:从hash中取内容
127.0.0.1:6379> HSET myhash field1 "foo"
(integer) 1
127.0.0.1:6379> HGET myhash field1
"foo"
127.0.0.1:6379> HDEL myhash field1
(integer) 1
127.0.0.1:6379> HGET myhash field1
(nil)
127.0.0.1:6379> HDEL myhash field2
(integer) 0
127.0.0.1:6379>

我们设置了 redis 的一些描述信息(name, description, likes, visitors) 到哈希表的 runoobkey 中。

127.0.0.1:6379> HMSET runoobkey name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000
OK
127.0.0.1:6379> HGETALL runoobkey
1) "name"
2) "redis tutorial"
3) "description"
4) "redis basic commands for caching"
5) "likes"
6) "20"
7) "visitors"
8) "23000"
127.0.0.1:6379>
Redis 列表(List)
127.0.0.1:6379> LPUSH runooblist redis
(integer) 1
127.0.0.1:6379> LPUSH runooblist mongodb
(integer) 2
127.0.0.1:6379> LPUSH runooblist mysql
(integer) 3
127.0.0.1:6379> LRANGE runooblist 0 10
1) "mysql"
2) "mongodb"
3) "redis"
127.0.0.1:6379>
Redis 集合(Set)
127.0.0.1:6379> SADD runoobset redis
(integer) 1
127.0.0.1:6379> SADD runoobset mongodb
(integer) 1
127.0.0.1:6379> SADD runoobset mysql
(integer) 1
127.0.0.1:6379> SMEMBERS runoobset
1) "redis"
2) "mysql"
3) "mongodb"
127.0.0.1:6379>
Redis 有序集合(sorted set)
127.0.0.1:6379> ZADD runoobsort 1 redis
(integer) 1
127.0.0.1:6379> ZADD runoobsort 2 mongodb
(integer) 1
127.0.0.1:6379> ZADD runoobsort 3 mysql
(integer) 1
127.0.0.1:6379> ZADD runoobsort 4 mysql
(integer) 0
127.0.0.1:6379> ZRANGE runoobsort 0 10 WITHSCORES
1) "redis"
2) "1"
3) "mongodb"
4) "2"
5) "mysql"
6) "4"
127.0.0.1:6379>

在以上实例中我们通过命令 ZADD 向 redis 的有序集合中添加了三个值并关联上分数。可用图形界面工具查看redis数据redis desktop manager


up_redis_04.png

三:Redis的持久化方案

Redis的所有数据都是保存到内存中的。
Rdb:快照形式,定期把内存中当前时刻的数据保存到磁盘。Redis默认支持的持久化方案。
1. 如果15min内, 有 >=1 个值发生了改变, 则15min保存一次快照文件
2. 如果5min内, 有 >=10 个值发生了改变, 则5min会保存一次快照文件
3. 如果每分钟都有 >=10000 个值发生改变, 则每分钟都会保存到磁盘中
 按照这种方式, 还是有可能会丢失数据的, 但是丢失数据的量会小很多. 这个是redis默认的持久化方案.
up_redis_05.png
aof形式:append only file。把所有对redis数据库操作的命令,增删改操作的命令。保存到文件中。数据库恢复时把所有的命令执行一遍即可
up_redis_06.png

四:Redis集群的搭建

(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.
(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value
(5)Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点
1. 进入下载的目录,因为刚才redis就是下载到该目录了
cd Desktop/
#创建一个目录
mkdir redisCluter
#进入这个目录
cd redisCluter/
#创建6个节点目录
mkdir 6000 6001 6002 6003 6004 6005

zhengcx:redisCluter apple$ cd /Users/apple/Desktop/redisCluter
zhengcx:redisCluter apple$ mkdir 6000 6001 6002 6003 6004 6005
zhengcx:redisCluter apple$ 
2: 把刚才解压的包更改一下配置
# 端口号,每个目录都不同
port 6000
# 开启集群模式
cluster-enabled yes
#节点超时实际,单位毫秒
cluster-node-timeout 5000
#集群内部配置文件(默认为 nodes-6379.conf)
cluster-config-file nodes.conf#
#启动 AOFappendonly yes# 默认是no,改成 yes,意思是是否要后台启动。
daemonize yes
3: redis-4.0.11目录 执行命令,redis启动,然后在关闭他,我就简单粗暴了
ps -ef|grep redis

找到redis进程 ,kill -9 进程id。这步启动然后关闭,其目的是为生成一些文件


up_redis_08.png
4: 配置的最后一步是 把 端口号,(每个目录都不同)port 6000 改成相应目录的端口号。也是刚才的步骤,进入每一个redis.conf,修改端口
up_redis_09.png
5:启动6个节点的redis

分别进入每一个端口下的redis 执行启动命令,例如

cd /Users/apple/Downloads/redisCluter/6005/redis-4.0.11
redis-server redis.conf

6个节点都启动成功后,自己看一下

ps -ef|grep redis
up_redis_10.png
6:关联所有节点

刚刚我们已经把所有的节点启动了,但此时他们都是互相独立的单个集群节点。要想实现集群,必须将他们关联起来,随便进入一个节点的 redis-cli.

进入6000节点的redis目录中执行命令,进入控制台
redis-cli -p 6000

依次执行下面的命令


up_redis_11.png
7:分配 slot

redis Cluster 是由 16384 个 slot 组成的,那么我们需要将这些槽分散到这其中 3 个节点里(3 主 3 从)

进入6002的redis目录中执行命令
zhengcx:redis-4.0.11 apple$ redis-cli -p 6000 cluster addslots {0..5461}
OK
zhengcx:redis-4.0.11 apple$ redis-cli -p 6001 cluster addslots {5462..10922}
OK
zhengcx:redis-4.0.11 apple$ redis-cli -p 6002 cluster addslots {10923..16383}
OK
zhengcx:redis-4.0.11 apple$

此时节点已经分配好了。通过以下命令验证:

redis-cli -p 6000 cluster nodes
up_redis_12.png
现在6个节点都是主节点,并且给6000 、6001 、6002分配了槽slot
错误提示是说:slot插槽被占用了、这是因为 搭建集群前时,以前redis的旧数据和配置信息没有清理干净。

解决方案:用redis-cli 登录到每个节点执行 flushall 和 cluster reset 就可以了

zhengcx:redis-4.0.11 apple$ redis-cli -p 6001
127.0.0.1:6001> flushall
OK
127.0.0.1:6001> cluster reset
OK
127.0.0.1:6001>
8:主从复制
主节点已经有了 slot,那么最后一步就是将主节点和从节点进行关联,形成主从复制的关系。
命令如下:注意:需要在从节点的 cli 命令窗口关联主节点。不能反着来
redis-cli -p 6000 cluster replicate 6003的NodeID
redis-cli -p 6001 cluster replicate 6004的NodeID
redis-cli -p 6002 cluster replicate 6005的NodeID
看到我框上的那一串 16 进制字符串,其实就是后面对应进程节点的NodeId,这个是用处的,先放着。

然后分别设置6003、 6004 、6005节点的主库,执行下面命令,你们要对应自己的NodeId。

这时候在执行
redis-cli -p 6000 cluster nodes
up_redis_13.png

到这里三主三从已经设置好了

8:设置下操作redis
6000节点数据只和6003 同步 6001和6004 6002和6005,这正是我前面设置的,当时我也很懵,是不是数据没有在其他5个节点同步呢? 错,其实数据已经在其他节点同步了,只是我们执行 redis-cli -c -p 6001 这个命令进入控制台的时候set的数据 是在当初我分配相应的槽下加了数据,而你去进入其他节点get key时是取当前节点下槽内的数据,而不是整个redis 的数据,所以我们需要使用图形化工具连接到我们的redis进行查看
up_redis_14.png

五:告诉一个秘诀,有时候集群失败报错,重新来都不行,电脑重新启动,重新来过就解决了。搞了半天时间。redis集群到这里结束了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354