1 redis的安装

1.1   安装redis

版本说明

本教程使用redis3.0版本。3.0版本主要增加了redis集群功能。

安装的前提条件:

需要安装gcc:yum install gcc-c++

1、下载redis的源码包。

2、把源码包上传到linux服务器

3、解压源码包

tar -zxvf redis-3.0.0.tar.gz

4、Make

5、Make install

[root@bogon redis-3.0.0]# make install PREFIX=/usr/local/redis

1.2   启动redis

1、前端启动模式

/usr/local/redis/bin/redis-server

默认是前端启动模式,端口是6379

2、后端启动

1)从redis的源码目录中复制redis.conf到redis的安装目录。

2)修改配置文件

3)[root@bogon bin]# ./redis-server redis.conf

1.3   Redis常用命令

./redis-cli 

127.0.0.1:> set a 

OK

127.0.0.1:> get a

""

1.4   Java代码测试redis,需使用jedis.jar

import java.util.HashSet;

import org.junit.Test;

import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPool;
/**
* 测试jedis,redis的客户端,想连接到虚拟机中的redis-server需要关闭iptables
* 执行:service iptables stop
* @author HELLXZ
* @date 创建时间:2017年8月17日 上午8:41:05
*/
public class testJedis { @Test
//单机测试
public void testJedis(){
Jedis jedis = new Jedis("192.168.25.133", 6379);
jedis.set("haha", "helloworld!");
String string = jedis.get("haha");
System.out.println(string);
jedis.close();
} @Test
//池测试
public void testJedisPool(){
JedisPool jedisPool = new JedisPool("192.168.25.133", 6379);
Jedis resource = jedisPool.getResource();
resource.set("hei", "ha");
String string = resource.get("hei");
System.out.println(string);
resource.close();
//关闭连接池
jedisPool.close();
}
}

1.4.1   此处的坑

代码测试显示失败,连接失败,想了一阵,以为是bind的ip地址不对,修改redis.conf的bind的ip,测试没有用。

然后百度发现问题在于虚拟机使用的cent6.4的防火墙还开着,关闭后测试通过。

cent7以下用到的防火墙是iptables,关闭防火墙代码如下

关闭防火墙命令:
service iptables stop
永久关闭防火墙:
chkconfig iptables off

cent7以上关闭命令:

systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动

1.5   常用数据类型

1) String

2) Hash

3) List

4) Set

5) SortedSet

其中1)2)最常用

2   Redis集群的搭建

2.1   Redis集群相关概念

2.1.1   redis-cluster架构图

集群基础知识:

redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value

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

Key:a

计算a的hash值,例如值为100,100这个槽在server1上,所以a应该放到server1.

Key:hello

Hash值:10032,此槽在server2上。Hell可以应该存在server2.

2.1.2   redis-cluster投票:容错

(1)领着投票过程是集群中所有master参与,如果半数以上master节点与master节点通信超过(cluster-node-timeout),认为当前master节点挂掉.

(2):什么时候整个集群不可用(cluster_state:fail)?

a:如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完成时进入fail状态. ps : redis-3.0.0.rc1加入cluster-require-full-coverage参数,默认关闭,打开集群兼容部分失败.

b:如果集群超过半数以上master挂掉,无论是否有slave集群进入fail状态.

ps:当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误

2.2   我们的集群结构

集群中有三个节点的集群,每个节点有一主一备。需要6台虚拟机。

搭建一个伪分布式的集群,使用6个redis实例来模拟。

2.3   搭建集群需要的环境

搭建集群需要使用到官方提供的ruby脚本。

需要安装ruby的环境。

安装ruby

yum install ruby

yum install rubygems

redis集群管理工具redis-trib.rb

[root@bogon ~]# cd redis-3.0.0

[root@bogon redis-3.0.0]# cd src

[root@bogon src]# ll *.rb

-rwxrwxr-x. 1 root root 48141 Apr  1 07:01 redis-trib.rb

[root@bogon src]#

脚本需要的ruby包

需要上传到linux服务。

安装ruby的包

gem install redis-3.0..gem

显示情况如下:

[root@bogon ~]# gem install redis-3.0.0.gem

Successfully installed redis-3.0.0

1 gem installed

Installing ri documentation for redis-3.0.0...

Installing RDoc documentation for redis-3.0.0...

2.4   集群的搭建

第一步:创建6个redis实例,端口号从7001~7006

创建实例举例第一个,后边相同,复制改名文件夹,配置文件改端口号即可:

cd /usr/local/redis #进入redis安装路径

cd bin

rm -rf dump.db  #删除缓存的数据库

cd ..

cp bin ../redis-cluster/redis01 #复制bin并重命名到redis-cluster目录下

#此时redis_cluster 中已经有一个redis01的实例文件夹了,
#此时可以先修改一下配置文件,比如:修改端口号,开启cluster-enabled yes
#然后 各种复制这个文件夹,创建6个实例
cp redis01 redis02
cp redis01 redis03
cp redis01 redis04
cp redis01 redis05
cp redis01 redis06
#之后参考第二步把没有修改的端口号改正确即可

第二步:修改redis.conf(这些都在redis01~06中,都需要修改!)

  1) 修改端口号

  2) 打开cluster-enable前面的注释。

第三步:把创建集群的ruby脚本(redis-trib.rb)从redis安装路径下的src路径,复制到redis-cluster目录下。

cd /usr/local/redis/src

cp *.rb /usr/local/redis-cluster

第四步:启动6个redis实例,删除dump.db文件,打开redis.conf更改端口号,开启cluster-enabled yes

创建脚本  vim startall.sh 输入如下并保存

 cd redis01
./redis-server redis.conf
cd ..
cd redis02
./redis-server redis.conf
cd ..
cd redis03
./redis-server redis.conf
cd ..
cd redis04
./redis-server redis.conf
cd ..
cd redis05
./redis-server redis.conf
cd ..
cd redis06
./redis-server redis.conf

此处保存完毕,chmod +x startall.sh授权,一定要 ./startall.sh 执行,然后再继续操作!

查看状态   ps aux|grep redis

第五步:创建集群。具体ip为虚拟机设置的ip,请注意

./redis-trib.rb create --replicas 1 192.168.25.133:7001 192.168.25.133:7002 192.168.25.133:7003 192.168.25.133:7004 192.168.25.133:7005  192.168.25.133:7006

接下来会弹一堆代码。看看就好,后边需要输入请求yes继续执行

[root@bogon redis-cluster]# ./redis-trib.rb create --replicas  192.168.25.133: 192.168.25.133: 192.168.25.133: 192.168.25.133: 192.168.25.133:  192.168.25.133:
>>> Creating cluster
Connecting to node 192.168.25.133:: OK
Connecting to node 192.168.25.133:: OK
Connecting to node 192.168.25.133:: OK
Connecting to node 192.168.25.133:: OK
Connecting to node 192.168.25.133:: OK
Connecting to node 192.168.25.133:: OK
>>> Performing hash slots allocation on nodes...
Using masters:
192.168.25.133:
192.168.25.133:
192.168.25.133:
Adding replica 192.168.25.133: to 192.168.25.133:
Adding replica 192.168.25.133: to 192.168.25.133:
Adding replica 192.168.25.133: to 192.168.25.133:
M: 5a8523db7e12ca600dc82901ced06741b3010076 192.168.25.133:
slots:- ( slots) master
M: bf6f0929044db485dea9b565bb51e0c917d20a53 192.168.25.133:
slots:- ( slots) master
M: c5e334dc4a53f655cb98fa3c3bdef8a808a693ca 192.168.25.133:
slots:- ( slots) master
S: 2a61b87b49e5b1c84092918fa2467dd70fec115f 192.168.25.133:
replicates 5a8523db7e12ca600dc82901ced06741b3010076
S: 14848b8c813766387cfd77229bd2d1ffd6ac8d65 192.168.25.133:
replicates bf6f0929044db485dea9b565bb51e0c917d20a53
S: 3192cbe437fe67bbde9062f59d5a77dabcd0d632 192.168.25.133:
replicates c5e334dc4a53f655cb98fa3c3bdef8a808a693ca
Can I set the above configuration? (type 'yes' to accept): yes

输入yes之后继续,接下来的代码到join...需要耐心等待,如果出现一两行的省略号,那么很遗憾,可能前边你的./startall.sh没有启动!!!ctrl+c关闭当前,删除各个文件夹中生成的dump.db,然后启动脚本./startall.sh,重复上述操作即可成功!

>>> 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 192.168.25.133:)
M: 5a8523db7e12ca600dc82901ced06741b3010076 192.168.25.133:
slots:- ( slots) master
M: bf6f0929044db485dea9b565bb51e0c917d20a53 192.168.25.133:
slots:- ( slots) master
M: c5e334dc4a53f655cb98fa3c3bdef8a808a693ca 192.168.25.133:
slots:- ( slots) master
M: 2a61b87b49e5b1c84092918fa2467dd70fec115f 192.168.25.133:
slots: ( slots) master
replicates 5a8523db7e12ca600dc82901ced06741b3010076
M: 14848b8c813766387cfd77229bd2d1ffd6ac8d65 192.168.25.133:
slots: ( slots) master
replicates bf6f0929044db485dea9b565bb51e0c917d20a53
M: 3192cbe437fe67bbde9062f59d5a77dabcd0d632 192.168.25.133:
slots: ( slots) master
replicates c5e334dc4a53f655cb98fa3c3bdef8a808a693ca
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All slots covered.
[root@bogon redis-cluster]#

至此,redis集群搭建完成

每个redis集群的节点都是会互相ping pong 的,接下来我们测试一下

#结尾的-c一定要写!不然会出现move失败的错误!
[root@bogon redis-cluster]# redis01/redis-cli -h 192.168.25.133 -p  -c #结尾的-c一定要写!不然会出现move失败的错误!

[root@bogon redis-cluster]# redis01/redis-cli -h 192.168.25.133 -p
192.168.25.133:> set a
(error) MOVED 192.168.25.133:
192.168.25.133:>
[root@bogon redis-cluster]# redis01/redis-cli -h 192.168.25.133 -p -c
192.168.25.133:> set a
-> Redirected to slot [] located at 192.168.25.133:
OK
192.168.25.133:>

2.5 java代码测试集群

 @Test
public void testJedisCluster() {
HashSet<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort("192.168.25.133", 7001));
nodes.add(new HostAndPort("192.168.25.133", 7002));
nodes.add(new HostAndPort("192.168.25.133", 7003));
nodes.add(new HostAndPort("192.168.25.133", 7004));
nodes.add(new HostAndPort("192.168.25.133", 7005));
nodes.add(new HostAndPort("192.168.25.133", 7006)); JedisCluster cluster = new JedisCluster(nodes); cluster.set("key1", "1000");
String string = cluster.get("key1");
System.out.println(string); cluster.close();
}

2.6   关闭redis集群(节点)

有开启自然有关闭,比较麻烦,一般的教程里没写,先cd到redis-cluster/,也可以把以下代码装进脚本如:vim shutdownall.sh,保存后chmod +x shutdownall.sh ,执行的时候./shutdownall.sh即可

redis01/redis-cli -p  shutdown

redis02/redis-cli -p  shutdown

redis03/redis-cli -p  shutdown

redis04/redis-cli -p  shutdown

redis05/redis-cli -p  shutdown

redis06/redis-cli -p  shutdown

 

2.7   重启redis集群(节点)

回忆我们创建redis集群的时候是create的cluster,那么重启呢?其实重启更简单!完全无需我们在create一个新的cluster!百度一会了,发现几乎没有解决方案,或者有解决方案的没有技术分享,不多说,直接说结论:

我们创建了集群之后,集群已经存在了,无需创建,仅仅重启各个节点就可以运行了!本文上边有提到startall.sh脚本的创建,只需执行那个脚本就启动了集群了!

./startall.sh

-------本文理论部分来自传智黑马授课笔记,仅作记录,实际操作的部分以及笔记中不全的步骤在这里得以补全,添加自认为会坑的细节。不喜勿喷。

无法连接的bug解决引用自:

http://blog.csdn.net/skymouse2002/article/details/52279553

redis安装、测试&集群的搭建&踩过的坑的更多相关文章

  1. Redis 3.0集群 Window搭建方案

    Redis 3.0集群 Window搭建方案 1.集群安装前准备 安装Ruby环境,安装:rubyinstaller-2.3.0-x64.exe http://dl.bintray.com/onecl ...

  2. spark1.3.1安装和集群的搭建

    由于越来越多的人开始使用spark计算框架了,而且spark计算框架也是可以运行在yarn的平台上,因此可以利用单个集群,运行多个计算框架.这是一些大公司都是这么干的.好了,下面讲一下spark1.3 ...

  3. redis单机版和集群版搭建笔记-简略版

    搭建单机版: 解压 tar -zxf redis-3.0.0.tar.gz 编译 cd redis-3.0.0 安装 make install prefix=/usr/local/redis-inst ...

  4. Redis Cluster 伪集群的搭建

    简介 为何要搭建Redis集群?Redis是在内存中保存数据的,而我们的电脑一般内存都不大,这也就意味着Redis不适合存储大数据,适合存储大数据的是Hadoop生态系统的Hbase或者是MogoDB ...

  5. redis单机及其集群的搭建

    http://www.cnblogs.com/mouseIT/p/5288204.html

  6. nacos集群模式搭建踩坑记录

    首先数据库使用的本地的mysql 1.看日志提示no set datasource,使用虚拟机ping本地后发现无法ping通,原因是本地没有关闭防火墙. 2.看日志提示不允许建立数据库连接,原因是r ...

  7. centos安装zabbix集群监控(亲测无坑版)

    一. 安装lemp环境 下载安装包:wget bbs.linuxtone.org/docs/autoinstall/lemp_auto_v1.0.6.tar.gz 包解压:tar zxvf lemp_ ...

  8. 安装zookeeper集群

    zookeeper集群的安装   顾名思义zookeeper就是动物园管理员,他是用来管hadoop(大象).Hive(蜜蜂).pig(小猪)的管理员, Apache Hbase和 Apache So ...

  9. 大数据平台搭建-zookeeper集群的搭建

    本系列文章主要阐述大数据计算平台相关框架的搭建,包括如下内容: 基础环境安装 zookeeper集群的搭建 kafka集群的搭建 hadoop/hbase集群的搭建 spark集群的搭建 flink集 ...

随机推荐

  1. CAS在Java类中的应用

    CAS 这个指令全称 compare and swap 即比较替换指令,在现代处理器新加入的指令.指导思想:基于乐观锁机制.比较一个变量在内存值中的值和变量的当前值(旧值).如果相等,则认为该变量没有 ...

  2. js把通过图片路径生成base64

    主要思想: 使用canvas.toDataURL()方法将图片的绝对路径转换为base64编码. 一.图片在本地服务器: var imgSrc = "img/1.jpg";//本地 ...

  3. a 标签的四种样式

    在支持 CSS 的浏览器中,链接的不同状态都可以不同的方式显示,这些状态包括:活动状态,已被访问状态,未被访问状态,和鼠标悬停状态.分别如下设置: a:link {color: red} /* 未访问 ...

  4. 关于asp.net web form 和 asp.net mvc 的区别

    asp.net web forms 有什么缺陷? 1.视图状态臃肿:服务器和客户端传输过程中包含了大量的试图状态——在现在的web程序中甚至多达几百kb,而且每次往返都会请求,导致服务器请求带宽增加, ...

  5. 关于vs2010下水晶报表的使用入门

    关于vs2010下使用水晶报表了解情况记录如下: 1.首先vs2010不再自带水晶报表控件了,需要下载安装vs2010配套的水晶报表控件:CRforVS_13_0.这个控件安装很简单,基本上都选择默认 ...

  6. vim 查找的技巧

    vim查找时如果有多个特殊字符需要转义容易出错还繁琐. 要确保要查找的 URL 仍保存在寄存器 u 中.然后,我们输入 / 或者 ? 调出查找提示符,二者均能正确工作.最后,要依次输入原义开关 \V ...

  7. IIS发布 用户 \'IIS APPPOOL\\X\' 登录失败

    曾多次遇到这个问题,我的解决方案就是修改数据库连接字符串 网上给的解决方案就是更换应用程序池的"进程模型":参考:http://jingyan.baidu.com/album/20 ...

  8. 使用Python实现贪心算法

    题目: 圣诞节来临了,在城市A中,圣诞老人准备分发糖果.现在有多箱不同的糖果,每一种糖果都有自己的价值和重量.每箱糖果都可以拆分成任意散装组合带走.圣诞老人的驯鹿最多只能承受一定重量的糖果.请问圣诞老 ...

  9. ES6小点心第二弹——底部浮现弹窗

    小点心,顾名思义,开箱即食,拿来即用. 献上第二个小点心:SlidePopup. GitHub 在线演示 GitHub 上欢迎大家来找茬^_^ 前端朋友们,今天要介绍的这款小点心牛B了.相信是个前端都 ...

  10. Zabbix实战-简易教程--动作(Actions)--自动发现

    一.概述 Zabbix提供了有效和非常灵活的网络自动发现功能. 设置网络发现后你可以: 加快Zabbix部署(自动添加主机.添加模板) 简化管理(自动删除主机.删除模板.禁用主机) 无需过多管理就能在 ...