redis 是一个高性能的 key-value 数据库。 redis 的出现,很大程度补偿了
memcached 这类 keyvalue 存储的不足,在部分场合可以对关系数据库起到很
好的补充作用。它提供了 Python,Ruby,Erlang,PHP 客户端,使用很方便。
Redis 的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上
(这称为“半持久化模式”);也可以把每一次数据变化都写入到一个 append
only file(aof)里面(这称为“全持久化模式”)。
[root@base2 ~]# sysctl vm.overcommit_memory=1
vm.overcommit_memory = 1
[root@base2 ~]# mkdir /usr/local/rediscluster
[root@base2 ~]# cd /usr/local/rediscluster
[root@base2 rediscluster]# mkdir 700{1..6}
[root@base2 rediscluster]# ls
7001 7002 7003 7004 7005 7006
[root@base2 rediscluster]# cd 7001
[root@base2 7001]# vim redis.conf
port 7001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes # 日志用的是aof
pidfile "/usr/local/rediscluster/7001/redis.pid" # 不同的实例pid分别放在不同的文件
logfile "/usr/local/rediscluster/7001/redis.log" # 不同的实例log分别放在不同的文件
daemonize yes # 允许打入后台
dir "/usr/local/rediscluster/7001" # 数据目录
[root@base2 7001]# redis-server redis.conf
[root@base2 7001]# ls
appendonly.aof nodes.conf redis.conf redis.log redis.pid
[root@base2 7001]# cp redis.conf ../7002
[root@base2 7001]# cp redis.conf ../7003
[root@base2 7001]# cp redis.conf ../7004
[root@base2 7001]# cp redis.conf ../7005
[root@base2 7001]# cp redis.conf ../7006
[root@base2 7001]# cd ../7002
[root@base2 7002]# vim 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@base2 7002]# redis-server redis.conf
[root@base2 7002]# ls
appendonly.aof nodes.conf redis.conf redis.log redis.pid
[root@base2 7002]# cd ../7003
[root@base2 7003]# vim redis.conf
port 7003
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
pidfile "/usr/local/rediscluster/7003/redis.pid"
logfile "/usr/local/rediscluster/7003/redis.log"
daemonize yes
dir "/usr/local/rediscluster/7003"
[root@base2 7003]# redis-server redis.conf # 为节点分配空间
[root@base2 7003]# ls
appendonly.aof nodes.conf redis.conf redis.log redis.pid
[root@base2 7003]# cd ../7004
[root@base2 7004]# vim redis.conf
port 7004
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
pidfile "/usr/local/rediscluster/7004/redis.pid"
logfile "/usr/local/rediscluster/7004/redis.log"
daemonize yes
dir "/usr/local/rediscluster/7004"
[root@base2 7004]# redis-server redis.conf
[root@base2 7004]# ls
appendonly.aof nodes.conf redis.conf redis.log redis.pid
[root@base2 7004]# cd ../7005
[root@base2 7005]# vim redis.conf
port 7005
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
pidfile "/usr/local/rediscluster/7005/redis.pid"
logfile "/usr/local/rediscluster/7005/redis.log"
daemonize yes
dir "/usr/local/rediscluster/7005"
[root@base2 7005]# redis-server redis.conf
[root@base2 7005]# ls
appendonly.aof nodes.conf redis.conf redis.log redis.pid
[root@base2 7005]# cd ../7006
[root@base2 7006]# vim redis.conf
port 7006
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
pidfile "/usr/local/rediscluster/7006/redis.pid"
logfile "/usr/local/rediscluster/7006/redis.log"
daemonize yes
dir "/usr/local/rediscluster/7006"
[root@base2 7006]# redis-server redis.conf
[root@base2 7006]# ls
appendonly.aof nodes.conf redis.conf redis.log redis.pid
[root@base2 7006]# ps ax | grep 700 # 端口全出现了
这些可执行文件的作用如下:
redis-server: redis 服务主程序。
redis-cli: redis 客户端命令行工具,也可以用telnet 来操作。
redis-benchmark: Redis 性能测试工具,用于测试读写性能。
redis-check-aof: 检查 redis aof 文件完整性,aof 文件持久化记录服务器执行的所有写操作命令,用于还原数据。
redis-check-dump: 检查 redis rdb 文件的完性,rdb 就是快照存储, 即按照一定的策略周期性的将数据保存到磁盘,是默的持久化方式。
redis-sentinel: redis-sentinel 是集群管理工具,主要负责主从切换。
[root@base2 ~]# 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 # 开始创建节点,三个主节点分别分配一个slave,,1表示每个master有一个salve
[root@base2 ~]# redis-cli --cluster info 127.0.0.1:7001
[root@base2 ~]# redis-cli --cluster check 127.0.0.1:7001
[root@base2 ~]# redis-cli -c -p 7001
127.0.0.1:7001> set name lala
-> Redirected to slot [5798] located at 127.0.0.1:7002
OK
127.0.0.1:7002> info
[root@base2 ~]# redis-cli -c -p 7006 # 当任意登录一个节点时
127.0.0.1:7006> get name
-> Redirected to slot [5798] located at 127.0.0.1:7002 # 也跳转到了7002上,获取到了信息
"lala"
127.0.0.1:7002>
127.0.0.1:7002> SHUTDOWN
not connected> QUIT
[root@base2 ~]# ps ax | grep 700 # 发现7002这个节点down掉了
[root@base2 ~]# redis-cli --cluster info 127.0.0.1:7001 # 我们再查看集群信息时,发现7002的slave7005接管了7002的工作成为了master
[root@base2 ~]# redis-cli -c -p 7005
127.0.0.1:7005> SHUTDOWN # 我们再down掉没有slave的节点
not connected> QUIT
[root@base2 ~]# redis-cli --cluster info 127.0.0.1:7001 # 查看集群信息
注:
集群少了任何一部分,都会挂掉
[root@base2 ~]# redis-cli -c -p 7001 # 当我们再次使用集群的时候,集群已经坏掉了
127.0.0.1:7001> get name
(error) CLUSTERDOWN The cluster is down
127.0.0.1:7001>
[root@base2 ~]# cd /usr/local/rediscluster/
[root@base2 rediscluster]# cd 7002/
[root@base2 7002]# redis-server redis.conf
[root@base2 7002]# cd ../7005
[root@base2 7005]# redis-server redis.conf
[root@base2 7005]# ps ax | grep 700 # 查看所有集群节点都恢复了
[root@base2 rediscluster]# mkdir 7007
[root@base2 rediscluster]# mkdir 7008
[root@base2 rediscluster]# cd 7007
port 7007
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
pidfile "/usr/local/rediscluster/7007/redis.pid"
logfile "/usr/local/rediscluster/7007/redis.log"
daemonize yes
dir "/usr/local/rediscluster/7007"
[root@base2 7007]# redis-server redis.conf
[root@base2 7007]# cd ../7008
[root@base2 7008]# vim redis.conf
port 7008
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
pidfile "/usr/local/rediscluster/7008/redis.pid"
logfile "/usr/local/rediscluster/7008/redis.log"
daemonize yes
dir "/usr/local/rediscluster/7008"
[root@base2 7008]# redis-server redis.conf
[root@base2 7007]# redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7001 # 添加节点
[root@base2 7007]# redis-cli --cluster info 127.0.0.1:7001 # 查看节点已经添加成功
[root@base2 7007]# redis-cli --cluster check 127.0.0.1:7001
[root@base2 7007]# redis-cli --cluster add-node --cluster-slave --cluster-master-id "570dc3ceeec624936a57b42769b66fb1eb189696" 127.0.0.1:7008 127.0.0.1:7001
[root@base2 7007]# redis-cli --cluster info 127.0.0.1:7001 # 查看添加成功
[root@base2 7007]# redis-cli --cluster reshard --cluster-from all --cluster-to 570dc3ceeec624936a57b42769b66fb1eb189696 --cluster-slots 300 --cluster-yes 127.0.0.1:7001
--cluster-from all # 所有节点
--cluster-slots 300 # 迁移的个数
127.0.0.1:7001 # 进入集群的一个接口,集群中任意一个成员都可以
[root@base2 7007]# redis-cli --cluster rebalance --cluster-threshold 1 --cluster-use-empty-masters 127.0.0.1:7001
rebalance # 表示重新进行均衡
--cluster-use-empty-masters # 如果master是空的,不进行均衡,在这条语句中的意思是忽略空master
[root@base2 7007]# redis-cli --cluster check 127.0.0.1:7001
[root@base2 7007]# redis-cli -c -p 7001
127.0.0.1:7001> get name
-> Redirected to slot [5798] located at 127.0.0.1:7007
"lala"
127.0.0.1:7007>