Redis集群搭建

Redis3以后支持Cluster特性:1.节点自动发现;2.slave->master 选举,集群容错;3.Hot resharding:在线分片;4.进群管理:cluster xxx;5.基于配置(nodes-port.conf)的集群管理;6.ASK 转向/MOVED 转向机制。

集群搭建技术知识点

  • Redis服务端口:用于接收客户端连接或客户端请求命令的端口,如:9579.
  • Redis集群通信端口:用于Redis内部更新交流状态的端口,为当前服务器端口+10000,如19579.
  • Redis的slot:Redis把所有的keys分成16284份,从0到16283.
  • Redis服务器的关系:主从,从是主的备份;主主:主主分别承担不同slot的keys的数据,0-16383个slot都需要分配主服务器上去.
  • Redis的配置文件:redis启动时候使用配置文件初始化服务器的信息,使用命令redis-server redis.conf.
  • Redis集群搭建的最少redis实例是3个,为3个主实例,分配0-16383个slot到三个实例中。从的redis实例可以是任意个,作为备份切换使用.
  • Redis集群中的node_id:redis的集群中除了使用ip加port来标示一个redis实例外,还是用了一个叫做node_id的东西来标示一个redis实例.

由于最小的Redis集群需要3个Master节点,本次测试使用另外3个节点作为备份的节点(Replicas),于是此次搭建需要6个Redis实例。由于可在同一台机器上运行多个Redis实例,因此我将在CentOS1上运行以下实例:

192.168.56.101:7000
192.168.56.101:7001
192.168.56.101:7002

并在CentOS2上运行以下实例:

192.168.56.102:7003
192.168.56.102:7004
192.168.56.102:7005

1. 下载Redis,目前的stable版本为3.0.6:

http://redis.io/download

2. 安装Redis

tar zxvf redis-3.0.6.tar.gz
cd redis-3.0.6
make
make install

安装完成后,redis-3.0.6/src文件夹下会出现redis-server、redis-cli等可执行文件,稍后将使用。

3. 修改配置文件

由于需要在CentOS1上运行多个实例,为了便于管理,在CentOS1上建立/home/user/Software/redis-cluster文件夹,并分别创建7000、7001和7002这三个子文件夹:

然后分别拷贝redis-3.0.6/redis.conf到这三个子文件夹中。redis.conf是redis服务器启动的必要配置文件,分别在这几个文件夹中打开该文件,修改以下选项(这几个选项是搭建Redis集群的必须选项),其它的保持默认即可:

#注意每个子文件夹下的配置中,端口号不同
port 7000
#logfile "/redisdata/redis.log"
#pidfile /var/run/redis.pid

cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

最后拷贝redis-3.0.6/src/redis-server文件到这几个子文件夹中

可以通过进程命令来查看启动结果

从每个实例的启动日志(redis.conf文件中的logfile选项可以配置日志文件)中,可以看到每一个节点都给自己分配了一个新的ID:

这个ID将被该Redis实例作为集群中的唯一名字永久使用,节点之间会互相记住这个名字。

redis启动提示vm.overcommit_memory、somaxconn警告错误

1、WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
2、WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.


解决:
第一个警告:
echo 1 > /proc/sys/vm/overcommit_memory  不需要启机器就生效
第二个警告:
echo 511 > /proc/sys/net/core/somaxconn


overcommit_memory参数说明:
设置内存分配策略(可选,根据服务器的实际情况进行设置)
/proc/sys/vm/overcommit_memory
可选值:0、1、2。
0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2, 表示内核允许分配超过所有物理内存和交换空间总和的内存

第三个警告:you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix thisissue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain thesetting after a reboot. Redis must be restarted after THP is disabled.
意思是:你使用的是透明大页,可能导致redis延迟和内存使用问题。执行 echo never > /sys/kernel/mm/transparent_hugepage/enabled 修复该问题。
临时解决方法:
echo never > /sys/kernel/mm/transparent_hugepage/enabled。
永久解决方法:
将其写入/etc/rc.local文件中。

5. 创建集群

在创建Redis集群前,在CentOS2机器中也需要按照步骤1~4完成相应的配置并运行Redis实例。

现在CentOS1上的3个Redis实例和CentOS2上的3个Redis实例都已经启动。目前这些实例虽然都开启了cluster模式,但是彼此还不认识对方,接下来可以通过Redis集群的命令行工具redis-trib.rb来完成集群创建。redis-trib.rb是一个Ruby写的可执行程序,它可以完成创建集群、为已存在的集群重新分片等功能。

而要想运行ruby程序,则需要系统先安装ruby运行环境:

sudo yum install ruby
Redis-trib.rb 需要ruby环境,先安装ruby环境
yum -y  install zlib ruby rubygems
yum install rubygems-devel

安装ruby的redis

gem install redis

升级ruby安装的软件

gem update --system

gem update

查看ruby安装的软件的结合

gem list

└─(root@host-192-168-1-17)$ gem install redis
Successfully installed redis-3.3.3
/usr/local/share/ruby/site_ruby/rubygems/core_ext/kernel_require.rb:55:in require': cannot load such file -- json/pure (LoadError) from /usr/local/share/ruby/site_ruby/rubygems/core_ext/kernel_require.rb:55:inrequire'

解决:

└─(root@host-192-168-1-17)$ gem install json_pure
Fetching: json_pure-2.1.0.gem (100%)

接下来运行以下命令(在CentOS1和CentOS2上运行均可):

redis-trib.rb create --replicas 1 192.168.1.17:7000 192.168.1.17:7001 192.168.1.17:7002 192.168.1.22:7003 192.168.1.22:7004 192.168.1.22:7005

此时会遇到以下问题:

提示缺少rubygems组件,可以使用yum来安装该组件:

sudo yum -y install rubygems

再次运行创建Redis集群的命令,还会报以下错误:

/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- redis (LoadError)
from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
from ./redis-trib.rb:25

搜索了一下,是因为缺少redis的ruby接口,可以通过以下命令安装:

sudo gem install redis

如果安装时出现错误,也可以下载文件后进行离线安装,下载地址:http://rubygems.org/gems/redis/versions,选择合适的版本,然后安装:

sudo gem install -l /mnt/Share/redis-3.0.6.gem

接下来再次运行创建Redis集群的命令:

上图中:

create为redis-trib.rb脚本的子命令,表示创建redis集群

--replicas 1表示创建的集群有1套数据备份

后面的参数为多个redis实例地址,表示使用那些实例来创建节点

在本次测试中,有7000~7005共6个节点,很显然会有3个master和3个replica。从上图中可以看到,端口号为7000、7003和7004的三个节点被选为master,另外三个节点则成为replica。而下图则展示了redis的16384个槽在三个master节点上的分布情况:

http://blog.csdn.net/posonrick/article/details/52524912

http://www.cnblogs.com/guxiong/p/6270140.html

results for ""

    No results matching ""