Redis集群搭建

来源:互联网 发布:dota2数据查询 编辑:程序博客网 时间:2024/05/29 16:15

安装环境:CentOS6.5 64位 ,当前Redis最新版本为3.2,所以本文以3.2为例担建Redis集群。

1、Redis服务器说明

用2台虚拟机(192.168.0.201和192.168.0.202),各安装3个Redis实例。分别为3个master和3个slave,模拟6台机器担建一个Redis集群。
192.168.0.201:6379
192.168.0.201:6380
192.168.0.201:6381

192.168.0.202:16379
192.168.0.202:16380
192.168.0.202:16381

2、安装Redis集群节点实例

单实例安装请参考《 Redis单实例安装与配置》
编译Redis源码前先检查系统是否安装了gcc,没安装的话执行yum install -y gcc安装。

1> 安装Redis

shell> wget http://download.redis.io/releases/redis-3.2.0.tar.gzshell> tar -zxvf redis-3.2.0.tar.gzshell> cd redis-3.2.0shell> make && make installshell> ln -s /usr/local/bin/redis* /usr/bin/shell> cp src/redis-trib.rb /usr/bin/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2> 创建Redis节点

shell> ./utils/install_server.sh
  • 1
  • 1

安装Redis服务
在两台虚拟机上依次执行install_server.sh脚本分别各安装3个redis实例。在安装提示时输入上面约定的端口(如:6379,6380,6381,16379,16380,16381),改变端口后同时配置文件、日志文件和数据存储目录名会自动加上端口号,以和其它实例区别。如果对安装路径没有特殊要求的话,在安装时只需改变端口号,其它都保持默认即可。默认配置文件如下:
配置文件:/etc/redis/port.conf
日志文件:/etc/log/redis_port.log
数据存储目录(aof文件、rdb文件、集群节点配置文件):/var/lib/redis/port

注意:port为你设置的端口

make时如果遇到zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory错误,用make MALLOC=libc && make install重新安装。

Redis服务安装完成之后,服务会同时启动,且会自动加入到系统服务中,并设为开机启动。

3> 修改Redis实例的集群配置

修改绑定IP

Redis默认绑定的是127.0.0.0地址,需要将其修改为本机IP或0.0.0.0,集群中的各个节点才能互相通信。

sed命令是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作

# 192.168.0.201节点shell> sed -i 's/127.0.0.1/0.0.0.0/g' /etc/redis/6379.confshell> sed -i 's/127.0.0.1/0.0.0.0/g' /etc/redis/6380.confshell> sed -i 's/127.0.0.1/0.0.0.0/g' /etc/redis/6381.conf# 192.168.0.202节点shell> sed -i 's/127.0.0.1/0.0.0.0/g' /etc/redis/16379.confshell> sed -i 's/127.0.0.1/0.0.0.0/g' /etc/redis/16380.confshell> sed -i 's/127.0.0.1/0.0.0.0/g' /etc/redis/16381.conf
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

修改端口号

安装完redis服务后,配置文件中集群的相关端口配置默认为6379,需要将其它几个非6379的端口修改过来。

# 192.168.0.201节点shell> sed -i 's/6379/6380/g' /etc/redis/6380.confshell> sed -i 's/6379/6381/g' /etc/redis/6381.conf# 192.168.0.202节点shell> sed -i 's/6379/16379/g' /etc/redis/16379.confshell> sed -i 's/6379/16380/g' /etc/redis/16380.confshell> sed -i 's/6379/16381/g' /etc/redis/16381.conf
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

修改集群配置

cluster-enabled yes  cluster-config-file nodes-6379.conf  cluster-node-timeout 5000  appendonly yes
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

cluster-enabled:开启集群模式
cluster-config-file:保存节点的配置信息,如集群中所有节点的IP、端口、状态、节点类型(master/slave)、节点ID、slots等
cluster-node-timeout:节点心跳超时时长
appendonly:开启aof文件存储

依次将每个实例配置文件中的以上注释打开,并修改成对应的值。

检查修改结果:

shell> cat /etc/redis/6380.conf | awk '{if($0 !~ /^$/ && $0 !~ /#/) {print $0}}' | grep 6380port 6380pidfile /var/run/redis_6380.pidlogfile /var/log/redis_6380.logdir /var/lib/redis/6380cluster-config-file nodes-6380.conf
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

有5处修改端口的地方,修改成功!

重新启动所有redis服务:

shell> service redis_portN restart
  • 1
  • 1

此时通过PS命令查看redis进程,和普通进程不同的是在进程名后边加了一个[cluster]标识。192.168.0.201节点如下图所示:
redis cluster进程
但它们现在都还是独立的实例,还没有分配到一个集群当中。没有master和slave关系。

查看服务详情及配置文件信息:
服务详情

3、创建Redis集群

1> 安装ruby环境

创建集群要用到ruby的一个脚本,在创建集群前,先安装ruby的运行环境和ruby的redis客户端。

shell> yum -y install ruby rubygemsshell> gem sources --add https://ruby.taobao.org/ --remove https://rubygems.org/  # 配置taobao的源shell> gem install redis --version 3.2.0
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

2> 创建集群

shell> redis-trib.rb create --replicas 1 192.168.0.201:6379 192.168.0.201:6380 192.168.0.201:6381 192.168.0.202:16379 192.168.0.202:16380 192.168.0.202:16381
  • 1
  • 1

参数说明:
1> redis-trib.rb脚本默认安装在$REDIS_SRC_HOME/src目录下,在安装redis服务时,已将其拷贝到/usr/bin目录下
2> create:创建集群参数
3> –replicas 1:每个master有1个slave节点
根据节点顺序确定master与slave节点,前边的优先选择做为master节点,后边优先选择做为slave节点。由脚本自动分配,但master和slave绝对不会分配在同一台机器上。

3> 检查Redis集群状态

shell> redis-trib.rb check 192.168.0.201:6379
  • 1
  • 1

Redis集群状态
从上图可以看出,192.168.0.201:6379、192.168.0.201:6380、192.168.0.201:6381被选为了master节点。192.168.0.202:16379被选为192.168.0.201:6381的slave节点,192.168.0.202:16380被选为192.168.0.201:6379的slave节点,192.168.0.202:16381被选为192.168.0.201:6380的slave节点。

到这儿Redis的集群就配置成功了!

4、验证Redis集群

数据存储测试

# 连接到201的6379节点shell> redis-cli -c -h 192.168.0.201 -p 6379192.168.0.201:6379> set foo abc-> Redirected to slot [12182] located at 192.168.0.201:6380OK192.168.0.201:6380>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

set foo abc本想在201的6379节点保存foo这个key,但201的6379节点并没有存,而是将请求转发给了201的6380节点存储。而且客户端自动切换到了6380节点。这是神马情况?这其实是redis集群数据存储的机制,通过crc16算法计算key的hash值,然后对16384取模,得到一个0~16384以内的slot值来决定由哪个节点存储,而每一个节点在创建集群的时候,都会均匀的分配相应的slot数量。有关数据存储的机制,请参考后面的文章。

自动选主测试

从上边的集群状态中得知,192.168.0.202:16381被选为192.168.0.201:6380的slave节点,现在把6380 master节点kill掉,看redis会不会将16381选主为master节点,并将刚刚保存的foo这个key有没有复制到16381节点中。如下图所示:
自动选主测试结果
从上图测试结果可以看出,当master节点挂掉之后,slave节点自动选举成了master节点,并且之前保存在master节点的数据foo也成功复制给了slave节点。

注意点:

1.在防火墙中开启例子中的6个端口。

/sbin/iptables -I INPUT -p tcp --dport 6379 -j ACCEPT #开启6379端口

/etc/rc.d/init.d/iptables save #保存配置

/etc/rc.d/init.d/iptables restart #重启服务

2.redis开启远程访问

redis默认只允许本地访问,要使redis可以远程访问可以修改redis.conf
解决办法:注释掉bind 127.0.0.1可以使所有的ip访问redis,   若是想指定多个ip访问,但并不是全部的ip访问,可以bind
注意
在redis3.2之后,redis增加了protected-mode,在这个模式下,即使注释掉了bind 127.0.0.1,再访问redisd时候还是报错

修改办法:protected-mode no

3.redis配置密码

redis默认连接不需要密码,表示任何人都可以连接这台redis server进行数据的修改,不太安全。打开配置文件,找到requirepass foobared,打开注释,修改foobared为你自己的密码.

redis服务器设置密码后,使用service redis stop 会出现以下信息:
service redis stop
Stopping ...
OK
(error) NOAUTH Authentication required.
Waiting for Redis to shutdown ...
Waiting for Redis to shutdown ...
Waiting for Redis to shutdown ...
Waiting for Redis to shutdown ...

出现这样的错误信息,redis 这时是没有停止服务的。可以使用ps -ef | grep redis  查进程号 然后kill 掉。

解决办法:
修改redis服务脚本,vi /etc/init.d/redis,在stop方法中修改如下一句
$CLIEXEC -a "password" -p $REDISPORT shutdown

4.master配置了密码,slave如何配置

若master配置了密码,则slave也要配置相应的密码参数,否则无法进行正常复制的。
slave中配置文件内找到如下行,移除注释,修改密码即可,#masterauth  mstpassword

5.  注意事项:

a.如果是使用redis-trib.rb工具构建集群,集群构建完成前不要配置密码,集群构建完毕再通过config set + config rewrite命令逐个机器设置密码

b.如果对集群设置密码,那么requirepass和masterauth都需要设置,否则发生主从切换时,就会遇到授权问题,可以模拟并观察日志

c.各个节点的密码都必须一致,否则Redirected就会失败

config set masterauth abc

config set requirepass abc

config rewrite

设置密码后,redis-trib.rb check 192.168.0.201:6379  报错连接不上实例,解决方法:

vim /usr/lib/ruby/gems/1.8/gems/redis-3.2.0/lib/redis/client.rb

class Redis
  class Client

    DEFAULTS = {
      :url => lambda { ENV["REDIS_URL"] },
      :scheme => "redis",
      :host => "127.0.0.1",
      :port => 6379,
      :path => nil,
      :timeout => 5.0,
      :password => "gh*8pass",
      :db => 0,
      :driver => nil,
      :id => nil,
      :tcp_keepalive => 0,
      :reconnect_attempts => 1,
      :inherit_socket => false
    }

修改下默认密码就可以了

注意:修改redis.conf配置之后,要重新启动服务使其生效。

service redis restart
客户端访问:  redis-cli -h 192.168.0.201 -p 6379 -a 123456

6.密码设置注意点

方式一:修改所有Redis集群中的redis.conf文件加入: 
masterauth passwd123 
requirepass passwd123 
说明:这种方式需要重新启动各节点

方式二:进入各个实例进行设置: 
redis-cli -c -h 192.168.0.201 -p 6379 -a 123456
config set masterauth passwd123 
config set requirepass passwd123 
config rewrite 
之后分别使用如上命令给各节点设置上密码 
注意:各个节点密码都必须一致,否则Redirected就会失败, 推荐这种方式,这种方式会把密码写入到redis.conf里面去,且不用重启


0 0
原创粉丝点击