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. Java NIO (二) 缓冲区(Buffer)

    缓冲区(Buffer):一个用于特定基本数据类型的容器,由 java.nio 包定义的,所有缓冲区都是 Buffer 抽象类的子类. Java NIO 中的Buffer 主要用于和NIO中的通道(Ch ...

  2. Linux并发连接上百万的配置

    To support over 500k users, you *need* - A bits hardware/kernel (AMD64, Opterons) - At least 8GB of ...

  3. MySQL 字符集问题及安全的更新操作

    一.字符集乱码 1.操作系统字符集 [root@mysql5 ~]# cat /etc/system-release /etc/sysconfig/i18n CentOS release 6.5 (F ...

  4. echart异步刷新图表,详细配置注释

    echarts刷新技巧: echartData.chear(); //当异步改变数据时,配合echartData .setOption(option)才会有动画效果 echartData.resize ...

  5. Xamarin调用JSON.net来解析JSON

      https://www.cnblogs.com/zjoch/p/4458516.html   再来我们要怎么解析JSON格示呢?在.net 中,我们很孰悉的JSON.net,没错,我们依然可以在X ...

  6. NOI 2008 假面舞会

    题目描述 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会. 今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办方会把此编号 ...

  7. Centos7上安装使用locate

    centos7上默认没有locate命令,需先安装locate yum install mlocate 注意是mlocate,如果是yum install locate系统会提示没有安装包 安装完成后 ...

  8. ubuntu搭建 zabbix3.2 with mysql database (Ubuntu 14.04.5 LTS)

    官网文档 服务构建:https://www.zabbix.com/documentation/3.2/manual/installation/install_from_packages/server_ ...

  9. golang 最和谐的子序列

    We define a harmonious array is an array where the difference between its maximum value and its mini ...

  10. MicroPython支持的开发板:高性能、低成本创客首选

    Python的开放.简洁.黏合正符合了现发展阶段对大数据分析.可视化.各种平台程序协作产生了快速的促进作用.自Python3的发布到现在已有五六年的时间,从刚发布的反对声音到慢慢被接受与喜欢经过了太漫 ...