REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。
Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
redis集群:
是一个提供多个Redis(分布式)节点间共享数据的程序集。
详细过程可以参看:redis数据库哨兵模式实现主从故障切换
7001:
[root@server1 rediscluster]# cd 7001/
[root@server1 7001]# vim redis.conf
port 7001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
pidfile "/usr/local/rediscluster/7001/redis.pid"
logfile "/usr/local/rediscluster/7001/redis.log"
daemonize yes
dir "/usr/local/rediscluster/7001"
将7001的配置文件cp到其他目录,把7001更改为相应的数值:
7002示例:
[root@server1 7001]# cp redis.conf ../7002/
[root@server1 7001]# vim ../7002/redis.conf
port 7002
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
pidfile "/usr/local/rediscluster/7002/redis.pid"
logfile "/usr/local/rediscluster/7002/redis.log"
daemonize yes
dir "/usr/local/rediscluster/7002"
[root@server1 7001]# redis-server redis.conf
[root@server1 7001]# cd ../7002/
[root@server1 7002]# redis-server redis.conf
[root@server1 7002]# cd ../7003/
[root@server1 7003]# redis-server redis.conf
[root@server1 7003]# cd ../7004/
[root@server1 7004]# redis-server redis.conf
[root@server1 7004]# cd ../7005/
[root@server1 7005]# redis-server redis.conf
[root@server1 7005]# cd ../7006/
[root@server1 7006]# redis-server redis.conf
[root@server1 7006]# redis-cli --cluster create --cluster-replicas 1 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
[root@server1 7006]# redis-cli --cluster info 127.0.0.1:7001
127.0.0.1:7001 (37640721...) -> 0 keys | 5461 slots | 1 slaves.
127.0.0.1:7002 (b49a2382...) -> 0 keys | 5462 slots | 1 slaves.
127.0.0.1:7003 (d52d9c66...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
可以看到现在7001、7002、7003为master,各有一个slave。每对master-slave各有5461个哈希槽。
附:哈希槽概念
Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。
(1)进入1个master,写入信息
[root@server1 7006]# redis-cli -c -p 7001
127.0.0.1:7001> set name laozhao
-> Redirected to slot [5798] located at 127.0.0.1:7002 #在7001上写,实际数据存储到7002里
OK
127.0.0.1:7002> get name
"laozhao"
127.0.0.1:7002> #取数据也是到7002上取
[root@server1 7006]# redis-cli -c -p 7004
127.0.0.1:7004> get name
-> Redirected to slot [5798] located at 127.0.0.1:7002 #取数据也是到7002上取
"laozhao"
127.0.0.1:7002>
(3)将7002关闭
(4)进入slave节点查看信息:
此时数据来自7005,数据从7002迁移到了7005
(5)查看集群的主从信息
可以看到7005成为了master,没有slave节点,因为7002关闭了。
注意:如果此时将7005再关闭,会破坏数据库结构,因为此时的7005下没有slave。
我们模拟这个错误:
[root@server1 7006]# redis-cli -c -p 7004
127.0.0.1:7004> get name
-> Redirected to slot [5798] located at 127.0.0.1:7005
"laozhao"
127.0.0.1:7005> SHUTDOWN
[root@server1 7006]# redis-cli -c -p 7006
127.0.0.1:7006> get name
(error) CLUSTERDOWN The cluster is down
恢复方法:
因为数据最开始是在7002里存储的,所以进入到7002里查看,另外进入7005里查看
在7002和7004下分别重新加载配置文件:
[root@server1 7005]# redis-server redis.conf
[root@server1 7005]# cd ../7002/
[root@server1 7002]# redis-server redis.conf
[root@server1 7002]# redis-cli --cluster info 127.0.0.1:7001
[root@server1 rediscluster]# ls
7001 7002 7003 7004 7005 7006
[root@server1 rediscluster]# mkdir 7007
[root@server1 rediscluster]# mkdir 7008
[root@server1 rediscluster]# ls
7001 7002 7003 7004 7005 7006 7007 7008
[root@server1 rediscluster]# cp 7001/redis.conf 7007/
[root@server1 rediscluster]# cp 7001/redis.conf 7008/
[root@server1 rediscluster]# vim 7007/redis.conf
[root@server1 rediscluster]# vim 7008/redis.conf
[root@server1 rediscluster]# cd 7007/
[root@server1 7007]# redis-server redis.conf
[root@server1 7007]# cd ../7008/
[root@server1 7008]# redis-server redis.conf
[root@server1 7008]# redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7001
[root@server1 7008]# redis-cli -c -p 7007
127.0.0.1:7007> cluster nodes
d52d9c6611aac64ec721195118ccf54ff1664a95 127.0.0.1:7003@17003 master - 0 1557722374000 3 connected 10923-16383
7be15f956fcb99f4846cba004edffd19a22b23c2 127.0.0.1:7007@17007 myself,master - 0 1557722373000 0 connected
f8c69852450d5286a4bb744b89b35eba8b7b481d 127.0.0.1:7004@17004 slave 37640721cde352f225d033081d5833b1a5fba41b 0 1557722374862 1 connected
974e4c4c3bfa192987116a2a5fe89903e3d44ad1 127.0.0.1:7005@17005 master - 0 1557722374563 7 connected 5461-10922
f3210a46f6d80e1263a3c6ee08704a7db7562570 127.0.0.1:7006@17006 slave d52d9c6611aac64ec721195118ccf54ff1664a95 0 1557722374000 3 connected
b49a2382720efa1eb8d418b58144dfef5f27b8e5 127.0.0.1:7002@17002 slave 974e4c4c3bfa192987116a2a5fe89903e3d44ad1 0 1557722374563 7 connected
37640721cde352f225d033081d5833b1a5fba41b 127.0.0.1:7001@17001 master - 0 1557722375564 1 connected 0-5460
[root@server1 7008]# redis-cli --cluster add-node 127.0.0.1:7008 127.0.0.1:7007 --cluster-slave --cluster-master-id 7be15f956fcb99f4846cba004edffd19a22b23c2
查看新节点的哈希槽情况:
此时7008也添加了,但是主7007节点并没有添加数据槽,不能存储数据。
redis-cli --cluster reshard 127.0.0.1:7007
How many slots do you want to move (from 1 to 16384)? 300 #分配多少数量的哈希槽
What is the receiving node ID? 7be15f956fcb99f4846cba004edffd19a22b23c2 给哪个节点分配哈西曹,这里填ID
Source node #1: all #从哪个主节点分离哈西曹
Do you want to proceed with the proposed reshard plan (yes/no)? yes #确认
[root@server1 7008]# redis-cli --cluster rebalance --cluster-threshold 1 --cluster-use-empty-masters 127.0.0.1:7001