《Redis 集群》
由于集群这章节内容较多,也比较重要,所以单独拉出来,做一个小章节。
1:如何搭建一个集群?
- 环境为 Ubuntu16.04
- 这里我预计使用 9001 - 9006 端口,生成一个 6 台机器的集群
- 生成对应目录
mkdir ~/redis-cluster
cd redis-cluster
mkdir -p /data
mkdir -p /data
......
mkdir -p /data
- 同时需要配置每个目录下的 Redis.conf 这里以 9001 端口为例
port (每个节点的端口号)
cluster-enabled yes(启动集群模式)(必须)
cluster-config-file nodes9001.conf(9001和port要对应)(必须)
- 配置完成之后,启动对应服务 这里以 9001 为例(其余同理)
sudo redis-server ~/redis-cluster//redis.conf
- 查看 9001 端口的服务会否正常启动
vagrant@hong:~/redis-cluster$ ps -aux | grep 'redis'
root 0.0 0.0 ? Ssl : : redis-server 127.0.0.1: [cluster]
- 这时候集群就已经正常使用了,但是,现在每个节点都是相对独立的。
- 我们应该把他连接起来。
- redis 提供的辅助工具可以方便的完成这个任务 redis-trib.rb
因为是用 Ruby 来写的,所以我们应该先安装它。
sudo apt-get install ruby
sudo apt-get install rubygems
sudo apt-get install redis
- 安装完成之后,找到这个文件
sudo find / -name "redis-trib.rb"
- 初始化集群
sudo /usr/share/doc/redis-tools/examples/redis-trib.rb create --replicas 127.0.0.1: 127.0.0.1: 127.0.0.1: 127.0.0.1: 127.0.0.1: 127.0.0.1:
/usr/share/doc/redis-tools/examples/redis-trib.rb
- 重要参数
--replicas 1 表示每个数据库拥有的从库为1,所以整个数据库拥有(6/2) = 3 个主库和从库
- 输出如下,表示集群搭建成功
>>> Creating cluster
>>> Performing hash slots allocation on nodes... // 使用下面三个为主库
Using masters:
127.0.0.1:
127.0.0.1:
127.0.0.1:9003 // 从库监听列表
Adding replica 127.0.0.1: to 127.0.0.1:9001 // 9004(从库) > 9001(主库) ,下同
Adding replica 127.0.0.1: to 127.0.0.1:
Adding replica 127.0.0.1: to 127.0.0.1:9003 // 分配插槽(在一个集群中。所有键都可以分配到16384个插槽中)
M: e456e2ab9792abe01bfd044dc708d550d6efa8a3 127.0.0.1:
slots:- ( slots) master
M: 7b1a201f5f4c5837d0794ca29e9ef85408f0df3e 127.0.0.1:
slots:- ( slots) master
M: 89341ac6f0df97eaf1f974080118ac283b8c1901 127.0.0.1:
slots:- ( slots) master
S: 56a07392b3541f41c6b6421f821280a59c687f96 127.0.0.1:
replicates e456e2ab9792abe01bfd044dc708d550d6efa8a3
S: 34509ad9c1e88fea4d09e95a296cbdbdaa9c2cd4 127.0.0.1:
replicates 7b1a201f5f4c5837d0794ca29e9ef85408f0df3e
S: cf18821f8a3dd9cb110db6d6b63a26dae4dd3189 127.0.0.1:
replicates 89341ac6f0df97eaf1f974080118ac283b8c1901
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All slots covered.
-- 至此,一个集群搭建就完毕了。
2:插槽和键的关系?
- 在一个集群中,所有的键会被分给 16384 个插槽。
- 在使用键时,Redis 将每个键名通过算法(CRC16),计算出散列,再取 16384 的余数,使得每个键都可以分配到每个节点中。
- 在连接 Redis 时,也可以使用 redis-cli -c -p 端口 使命令重定向到可以处理的插槽中
3:集群搭建完成之后,还可以在插入节点么?
- 当然可以。
新节点:新节点端口> CLUSTER MEET 随便在集群中的一个节点 对应端口
- 之后我们可以看集群内的节点信息
CLUSTER NODES
- 但是,值得注意的是,在新加入节点之后,是不会分配任何插槽的,因为之前创建时就已经分配了插槽。
- 后续再分配插槽是非常不友好的,因为会影响到之前的键。
- 所以推荐使用预分片,建立足够多的节点,为了以后的大数据量打下基础
4:集群中的故障恢复
- 在一个节点中,每个节点都会定期向其他节点发送 PING 命令。
- 如果某节点没有响应,认为目标节点 疑似下线(类似哨兵的主观下线)
- 选举,超过一半,则从数据库转成主数据库
- 如果没有从数据库可以进行恢复,则整个集群默认下线并无法工作。
- 也可以通过配置修改 cluster-require-full-coverage 使其正常工作。
- 但是会有一部分负责插槽,无法工作。
《Redis 集群》的更多相关文章
- 简单物联网:外网访问内网路由器下树莓派Flask服务器
最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...
- 利用ssh反向代理以及autossh实现从外网连接内网服务器
前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...
- 外网访问内网Docker容器
外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...
- 外网访问内网SpringBoot
外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...
- 外网访问内网Elasticsearch WEB
外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...
- 怎样从外网访问内网Rails
外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...
- 怎样从外网访问内网Memcached数据库
外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...
- 怎样从外网访问内网CouchDB数据库
外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...
- 怎样从外网访问内网DB2数据库
外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...
- 怎样从外网访问内网OpenLDAP数据库
外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...
随机推荐
- Linux免密码登录设置 && 设置快捷键
看到这篇文章,你肯定是有这种需求. 假设要登录的机器为192.168.1.100,当前登录的机器为192.168.1.101. 首先在101的机器上生成密钥(如果已经生成可以跳过): $ ssh-ke ...
- 关于Python打包运行的一些思路
需求 本地开发python django应用程序,然后放到生产环境运行.使用了tensorflow,手动安装包很麻烦.生产环境不能联网,不能使用 pip freeze. 思路: 使用docker,直接 ...
- Mac xcode 配置OpenGL
配置过程 安装homebrew 打开命令行 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/ ...
- CentOS重新加载网卡报错 Active connection path: /org/freedesktop/NetworkManager/ActiveConnection/23
最新文章:Virson's Blog 重新加载网卡时出现的错误如下: [root@vdb1 dev]# service network restart Shutting down interface ...
- 牛客网_Go语言相关练习_判断&选择题(4)
题目来源于牛客网 一.判断题 成员变量或者函数的首字母表示是否对外部可见. switch后面的声明语句和表达式语句都是可以选择的.例如: //可以什么都不加 switch: break; 错误指的是可 ...
- Zookeeper系列四:Zookeeper实现分布式锁、Zookeeper实现配置中心
一.Zookeeper实现分布式锁 分布式锁主要用于在分布式环境中保证数据的一致性. 包括跨进程.跨机器.跨网络导致共享资源不一致的问题. 1. 分布式锁的实现思路 说明: 这种实现会有一个缺点,即当 ...
- Java SpringBoot中使用sqljdbc4注意事项 java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver
因项目需要,需要在Java项目中访问 MSSQLServer 数据库,本地开发的时候,没有问题,可以正常链接数据库,通过Jenkins部署到服务器上时候,报数据库驱动未找到. java.lang.Cl ...
- portfolio
1.工作量计算逻辑: 原始待办事项: 预估2个冲刺,如下图所示: Sprint1的故事点计划工作量5,空闲工作量28.如下图 Sprint2为预估冲刺,指的是预估待办事项在后续冲刺的预估计划,后续冲刺 ...
- json_decode 为空
传递参数 wsk/addorder?goods=[{"gsn":802006,"number":1},{"gsn":103761," ...
- IOC容器特性注入第六篇:利用MVC注入点,把容器启动
这里是利用MVC三个注入点中的:IDependencyResolver 进行注入 在全局类中Global.asax代码如下: #region MVC Inject System.Web.Mvc.Dep ...