1.redis介绍(百度来的)
Redis是一款开源的、高性能的键-值存储(key-value store),它是用ANSI C来编写。Redis的项目名是Remote Dictionary Server的缩写,但它常被称作是一款数据结构服务器(data structureserver)。Redis的键值可以包括字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)和 有序集合(sorted sets)等数据类型。 对于这些数据类型,你可以执行原子操作。例如:对字符串进行附加操作(append);递增哈希中的值;向列表中增加元素;计算集合的交集、并集与差集等。为了获得优异的性能,Redis采用了内存中(in-memory)数据集(dataset)的方式。根据使用场景的不同,你可以每隔一段时间将数据集转存到磁盘上来持久化数据,或者在日志尾部追加每一条操作命令。同时Redis还具有其它一些特性,其中包括简单的check-and-set机制、pub/sub和配置设置等,以便使得Redis能够表现得更像缓存(cache)。
2.redis--cluster redis集群Redis 集群中内置了 16384 个哈希槽(Hash-slot),当需要在Redis集群中放置一个key-value时,redis通过算法算出一个结果,然后把结果对16384求余,这样每个key都会对应一个编号在0-16383之间的哈希槽,redis会根据节点数量大致均等的将哈希槽映射到不同的节点。集群的使用公式CRC16(Key)&16383计算key属于哪个槽:HASH_SLOT = CRC16(key) mod 16384,CRC16其结果长度为16位。
以下图为列 ,3个主节点A、B、CA--0到5500哈希槽
B--5501到11000哈希槽
C--11001到16384哈希槽
a、集群中所有的master节点使用ping-pong彼此互联,内部使用二进制协议优化传输速度和宽带
b、客户端连接集群中的任一节点都可以使用
c、故障转移,master节点可以有多个slave从节点,从节点备份主节点的数据,主节点故障时,集群故障节点的从节点中选举一个为主节点
3.选举容错
选举过程是集群中所有 master 参与,如果半数以上 master 节点与 master 节点通信超过 (cluster-node-timeout),认为当前 master 节点挂掉.
4.什么集群不可用当master节点挂掉,并且此master节点没有从节点是集群不可用,这是因为16384个哈希槽的映射不完整,导致集群不可用
当集群中半数以上的master节点挂掉(不管此时是否有从节点),集群不可用,
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
redis集群介绍完毕,下面开始使用docker搭建redis集群
1.首先来一个基础镜像,centos就可以,我们可以docker pull centos 下载一个
2.准备安装redis集群所用到的安装文件
3.制作dockerfile
#基础包用的centos7
FROM centos:7.1
#镜像作者或者维护人员信息
MAINTAINER LuTshoes
#COPY命令会复制lib(lib下是安装redis所需要的tar.gz包)到容器指定的目录下面(进入容器make&&make install之后commit容器)
COPY lib /usr/local/redis-cluster
4.docker build 生成镜像
docker build -t reids:1.0 .
注意:使用此命令时,要在dockerfile文件同目录下
5.运行起来
docker run -d -p7001:7001 --name redis1 redis:1.0
进入运行的容器
docker exec -it redis1 /bin/sh
找到我们的安装包,开始行动吧
安装gcc:yum install gcc-c++
解压:tar -xf redis-3.0.2.tar.gz
Make:make MALLOC=libc
Make install
安装完成测试是否安装成功,
复制一个redis.conf配置文件
Vim修改
启动: redis-server 7001.conf
使用redis-cli客户端连接;
安装成功!
关闭: redis-cli -p 7001 shutdown
ok下面开始安装集群环境
1) 安装zlib
a) tar –zxvf zlib-1.2.8.tar.gz
b) cd zlib-1.2.8
c) ./configure
d) make
e) make install
2) 安装ruby
a) tar –zxvf ruby-2.2.2.tar.gz
b) cd ruby-2.2.2
c) ./configure -prefix=/usr/local/ruby
d) make
e) make install
f) sudo cp ruby /usr/local/bin
3) 安装rubygems
a) tar –zxvf rubygems-2.4.8.tgz
b) cd rubygems-2.4.8
c) sudo ruby setup.rb
d) sudo cp bin/gem /usr/local/bin
4) 安装ruby-redis-3.2.1.gem插件
a) gem install -l ruby-redis-3.2.1.gem
b) cp /%redis_home%/src/redis-trib.rb /usr/local/bin/redis-trib
[ 这里可能无法安装,因为无法连接gem服务器:
[@zw_22_90 src]# gem install redis --version 3.0.0
ERROR: Could not find a valid gem 'redis' (= 3.0.0) in any repository
ERROR: While executing gem ... (Gem::RemoteFetcher::FetchError)
需要手工下载并安装:
wget https://rubygems.global.ssl.fastly.net/gems/redis-3.2.1.gem
gem install -l ./redis-3.2.1.gem
全部安装完成之后,退出容器:exit,
然后commit容器:docker commit redis1 redis7001-2,生成一个新的镜像文件
以redis7001-2镜像为基础,生成3个镜像,分别映射7001-7006端口,并在容器内部配置相应的配置文件,这要就没每个redis实例的.conf文件里面的端口
Redis7001-2:容器ip为172.17.0.2,容器内有两个redis节点,开放7001和7002端口,
Redis7003-4:容器ip为172.17.0.3,容器内有两个redis节点,开放7003和7004端口,
Redis7005-6:容器ip为172.17.0.4,容器内有两个redis节点,开放7005和7006端口,
redis-server /opt/redis/7001/7001.conf
7001-7002
7003-7004
7005-7006
所有节点启动完成之后,在任意容器内执行集群创建命令即可
进入redis解压文件src目录下,注意 这几个ip是我们三个容器的ip,
./redis-trib.rb create --replicas 1172.17.0.2:7001 172.17.0.2:7002 172.17.0.3:7003 172.17.0.3:7004
172.17.0.4:7005 172.17.0.4:7006
查看集群节点信息命令:redis-cli -p 7002 cluster nodes。看到三个master节点,三个slave节点,
好的,下面见证奇迹的时刻到了,测试下
先进入7001节点,我们设置一个name,这时候集群帮我们把这个key保存到7003节点了,因为算出来的哈希槽5798在7003节点上
再来,进入7006节点get下,可以看到也是从7003节点取到的,搞定。