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"
测试通过!!