node<--->slot<---->value
部署环境
使用两台虚拟机,
redis master:192.168.200.100
redis slave:192.168.200.101
每台起3个实例
基础环境:centos 7.5
关闭firewalld,networkmanager,selinux
软件:redis 4.0.11
两台机都同样部署
#安装依
#赖
yum -y install wget gcc gcc-c++ make tar openssl openssl-devel cmake
#编译安装redis
tar xf redis-4.0.11.tar.gz -C /usr/src/
cd /usr/src/redis-4.0.11/
make
make MALLOC=jemalloc
make PREFIX=/usr/local/redis install
#从源码包复制redis,哨兵配置文件模板,cluster集群创建工具
mkdir -p /usr/local/redis/conf
cp /usr/src/redis-4.0.11/redis.conf /usr/local/redis/conf/
cp /usr/src/redis-4.0.11/sentinel.conf /usr/local/redis/conf/
cp /usr/src/redis-4.0.11/redis-trib.rb /usr/local/redis/bin/
cd /usr/local/redis/conf/
cp redis.conf{,.bak}
egrep -v "^$|^#" redis.conf.bak > redis.conf
#创建命令软连接
ln -s /usr/local/redis/bin/* /usr/local/bin/
进行操作系统调优
echo "* - nofile 10240" >> /etc/security/limits.conf
echo "net.core.somaxconn = 10240" >> /etc/sysctl.conf
echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
sysctl -p
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.local
echo 'echo never > /sys/kernel/mm/transparent_hugepage/defrag' >> /etc/rc.local
#在redis-master上操作,为不同实例创建基础目录
mkdir -p /data/redis/{7000..7002}
cp /usr/local/redis/conf/redis.conf /data/redis/7000
cp /usr/local/redis/conf/redis.conf /data/redis/7001
cp /usr/local/redis/conf/redis.conf /data/redis/7002
#在redis-slave上操作
mkdir -p /data/redis/{8000..8002}
cp /usr/local/redis/conf/redis.conf /data/redis/8000
cp /usr/local/redis/conf/redis.conf /data/redis/8001
cp /usr/local/redis/conf/redis.conf /data/redis/8002
修改master上的redis配置文件
#redis-master不开启任何持久化存储
vim /data/redis/7000/redis.conf
#修改以下内容
1 cluster-enabled yes #增加此行,支持cluster集群
2 bind 0.0.0.0 #允许任意IP
4 port 7000 #三个实例,依次修改为7000,7001,7002
5 tcp-backlog 1024 #tcp连接数修改为1024
8 daemonize yes #启动方式启用守护进程
10 pidfile /data/redis/7000/redis.pid #修改为每个实例匹配的目录
12 logfile "/data/redis/7000/redis.log" #同上
#删除save参数相关三行
20 dir /data/redis/7000/ #修改基础目录为实例匹配的目录
修改slave上的redis配置文件
#每个实例都需要修改
vim /data/redis/8000/redis.conf
#修改以下内容:
1 cluster-enabled yes #增加此行
2 bind 0.0.0.0
4 port 8000 #每个实例要匹配
5 tcp-backlog 1024
8 daemonize yes
10 pidfile /data/redis/8000/redis.pid
12 logfile "/data/redis/8000/redis.log"
22 dir /data/redis/8000/
33 appendonly yes #开启aof存储
启动两台机上共6个redis实例
redis-server /data/redis/7000/redis.conf
#等等
ruby,一种完全的面向对象的语言,我们需要用到其中的函数,安装ruby对redis的拓展
#master和slave上都需要安装
#下载高版本的ruby,yum安装的版本太低
wget --no-check-certificate 'https://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.7.tar.gz'
#若redis版本高,也可以适当选择合适的ruby版本
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拓展
/usr/local/bin/gem install redis
#在master上操作
redis-trib.rb create 192.168.200.100:7000 192.168.200.100:7001 192.168.200.100:7002
#指定IP,端口创建,不要指定本地127.0.0.1,会使得集群无法正常读取
#创建过程中,会有提示,需要输入yes来确认,最后显示两个OK就算成功
#创建完成后,可以查询集群的信息
redis-cli -p 7000 cluster nodes
#显示myself的为查询时使用的redis,状态分为master,slave
#集群中的监听端口一般为redis端口前加一位,例如端口为7000的redis,在集群中的监听端口为17000,注意不要和别的服务冲突
#若创建有误,需要重建,需要删除集群中所有库的nodes.conf文件,再重启redis(存储位置一般在基础目录中)
rm -rf /data/redis/7000/nodes.conf
...
redis-cli -p 7000 shutdown
...
redis-server /data/redis/7000/redis.conf
...
#重新创建
redis-trib.rb create 192.168.200.100:7000 192.168.200.100:7001 192.168.200.100:7002
#在master上操作
redis-trib.rb add-node --slave 192.168.200.101:8000 192.168.200.100:7000
#主库在后,从库在前,在增加成功的输出中,可以看到从库被添加到集群中,且作为指定的redis实例的从库
redis-trib.rb add-node --slave 192.168.200.101:8001 192.168.200.100:8001
redis-trib.rb add-node --slave 192.168.200.101:8002 192.168.200.100:7002
以此集群为例,通过-c参数操作集群,写的时候
#在集群中任意一台节点上,可以实现成功读写
redis-cli -h 192.168.200.100 -c -p 7000 set name 123
redis-cli -h 192.168.200.101 -c -p 8001 get name
#且读取数值时,会提示从哪个节点读取的数据,若不提示,那么数据就存储在你指定登录的节点上
写入大量数据,查看数据分布情况
#写入数据
for line in `seq -w 10000`;do redis-cli -h 192.168.200.100 -p 7000 -c set key_${line} value_${line};done
#查看分布
redis-cli -h 192.168.200.100 -p 7000 info Keyspace
redis-cli -h 192.168.200.100 -p 7001 info Keyspace
redis-cli -h 192.168.200.100 -p 7002 info Keyspace
#正常情况下,三个主节点key个数应该大概平均
当主库宕机后,对应的从库会自动升级为主库,实现主从切换
#宕掉一个主库,查看node信息变化
redis-cli -h 192.168.200.100 -p 7000 shutdown
redis-cli -h 192.168.200.101 -p 8000 cluster nodes
#正常情况是,宕掉的节点状态会显示为master,fail,而对应的从库变为master状态
重新启动宕掉的节点,并手动切换为主库
#在宕机的服务器上,启动服务再查看redis集群状态
redis-server /data/redis/7000/redis.conf
redis-cli -h 192.168.200.101 -p 8000 cluster nodes
#重新启动后,检测到节点,但状态为slave
#手动切换,再查看
redis-cli -h 192.168.200.100 -c -p 7000 cluster failover
redis-cli -h 192.168.200.101 -p 8000 cluster nodes
#切换成功,则7000端口节点的状态会变为master
python安装redis-cluster拓展
yum -y install epel-release
yum -y install python2-pip
pip install redis-py-cluster
操作集群的代码
#通过脚本来操作
vim /scripts/redis_cluster.py
#内容为
# -*- coding:utf-8 -*-
from rediscluster import StrictRedisCluster
redis_nodes = [
{'host':'192.168.200.100','port':7000},
{'host':'192.168.200.100','port':7001},
{'host':'192.168.200.100','port':7002},
{'host':'192.168.200.101','port':8000},
{'host':'192.168.200.101','port':8001},
{'host':'192.168.200.101','port':8002},
]
redis_conn = StrictRedisCluster(startup_nodes=redis_nodes)
redis_conn.set('key_test','values_test')
print(redis_conn.get('key_test'))
#具体操作为
python /scripts/redis_cluster.py
#这样会在集群中写入一个键值,也就是脚本中定义的那个
redis-cli -c -h 192.168.200.100 -p 7000 get key_test
#在集群中测试操作是否成功
使用pip安装rdbtools分析工具
pip install rdbtools
which rdb
#根据dump.rdb文件分析
#把所有key定向到一个文件
rdb -c memory /data/redis/8000/dump.rdb > ~/memory.csv
#分析key的大小
cat ~/memory.csv | tr ',' ' ' | sort -k4rn | head
#tr ',' ' ':将分列符由,改为空格' '
#sort -k4rn:-k4按第4列排序,r为倒序,n为按照数字排序