redis 之redis集群与集群配置
一.为什么要用集群
redis3.0集群采用P2P模式,完全去中心化,将redis所有的key分成了16384个槽位,每个redis实例负责一部分slot,集群中的所有信息通过节点数据交换而更新。
redis实例集群主要思想是将redis数据的key进行散列,通过hash函数特定的key会映射到指定的redis节点上
二.数据分布理论
分布式数据库首要解决把整个数据集按照分区规则映射到多个节点的问题,即把数据集划分到多个节点上,每个节点负责整个数据的一个子集。
常见的分区规则有哈希分区和顺序分区。Redis Cluster采用哈希分区规则,因此接下来会讨论哈希分区规则。
(1)节点取余分区
(2)一致性哈希分区
(3)虚拟槽分区(redis-cluster采用的方式)
顺序分布
那么同样的分4个节点就是hash(key)%4
节点取余的优点是简单,客户端分片直接是哈希+取余
一致性哈希
客户端进行分片,哈希+顺时针取余
三.redis虚拟槽分区
Redis Cluster采用虚拟槽分区
虚拟槽分区巧妙地使用了哈希空间,使用分散度良好的哈希函数把所有的数据映射到一个固定范围内的整数集合,整数定义为槽(slot)。
Redis Cluster槽的范围是0~16383。
槽是集群内数据管理和迁移的基本单位。采用大范围的槽的主要目的是为了方便数据的拆分和集群的扩展,
每个节点负责一定数量的槽
存的数据是存到槽位,16383个槽位在分配给节点。
四.搭建redis cluster
搭建集群分为几步:
准备节点(redis库)
节点通信(自动分配主从)
分配槽位给节点(slot分配给redis)
redis-cluster集群架构
多个服务端,负责读写,彼此通信,redis指定了16384个槽。
ruby的脚本自动就把分配槽位这事做了。
五.redis集群配置
1.准备6个节点
mkdir /opt/redis_conf/redis_Cluster/
192.168.1.209 3个节点
/opt/redis_conf/redis_Cluster/redis-7000.conf
/opt/redis_conf/redis_Cluster/redis-7001.conf
/opt/redis_conf/redis_Cluster/redis-7002.conf
192.168.1.208 3个节点
/opt/redis_conf/redis_Cluster/redis-7003.conf
/opt/redis_conf/redis_Cluster/redis-7004.conf
/opt/redis_conf/redis_Cluster/redis-7005.conf
2.节点的配置
port 7000 bind 192.168.1.209 daemonize yes dir "/data/redis_Cluster/" logfile "/data/redis_Cluster/logs/7000.log" dbfilename "dump-7000.rdb" cluster-enabled yes cluster-config-file nodes-7000.conf
这6个节点配置文件都一样,仅仅是端口的不同
,bind后端的ip是本机ip
这边再放一个另外一台的配置:
[root@node208 redis_Cluster]# cat redis-7003.conf
port 7003 bind 192.168.1.208 daemonize yes dir "/data/redis_Cluster/" logfile "/data/redis_Cluster/logs/7003.log" dbfilename "dump-7003.rdb" cluster-enabled yes cluster-config-file nodes-7003.conf
并创建相应的目录:
mkdir /data/redis_Cluster/
mkdir /data/redis_Cluster/logs/
3.启动这六个节点
192.168.1.209 上运行
redis-server /opt/redis_conf/redis_Cluster/redis-7000.conf
redis-server /opt/redis_conf/redis_Cluster/redis-7001.conf
redis-server /opt/redis_conf/redis_Cluster/redis-7002.conf
192.168.1.209 上运行
redis-server /opt/redis_conf/redis_Cluster/redis-7003.conf
redis-server /opt/redis_conf/redis_Cluster/redis-7004.conf
redis-server /opt/redis_conf/redis_Cluster/redis-7005.conf
启动6个节点后的截图:
4.随便进入一个redis交互模式,写入数据,发现无法写入
报错,没有分配哈希槽
5.准备ruby环境,安装ruby并执行redis-trib.rb脚本
分配redis集群状态,以及槽位分配,互联网企业,豆瓣公司开源的一个工具
(1)下载、编译、安装Ruby
# 下载ruby wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz # 安装ruby tar -xvf ruby-2.3.1.tar.gz # 进入目录 cd ruby-2.3.1/ # 指定安装目录 ./configure --prefix=/opt/ruby/ # 编译安装 make && make install
6.添加ruby环境变量
vim /etc/profile 在PATH=后面添加ruby的环境变量路径 export PATH=$PATH:/opt/python36/bin:/opt/ruby/bin # 重新读取环境变量 source /etc/profile
7.安装ruby gem redis-trib.rb
wget http://rubygems.org/downloads/redis-3.3.0.gem 使用gem安装redis-3.3.0.gem工具 gem install -l redis-3.3.0.gem 安装redis-trib.rb命令 cp /opt/redis-5.0.0/src/redis-trib.rb /usr/local/bin/
如下截图,说明redis-trib.rb配置成功
这样表示添加成功
安装ruby gem 包管理工具
wget http://rubygems.org/downloads/redis-3.3.0.gem
gem install -l redis-3.3.0.gem
8.一键开启redis-cluster集群
redis-cli --cluster create --cluster-replicas 1 192.168.1.209:7000 192.168.1.209:7001 192.168.1.209:7002 192.168.1.208:7003 192.168.1.208:7004 192.168.1.208:7005
--replicas # 表示进行身份授权
1 # 表示每个主节点,只有一个从节点
# 集群会自动分配主从关系 7000、7001、7002为主服务器master 7003、7004、7005为从服务器slave
连接集群命令
redis-cli -h IP地址 -p 端口 -c
# redis-cli -h 192.168.1.209 -p 7000 -c
两个数据库的数共享,插入的数据随机分配到一主一从的其中一个。查询数据的时候,
两个库的数据都能在一个库中查询到。每一次插入数据都会先分配节点,在插入相应的库的数据。
原文地址:https://www.cnblogs.com/hszstudypy/p/11561546.html
- 11-移动端开发教程-zepto.js入门教程
- 【OpenCV学习笔记之一】图像加载,修改及保存
- 【干货】一种直观的方法认识梯度下降
- 漫谈Java IO之普通IO流与BIO服务器
- 浅谈强化学习的方法及学习路线
- 【亲测有效】Win10家庭版Microsoft Edge页面出现乱码的两种解决方案及gpedit.msc命令无法使用的解决策略
- Fiddler抓包7-post请求(json)
- Selenium2+python自动化56-unittest之断言(assert)
- 长文 | 手把手教你如何使用python进行数据分析(最好将文章代码自己码一遍)
- 回归与梯度下降法及实现原理
- 【宅男宅女们的福音】电影天堂最新电影爬取及搜索脚本
- 把模块有关联的放在一个文件夹中 在python2中调用文件夹名会直接失败 在python3中调用会成功,但是调用不能成功的解决方案
- numpy用法小结
- 凯撒密码加解密及破解实现原理
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux系统Logrotate服务介绍
- python五十四课——datetime模块
- python五十五课——calendar模块
- python五十六课——正则表达式(常用函数之match)
- python五十六课——正则表达式(常用函数之search())
- python五十六课——正则表达式(常用函数之findall)
- python五十七课——正则表达式(元字符)
- python五十七课——正则表达式(边界字符)
- python五十七课——正则表达式(多个字符)
- python五十八课——正则表达式(分组)
- python五十八课——正则表达式(替换)
- 配置Tomcat使用https协议(单向认证)
- python五十八课——正则表达式(切割)
- python五十九课——正则表达式的拓展内容
- 配置SVN的hooks功能自动更新代码