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. Less is exponentially more

    Less is exponentially more  (原文出处:rob pike 博客,https://commandcenter.blogspot.jp/2012/06/less-is-expo ...

  2. python自动安装mysql5.7

    python自动安装mysql5.7 python版本:python2.6 centos版本:centos6.9 mysql版本:mysql5.7.19 安装目录路径和数据目录路径都是固定,当然也可以 ...

  3. c#常用快捷键

    VS快捷键大全(总结了一些记忆的口诀) 原文转载至   https://www.cnblogs.com/liyunhua/p/4537054.html#top  谢谢大牛的分享!     相信.Net ...

  4. hidden,display,visibility ,jQuery中的hide()区别

    hidden是html中的属性,规定元素是否可见 display是css中的样式,规定元素是否显示 visible 是css中的样式,规定元素是否可见 display:none ---不为被隐藏的对象 ...

  5. Linux笔记---硬盘添加

    BZ创建了一个块云硬盘添加到了虚拟机里,然后按照平时挂在U盘的方式去挂载硬盘: mount  -t ext4 /dev/vdb  /mnt/xxxx 结果报出以下错误: mount: wrong fs ...

  6. 在阿里云 ECS 搭建 nginx https nodejs 环境(三、nodejs)

    在阿里云 ECS 搭建 nginx https nodejs 环境(三.nodejs) 在阿里云 ECS 搭建 nginx https nodejs 环境(三.nodejs) 第一步 指定版本源 执行 ...

  7. 史上最简单的js+css3实现时钟效果

    今天我看到百度搜索的时间那个效果不错,于是就产生了模仿一下的效果,不过为了节省时间,就随便布了下局,废话不多说,先看看效果吧,顺便把百度的效果也拿过来. 对比样子差了好多啊,但是基本功能都是实现了的, ...

  8. [转载]mysql创建临时表,将查询结果插入已有表中

    今天遇到一个很棘手的问题,想临时存起来一部分数据,然后再读取.我记得学数据库理论课老师说可以创建临时表,不知道mysql有没有这样的功能呢?临时表在内存之中,读取速度应该比视图快一些.然后还需要将查询 ...

  9. C#学习笔记-基础知识篇(不定期更新)

    1.父类必须包含构造函数么? 父类必须要有一个构造函数,有参无参都可以. 构造函数是对象的基本,没有构造函数就没有对象,若父类中显示的有参数的构造函数,在子类继承就必须写一个构造函数来调用父类的构造函 ...

  10. laravel 生成 key

    把 .env.example 文件 复制并重命名为 .env 文件 命令行运行 php artisan key:generate php artisan key:generate