Redis集群搭建

  本文内容参考资料:redis官网文档-集群教程

  redis单机版安装和配置的博客参考:redis安装与配置

 

一、集群不可用

  当redis集群中,超过半数(包含1半)的redis服务器宕机(不可用)时,就认为整个redis集群不可用。

  如果集群由2台redis服务器组成,那么1台宕机(占50%),集群就不可用

  如果集群由3台redis服务器组成,那么2台宕机(占67%),集群就不可用;

  如果集群由4台redis服务器组成,那么2台宕机(占50%),集群就不可用;

  如果集群由5台redis服务器组成,那么3台宕机(占60%),集群就不可用;

  如果集群由6台redis服务器组成,那么3台宕机(占50%),集群就不可用;

  ...........

  通过上面的计算,对于总的服务器数量,奇数台服务器,和偶数台服务器的,相同数量的机器发生宕机且造成集群不可用时,选择部署奇数台服务器更节省成本,因为后果都是一样的,但是奇数台可以省一台服务器。

  所以,建议至少使用3台服务器来搭建集群,并且服务器的数量最好是奇数台

 

二、搭建流程

2.1、服务器信息

  现在我有3台centos机器,版本为6.10,都安装了redis,机器名称以及ip信息如下:

  centos03,对应ip:192.168.1.3

  centos04,对应ip:192.168.1.4

  centos05,对应ip:192.168.1.5

 

2.2、修改redis配置文件

  每一台机器上的redis都要进行下面的配置,修改redis.conf

#redis监听端口
port 6379

# 开启redis集群模式
cluster-enabled yes

# 指定redis集群配置文件,这个配置文件可以不用关心
cluster-config-file nodes-6379.conf

# 集群通信超时时间(单位为毫秒)
cluster-node-timeout 5000

# 注释掉bind 127.0.0.1,并且设置protected-mode为no,表示允许其他主机无授权登录
# bind 127.0.0.1
protected-mode no

# 打开AOF开关
appendonly yes

  

 

2.3、删除机器的rdb文件

  在启动集群前,需要将rbd文件删除,否则集群启动后,该文件会同步给其他redis节点。

rm -rf /usr/local/redis/dump.rdb

  

2.4、安装ruby扩展

  搭建redis集群,需要用到ruby,以及ruby相关的扩展

yum install -y ruby 
yum install -y rubygems

  确保ruby的版本稍微高一点,比如2.5以上,我安装的ruby1.8,版本太低,导致后面出现问题,所以使用rvm来安装ruby2.5,过程如下(可以忽略本小段):

gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB

curl -sSL https://get.rvm.io | bash -s stable

source /etc/profile.d/rvm.sh

# 可以通过rvm list known查看可获取的ruby版本,我选的2.5
rvm install 2.5

  

2.5、安装redisgem

  在redis 3/4中,搭建集群是使用redis-trib.rb这个ruby脚本,运行这个脚本需要安装redisgem,因为我使用的是redis 4,所以也需要安装。

gem install redis

  

2.6、放行10000+端口

  这个10000+端口,是这样的:redis监听两个端口:

  一个端口就是6379,这个是用户客户端和服务器之间的数据通信使用的;

  另外一个端口,就是redis集群中,redis服务器之间通信使用的端口(比如故障检测,配置更新,故障转移),这个端口,就是前面一个端口(6379)+ 10000,也就是16379端口;

  如果前面设置服务器与客户端交互使用8000端口,那么集群中的redis服务器通信就会使用18000端口。

  所以集群中的redis服务器还需要将防火墙放行6379和16379端口。

iptables -A INPUT -p tcp -m tcp --dport 6379 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 16379 -j ACCEPT

# 重启防火墙
service iptables restart

  

2.7、启动每台机器上的redis服务器

  上面的配置完成后(每台机器都需要配置),然后分别启动redis,使用各自的配置文件(其实配置文件都是一样的)

# 启动centos03的redis服务器
[root@centos03 ~]# /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

# 启动centos04的redis服务器
[root@centos04 ~]# /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

# 启动centos05的redis服务器
[root@centos05 ~]# /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf    

 

2.8、最后一步

  有一个ruby脚本至关重要,名称为redis-trib.rb,这是redis3/4搭建集群需要使用的脚本。

  该脚本在redis压缩包解压后的src目录下。

  随便挑选一台机器(我选了centos05),去执行redis-trib.rb脚本,命令如下:

# create创建集群,后面跟着的redis服务器的ip和端口
./redis-trib.rb create 192.168.1.3:6379 192.168.1.4:6379 192.168.1.5:6379

  流程如下:

  

 

  到此,redis集群就搭建完成了

  需要注意的是,上面的配置只是很简单的配置,redis-trib.rb提供了很多选项进行集群的配置,如下:

[root@centos05 src]# ./redis-trib.rb
Usage: redis-trib <command> <options> <arguments ...>

  create          host1:port1 ... hostN:portN
                  --replicas <arg>
  check           host:port
  info            host:port
  fix             host:port
                  --timeout <arg>
  reshard         host:port
                  --from <arg>
                  --to <arg>
                  --slots <arg>
                  --yes
                  --timeout <arg>
                  --pipeline <arg>
  rebalance       host:port
                  --weight <arg>
                  --auto-weights
                  --use-empty-masters
                  --timeout <arg>
                  --simulate
                  --pipeline <arg>
                  --threshold <arg>
  add-node        new_host:new_port existing_host:existing_port
                  --slave
                  --master-id <arg>
  del-node        host:port node_id
  set-timeout     host:port milliseconds
  call            host:port command arg arg .. arg
  import          host:port
                  --from <arg>
                  --copy
                  --replace
  help            (show this help)

For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.

  

三、测试

  测试方式:使用任意一个客户端,登录到集群的任意一台redis服务器,进行set一些key-value,然后去其他机器看是否可以获取到key-value,以此来验证集群的存取。

  需要注意的是,使用redis-cli连接redis集群时,需要加-c选项,表示以集群方式连接;如果不加-c,表示非集群方式连接。

  下面是不加-c选项的示例,会出现(error)MOVED的错误:

ganlixins-MacBook-Pro:~ root# /usr/local/redis/bin/redis-cli -h 192.168.1.3 -p 6379
192.168.1.3:6379> set "demoKey" "demoValue"
(error) MOVED 11618 192.168.1.5:6379

  

  我这里在宿主机上登录到centos03上进行set

ganlixins-MacBook-Pro:~ root# /usr/local/redis/bin/redis-cli -h 192.168.1.3 -p 6379 -c
192.168.1.3:6379> set demoKey "demoValue"
-> Redirected to slot [11618] located at 192.168.1.5:6379
OK
192.168.1.5:6379> set testKey "testValue"
-> Redirected to slot [5203] located at 192.168.1.3:6379
OK
192.168.1.3:6379> set exampleKey "exampleValue"
-> Redirected to slot [7417] located at 192.168.1.4:6379
OK

  

  登录到centos04上查询

ganlixins-MacBook-Pro:~ root# /usr/local/redis/bin/redis-cli -h 192.168.1.4 -p 6379 -c
192.168.1.4:6379> get demoKey
-> Redirected to slot [11618] located at 192.168.1.5:6379
"demoValue"
192.168.1.5:6379> get testKey
-> Redirected to slot [5203] located at 192.168.1.3:6379
"testValue"
192.168.1.3:6379> get exampleKey
-> Redirected to slot [7417] located at 192.168.1.4:6379
"exampleValue"

  

  测试通过!!

 

 

  

posted @ 2018-09-17 09:58  寻觅beyond  阅读(556)  评论(0编辑  收藏  举报
返回顶部