高性能网站架构设计之缓存篇(5)- Redis 集群(上)

news/2024/5/21 0:35:51/文章来源:https://blog.csdn.net/lgq421033770/article/details/50727787

转自:http://www.cnblogs.com/zhaoguihua/p/redis-005.html

集群技术是构建高性能网站架构的重要手段,试想在网站承受高并发访问压力的同时,还需要从海量数据中查询出满足条件的数据,并快速响应,我们必然想到的是将数据进行切片,把数据根据某种规则放入多个不同的服务器节点,来降低单节点服务器的压力。

上一篇我们讲到了 Redis 的主从复制技术,当实现了多节点的 master-slave 后,我们也可以把它叫做集群,但我们今天要讲的集群主要是利用切片技术来组建的集群。

集群要实现的目的是要将不同的 key 分散放置到不同的 redis 节点,这里我们需要一个规则或者算法,通常的做法是获取 key 的哈希值,然后根据节点数来求模,但这种做法有其明显的弊端,当我们需要增加或减少一个节点时,会造成大量的 key 无法命中,这种比例是相当高的,所以就有人提出了一致性哈希的概念。

一致性哈希有四个重要特征:

均衡性:也有人把它定义为平衡性,是指哈希的结果能够尽可能分布到所有的节点中去,这样可以有效的利用每个节点上的资源。

单调性:对于单调性有很多翻译让我非常的不解,而我想要的是当节点数量变化时哈希的结果应尽可能的保护已分配的内容不会被重新分派到新的节点。

分散性和负载:这两个其实是差不多的意思,就是要求一致性哈希算法对 key 哈希应尽可能的避免重复。

但一致性哈希不是我们今天要介绍的重点,因为 Redis 引入另一种哈希槽(hash slot)的概念。

Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。

使用哈希槽的好处就在于可以方便的添加或移除节点。

当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点就可以了;

当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就行了;

内部机制,与我何干,对于我们来说,在新增或移除节点的时候不要让我们先停掉所有的 redis 服务我就谢天谢地了,这点它做到了。

下面我们就开始动手搭建一个 redis 集群来体验一下。

因为我们要启动多个 redis 实例,虽然我们可以直接通过命令行来启动,但始终是不怎么方便的,所以我们先来新建三个实例目录,分别是9001,9002,9003,目录名就是 redis 实例的端口号。

我这里已经建好了目录,然后我们把以前编译过和修改过的 redis-server、redis.conf这两个文件分别拷贝到这三个目录里面,拷贝完之后就像这样子了:

我们打开 redis.conf 文件,为了简单起见,我们只保留下面几个配置项:

daemonize yes
port 9001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

注意:port 要修改成对应目录的名字,也就是每个实例要有不同的端口。

下面我们分别启动这三个实例:

zhaoguihuadediannao:~ zhaogh$ cd applications/dev/redis-cluster

zhaoguihuadediannao:redis-cluster zhaogh$ cd 9001

zhaoguihuadediannao:9001 zhaogh$ ./redis-server ./redis.conf

zhaoguihuadediannao:9003 zhaogh$ cd ../9002

zhaoguihuadediannao:9002 zhaogh$ ./redis-server ./redis.conf

zhaoguihuadediannao:9002 zhaogh$ cd ../9003

zhaoguihuadediannao:9003 zhaogh$ ./redis-server ./redis.conf

zhaoguihuadediannao:9003 zhaogh$ 

接下来我们来创建集群,让三个实例互相通讯:

zhaoguihuadediannao:src zhaogh$ ./redis-trib.rb create --replicas 0 127.0.0.1:9001 127.0.0.1:9002 127.0.0.1:9003

>>> Creating cluster

Connecting to node 127.0.0.1:9001: OK

Connecting to node 127.0.0.1:9002: OK

Connecting to node 127.0.0.1:9003: OK

>>> Performing hash slots allocation on 3 nodes...

Using 3 masters:

127.0.0.1:9001

127.0.0.1:9002

127.0.0.1:9003

M: 92c9912cb1ccf657c886ecd839dd32c66efd8762 127.0.0.1:9001

   slots:0-5460 (5461 slots) master

M: b6d46fcb8b0e6ee373b09a4f2cbcec744d1a259b 127.0.0.1:9002

   slots:5461-10922 (5462 slots) master

M: 44ab30c7c589ffb15b9b04dd827c72cfaeedacb2 127.0.0.1:9003

   slots:10923-16383 (5461 slots) master

Can I set the above configuration? (type 'yes' to accept): yes

>>> Nodes configuration updated

>>> Assign a different config epoch to each node

>>> Sending CLUSTER MEET messages to join the cluster

Waiting for the cluster to join..

>>> Performing Cluster Check (using node 127.0.0.1:9001)

M: 92c9912cb1ccf657c886ecd839dd32c66efd8762 127.0.0.1:9001

   slots:0-5460 (5461 slots) master

M: b6d46fcb8b0e6ee373b09a4f2cbcec744d1a259b 127.0.0.1:9002

   slots:5461-10922 (5462 slots) master

M: 44ab30c7c589ffb15b9b04dd827c72cfaeedacb2 127.0.0.1:9003

   slots:10923-16383 (5461 slots) master

[OK] All nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.

zhaoguihuadediannao:src zhaogh$ 

需要注意的是执行 redis-trib.rb 命令需要 ruby 的支持,如果你没有安装可以先到 https://rubygems.org/gems/redis 下载,然后离线安装。

sudo gem install redis-3.0.7.gem --local

下面我们用 redis 自带的客户端测试一下:

zhaoguihuadediannao:src zhaogh$ ./redis-cli -c -p 9001

127.0.0.1:9001> get testkey001

-> Redirected to slot [12786] located at 127.0.0.1:9003

(nil)

127.0.0.1:9003> set testkey002 testvalue002

-> Redirected to slot [401] located at 127.0.0.1:9001

OK

127.0.0.1:9001> get testkey002

"testvalue002"

127.0.0.1:9001> set testkey003 testvalue003

OK

127.0.0.1:9001> 

可以看到,虽然我们第一次连接的是9001端口,当我们去获取 testkey001 的时候,redis cluster 自动帮我们重定向到 9003 。

当我们在 9003 设置 testkey002 时,redis cluster 又重定向到 9001 。

总的来说, redis 集群部署起来还是非常方便的,遗憾的是,目前几乎还没有 c# 的客户端能很好的支持 redis 集群,真是非常的悲哀,我们期待他们的更新。

下一遍中,我们继续讨论 redis 集群,比如,如何增加节点,移除节点,重新切片等,敬请期待。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_893021.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计相关的网站

来自:http://blog.csdn.net/leejizhou/article/details/51623082 李济洲的博客 ) 这篇文章给大家介绍几个设计相关的网站,因为博主除了软件开发以外还比较喜欢设计,据我观察了解程序员普遍审美都是比较差的,所以这次给大家推荐几…

linux企业实战 大型网站架构概述

大型网站架构概述 网站架构演化发展历程 初始阶段的网站(特点:没人)应用程序、数据库、文件都在一个服务器 应用服务和数据服务分离 随着网站业务的发展,-台服务器逐渐不能满足需求:性能越来越差,存储空间不足。这是就需要应用和数据分离 应用服务…

为程序员准备的7个国外社交网站

Forrst Forrest是为开发人员和设计师提供的一个新兴的地方,在这里可以分享代码和截图以及链接,启发你的灵感。如果你曾想为你的一块代码获得一些专业实诚 的建议;如果你在几个logo中没法做出决定的时候,Forrst正好适合你。此社区正…

技术网站

VC知识库:http://www.vckbase.com/; 0GiNr技术社区(我们的微型技术圈):http://krnl.info/; 看雪学院:http://bbs.pediy.com/; 在线编程挑战平台Interview Street:ht…

浏览器只有百度不能上网,其他网站上网正常

发现一个问题,困然了我几天,下班之前电脑好好的,都是正常,第二天上班,浏览器有关百度的网址全部打不开,还有部分网址也打不开,查看了host文件,更改刷新了dns,也更改了浏览…

今年2月 黑客组织Anonymous 攻陷技术公司HBGary Federal的网站,由此带来的7点教训

黑客组织Anonymous组织采用了一系列简单的技术方法和社会工程学来攻击安全技术公司HBGary Federal公司的网络,这其中涵盖的很多网络技术问题都值得其他网络安全专家借鉴。 最重要的教训就是:认真遵循企业防御基本的最佳做法。另外还可以从HBGary Federal…

建站流程

文章目录 建站流程前期准备工作登录厂商账号在管理中心下面现在进入运营中心 建站流程 前期准备工作 需要:厂商账号,前台域名…… 登录厂商账号 在管理中心下面 进入管理中心 > 用户 > 组织机构 > 全平台 填写相关信息(不知道…

关于phpStudy如何修改默认网站

#####摘要:使用过php开发项目的IT猴子90%的人都是知道有这一个本地项目搭建的圣器——phpStudy。phpStudy支持Web端管理,一键创建网站、FTP、数据库、SSL;安全管理,计划任务,文件管理,PHP多版本共存及切换&…

导入他人的网站很多页面找不到的可能原因

问题与原因:有的时候,导入他人的项目页面无法加载,报了很多404的问题,而直接根据自己实际的网站路径却能访问成功。这是因为某些网站前端加载的界面写的是绝对路径,而不同人部署的网站根目录的不同,就导致了…

NET MVC 2 多语言网站的实现

.NET MVC 2 多语言网站的实现 2010-10-24 12:26:10| 分类: .net mvc | 标签: |字号大中小 订阅 要求如下: 1,用 Resources 2,分离项目(Model , Controller 等分开成子项目) 3,简单 因为要用 Resources ,所以很…

网站架构之架构演化

网站从构建之初的很少有人问津,用户数量较少,并发量较低,到之后的拥有千万上亿用户,数万量级的高并发,之间经历了怎样的过程,小型网站架构是怎样逐步演化的,本文简单探讨下这方面的内容&#xf…

基于renren.com和google map的sns网站

基于renren.com和google map的sns网站 网站介绍及寻找合作伙伴 站点名称 网站的功能 意见及建议 支持与合作 站点名称 本网 站基于renren.com和google map的开放的api,充分利用了renren的sns属性和google map的直观视图,故网站暂定名RenrenMap 。 回…

搭建网站之路

我是在申请一个阿里云服务器之后才想起搭建网站的,哈哈,我的驱动力就是好玩。下面说下我搭建人生中中第一个网站(博客)的心里路程 1、首先申请一个服务器 我申请的是阿里云服务器,centos6.6的操作系统,1G内存,20G的磁…

打开网站工程时遇到配置bower显示404的问题。

在装了mongodb和nodejs准备打开一个网站项目时(网页包含angular),却发现,打开后网页的内容全是混乱的。然后查看nodejs的运行状况,发现有些包含bower的项目(特别是有些angular的项目)显示的是40…

Python学习记录-网站爬点句子

背景 想用python上网爬点句子,于是花一下午的时间来做这件事,这只是一个简单的例子,不过对于入坑来说nn conda使用 顺便添加一下conda的使用,之前一直是用python自带的virtualenv工具,安装了anoconda后还是觉得cond…

不同网站和页面爬虫知识点

1、json.loads()解码python json格式 json.load()加载python json格式文件 因此使用requests.get(url)和urllib.urlopen(url)获取内容的方式如下: 2、关于爬取Ajax动态加载(翻页时url不变)的网页网站 (1)中国票房网&a…

Github 无法登陆,网站超时问题

网络诊断为:电脑配置没有问题,但是该网站服务器资源无法访问。 简单点直接上解决办法:在hosts文件中添加网站IP。 在文件目录下:C:\Windows\System32\drivers\etc 中,将hosts文件复制到桌面,右键 【属性】…

基于httpd搭建web静态网站

.搭建静态网站 要求: >基于ip实现web网站访问 建立一个xxx.xxx.xxx.100的网站,文件放在/www/100,内容显示this is xxx.xxx.xxx.100. 建立一个xxx.xxx.xxx.200的网站,文件放在/www/200,内容显示this is xxx.xxx.xxx.200. 安装httpd&#x…

android源码常用网站

泡在网上的日子http://www.jcodecraeer.com/plus/list.php?tid31 2.安卓源码服务专家http://www.javaapk.com 3.伯乐在线http://hao.jobbole.com/category/android/ A5源码:http://down.admin5.com/ 安卓巴士:http://www.apkbus.com/ 当然还有开源中国&…

大规模网站架构缓存

一、前端Cache机制 1. 域名转为IP地址(域名服务器DNS缓存) 我们知道域名其实只是一个别名,真实的服务器请求地址,实际上是一个IP地址。获得IP地址的方式,就是查询DNS映射表。虽然这是一个非常简单的查询, 但…