Redis-cluster集群
redis-cluster所有包
链接:https://pan.baidu.com/s/1wcAI-jFFEaIU5Ilj6Beefg
提取码:s29i
一、Redis自带Cluster集群的部署与基础使用
1.1 Redis集群特性
redis cluster集群方式支持主从自动切换
redis cluster集群只有一个库,单列或者主从的话又多个库
redis cluster集群去中心化,只要通过其中一个端口连接即可
redis cluster集群,只有一个db库,不支持多库
1.2 redis自带集群搭建,一般使用三主三从来构建(最少六台机器)
主机名 | IP | 端口 | 用途 |
---|---|---|---|
redis-master | 192.168.200.116 | 7000 | redis-master01 |
192.168.200.116 | 7001 | redis-master02 | |
192.168.200.116 | 7002 | redis-master03 | |
redis-slave | 192.168.200.105 | 8000 | redis-slave01 |
192.168.200.105 | 8001 | redis-slave02 | |
192.168.200.105 | 8002 | redis-slave03 |
1.3 实验初始环境要求
两台都需要搭建redis服务
cat /etc/redhat-release
uname -r
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sestatus
1.4 配置实例
redis-master上操作如下图
mkdir -p /data/redis-cluster
cd /data/redis-cluster
mkdir -p 7000 7001 7002
cp /usr/local/redis/conf/redis.conf /data/redis-cluster/7000
cp /usr/local/redis/conf/redis.conf /data/redis-cluster/7001
cp /usr/local/redis/conf/redis.conf /data/redis-cluster/7002
tree /data
redis-slave上操作如下图
mkdir -p /data/redis-cluster
cd /data/redis-cluster
mkdir -p 8000 8001 8002
cp /usr/local/redis/conf/redis.conf /data/redis-cluster/8000
cp /usr/local/redis/conf/redis.conf /data/redis-cluster/8001
cp /usr/local/redis/conf/redis.conf /data/redis-cluster/8002
tree /data
修改redis-master的redis.conf配置文件(三个实例都修改端口,pid,日志并开启cluster)
redis-master不开任何持久化配置
vim 7000/redis.conf
cat 7000/redis.conf
cluster-enabled yes
bind 0.0.0.0
port 7000
pidfile /data/redis-cluster/7000/redis.pid
logfile "/data/redis-cluster/7000/redis.log"
dir /data/redis-cluster/7000/
tcp-backlog 1024
timeout 0
tcp-keepalive 0
daemonize yes
loglevel notice
databases 16
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump.rdb"
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
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
slave-lazy-flush no
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite yes
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
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
vim 7001/redis.conf
cat 7001/redis.conf
vim 7002/redis.conf
cat 7002/redis.conf
修改redis-slave的redis.conf配置文件(三个实例都修改端口,pid,日志并开启cluster)
vim 8000/redis.conf
cat 8000/redis.conf
vim 8001/redis.conf
cat 8001/redis.conf
vim 8002/redis.conf
cat 8002/redis.conf
1.5 启动redis-master和slave多实例
redis-server /data/redis-cluster/7000/redis.conf
redis-server /data/redis-cluster/7001/redis.conf
redis-server /data/redis-cluster/7002/redis.conf
ss -antup | grep redis
redis-server /data/redis-cluster/8000/redis.conf
redis-server /data/redis-cluster/8001/redis.conf
redis-server /data/redis-cluster/8002/redis.conf
1.6 编译安装高ruby版本,Ruby版本需要大于等于2.2.2(yum安装的不符合)
master和slave都进行
ls
tar xf ruby-2.2.7.tar.gz -C /usr/src/
cd /usr/src/ruby-2.2.7/
./configure && make && make install
ruby --version
在线安装ruby的redis扩展
[root@redis-slave ruby-2.2.7]# /usr/local/bin/gem install redis
Fetching: redis-4.1.0.gem (100%)
Successfully installed redis-4.1.0
Parsing documentation for redis-4.1.0
Installing ri documentation for redis-4.1.0
Done installing documentation for redis after 1 seconds
1 gem installed
1.7 使用reids自带redis-trib.rb工具创建集群
在redis-master上面操作
将redis-trib.rb复制到redis/bin下面。
cd /usr/src/redis-4.0.11/src
cp redis-trib.rb /usr/local/redis/bin/
ln -s /usr/local/redis/bin/* /usr/local/bin/ --->报错是之前添加的
创建集群
redis-trib.rb create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002
1.8 查看集群的信息
redis-cli -p 7000 cluster nodes
cat /data/redis-cluster/7000/nodes.conf
1.9 使用redis-cli去操作集群,需要加入-c参数,-c表示用集群的方式查看建值
redis-cli -c: Enable cluster mode (follow-ASK and -MOVED redirections)
redis-cli -c -p 7000
set name1 yunjisuan
set name2 benet
1.10 去中心化,随意一个入口
在master上操作
redis-cli -c -p 7001 get name1
redis-cli -c -p 7002 get name2
在slave上操作
redis-cli -h 192.168.200.116 -c -p 7000 get name1 --->被拒绝
redis-cli -h 192.168.200.116 -p 7002 get name1 --->访问成功,指定7002端口
为什么远程方式访问redis-cluster时候被拒绝了?因为我们创建集群的时候是以127.0.0.1的本地IP方式创建的,因此只有本地访问cluster集群才能发挥作用,远程访问7002端口之所以能成功,因为数据本身就在7002端口的redis上,不加-c也能访问成功。
1.11 cluster集群的重建
在master上操作
ls /data/redis-cluster/7000
ls /data/redis-cluster/7001
ls /data/redis-cluster/7002
删除cluster集群配置文件
rm -rf /data/redis-cluster/7000/nodes.conf
rm -rf /data/redis-cluster/7001/nodes.conf
rm -rf /data/redis-cluster/7002/nodes.conf
redis-cli -p 7000 shutdown
redis-cli -p 7001 shutdown
redis-cli -p 7002 shutdown
启动redis-server
redis-server /data/redis-cluster/7000/redis.conf
redis-server /data/redis-cluster/7001/redis.conf
redis-server /data/redis-cluster/7002/redis.conf
ss -antup | grep redis
重新创建redis-cluster集群
redis-trib.rb create 192.168.200.116:7000 192.168.200.116:7001 192.168.200.116:7002
ps -ef | grep cluster | grep -v grep
1.12 在redis-slave上进行远程连接cluster集群测试
redis-cli -h 192.168.200.116 -c -p 7000 set name yunjisuan
redis-cli -h 192.168.200.116 -c -p 7001 get name
redis-cli -h 192.168.200.116 -c -p 7001
get name
set name2 xxxx
get name2
1.13 批量导入数据观察key的集群分布情况
for line in `seq -w 10000`;do redis-cli -h 192.168.200.116 -p 7000 -c set key3_${line} value_${line};done
1.14 分析cluster集群key的节点分布情况
redis-cli -h 192.168.200.116 -p 7000 info keyspace
redis-cli -h 192.168.200.116 -p 7001 info keyspace
redis-cli -h 192.168.200.116 -p 7002 info keyspace
二、Redis Cluster集群的故障自动切换
2.1 将redis-master的配置文件拷贝到redis-slave
cd /data/redis-cluster
scp 7000/redis.conf root@192.168.200.137:/data/redis-cluster/8000
scp 7000/redis.conf root@192.168.200.137:/data/redis-cluster/8001
scp 7000/redis.conf root@192.168.200.137:/data/redis-cluster/8002
修改配置文件为对应的8000、8001、8002端口,过程省略(上文提前修改了)
2.2 启动redis-slave上所有的从库
2.3 redis-cluster集群从库的添加
redis-master上操作
添加第一组主从
redis-trib.rb add-node --slave 192.168.200.105:8000 192.168.200.116:7000
添加第二组主从
redis-trib.rb add-node --slave 192.168.200.105:8001 192.168.200.116:7001
添加第三组主从
redis-trib.rb add-node --slave 192.168.200.105:8002 192.168.200.116:7002
2.4 查看集群所有节点的信息
redis-cli -p 7000 cluster nodes
2.5 redis-cluster集群slave从库的读写测试
redis-cli -h 192.168.200.105 -c -p 8000
set name 666
exit
redis-cli -h 192.168.200.105 -c -p 8000 get name
redis-cli -h 192.168.200.105 -c -p 8001 get name
redis-cli -h 192.168.200.105 -c -p 8002 get name
redis-cli -h 192.168.200.116 -c -p 7002 get name
redis-cli -h 192.168.200.116 -c -p 7001 get name
redis-cli -h 192.168.200.116 -c -p 7000 get name
通过测试,发现redis的cluster集群,不论是主库还是从库都可以进行set和get.因此,在使用中就没有必要都去主库了.
2.6 查看主从cluster集群key的分布情况
redis-cli -h 192.168.200.105 -c -p 8002 info keyspace --->从库
redis-cli -h 192.168.200.105 -c -p 8001 info keyspace
redis-cli -h 192.168.200.105 -c -p 8000 info keyspace
redis-cli -h 192.168.200.116 -c -p 7002 info keyspace --->主库
redis-cli -h 192.168.200.116 -c -p 7001 info keyspace
redis-cli -h 192.168.200.116 -c -p 7000 info keyspace
2.7 redis集群的主从自动切换,主库挂掉后,从自动变成主
手动切换主从命令
cluster failover
手动down掉了7000端口的redis-server。从信息得知,7000端口挂了,8000端口被切换为了master
redis-cli -h 192.168.200.116 -p 7000 shutdown
redis-cli -h 192.168.200.105 -p 8000 cluster nodes
重新启动7000端口的server,再次查看
redis-server /data/redis-cluster/7000/redis.conf --->重新启动7000端口的server
在从库上查看状态
redis-cli -h 192.168.200.105 -p 8000 cluster nodes --->发现原先的主变成了从
手动将redis-server 7000端口重新切换成主库
redis-cli -h 192.168.200.116 -c -p 7000 cluster failover
redis-cli -h 192.168.200.105 -p 8000 cluster nodes --->发现7000端口又变成了主
三、使用Python操作Redis Cluster集群
3.1 Python安装扩展用来操作redis集群
[root@redis-master ~]# yum -y install epel-release
[root@redis-master ~]# yum -y install python2-pip
[root@redis-master ~]# pip install redis-py-cluster
3.2 操作集群的代码
[root@redis-master ~]# mkdir -p /server/scripts
[root@redis-master ~]# cd /server/scripts
[root@redis-master scripts]# vim redis_cluster.py
[root@redis-master scripts]# cat redis_cluster.py
# -*- coding:utf-8 -*-
from rediscluster import StrictRedisCluster
redis_nodes = [
{'host':'192.168.200.116','port':7000},
{'host':'192.168.200.116','port':7001},
{'host':'192.168.200.116','port':7002},
{'host':'192.168.200.105','port':8000},
{'host':'192.168.200.105','port':8001},
{'host':'192.168.200.105','port':8002}
]
redis_conn = StrictRedisCluster(startup_nodes=redis_nodes)
redis_conn.set('key_test','values_test')
print(redis_conn.get('key_test'))
[root@redis-master scripts]# python redis_cluster.py
values_test
[root@redis-master scripts]# redis-cli -c -p 7002 get key_test
"values_test"
主:如果其中一个节点挂了,不影响功能的使用
四、分析Redis的所有key和key的大小
4.1 pip安装rdbtools分析工具
[root@redis-master scripts]# pip install rdbtools
[root@redis-master scripts]# which rdb
/usr/bin/rdb
4.2分析key及key的大小
运维需求,根据dump.rdb文件分析key和key的大小
[root@redis-master ~]# rdb -c memory /data/redis-cluster/7000/dump.rdb > /root/memory.csv
[root@redis-master ~]# cat /root/memory.csv | head
database,type,key,size_in_bytes,encoding,num_elements,len_largest_element,expiry
0,string,key3_03130,72,string,11,11,
0,string,key3_04725,72,string,11,11,
0,string,key3_07347,72,string,11,11,
0,string,key3_06980,72,string,11,11,
0,string,key3_07297,72,string,11,11,
0,string,key3_02168,72,string,11,11,
0,string,key3_04336,72,string,11,11,
0,string,key3_00710,72,string,11,11,
0,string,key3_06607,72,string,11,11,
#分析key的大小
[root@redis-master ~]# cat /root/memory.csv | tr ',' ' ' | sort -k4rn | head
0 string key3_00002 72 string 11 11
0 string key3_00003 72 string 11 11
0 string key3_00006 72 string 11 11
0 string key3_00007 72 string 11 11
0 string key3_00010 72 string 11 11
0 string key3_00014 72 string 11 11
0 string key3_00018 72 string 11 11
0 string key3_00020 72 string 11 11
0 string key3_00021 72 string 11 11
0 string key3_00024 72 string 11 11
[root@redis-master ~]# cat /root/memory.csv | tr ',' ' ' | sort -k4n | head
database type key size_in_bytes encoding num_elements len_largest_element expiry
0 string name2 56 string 4 4
0 string key3_00002 72 string 11 11
0 string key3_00003 72 string 11 11
0 string key3_00006 72 string 11 11
0 string key3_00007 72 string 11 11
0 string key3_00010 72 string 11 11
0 string key3_00014 72 string 11 11
0 string key3_00018 72 string 11 11
0 string key3_00020 72 string 11 11