redis 3.0的集群陈设

目前redis支持的cluster特性(已亲测):

背景

  目前更为多的公司把业务搬迁到云上,公司也有其一布署,自己抽时间在阿里云和Azure上做了有些小的品尝,现在把阿里云上配置ES和kibana记录下来。为后来做一个参阅,也指望对其余人有救助。

  这里以阿里云为例,由于测试唯有一台机械所以那边就展开到集群了,上面介绍下详细的步骤。

1):节点自动发现

步骤:

2):slave->master 选举,集群容错

1.申请阿里云,开通免费ECS

  首先登陆阿里云,然后在优化专区拔取了免费三个月的移动,点击进入由于名额有限没到手免费的,不过9.9元也可获得该资格,然后申请了。

图片 1

  注意:那里绝对要从免费套餐内去创设免费的内容,不可能再工作台创立。否则要付钱的。

  我在那里分别创设了ECS和RDS以及OSS等,还有局地安全类,这里不做牵线,专心配置ECS。

3):Hot resharding:在线分片

2.安装ES

  1.下载JDK。

--判断是否已经安装jdk,官方建议安装jdk8
rpm -qa | grep -E '^open[jre|jdk]|j[re|dk]'
--如果有批量卸载
rpm -qa | grep Java | xargs rpm -e --nodeps
--下载接受oracle协议的jdk,也可以自己下载jdk
wget --no-check-certificate --no-cookies \
--header "Cookie: oraclelicense=accept-securebackup-cookie" \
http://download.oracle.com/otn-pub/java/jdk/8u101-b13/jdk-8u101-linux-x64.tar.gz

  2.安装JDK

--解压下载的jdk
tar -zxvf jdk-8u101-linux-x64.tar.gz
--修改配置,使用yum会自动完成配置
vi /etc/profile
--设定变量
export JAVA_HOME=/usr/local/jdk1.8.0_101
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:${PATH}

  保存后运行 source /etc/profile  使环境变量生效。输入 java
-version 确认是还是不是安装成功。

  3.下载安装ES

--下载有两个版本

 wget
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.1.2.tar.gz

--请选择一个

wget https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.4.0/elasticsearch-2.4.0.tar.gz
--解压缩
tar -zxvf elasticsearch-2.4.0.tar.gz
--启动
sh /usr/local/elasticsearch-2.4.0/bin/elasticsearch 

借使出现下列错误,是因为运用了root账户造成的。

图片 2

可以增加专用账号或者应用如下指令启动ES,那里提议不要选择root账户。

 sh /usr/local/elasticsearch-2.4.0/bin/elasticsearch -d -Des.insecure.allow.root=true

  4.验证是还是不是启动成功

curl http://localhost:9200/

图片 3

如上图所示,表示成功启动ES。当然也得以选用任何艺术比如yum,经测试都尚未难题。仅做参考。

  5.装置插件

  /bin目录,运行./plugin -install
mobz/elasticsearch-head,安装并启动elasticsearch后,在浏览器打开http://localhost:9200/\_plugin/head/

4):进群管理:cluster xxx

3.要求外网访问仍旧内网IP访问需求做如下配置:

  首先在ES的conf目录下yml文件内修改network.host
的地点如下,我那边写的内网地址(阿里云拔取的专用网络)

图片 4

  其次,
在阿里云控制台ECS,安全组里面逐步找到安全组规则,右边选拔丰盛或者高速拉长规则把入站出站的端口号添加进去,我那里用的是“0.0.0.0/0”
,端口为9200,如若有集群也要打开9300

图片 5

 

 

   最后,访问插件地址即可,切记,那里IP地址要采纳公网IP地址:

图片 6

5):基于配置(nodes-port.conf)的集群管理

总结

  本文首要介绍了单机在阿里云上搭建ES的总体流程方便测试和简单实用。其实与下线无异,难题在于外网访问那块,也不算难题就是第几遍不精通可能出标题,配置IP那块须要配置内网地址吗,然后访问时候利用外网。下一篇我将介绍即便利用jdbc完毕多少导入和elk套件kibana的配置陈设和选取(http://www.cnblogs.com/wenBlog/p/7459971.html)。第四遍全程自己配置有广大难题,希望跟大家共同享受起来。共同进步。

 

6):ASK 转向/MOVED 转向机制.

架构细节:

(1)所有的redis节点相互互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.

(2)节点的fail是由此集群Chinese Football Association Super League越一半的节点检测失效时才生效.

(3)客户端与redis节点直连,不要求中间proxy层.客户端不需求连接集群拥有节点,连接集群中其它一个可用节点即可

(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster
负责珍爱node<->slot<->value

2) redis-cluster选举:容错

(1)领着选举进度是集群中拥有master插手,假使一大半master节点与master节点通讯超过(cluster-node-timeout),认为当下master节点挂掉.

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

a:要是集群任意master挂掉,且当前master没有slave.集群进入fail状态,也得以明白成进群的slot映射[0-16383]不成就时进入fail状态.

 b:借使进群当先大多数master挂掉,无论是还是不是有slave集群进入fail状态.

  1. 1.    下载和平解决包

安装gcc:yum install gcc

安装zlib:yum install zib

安装ruby:yum install ruby

安装rubygems:yum install rubygems

系统参数

修改open files:# ulimit -n  10032 (默认1024)

添加vm.overcommit_memory=1:

#vi /etc/sysctl.conf

#sysctl vm.overcommit_memory=1

关闭hugepage:# echo never >
/sys/kernel/mm/transparent_hugepage/enabled

修改somaxconn :# echo 511 >/proc/sys/net/core/somaxconn

闭馆防火墙:# service iptables stop

关闭selinux:# vi /etc/sysconfig/selinux  修改“SELINUX=disabled”

安装Cluster

(1)       安装软件

# cd /usr/local/src/redis-3.0.4

# make

# make install

 

缘由是尚未设置jemalloc内存分配器,可以安装jemalloc 或 直接 输入make
MALLOC=libc  && make install(2)       拷贝bin文件

# cp  /usr/local/src/redis-3.0.4/src/redis-trib.rb redis-cli 
redis-server redis-benchmark  redis-check-aof   redis-check-dump 
/usr/local/bin/

#cd  /usr/local/

# mkdir 7000 7001 7002   //分别代表多个节点    其对应端口 7000 7001
7002

开创7000节点为例,

 cd ./7000

 cp /usr/local/src/redis-3.0.4/redis.conf   ./    //拷贝到近来7000索引

 vi redis.conf    //编辑配备  紧要修改一下多少个参数

daemonize    yes                          //redis后台运行

pidfile  /var/run/redis_7000.pid        //pidfile文件对应7000

port  7000                                  //端口7000

cluster-enabled  yes                    //开启集群   把注释#去掉

cluster-config-file  nodes.conf      //集群的安排 
配置文件首次启动自动生成

cluster-node-timeout   5000       //请求超时  设置5秒够了

appendonly   on                  //aof日志开启  
有要求就打开,它会每一次写操作都记录一条日志  (全持久化)
#save 900  1
#save 300  10                   
//注释掉这多少个,这是写磁盘的陈设,我只是做缓存,不须要写磁盘
(半持久化)
#save 60   10000
                //开启的话,在开行节点后,会变动对应的dump.rdb

配备好了,就相应地把那个修改后的布置文件拷贝到 7001
 7002索引,注意要修改监听端口port 7001 7002.

接下去,启动服务,进入节点目录

逐条执行  redis-server   redis.conf

可以看到变化了appendonly.aof  nodes.conf

ps -ef | grep redis 查看是或不是启动成功

 root 885 0.8 0.2 129452 2620 ? Ssl 20:10 0:21 redis-server *:7000
[cluster]
 root 887 0.8 0.2 129452 2616 ? Ssl 20:10 0:21 redis-server *:7001
[cluster]
 root 893 0.8 0.2 128356 2612 ? Ssl 20:10 0:21 redis-server *:7002
[cluster]

    netstat -tnlp | grep redis 可以观看redis监听端口

 tcp 0 0 0.0.0.0:7000 0.0.0.0:* LISTEN 885/redis-server *
 tcp 0 0 0.0.0.0:7001 0.0.0.0:* LISTEN 887/redis-server *
 tcp 0 0 0.0.0.0:7002 0.0.0.0:* LISTEN 893/redis-server *
 tcp 0 0 0.0.0.0:17000 0.0.0.0:* LISTEN 885/redis-server *
 tcp 0 0 0.0.0.0:17001 0.0.0.0:* LISTEN 887/redis-server *
 tcp 0 0 0.0.0.0:17002 0.0.0.0:* LISTEN 893/redis-server *

 大家除了见到 配置文件中装置的端口700*    还有700*+10000  (1700*),
前者是客户端访问的, 后者是集群内部节点之间访问的.

 注意,在多台Server间搭建集群,如若开了防火墙的,须要设置iptables开放地点装有端口.

 Server2

 步骤和Server1一样, 设置端口  7003  7004  7005

成立集群

面前早已准备好了搭建集群的redis节点,接下去大家要把这个节点都串连起来搭建集群。官方提供了一个工具:redis-trib.rb
 (/usr/local/src/redis-3.0.4/src/redis-trib.rb)
看后缀就知道那鸟东西无法平素实施,它是用ruby写的一个程序,所以我们还得安装ruby.

yum -y install ruby ruby-devel rubygems rpm-build  
 //网上不明觉厉,都是那样安装的,就接着那样玩吧

再用 gem 这么些命令来安装redis接口     gem貌似是ruby的一个工具包
 反正没错就是了。

gem install redis    
//等说话就好了,当然,方便操作,两台Server都要设置。

 下面的手续完结了,接下去运行一下redis-trib.rb

/usr/local/src/redis-3.0.4/src/redis-trib.rb 

肯定所有的节点都启动,接下去使用参数create 创建    
(在Server1中来成立)

/usr/local/src/redis-3.0.4/src/redis-trib.rb  create \

–replicas 1 192.168.0.7:7000 192.168.0.7:7001 192.168.0.7:7002
192.168.0.21:7003  192.168.0.21:7004 192.168.0.21:7005

留神:这里假使在同一台
机子上面配置四个节点的话,可以写127.0.0.1的ip加端口,但是,假如是在两台机子上各有多个节点的话,就务须写192.168.从头的ip地址,不然会冒出“Waiting
for the cluster to join.。。。。一贯等候下去的动静。

解释下, –replicas  1  表示 自动为每一个master节点分配一个slave节点  
 上边有6个节点,程序会按照一定规则生成 3个master(主)3个slave(从)

面前已经提醒过的 防火墙一定要开放监听的端口,否则会创制失利。

运行中,提示Can I set the above configuration? (type 'yes' to accept): yes    //``输入yes

接下来 提示 “

[OK] All nodes agree about slots configuration.

>>> Check for open slots…

>>> Check slots coverage…

[OK] All 16384 slots covered. 表达创立成功!

在意:无论是新增节点,依旧始于成立集群,在上头的实践成功后,还要先redis-trib.rb
check 192.168.0.7:7000

据悉master和slave的绑定结果,继续上边的操作,对每一对master和slave举行锁定:

延续到要抬高的slave数据库中,执行replicate操作,前边的ID为Master
192.168.0.7:7003的ID。

# redis-cli -c -h 192.168.0.21 -p 7002

192.168.0.21:7002> cluster  replicate
 7e26effeeec1015545eddeccf0ad6d90ecd71bcf

OK

基于check结果,可以看来slave成功和Master建立联系。

测试

get 和 set数据

在192.168.0.7上终点输入   redis-cli -c -p 7000

跻身命令窗口,直接 set  hello   howareyou

一贯依照hash匹配切换来相应的slot的节点上。

接下来找到这么些节点所对应的从节点,然后在从节点上redis-cli -c -p
7004进来命令行后,输入get  hello出现如下界面

 

仍是可以通过

# redis-trib.rb check 192.168.0.7:7002
检查集群状态(ip和端口可以是别的一个节点)

依然要验证一下,redis集群有16383个slot组成,通过分片分布到八个节点上,读写都暴发在master节点。

假设测试

先把Server2服务Down掉,(Server2有1个Master, 2个Slave) ,  跑回Server1,
查看一下
发生了怎么样事,Server1的3个节点全体都是Master,其余多少个Server2的遗失了,测试一下,依然小难题,集群依然能继承工作。

由来:
 redis集群通过选举行法举行容错,有限支撑一台Server挂了仍可以跑,这一个选举是成套集群超过一半以上的Master发现其余Master挂了后,会将其余相应的Slave节点升级成Master.

疑问: 如果挂的是Server1怎么做?试了,cluster is
down!!不能,大多数挂了那救不了了,整个集群就无法工作了。
如若有三台Server,每台两Master,切记对应的为主节点不要放在一台Server,别问我何以自己用心血想想看,相互交叉配置基本,挂哪台也没事,你要说还要两台crash了,呵呵哒……

还足以经过redis-cli -p 7001 cluster
nodes命令举行查看,下图中的7000的电话机已经挂了,是自个儿为止了服务,然后对应的7005从slave升为了master。

 

再者这时故障已经更换,获取到了key,value

 

关于一致性

自身还从未这样勇敢拿redis来做数据库持久化网站数量,只是拿来做cache,官网说的很明亮,Redis
Cluster is not able to guarantee strong consistency.  

 

化解措施:

1)、将急需新增的节点下aof、rdb等本土备份文件删除;

2)、同时将新Node的集群配置文件删除,即:删除你redis.conf里面cluster-config-file所在的文书;

3)、再度添加新节点假若照旧报错,则登录新Node, redis-cli -c -p 端口号
对数据库举办消除:

172.168.63.201:7001>  flushdb      #清空当前数据库

添加master节点

照下面的操作,新加一个布署文件和端口,例如7006/redis.conf,端口是7006,并且更改防火墙的安装后,举办如下操作,使用redis-trib.rb添加节点

在已有集群服务器(192.168.0.7)上实施

(注意:add-node的运用格局为new_host:new_port
 existing_host:existing_port,前边是新加上的节点音讯,前边是已存在的节点信息)

# redis-trib.rb add-node 192.168.0.21:7006  192.168.0.7:7001

在线添加 时,须要dump整个master进度,并传递到slave,再由
slave加载rdb文件到内存,rdb传输进度中Master可能否提供劳动,整个经过消耗大批量io,小心操作(添加成功时出现的界面并从未下边的红字)。

 

node新节点没有包涵别的数据,
因为它没有包蕴其余slot,会自动成为一个主节点,
当集群须求将某个从节点升级为新的主节点时,
那几个新节点不会被入选。选用其中一个节点,检查集群状态,发现刚添加的节点已经在集群中了,角色是master,前边要经过shard命令分配slot。

# redis-trib.rb check 192.168.0.21:7006

 

加入新的节点后,要求将其余的节点中的hash
slot移动到新的节点中,以落成负载均衡的功用,其中要提议的是当主节点过多,那么就不可能根据下边的基数进行分了,应听从主节点的基数举行平均分配,可以在线reshard
slot来化解,只是需要reshard的master节点是老节点的ip和端口。

#redis-trib.rb  reshard  192.168.0.7:7000

#依照提醒选用要动迁的slot数量(ps:那里采取500,最好是16384的约数例如4096,或是各种主节点平均分配)  

How many slots do you want to move (from 1 to 16384)? 500  

#选料要经受这一个slot的node-id  

What is the receiving node ID? f51e26b5d5ff74f85341f06f28f125b7254e61bf (此id为新增节点的id) 

#选择slot来源:  

#all表示从拥有的master重新分配,  

#抑或数额要提取slot的master节点id,最终用done截至  

Please enter all the source node IDs.  

  Type ‘all’ to use all the nodes as source nodes for the hash slots.  

  Type ‘done’ once you entered all the source nodes IDs.  

Source node #1:all  

#打印被移动的slot后,输入yes开首活动slot以及对应的数据.  

#Do you want to proceed with the proposed reshard plan (yes/no)? yes  

 

接下来出现下图滚动:

 

#结束  

新被分配slot的节点如下图突显 :

 

主节点添加已毕后,必要给该主节点添加一个slave节点,添加进程和主节点一致,添加落成后须要在redis中举行设置。

# redis-trib.rb add-node 192.168.0.21:7007  192.168.0.21:7003

来得内容大约

连日到要丰硕的slave数据库中,执行replicate操作。前面的ID为Master
192.168.0.21:7003的ID,通过redis-trib.rb check能够见见。

# redis-cli -c -h 192.168.0.21 -p 7007

192.168.0.21:7007> cluster  replicate
 7e26effeeec1015545eddeccf0ad6d90ecd71bcf

OK

据悉check结果,可以看出新添加的slave以及成功和Master建立联系。

去除一个slave节点

#redis-trib  del-node  ip:port  ‘<node-id>’  

redis-trib.rb  del-node  192.168.0.21:7007
  ‘c7ee2fca17cb79fe3c9822ced1d4f6c5e169e378’  

 

除去一个master节点

剔除master节点此前,首先要将此master节点上的slave节点删除,然后再利用reshard移除master的一体slot,然后再删除当前节点(近期只能把被剔除master的slot迁移到一个主节点上)。

#把192.168.0.21:7003当前master迁移到192.168.0.21:7006上  

redis-trib.rb  reshard  192.168.0.21:7006  

#按照提醒采纳要搬迁的slot数量(ps:那里选拔500)  

How many slots do you want to move (from 1 to 16384)? 500(被删除master的所有slot数量)  

#分选要承受那么些slot的node-id(192.168.0.21:7006)  

What is the receiving node ID? c4a31c852f81686f6ed8bcd6d1b13accdc947fd2 (ps:
192.168.0.21:7006的node-id)  

Please enter all the source node IDs.  

  Type ‘all’ to use all the nodes as source nodes for the hash slots.  

  Type ‘done’ once you entered all the source nodes IDs.  

Source node #1:f51e26b5d5ff74f85341f06f28f125b7254e61bf(被删除master的node-id)  

Source node #2:done  

#打印被挪动的slot后,输入yes开头活动slot以及对应的数据.  

#Do you want to proceed with the proposed reshard plan (yes/no)? yes 

删除空master节点

redis-trib.rb  del-node  192.168.0.21:7003
 ‘f51e26b5d5ff74f85341f06f28f125b7254e61bf’  

 

小心:当删除完主从的一对节点后,再度重新添加这一对中央节点后,添加进度尽管有上边的红字提醒,但是并不影响添加,当使用check命令后查看到,那对节点已经添加上了。

 

 

redis cluster 客户端(Jedis)

<span style=”color: #333333; font-family: Arial, sans-serif;”><span style=”color: #333333; font-family: Arial, sans-serif;”> private static BinaryJedisCluster jc;  

  static {  

       //只给集群里一个实例就足以  

        Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();  

        jedisClusterNodes.add(new HostAndPort(“10.10.34.14”, 6380));  

        jedisClusterNodes.add(new HostAndPort(“10.10.34.14”, 6381));  

        jedisClusterNodes.add(new HostAndPort(“10.10.34.14”, 6382));  

        jedisClusterNodes.add(new HostAndPort(“10.10.34.14”, 6383));  

        jedisClusterNodes.add(new HostAndPort(“10.10.34.14”, 6384));  

        jedisClusterNodes.add(new HostAndPort(“10.10.34.14”, 7380));  

        jedisClusterNodes.add(new HostAndPort(“10.10.34.14”, 7381));  

        jedisClusterNodes.add(new HostAndPort(“10.10.34.14”, 7382));  

        jedisClusterNodes.add(new HostAndPort(“10.10.34.14”, 7383));  

        jedisClusterNodes.add(new HostAndPort(“10.10.34.14”, 7384));  

        jc = new BinaryJedisCluster(jedisClusterNodes);  

    }  

@Test  

    public void testBenchRedisSet() throws Exception {  

        final Stopwatch stopwatch = new Stopwatch();  

        List list = buildBlogVideos();  

        for (int i = 0; i < 1000; i++) {  

            String key = “key:” + i;  

            stopwatch.start();  

            byte[] bytes1 = protostuffSerializer.serialize(list);  

            jc.setex(key, 60 * 60, bytes1);  

            stopwatch.stop();  

        }  

        System.out.println(“time=” + stopwatch.toString());  

    }</span></span>  

 

jedis客户端的坑.

1)cluster环境下redis的slave不收受任何读写操作,

2)client端不协助keys批量操作,不辅助select dbNum操作,唯有一个db:select 0

3)JedisCluster 的info()等单机函数无法调用,重临(No way to dispatch this
command to Redis Cluster)错误,.

4)JedisCluster 没有针对byte[]的API,须求团结扩充(附件是自身加的基于byte[]的BinaryJedisCluster
 api)

 

 

图片 7

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注