redis cluster集群搭建

一、环境准备

采用的Vmware pro 12虚拟机,创建一个centos7最小化版本节点,在上面安装redis-4.0.6,再复制两个redis实例。然后通过vmware克隆一个新的节点。从而保证三主三从共6个redis实例。

二、操作步骤

1.在每台centos机器的/usr/local文件夹下创建redis-cluster文件夹作为redis集群根目录
cd /usr/local && mkdir redis-cluster
2.在redis-cluster文件夹下安装3个redis实例,主要是将源码包里的redis.conf拷贝过来,修改几个参数,如下
port  7000           //自定义每个redis实例端口如7000~7006 
protected-mode no    //默认保护模式yes,修改为no       
#bind 127.0.0.1      //默认安全保护,只能访问本机
daemonize    yes              //redis后台运行
cluster-enabled  yes         //开启集群  把注释#去掉
#下面项实验时未进行设置
pidfile  ./redis_7000.pid     //pidfile文件对应7000,7001,7002
cluster-config-file  nodes_7000.conf   //集群的配置  配置文件首次启动自动生成 7000,7001,7002
cluster-node-timeout  15000    //请求超时  默认15秒,可自行设置
appendonly  yes              //aof日志开启  有需要就开启,它会每次写操作都记录一条日志
3.将源码包里的ruby脚本redis-trib.rb拷贝到redis-cluster文件夹下
cp redis-trib.rb /usr/local/redis-cluster/
4.安装ruby环境
yum -y install ruby ruby-devel rubygems rpm-build
gem install redis
5.启动每个redis实例
redis-server redis.conf
ps 检查进程: ps -ef|grep redis
6.执行ruby脚本
redis-trib.rb create --replicas 1 192.168.1.80:7000 192.168.1.80:7001 192.168.1.80:7002 192.168.1.81:7003 192.168.1.81:7004 192.168.1.81:7005

如果提示:All 16384 slots covered,表示集群启动成功

三、碰到的坑

1.centos7无法访问外网
我这里宿主机用的win10 + wifi上网
1)首先在宿主机cmd 
ipconfig /all  
查看本机网路情况,要记录下本机的ip和dns,后面centos7要用
2)然后vmware 虚拟网络编辑器选择的Nat模式,注意子网IP要设置跟宿主机ip不是一个网段,如宿主机ip:192.168.10.155,那么这里VMnet8的ip可以设置192.168.1.0,子网:255.255.255.0;nat设置里设置网关与VMnet8的ip同网段,末尾只要与它ip不一致并且不是0就行,如192.168.1.2.
记住这个网关,因为后面centos设置网络配置文件时,里面的gateway就是写的这个。
对于端口转发,我设置了一个22端口,不知道有没有用~...
主机端口 22 类型 tcp 虚拟机IP地址 宿主机ip:22 
这里宿主机ip就是cmd里记得 192.168.10.155
3)在修改/etc/sysconfig/network-scripts/ifcfg-e***文件,如ifcfg-eno16777736或者ifcfg-etho33,主要修改一下几项:
    BOOTPROTO=static #选项还有dhcp:自动分配ip,这里是指定静态ip,防止重启ip变化
    IPADDR=192.168.1.80 #这里要设置的ip要跟vmnet8设置的网关一个网段
    NETMASK=255.255.255.0 #指定子网掩码
    ONBOOT=yes #centos启动就自动网络连接
    #另外我碰到一个重启网络服务,dns重置的问题,将dns配置以/etc/resolv.conf为主,这里另外设置的
    PEERDNS=no
    NM_CONTROLLED="no"
4)设置/etc/resolv.conf
nameserver 219.141.136.10 #这里就是cmd记录的宿主机网关
    #google dns
    nameserver 8.8.8.8
    nameserver 4.4.4.4
如果报错:failed to start lsb:bring up/down networking.
解决办法:将NetworkManager关掉
systemctl stop NetworkManager
systemctl disable NetworkManager
Removed symlink /etc/systemd/system/multi-user.target.wants/NetworkManager.service.
Removed symlink /etc/systemd/system/dbus-org.freedesktop.NetworkManager.service.
Removed symlink /etc/systemd/system/dbus-org.freedesktop.nm-dispatcher.service.
重新启动网络:
systemctl start network.service
ifconfig |grep eno
如果克隆的centos找不到ip,则按照以下步骤解决:
1.由于在CentOS7-1中,我关闭了NetworkManager.service服务,并设置了开机不启动。再CentOS7-2中,先开启NetworkManager服务。
# systemctl start NetworkManager.service
2.使用ifconfig或者 ip addr查看网卡信息,发现一个名为ens33的网卡。记下MAC地址,例如00:0c:29:84:13:a1
3.进入目录/etc/sysconfig/netowrk-scripts中。将ifcfg-eno16777736改名为ifcfg-ens33。
# mv ifcfg-eno16777736 ifcfg-ens33
4.修改ifcfg-ens33
# vi ifcfg-ens33
TYPE="Ethernet"
BOOTPROTO="static"
NAME="ens33"
HWADDR="00:0c:29:84:13:a1"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.1.81
NETMASK=255.255.255.0
GATEWAY=192.168.1.2
DNS1=219.141.136.10
5.删除文件 
# rm -f /etc/udev/rules.d/90-eno-fix.rules
6.关闭NetworkManager服务, 
# systemctl stop NetworkManager.service
7.重启网络服务
# systemctl restart network.service

ps 防火墙都是禁用状态

systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service  #禁止开机启动
至此,centos机应该访问外网

2.gem install redis,发现redis需要的ruby版本要大于2.2.0

解决办法是 先安装rvm,再把ruby版本提升至2.3.3
1.安装curl
sudo yum install curl
2. 安装RVM
curl -L get.rvm.io | bash -s stable 
3. 
source /usr/local/rvm/scripts/rvm
4. 查看rvm库中已知的ruby版本
rvm list known
5. 安装一个ruby版本
rvm install 2.3.3
6. 使用一个ruby版本
rvm use 2.3.3
7. 设置默认版本
rvm remove 2.0.0
8. 卸载一个已知版本
ruby --version
9. 再安装redis就可以了
gem install redis

四、集群命令

1.创建集群

redis-trib.rb create --replicas 1 192.168.1.80:7000 192.168.1.80:7001 192.168.1.80:7002 192.168.1.81:7003 192.168.1.81:7004 192.168.1.81:7005
其中:create //表示创建集群功能
--replicas 1 //表示为每个主节点自动分配一个从节点.也就是自动分配三个主节点和三个从节点.

2.查看集群状态
登录客户端 redis-cli -p 7002(可以任意一个)

cluster info 

3.查看集群节点信息
登录客户端 redis-cli -p 7002(可以任意一个)

cluster nodes

4.检查集群状态
5.修复集群状态
6.增加redis节点
1) 创建两个实例目录,一个实例做为新节点的主实例,一个实例做为新节点的从实例
2)修改相应的redis.conf,修改端口等信息
3)启动这两个实例
4)增加节点

redis-trib.rb add-node 192.168.1.81:7007 192.168.1.80:7001
PS:这个IP:PORT可以是集群里边儿任意一个主节点的IP和端口
redis-cli -c -p 7002 cluster nodes
36d53c7f1896838249c0b4afdcf680bac2f4ec2e 192.168.1.81:7007 master - 0 1463476564369 0 connected

发现7007这个实例已经做为主节点加到集群里边儿来了.

5)7008做为7007的从节点也加入到集群里边儿来, 注意记住7007这个主节点的节点id.从节点加入到集群的时候要用到.

redis-trib.rb add-node --slave --master-id 36d53c7f1896838249c0b4afdcf680bac2f4ec2e 192.168.1.81:7008 192.168.1.80:7001

6)重新分片

redis-trib.rb reshard 192.168.1.80:7001
//PS: 这条命令是交互的,按照提示操作即可.
How many slots do you want to move (from 1 to 16384)?4096  //输入一个数,这个4096表示迁移多少个slots数
What is the receiving node ID? 36d53c7f1896838249c0b4afdcf680bac2f4ec2e //输入目标节点ID,表示迁移到哪个目标节点
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1:all //输入all表示从老的所有节点进行重分配,凑够4096个slots给到新节点.
也可以输入源节点id, 可以输入多个源节点id,最后输入done.就开始从你输入的源节点id的节点进行迁移了.

7.删除redis节点(主节点 7001)
首先必须确保这个节点没有拥有任何一个slots
1)查看集群节点信息

redis-cli -c -p 7002 cluster nodes
a2eee0ea546f2c3701b08981737c07938039857c 192.168.1.80:7001 master - 0 1463477001334 1 connected 1365-5460

2)重新分片

redis-trib.rb reshard 192.168.1.80:7001
How many slots do you want to move (from 1 to 16384)?16384 //输入一个大于或等于7001节点所拥有的slots数的数即可.
What is the receiving node ID? 8ab3d14eba181c06dc8826bea0db1becdead2533 //接收这些slots的目标节点,这里是7002节点
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1:a2eee0ea546f2c3701b08981737c07938039857c //因为我们要删除7001这个节点,所以源节点的id就是7001的节点ID
Source node #2:done //输入done,回车,就会开始从7001 这个节点迁移16384个slot(没有这么多就迁移拥有的全部)到7002节点中去.

再看各个节点的状态

redis-cli -c -p 7002 cluster nodes 
a2eee0ea546f2c3701b08981737c07938039857c 192.168.1.80:7001 master - 0 1463477349186 1 connected

7001 已经没有分配slots了,可以从集群中删除了.

redis-trib.rb del-node 192.168.1.80:7002 a2eee0ea546f2c3701b08981737c07938039857c      
ps: 这个主节点被删除之后,它之前拥有的从节点会自动成为其他主节点的从节点                       

五、原理

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

六、cache集群方案对比

  1. Twemproxy – Twitter
  2. Codis – 豌豆荚
  3. Redis Cluster – 官方

twemproxy

架构图:
twemproxy架构

优点:

  • 开发简单,对应用几乎透明
  • 历史悠久,成熟
    缺点:
  • 代理影响性能
  • lvs和twemproxy会有节点性能瓶颈
    • redis扩容非常麻烦
    • twitter内部已放弃使用该方案,新使用的架构未开源

Codis:

架构图
codis架构图

ZooKeeper:
    存放路由表和代理节点元数据
    分发Codis-Config的命令
Codis-Config :
    集成管理工具,有web界面
Codis-Proxy :
    无状态代理,兼容Redis协议
    对业务透明
Codis-Redis:
    基于2.8版本,二次开发
    加入slot支持和迁移命令

优点:
- 开发简单,对应用几乎透明
- 性能比Twemproxy好
- 有图形化界面,扩容容易,运维方便
缺点:
- 代理依旧影响性能
- 组件过多,需要很多机器资源
- 修改了redis代码,导致和官方无法同步,新特性跟进缓慢
- 开发团队准备主推基于redis改造的reborndb

Redis Cluster:

架构图:
redis cluster

P2P模式,无中心化
把key分成16384个slot
每个实例负责一部分slot
客户端请求若不在连接的实例,该实例会转发给对应的实例。
通过Gossip协议同步节点信息

优点:
- 组件all-in-box,部署简单,节约机器资源
- 性能比proxy模式好
- 自动故障转移、Slot迁移中数据可用
- 官方原生集群方案,更新与支持有保障
缺点:
- 架构比较新,最佳实践较少
- 多键操作支持有限(驱动可以曲线救国)
- 为了性能提升,客户端需要缓存路由表信息
- 节点发现、reshard操作不够自动化

七、总结

redis支持少量数据存储,可以全部以in-momery方式支持高速访问,同时支持数据落地的功能。
redis集群可以支持存储海量数据,支持分布式横向拓展,数据一致性保证。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
天猫商城是一个基于SSM框架的综合性B2C电商平台,需求设计主要参考天猫商城的购物流程:用户从注册开始,到完成登录,浏览商品,加入购物车,进行下单,确认收货,评价等一系列操作。 作为模拟天猫商城系统的核心组成部分之一,采用SSM框架的天猫数据管理后台包含商品管理,订单管理,类别管理,用户管理和交易额统计等模块,实现了对整个商城的一站式管理和维护。本课程是一门专业的Java微服架构开发实战课程,主要讲解了当下流行的SpringBoot框架、SpringCloud架构以及与第三方技术整合开发实战内容。通过本课程的学习,能够理解并掌握SpringBoot的基础知识,同时能够掌握SpringBoot与常用的第三方技术整合实现实际开发中的业务需求,包括实现Web开发、数据访问、缓存管理、安全管理、消息服务、任务管理等;了解并掌握SpringCloud微服务架构的基础知识及相关组件的应用,掌握微服务架构在企业级开发的实践,建立起微服架构思想。项目技术栈:采用SpringBoot简化商城系统的初始搭建以及开发过程采用SpringMVC+Spring+IBatis完成项目的整合采用Mysql作为数据库存储,Druid配置数据库连接池采用SpringCloud+Netflix 微服务技术栈的实战开发使用Redis完成缓存的数据存储,搭建Redis搭建主从、哨兵、集群应用,保证Redis的高可用使用ElasticSearch全文检索系统进行商品数据搜索,使用ElasticSearch搭建搜索服务的高可用使用Ngnix实现页面动静分离与负载均衡的配置采用FastDFS文件储存系统文件存储,完成广告图片、商品图片的上传和存储系统使用采用CAS+shiro单点登录系统实现用户认证使用ECharts根据后台查询数据生成图表使用POI实现了商城盈利状况的Excel表格导出。商品的详情页使用Thymeleaf完成页面静态化,减少页面数据展示延迟项目中使用SpringBoot下的Aop + 自定义注解完成用户行为记录,日志采集后台管理系统使用Shiro实现登录验证和权限管理(超级管理员、管理员、产品编辑员)项目整合微信完成订单的支付使用Redission完成分布式锁,生成订单的编号使用SpringCloud Alibaba Seat完成下订单模块的分布式事务(新增订单表,库存减少,库存超卖设计)使用RabbitMQ 做消息队列,完成订单未支付自动取消和模块直接的解耦合使用Quartz任务调度,完成缓存的定时刷新,保证缓存的一致性使用本地消息表机制完成消息然队列RabbitMQ消息可靠性传输订单支付模块使用微信扫码支付,并设置订单超时自动取消通过Jquery实现前端校验,通过基于Hibernate的Valida注解实现后端的校验功能使用Base64编码对Json数据传输进行编码和解码项目使用RESTful设计风格实现资源的访问,实现前后端分离项目使用聚合数据第三方短信平台完成用户的登陆功能项目使用SpringBoot整合JavaMail完成邮件的发送项目使用SpringBoot整合Swagger2生成接口文档使用PostMan完成接口的测试项目的测试:SpringTest、dbunit、EasyMock使用Docker 进行应用的自动化打包和发布、自动化测试和持续集成、部署和调整其他应用使用 PowerDesigner,完成数据库的建模项目使用禅道进行BUG管理环境采用Maven实施多模块项目构建,采用Git进行项目版本管理 架构解读:  项目部分截图:              讲义部分截图:          
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值