第一章:集群的意义
服务器集群有更多服务器提供相同服务,因此可以提供更好的并发特性,当有更多用户访问的时候,只需要向集群中加入新的机器即可。同时因为一个应用由多台服务器提供,当某台服务器发生故障时,负载均衡设备或者系统的失效转移机制会将请求转发到集群中其他服务器上,使服务器故障不影响用户使用。所以在网站应用中,即使是访问量很小的分布式应用和服务,也至少要部署两台。
第二章:Redis是什么
1、存储类别
Redis是一个NOSQL,(Nosql是非关系型数据库;mysql是关系型数据库)NOSQL有许多种,它们分为:
- 列存储,如:Hbase、Cassandra这种
- 文档存储,如:MongoDB(首推)
- key-value存储,如:Berkeley DB、MemcacheDB、Redis,其中Redis最强
- 图存储,这块基本不用,有:Neo4j、Versant
- XML存储,如:Berkeley DB Xml还有XBASE,ORACLE很早已经支持这种存储方式了
2、特点
Redis 有三个主要使其有别于其它很多竞争对手的特点:
- Redis是完全在内存中保存数据的数据库,使用磁盘只是为了持久性目的;
- Redis相比许多键值数据存储系统有相对丰富的数据类型;
- Redis可以将数据复制到任意数量的从服务器中;
3、优点
- 异常快速 : Redis是非常快的,每秒可以执行大约110000设置操作,81000个/每秒的读取操作。
- 支持丰富的数据类型 : Redis支持最大多数开发人员已经知道如列表,集合,可排序集合,哈希等数据类型。
这使得在应用中很容易解决的各种问题,因为我们知道哪些问题处理使用哪种数据类型更好解决。
- 操作都是原子的 : 所有 Redis 的操作都是原子,从而确保当两个客户同时访问 Redis 服务器得到的是更新后的值(最新值)。
- MultiUtility工具:Redis是一个多功能实用工具,可以在很多如:缓存,消息传递队列中使用(Redis原生支持发布/订阅),在应用程序中,如:Web应用程序会话,网站页面点击数等任何短暂的数据;
第三章:Redis基础应用场景
- web间session共享,即多个war工程共享一个session
- 分布式缓存,因为redis为键值对,而且它提供了丰富的adapter可以支持到C、.net、java客户端,因此对于异质平台间进行数据交换起到了作用,因此它可以用作大型系统的分布式缓存,并且其setnx的锁常被用于”秒杀“,”抢红包“这种电商活动场景中。
第四章:Redis集群搭建
1.解压
在/usr/local目录下新建myRedis2文件夹, 将 redis-3.0.4.tar.gz 放到该文件夹下
cd /usr/local/myRedis2
tar -zxvf redis-3.0.4.tar.gz
生成redis-3.0.4文件夹
2.编译安装
cd redis-3.0.4
make && make install
3.检测是否安装成功
cd src
./redis-server
如上图:Redis的默认端口号是6379
至此,Redis已经安装完成。
启动redis服务进程后,就可以使用测试客户端程序redis-cli和redis服务交互了。 比如:
4.Redis集群的搭建
创建redis-cluster 文件夹
mkdir /usr/local/myRedis2/redis-cluster
cd /usr/local/myRedis2/redis-cluster
创建7000到7005 文件夹
mkdir 7000
mkdir 7001
mkdir 7002
mkdir 7003
mkdir 7004
mkdir 7005
将redis.conf 和redis-server复制到7000目录下,
cp/usr/local/myRedis2/redis-3.0.4/redis.conf/usr/local/myRedis2/redis-cluster/7000
cp/usr/local/myRedis2/redis-3.0.4/src/redis-server/usr/local/myRedis2/redis-cluster/7000
效果如图
修改配置文件中的下列选项:
vi redis.conf
指定Redis监听端口,默认端口为6379,作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字
a) port 7000
//Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
b) daemonize yes //启用或停用集群
c) cluster-enabled yes //cluster配置文件
d) cluster-config-filenodes.conf //节点与故障节点通信超过该时间,则认为该节点故障
e) cluster-node-timeout 5000 //指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。
f) appendonly yes
将redis.conf和redis-server复制粘贴到7001~7005目录下
修改redis.conf中的port,对应各自文件名7001~7005
启动其中该6个实例,
cd /usr/local/myRedis2/redis-cluster/7000
./redis-server ./redis.conf
如果需要关闭某个实例的话,例如关闭7000端口的redis,如下
redis-cli -p 7000 shutdown
查看实例启动情况:
ps -ef|grep redis
结果如下图所示,代表实例启动成功:
进入src目录:
cd /usr/local/myRedis2/redis-3.0.4/src
执行redis的创建集群命令创建集群
1、redis-trib.rb的create子命令构建, 这表示我们希望创建一个新的集群。
2、replicas则指定了为Redis Cluster中的每个Master节点配备几个Slave节点
3、节点角色由顺序决定,先master之后是slave
./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
或
./redis-trib.rb create --replicas 1 10.10.11.252:7000 10.10.11.252:7001 10.10.11.252:7002 10.10.11.252:7003 10.10.11.252:7004 127.0.0.1:7005
(注意:前者,实际上集群可以成功建立,但利用jedis访问时,实际jedisClusterNodes.add(newHostAndPort("10.10.11.252", 7000));此时控制台会报 Too many Cluster redirections?的错误。)
但是,执行上一步,会报错,这里需要安装ruby环境(版本在1.8.7 以上),首先安装ruby,
sudo yum install ruby
查看状态
ruby -v
安装ruby组件:
yum install rubygems
检查是安装rubygems:
rpm -qa|grep ruby
还缺少redis和ruby的接口,使用gem 安装
gem install redis
再次执行
./redis-trib.rb create --replicas 1 10.10.11.252:7000 10.10.11.252:7001 10.10.11.252:7002 10.10.11.252:7003 10.10.11.252:7004 127.0.0.1:7005
正常如下图所示
输入yes,然后配置完成,如下图
这表示集群中的 16384个槽都有至少一个主节点在处理,集群运作正常。
当前,是部署在同一个centos下(即同一个服务器下)。注意观察主从的配置:默认是前三个节点 7000 7001 7002 是主(Master),后3个节点7003 7004 7005 是从(slave)。
至此,redis集群搭建完成。
5.集群启动顺序
首先,务必关闭centos7的防火墙,否则JedisClusterjc = new JedisCluster(jedisClusterNodes);速度会非常慢,同时redisClient.jar无法访问。
systemctldisable firewalld.service #禁止firewall开机启动
firewall-cmd–state #查看防火墙状态
执行顺序
su root
cd /usr/local/myRedis2/redis-cluster
./gcCluster.sh
./startCluster.sh
./redis-trib.sh
集群至此,启动成功(相关脚本代码,见文末附录)。
另:
1) 如果需要关闭某个实例的话,例如关闭7000端口的redis,如下
redis-cli -p 7000 shutdown
2) 进入某一个集群:
redis-cli -c -p 7000
flushdb #清空当前数据库
3) 查看实例启动情况:
ps -ef|grep redis
4) 集群搭建成功后,查看主从关系
redis-cli -c -p 7000 cluster nodes
6.其他Redis集群方案
6.1 twemproxy
Twemproxy是一个使用C语言编写、以代理的方式实现的、轻量级的Redis代理服务器,它通过引入一个代理层,将应用程序后端的多台Redis实例进行统一管理,使应用程序只需要在Twemproxy上进行操作,而不用关心后面具体有多少个真实的Redis或Memcached实例,从而实现了基于Redis和Memcached的集群服务。当某个节点宕掉时,Twemproxy可以自动将它从集群中剔除,而当它恢复服务时,Twemproxy也会自动连接。由于是代理,所以Twemproxy会有微小的性能损失。根据 Redis作者的测试结果,在大多数情况下,Twemproxy的性能相当不错,同直接操作Redis相比,最多只有20%的性能损失。Twemproxy遵循Apache License 2.0开源协议发布,更多关于Twemproxy的信息请登录其在GitHub的主页查看。
6.2 codis
6.2.1 codis简介
Codis是豌豆荚使用Go和C语言开发、以代理的方式实现的一个Redis分布式集群解决方案,且完全兼容Twemproxy。Twemproxy对于上一层的应用来说, 连接Codis Proxy(Redis代理服务)和连接原生的Redis服务器没有明显的区别,上一层应用能够像使用单机的 Redis一样对待。Codis底层会处理请求的转发、不停机的数据迁移等工作, 所有底层的一切处理, 对于客户端来说是透明的。总之,可以简单的认为后台连接的是一个内存无限大的Redis服务。
6.2.2 codis组成
Codis主要包含Codis Proxy(codis-proxy)、Codis Manager(codis-config)、Codis Redis(codis-server)和ZooKeeper四大组件,每个部分都可动态扩容。
codis-proxy :客户端连接的Redis代理服务,本身实现了Redis协议,表现很像原生的Redis (就像 Twemproxy)。一个业务可以部署多个 codis-proxy,其本身是无状态的。
codis-config:Codis 的管理工具,支持添加/删除Redis节点、添加/删除Proxy节点、发起数据迁移等操作。codis-config自带了一个http server,会启动一个dashboard,用户可以在浏览器上观察 Codis 集群的运行状态。
codis-server:Codis 项目维护的一个Redis分支,加入了slot的支持和原子的数据迁移指令。
ZooKeeper:Codis依赖ZooKeeper来存放数据路由表和codis-proxy节点的元信息,codis-config发起的命令会通过 ZooKeeper同步到各个存活的codis-proxy。
第五章:附录
1、startCluster.sh脚本
#! /bin/sh
cd /usr/local/myRedis2/redis-cluster/7000
./redis-server ./redis.conf
cd /usr/local/myRedis2/redis-cluster/7001
./redis-server ./redis.conf
cd /usr/local/myRedis2/redis-cluster/7002
./redis-server ./redis.conf
cd /usr/local/myRedis2/redis-cluster/7003
./redis-server ./redis.conf
cd /usr/local/myRedis2/redis-cluster/7004
./redis-server ./redis.conf
cd /usr/local/myRedis2/redis-cluster/7005
./redis-server ./redis.conf
ps -ef|grep redis
2、stopCluster.sh脚本
#! /bin/sh
redis-cli -p 7000 shutdown
redis-cli -p 7001 shutdown
redis-cli -p 7002 shutdown
redis-cli -p 7003 shutdown
redis-cli -p 7004 shutdown
redis-cli -p 7005 shutdown
ps -ef|grep redis
#! /bin/sh
cd /usr/local/myRedis2/redis-cluster/7000
rm -rf appendonly.aof dump.rdb nodes.conf
cd /usr/local/myRedis2/redis-cluster/7001
rm -rf appendonly.aof dump.rdb nodes.conf
cd /usr/local/myRedis2/redis-cluster/7002
rm -rf appendonly.aof dump.rdb nodes.conf
cd /usr/local/myRedis2/redis-cluster/7003
rm -rf appendonly.aof dump.rdb nodes.conf
cd /usr/local/myRedis2/redis-cluster/7004
rm -rf appendonly.aof dump.rdb nodes.conf
cd /usr/local/myRedis2/redis-cluster/7005
rm -rf appendonly.aof dump.rdb nodes.conf
4、redis-trib.sh脚本
#! /bin/sh
cd /usr/local/myRedis2/redis-3.0.4/src
./redis-trib.rb create --replicas 1 10.10.11.252:7000 10.10.11.252:7001 10.10.11.252:7002 10.10.11.252:7003 10.10.11.252:7004 127.0.0.1:7005