安装
环境:Ubuntu18.04,redis版本:5.0.7-2
直接通过apt
安装:
sudo add-apt-repository ppa:chris-lea/redis-server #安装最新版redis
sudo apt update
sudo apt install redis -y #安装redis
或直接下载最新deb
安装包,手动安装:
先安装redis-tools
,再安装redis-server
:
sudo dpkg -i redis-tools_5.0.7-2_amd64.deb
sudo dpkg -i redis-server_5.0.7-2_amd64.deb
安装完成后,通过redis-cli
命令看是否能进入redis
,以验证是否安装成功:
$ redis-cli
127.0.0.1:6379>
分布式集群搭建
准备
当然,首先要在搭建集群的所有服务器上安装好redis
。
这里用6台服务器实现集群搭建,组成3主3从集群模式,服务器的redis
信息及主从关系如下:
服务器名称 | IP | redis实例端口 | 主从信息 |
---|---|---|---|
服务器1 | 192.168.0.127 | 6379 | 主1 |
服务器2 | 192.168.0.200 | 6379 | 主2 |
服务器3 | 192.168.0.32 | 6379 | 主3 |
服务器4 | 192.168.0.202 | 6379 | 从1 |
服务器5 | 192.168.0.26 | 6379 | 从2 |
服务器6 | 192.168.0.23 | 6379 | 从3 |
虽然开始指定了服务器间的主从关系,但主从角色可能会发生变化,比如一台主节点挂掉时,其从节点就会自动转为主节点以保证集群稳定,当原主节点重新上线时,其会变为相应的从节点。
配置
编辑配置文件/etc/redis/redis.conf
:
sudo vi /etc/redis/redis.conf
在所有redis
服务器上修改以下两项内容:
#bind 127.0.0.1 ::1 #注释掉此行,约在69行位置
protected-mode no #禁用保护模式,约在88行
cluster-enabled yes #将此行的注释去掉,约在832行位置
修改完成后重启所有redis
:
sudo /etc/init.d/redis-server restart
然后进入任一服务器的redis
,执行创建集群命令:
redis-cli --cluster create 192.168.0.127:2379 192.168.0.200:2379 192.168.0.32:2379 192.168.0.202:2379 192.168.0.26:2379 192.168.0.23:2379 --cluster-replicas 1
创建集群命令中的--cluster-replicas 1
表示每个主节点分配一个从节点,若不加该参数,则所有节点都将作为主节点,设置该参数时,要提前计算好服务器数量与主从节点关系,最好保证每个主节点所拥有的从节点数量是一致的。比如这里6台服务器,设置每个主节点都有一个从节点,则3主3从正好分配,redis
会自动将前3台服务器作为主节点,后3台作为他们的从节点。
出现确定界面时,输入yes
验证
在服务器1上以集群模式进入redis
:
redis-cli -c
然后存储一条数据:
127.0.0.1:6379> set testKey "testValue"
OK
在服务器2上以集群模式进入redis
:
redis-cli -c
查询刚在服务器1上存储的数据:
127.0.0.1:6379> get testKey
-> Redirected to slot [5203] located at 192.168.0.127:6379
"testValue"
可以看到,连接自动转移至了服务器1并获取到了数据。
服务器数量较少时集群搭建时的优化方案
方案
若只有服务器数量较少,搭建redis
集群时,一般情况下,服务器均为主节点,这时若一台崩溃,则该节点存储的数据将不可访问,可以在一台服务器上运行多个redis
实例,以3台服务器为例,3台服务器共启动6个redis
,交叉组成3主3从集群模式,如下:
服务器名称 | IP | redis实例端口 | 主从信息 |
---|---|---|---|
服务器1 | 192.168.0.127 | 6379 | 主1 |
服务器1 | 192.168.0.127 | 6380 | 从3 |
服务器2 | 192.168.0.32 | 6379 | 主2 |
服务器2 | 192.168.0.32 | 6380 | 从1 |
服务器3 | 192.168.0.26 | 6379 | 主3 |
服务器3 | 192.168.0.26 | 6380 | 从2 |
这样,当一台服务器挂掉,其上的两个redis
节点的数据可以从其他节点得到恢复,可提高集群的容错性,例如当服务器1挂掉时,其6379
端口的redis
上的数据会在其从节点服务器2的6380
端口的redis
上得到恢复,其6380
端口的redis
上的数据会在其主节点服务器3的6379
端口的redis
上得到恢复。
一台服务器上启动两个redis
实例
redis
是基于配置文件启动实例的,因此,若要在一台服务器上启动两个实例,相应的需要另一个配置文件和对应的启动脚本,redis
安装以后,其默认配置文件为/etc/redis
目录下的redis.conf
文件,默认端口为6379
,默认启动脚本文件为/etc/init.d/redis-server
,首先复制一个新配置文件,并赋予用户组为redis
:
cd /etc/redis
sudo cp redis.conf redis-6380.conf
sudo chown redis:redis redis-6380.conf
然后编辑配置文件:
sudo vi /etc/redis/redis-6380.conf
编辑如下项:
port 6380 #设置redis端口,约在92行位置
pidfile /var/run/redis-6380/redis-server-6380.pid #pid文件路径,约在158行位置
logfile /var/log/redis/redis-server-6380.log #日志文件路径,约在171行位置
dbfilename dump6380.rdb #数据库持久化路径,约在253行位置
cluster-config-file nodes-6380.conf # 集群配置文件存储目录,约在840行位置
然后为新实例复制一个启动脚本:
sudo cp /etc/init.d/redis-server /etc/init.d/redis-server-6380
编辑脚本:
sudo vi /etc/init.d/redis-server-6380
更改脚本中的以下变量定义:
DAEMON_ARGS=/etc/redis/redis-6380.conf #启动时加载的配置文件
DESC=redis-server-6380 #描述
NAME=redis-server-6380 # 名称
RUNDIR=/var/run/redis-6380 # pid文件目录 与配置文件中的pidfile对应
PIDFILE=$RUNDIR/redis-server-6380.pid #pid文件路径
然后启动新的redis
实例:
sudo /etc/init.d/redis-server-6380 start
这样,连同原有的一个redis
,便有了两个redis
,分别查看两个redis
实例的运行状态:
sudo /etc/init.d/redis-server-6380 status
sudo /etc/init.d/redis-server status
这样配置后,每个redis
便可以单独管理与运行,要进入哪个redis
,只需表明端口号即可:
redis-cli -p 2380 -c
6个redis
便可以搭建一个3主3从集群,配置同6台单独服务器。
可以将第二个redis
实例也加入系统服务:
sudo update-rc.d redis-server-6380 defaults 80
集群管理命令
cluster info #打印集群的信息
cluster nodes #列出集群当前已知的所有节点(node),以及这些节点的相关信息
节点(node)
cluster meet <ip> <port> #将ip和port所指定的节点添加到集群当中,让它成为集群的一份子
cluster forget <node_id> #从集群中移除node_id指定的节点
cluster replicate <node_id> #将当前节点设置为node_id指定的节点的从节点
cluster saveconfig #将节点的配置文件保存到硬盘里面
cluster slaves <node_id> #列出该slave节点的master节点
cluster set-config-epoch #强制设置configEpoch
槽(slot)
cluster addslots <slot> [slot ...] #将一个或多个槽(slot)指派(assign)给当前节点
cluster delslots <slot> [slot ...] #移除一个或多个槽对当前节点的指派
cluster flushslots #移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点
cluster setslot <slot> node <node_id> #将槽slot指派给node_id指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽,然后再进行指派
cluster setslot <slot> migrating <node_id> #将本节点的槽slot迁移到node_id指定的节点中
cluster setslot <slot> importing <node_id> #从node_id 指定的节点中导入槽slot到本节点
cluster setslot <slot> stable #取消对槽slot的导入(import)或者迁移(migrate)
键(key)
cluster keyslot <key> #计算键key应该被放置在哪个槽上
cluster countkeysinslot <slot> #返回槽slot目前包含的键值对数量
cluster getkeysinslot <slot> <count> #返回count个slot槽中的键
其它
cluster myid #返回节点的ID
cluster slots #返回节点负责的slot
cluster reset #重置集群,慎用