redis3.0集群详细部署过程

来源:互联网 发布:linux修改profile文件 编辑:程序博客网 时间:2024/05/21 07:10

本文参考:

http://songhe.blog.51cto.com/9457084/1686402

http://blog.csdn.net/xu470438000/article/details/42971091

 

Redis3.0集群说明:

1.  Redis集群提供一种运行Redis的方式,数据被自动的分片到多个Redis节点。

2. 集群不支持处理多个键的命令,因为这需要在Redis节点间移动数据,使得                 Redis集群不能提供像Redis单点那样的性能,在高负载下会表现得不可预知。

3.  集群可在多个节点间自动拆分数据集。

当部分节点正在经历失败或者不能与集群其他节点通信时继续运转

Redis集群不保证数据强一致性。

  redis-server 集群以哈希槽的方式存放数据(目前最大是 16384 个哈希槽)

5.  redis集群  通过failover选举方式进行容错,保证一台Server挂了还能跑,这个选举是全部集群超 过半数以上的Master发现其他Master挂了后,会将其他对应的Slave节点升级成Master.

6.  cluster环境下redisslave不接受任何读写操作

7.  从节点挂掉或失效,不需要进行failoverredis cluster能正常提供服务;主节点挂掉或失效需要进行failover。另外,redis cluster还支持manual failover,即人工进行failover,产从节点变为主节点,即使主节点还活着。下面将介绍这两种类型的failover

 

 

搭建配置:

双机六节点

 

redis节点部署

http://download.redis.io/releases/redis-3.0.3.tar.gz

依赖包

yum -y install ruby ruby-devel rubygems rpm-build

gem install redis

 

安装:

S1和S2

tar -zxvf redis-3.0.0-rc2.tar.gz

cd redis-3.0.0-rc2

make MALLOC=libc  && make install

规划节点:

S1,S2分别运行3个节点

s1:

mkdir /usr/local/redis_cluster

cd /usr/local/redis_cluster

mkdir 7000 7001 7002 

s2 :

mkdir /usr/local/redis_cluster

cd /usr/local/redis_cluster

mkdir 7003 7005 7004

创建配置节点:

先把redis.conf文件拷贝到/usr/local/redis_cluster

cp /usr/local/redis-3.0.3/redis.conf  /usr/local/redis_cluster/7000

vim  /usr/local/redis_cluster/7000

daemonize    yes                          

pidfile  /var/run/redis_7000.pid    pidfile文件对应端口号

port  7000                       端口7000

cluster-enabled  yes                    开启集群功能  

cluster-config-file  nodes.conf      指定集群的配置文件

cluster-node-timeout   5000       节点请求超时  

appendonly   yes                  开启aof日志  

 

cp  /usr/local/redis_cluster/7000/redis.conf  /usr/local/redis_cluster/700X

分别复制redis.conf配置文件到各节点存放的目录 并修改端口号和pid文件

 

以配置文件方式启动各节点:

cd  /usr/local/redis_cluster/700X/

redis-server  redis.conf

配置无误启动后在各节点目录中会生成以下文件

 

查看一下redis监听的端口号,确定各节点正常运行

netstat -tnlp | grep redis

我们除了看到 配置文件中设置的端口700X   还有700X+10000  1700X前者是客户端访问的, 后者是集群内部节点之间访问的.

 

2.Redis3.0集群创建

创建集群之前先配置iptables开放redis端口:

Iptales配置(测试环境直接关闭)

iptables -A INPUT -p tcp --dport 700X -j ACCEPT

iptables -A INPUT -p tcp --dport 1700X -j ACCEPT


iptables -A INPUT -p tcp --dport 7000 -j ACCEPT
iptables -A INPUT -p tcp --dport 7001 -j ACCEPT
iptables -A INPUT -p tcp --dport 7002 -j ACCEPT
iptables -A INPUT -p tcp --dport 7003 -j ACCEPT
iptables -A INPUT -p tcp --dport 7004 -j ACCEPT
iptables -A INPUT -p tcp --dport 7005 -j ACCEPT
iptables -A INPUT -p tcp --dport 17000 -j ACCEPT
iptables -A INPUT -p tcp --dport 17001 -j ACCEPT
iptables -A INPUT -p tcp --dport 17002 -j ACCEPT
iptables -A INPUT -p tcp --dport 17003 -j ACCEPT
iptables -A INPUT -p tcp --dport 17004 -j ACCEPT
iptables -A INPUT -p tcp --dport 17005 -j ACCEPT


创建:

s1上:

cd /usr/local/redis/src/

./redis-trib.rb    (查看集群使用的的语法)这一步搞啥没搞懂

/app/redis3.0/redis-3.0.0-rc2/src/redis-trib.rb  create  --replicas  1   127.0.0.1:7000  127.0.0.1:7001  172.16.5.177:7005  172.16.5.177:7006  172.16.5.177:7007  127.0.0.1:7002

--replicas  1  表示 自动为每一个master节点分配一个slave节点    上面有6个节点,redis会按照一定规则生成 3master(主)3slave()--replicas不同时只从数量也不同。

打开上s2终端:

cd /usr/local/redis_cluster/7005-7

redis-cli -c -p 7005-7

cluster meet 192.168.183.129 7000

 

查看集群主从节点分配

/usr/local/redis/src/redis-trib.rb check 127.0.0.1:700X

 

M: 0188178f958b0598d95c7bf852aa97e79f89507b 192.168.183.129:7002

   slots:5461-10922 (5462 slots) master

   1 additional replica(s)

S: fbc29b05d2c0ec1a02644fddbf65d3e499ad66ec 192.168.183.131:7003

   slots: (0 slots) slave

   replicates 0188178f958b0598d95c7bf852aa97e79f89507b

M: c775049713a9d950bb80972ff760aa9add598728 192.168.183.129:7001

   slots:10923-16383 (5461 slots) master

   1 additional replica(s)

[OK] All nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.


如果出现异常,查看服务器防火墙是否关闭。

 

集群数据同步测试;

s1上:

[root@localhost ~]# redis-cli -c -p 7000       

127.0.0.1:7000> set gozap yunweibu

-> Redirected to slot [10865] located at 127.0.0.1:7002

OK

127.0.0.1:7002> get gozap

"yunweibu"

127.0.0.1:7002> 

s2上:

[root@localhost 7003]# redis-cli -c -p 7005  当使用参数 -c 登录后,会自动取到其它节点中的数据        

127.0.0.1:7005> get gozap

-> Redirected to slot [10865] located at 192.168.183.129:7002

"yunweibu"

192.168.183.129:7002>

 

 

 

 

 

 Redis 3.0版本主要新特性

官方说明:Redis 3.0版本相对于2.8版本带来的主要新特性包括:

引入了全新的"embedded string" 对象编码方式,从而实现了更少的缓存丢失和在特定的工作负载下速度的大幅提升;

AOF重写过程中的 "last write" 操作降低了AOF child -> parent数据传输的延迟

大幅提升LRU算法的性能以用于值的失效;

WAIT命令能够阻塞传输到指定数量从节点的写操作;

实现了对MIGRATE连接缓存的支持,从而大幅提升键值迁移的性能;

MIGARTE新增了参数:COPYREPLACE

CLIENT PAUSE命令实现了在指定时间内停止处理客户端请求;

提高了BITCOUNTINCR操作的性能;

CONFIG SET能够接受不同单位的内存值,如CONFIG SET maxmemory 1gb

调整Redis日志格式。


转自 http://blog.csdn.net/vtopqx/article/details/50235891

[ERR] Not all 16384 slots are covered by nodes.

早些时间公司Redis集群环境的某台机子冗机了,同时还导致了部分slot数据分片丢失;

在用check检查集群运行状态时,遇到错误;

[root@node01 src]# ./redis-trib.rb check172.168.63.202:7000


Connecting to node 172.168.63.202:7000: OK

Connecting to node 172.168.63.203:7000: OK

Connecting to node 172.168.63.201:7000: OK

>>> Performing Cluster Check(using node 172.168.63.202:7000)

M: 449de2d2a4b799ceb858501b5b78ab91504c72e0172.168.63.202:7000

  slots: (0 slots) master

   0additional replica(s)

M: db9d26b1d15889ad2950382f4f32639606f9a94b172.168.63.203:7000

  slots: (0 slots) master

   0additional replica(s)

M: f90924f71308eb434038fc8a5f481d3661324792172.168.63.201:7000

  slots: (0 slots) master

   0additional replica(s)

[OK] All nodes agree about slotsconfiguration.

>>> Check for open slots...

>>> Check slots coverage...

[ERR] Not all 16384 slots are covered by nodes.


原因:

这个往往是由于主node移除了,但是并没有移除node上面的slot,从而导致了slot总数没有达到16384,其实也就是slots分布不正确。以在删除节点的时候一定要注意删除的是否是Master主节点。

1)、官方是推荐使用redis-trib.rb fix 来修复集群…. ….  通过cluster nodes看到7001这个节点被干掉了… 那么

[root@node01 src]#  ./redis-trib.rb fix 172.168.63.201:7001


修复完成后再用check命令检查下是否正确

[root@node01 src]# ./redis-trib.rb check172.168.63.202:7000

只要输入任意集群中节点即可,会自动检查所有相关节点。可以查看相应的输出看下是否是每个Master都有了slots,如果分布不均匀那可以使用下面的方式重新分配slot:

[root@node01 src]#  ./redis-trib.rb reshard 172.168.63.201:7001


 

 

参考资料:

1Ruby 安装 - Linux

下面列出了在 Linux 机器上安装 Ruby 的步骤。

注意:在安装之前,请确保您有 root 权限。

源码安装

下载最新版的 Ruby 压缩文件。请点击这里下载

下载 Ruby 之后,解压到新创建的目录下:

$ tar -xvzf ruby-2.2.3.tgz    

$ cd ruby-2.2.3

现在,配置并编译源代码,如下所示:

./configure

$ make

$ sudo make install

安装后,通过在命令行中输入以下命令来确保一切工作正常:

$ruby -v

ruby 2.2.3……

如果一切工作正常,将会输出所安装的 Ruby 解释器的版本,如上所示。如果您安装了其他版本,则会显示其他不同的版本。

自动安装 Ruby

如果您的计算机已经连接到 Internet,那么最简单安装 Ruby 的方式是使用 yum 或 apt-get。在命令提示符中输入以下的命令,即可在您的计算机上安装 Ruby。

$  sudo yum install ruby    # CentOS, Fedora, 或 RHEL 系统

sudo apt-get install ruby-full # Debian 或 Ubuntu 系统

如果你是苹果系统,可以使用 brew 命令安装:

$ brew install ruby

 

2Ruby RubyGems

RubyGems 是 Ruby 的一个包管理器,它提供一个分发 Ruby 程序和库的标准格式,还提供一个管理程序包安装的工具。

RubyGems 旨在方便地管理 gem 安装的工具,以及用于分发 gem 的服务器。这类似于 Ubuntu 下的apt-get, Centos 的 yum,Python 的 pip。

RubyGems大约创建于2003年11月,从Ruby 1.9版起成为Ruby标准库的一部分。

如果你的 Ruby 低于 1.9 版本,也可以通过手动安装:

首先下载安装包:https://rubygems.org/pages/download

解压并进入目录,执行命令:ruby setup.rb

更新 RubyGems 命令:

$ gem update --system          需要管理员或root用户

Gem

Gem 是 Ruby 模块 (叫做 Gems) 的包管理器。其包含包信息,以及用于安装的文件。

Gem通常是依照".gemspec"文件构建的,包含了有关Gem信息的YAML文件。Ruby代码也可以直接建立Gem,这种情况下通常利用Rake来进行。

gem命令

gem命令用于构建、上传、下载以及安装Gem包。

gem用法

RubyGems 在功能上与 apt-get、portage、yum 和 npm 非常相似。

安装:

gem install mygem

卸载:

gem uninstall mygem

列出已安装的gem:

gem list --local

列出可用的gem,例如:

gem list --remote

为所有的gems创建RDoc文档:

gem rdoc --all

下载一个gem,但不安装:

gem fetch mygem

从可用的gem中搜索,例如:

gem search STRING --remote

gem 包的构建

gem命令也被用来构建和维护.gemspec和.gem文件。

利用.gemspec文件构建.gem:

gem build mygem.gemspec

修改国内源

由于国内网络原因(你懂的),导致 rubygems.org 存放在 Amazon S3 上面的资源文件间歇性连接失败。

所以你会与遇到 gem install rack 或 bundle install 的时候半天没有响应,具体可以用 gem install rails -V 来查看执行过程。

因此我们可以将它修改为淘宝下载源: http://ruby.taobao.org/

首先,查看当前源:

$ gem sources -l

*** CURRENT SOURCES ***

https://rubygems.org/

接着,移除https://rubygems.org/,并添加淘宝下载源 http://ruby.taobao.org/。

$ gem sources --remove https://rubygems.org/$ gem sources -a https://ruby.taobao.org/$ gem sources -l

*** CURRENT SOURCES ***

https://ruby.taobao.org# 请确保只有 ruby.taobao.org$ gem install rails

如果你使用 Gemfile 和 Bundle (例如:Rails 项目)

你可以用bundle的gem源代码镜像命令。

$ bundle config mirror.https://rubygems.org https://ruby.taobao.org

这样你不用改你的 Gemfile 的 source。

source 'https://rubygems.org/'gem 'rails', '4.1.0'...

3、redis.clients.jedis.exceptions.JedisDataException: MOVED 13102 127.0.0.1

参照:http://blog.csdn.net/chenyuangege/article/details/51519370

这个异常上网查了很久才知道原因:

MOVED indicates that you're using Redis Cluster. ShardedJedis is not for Redis Cluster, so you should use JedisCluster instead. Please note that JedisCluster doesn't have pipeline mode, so you may want to send your operation one by one.

大概意思就是ShardedJedis 不能用于Redis集群,要用JedisCluster 代替ShardedJedis 才可以,而且JedisCluster 还没有pipeline 模式,所以一次只能执行一个操作




4、其他参考

  安装ruby环境:

          

[plain] view plain copy  在CODE上查看代码片派生到我的代码片
  1. [root@localhost redis-cluster]# yum install ruby  
  2. [root@localhost redis-cluster]# yum install rubygems  

 

        安装redis-trib.rb运行依赖的ruby的包redis-3.2.2.gem,下载

        

[plain] view plain copy  在CODE上查看代码片派生到我的代码片
  1. [root@localhost redis-cluster]# gem install redis-3.2.2.gem  

http://www.cnblogs.com/gomysql/p/4395504.html

http://blog.csdn.net/dc_726/article/details/48552531

http://blog.csdn.net/huwei2003/article/details/50973967

 

0 0
原创粉丝点击