Redis-cluster集群部署

1 cluster集群的特性

  • cluster集群,支持主从自动切换;只有一个数据库,数据在各个主库,呈平均分布式存储;通过集群中任一节点,可实现读写;支持横向扩容
  • redis集群把所有的节点(master状态)映射到[0-16383]slot上,集群负责维护node<--->slot<---->value
  • 集群预先分好16384个桶,当读写一个key-value时,根据hash算法:CRC16(‘key’)mod = n(n是指16384个slot中的一个),计算出slot位置,决定存放(读取)的位置
  • 当集群中有三个节点式,采用hash slot(哈希槽)的方式,来分配16384个slot,不一定是完全平均,这个时候三个节点就分别承担1/3左右的slot
  • 所谓hash slot的方式,就是指在分布式集群中,某些hash slot区间对应一台机器,当集群中增加新节点,所有节点中slot会发生改变,每个节点拿出一些来分配给新节点,达到一个相对平均的状态,而hash slot又被称为虚拟桶,hash桶,就是存放key的容器
  • redis存储数据类型是键值型,也支持hash(数据类型,是一种无序的键值组合),这不是传统的一致性hash,而是hash slot,对容量的使用率更高
  • 当写入一个新数据时,通过hash slot算法,得到slot的位置,从而找到承担这个slot的节点,然后把这个数据存储到对应节点上,同理,读取这个数据时,也是通过hash slot算法,从内部跳到对应的节点上读取。正是因为这种方式,在cluster集群中的任意节点上读写,都可以实现正确操作
  • 当存在主从时,主宕机,从会顶替主在集群中的位置,称为新的主,并且负担起原来主的slot区间,当主恢复后,从再恢复为原来的从状态,但也因为这种hash slot的方式,若一对主从都宕机,则整个集群的数据都会变的不完整
  • cluster集群还有一个必要的特性,集群中至少需要三个节点,但是为了高可用,通常三个节点会部署三个从节点,一一对应

2 cluster部署实例

部署环境
使用两台虚拟机,
redis master:192.168.200.100
redis slave:192.168.200.101
每台起3个实例
基础环境:centos 7.5
关闭firewalld,networkmanager,selinux
软件:redis 4.0.11

2.1 基础部署和调优

两台机都同样部署

#安装依
#赖
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

2.2 主从多实例基础环境配置

#在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
#等等

2.3 安装ruby

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

2.4 创建集群

#在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

2.5 cluster集群中从库的添加

#在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

2.6 cluster集群数据的读写特性

以此集群为例,通过-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个数应该大概平均

2.7 cluster集群的主从切换

当主库宕机后,对应的从库会自动升级为主库,实现主从切换

#宕掉一个主库,查看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

3 使用python操作cluster集群

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
#在集群中测试操作是否成功

4 分析redis中key的数目和大小

使用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为按照数字排序
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值