redis2.8之前使用的是sync同步命令,redis2.8之后使用的是psync命令
两者的不同在于:sync仅支持全量复制过程,psync支持全量和部分复制
Redis已经发现了读写分离这个场景的普遍性,所以自身集成了读写分离供用户使用,我们只需要在redis的配置文件里面加上一条slaveof host port语句进行配置即可。
之前已经在Centos里安装了redis了,所以我们直接开始搭建配置
1、停止运行的Redis
查找正在运行的redis服务
ps -ef | grep redis
在redis的bin目录下停止对应端口的redis服务
./redis-cli -h 127.0.0.1 -p 6379 shutdown
2、删除bin文件夹下的数据文件,并修改bin文件名为bin7001,同时更改bin7001中的redis.conf文件
首先我们看一下bin文件夹下的内容
其次删除数据文件
rm -rf appendonly.aof dump.rdb
更改文件夹名称后,修改redis.conf文件
(这里使用的是idea进行更改文件,之前的文章里也有过介绍)
更改成功后如下
3、修改bin文件夹为bin7001,并复制为一个bin7002
复制文件夹
修改bin7002的文件夹的redis.conf
port 7002
slaveof 192.168.100.129 7001
以下显示7001的启动过程,7002是一样的,记得7002再开一个Xhsell界面进行连接
可以通过如下命令可以看到启动的redis服务
启动服务器后,还需要启动客户端,才可以进行数据操作
-p 后的参数是redis服务所对应的端口号
5、置入数值看一下
这里我们看到7001是主节点,7002是从节点,也就是说如果在主节点里放入值,就可以在从节点中查到
当我们尝试在7002节点中放入值时就会报错
但是如果在7001放入值就不会出现这种错误
这就实现了读写分离
6、一个主节点可以有多个节点
所以我们再复制一个bin7003,并删除复制的数据文件,方便它生成自己的数据文件
记得更改端口号
因为是复制的7002,所以redis.conf中已经有,说明7003是7001的从节点
slaveof 192.168.100.129 7001
ps:可以使用info命令查看当前节点的信息
高可用是分布式系统架构中必须考虑的因素之一,它可以减少系统所不能提供服务的时间。我理解它为如果一个挂掉了,还有其他的来自动补位,减少系统的宕机时间。
保证高可用通常遵循以下几点:
单点是系统高可用最大的敌人,在系统设计中应该避免单点
通过架构设计而保证系统高可用的核心准则是冗余
每次出现故障时需要人工介入恢复,会增加系统的不不可用时间,实现自动故障转移
我们将7001主节点手动停止
进入从节点使用info查看状态,可以看到主节点宕机
然后我们通过命令slaveof no one
将7002升级主节点
使用info可以看到7002节点状态
可以看到当前节点无从节点,这是因为7003还不知道主节点成为了7002,那我们限制告诉它
查看状态
主节点升级后我们进行数据置入,看看效果
1、复制哨兵机制的配置文件并进行更改
在redis解压包解压后的文件中找到哨兵机制的配置文件
进入到redis文件夹中,将sentinel.conf配置文件复制到该文件夹
更改sentinel.conf文件中的如下字段
bind 0.0.0.0
# 设定主节点名和地址,1 为失效的投票数
sentinel monitor mymaster 192.168.200.129 7001 1
# 设置Sentinel认为服务器已经断线所需的毫秒数。
sentinel down-after-milliseconds mymaster 10000
# 设置failover(故障转移)的过期时间。当failover开始后,在此时间内仍然没有触发任何failoer操作,当前sentinel 会认为此次failoer失败。
sentinel failover-timeout mymaster 60000
# 设置在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步
sentinel parallel-syncs mymaster 1
2、关闭所有redis服务并重新启动redis服务,同时启动sentinel
进入到最原始的文件夹的src,即redis-4.0.14解压后的文件夹
redis-sentinel就是哨兵服务,然后启动
3、关闭主节点后的哨兵服务
进入7001主节点结束服务
哨兵机制会将从节点中的一个推选为主节点
重新启动7001
可以看到哨兵机制中7001已经重新加入集群,并且以7003作为主节点
我们使用info查看7001节点状态,会发现7001变成了从节点
为了保证节点之间可以进行投票,所以集群的节点最好为奇数
因此集群最少需要三个主节点,每个主节点至少一个从节点,所以至少需要3个从节点
我们以下一共使用6个redis实例,端口号为8001-8006
1、准备节点,拷贝redis到cluster,删除不需要的配置文件
然后复制一个8001节点,删除复制过来的数据文件
修改节点的redis.conf文件
# 不能设置密码,否则集群启动时会连接不上
# Redis服务器可以跨网络访问
bind 0.0.0.0
# 修改端口号
port 8001
# Redis后台启动
daemonize yes
# 开启aof持久化
appendonly yes
# 开启集群
cluster-enabled yes
# 集群的配置 配置文件首次启动自动生成
cluster-config-file nodes.conf
# 请求超时
cluster-node-timeout 5000
记得同时删除slaveof信息以及修改dir为对应的节点的目录,非常重要,如果修改不正确,整个集群会跑不起来,非常痛苦
dir修改的东西如下,会将node.conf放在每个节点的这个目录下
然后复制五份,一共生成六个节点,记得修改每个节点对应的redis.conf文件中的port信息和dir信息
2、编写启动脚本启动集群
启动脚本内容如下,保存为文件start-all-redis.sh
# 如果你的路径和我不一致,改为自己bin8001-bin8006所在的地址
cd /root/redis/bin8001
./redis-server redis.conf
cd /root/redis/bin8002
./redis-server redis.conf
cd /root/redis/bin8003
./redis-server redis.conf
cd /root/redis/bin8004
./redis-server redis.conf
cd /root/redis/bin8005
./redis-server redis.conf
cd /root/redis/bin8006
./redis-server redis.conf
编写好启动脚本后,进行启动
启动完成后,我们查看当前起动的redis服务,确保集群真正启动了
如果出现了问题,使用如下命令查看一下集群的配置文件是否正确
如果是这样的,就说明是正确的,否则可能是上面的配置信息不正确,那就暂时不要往下进行了,回到上面进行检查
3、安装ruby环境
redis集群的管理工具使用的是ruby脚本语言,安装集群需要ruby环境,所以我们先来安装ruby
安装ruby的命令如下
yum -y install ruby ruby-devel rubygems rpm-build
安装完毕后,我们查看一下版本确保正确安装了
需要知道的是,redis4.0.14集群需要2.2.2以上的ruby版本,我们当前安装的版本过低,所以需要升级ruby版本
命令如下:
yum install centos-release-scl-rh
yum install rh-ruby23 -y
scl enable rh-ruby23 bash
4、安装ruby的安装工具gem
执行命令安装gem
gem install redis-4.1.0.gem
5、编写脚本启动集群
使用集群管理脚本启动集群
# 改换成自己的ip
./redis-trib.rb create --replicas 1 \
192.168.100.129:8001 \
192.168.100.129:8002 \
192.168.100.129:8003 \
192.168.100.129:8004 \
192.168.100.129:8005 \
192.168.100.129:8006
运行期间可以看到如下信息
上述信息的意思是为各个节点分配了槽值,记得吗。cluster集群会划分16384个哈希槽,会分配给主节点们
这个的意思是询问我们是否使用上述的配置,我们选择“是”
然后就会看到建立完成的集群环境,主从节点都自动分配了
至此,集群配置完毕
6、通过客户端连接集群,放入值进行测试
我们在8001中放入值,它会自动分配槽值,不一定会是在当前节点,比如下述信息,显示存入的值被重定向到8002节点
那么8004作为8002的从节点就可以查到该信息,而其他节点则查不到
分片重哈希,可以连接任意节点
./redis-trib.rb reshard 192.168.100.129:8001
执行该命令,会提示该节点需要移动多少个hash槽,直接输入需要移动的hash槽数量即可
记得移动不含有数据的槽,否则就需要停掉所有节点,并删除数据文件,重新创建集群环境
可以将停掉所有节点也写成一个启动脚本
cd /root/redis/bin8001
./redis-cli -p 8001 shutdown
rm -rf appendonly.aof dump.rdb nodes.conf
cd /root/redis/bin8002
./redis-cli -p 8002 shutdown
rm -rf appendonly.aof dump.rdb nodes.conf
cd /root/redis/bin8003
./redis-cli -p 8003 shutdown
rm -rf appendonly.aof dump.rdb nodes.conf
cd /root/redis/bin8004
./redis-cli -p 8004 shutdown
rm -rf appendonly.aof dump.rdb nodes.conf
cd /root/redis/bin8005
./redis-cli -p 8005 shutdown
rm -rf appendonly.aof dump.rdb nodes.conf
cd /root/redis/bin8006
./redis-cli -p 8006 shutdown
rm -rf appendonly.aof dump.rdb nodes.conf
重哈希后,也就是将槽值移动后,可以使用如下命令查看一下当前集群的状况
./redis-cli -p 8001 cluster nodes
移除主节点:
在移除主节点前,需要确保这个主节点是空的,如果不是空的,就需要将这个节点的数据重新分片到其他主节点上
移除从节点:
直接移除即可
移除节点的命令如下:
./redis-trib.rb del-node 节点ip 节点id
该命令的第一个参数是任意节点的地址,第二个参数是想要移除的节点id
接下来演示的是一个含有数据的主节点的移除
当我们直接执行该命令时,会发现失败了
那么我们首先创建end-all-redis.sh,内容如下:
cd /root/redis/bin8001
./redis-cli -p 8001 shutdown
rm -rf appendonly.aof dump.rdb nodes.conf
cd /root/redis/bin8002
./redis-cli -p 8002 shutdown
rm -rf appendonly.aof dump.rdb nodes.conf
cd /root/redis/bin8003
./redis-cli -p 8003 shutdown
rm -rf appendonly.aof dump.rdb nodes.conf
cd /root/redis/bin8004
./redis-cli -p 8004 shutdown
rm -rf appendonly.aof dump.rdb nodes.conf
cd /root/redis/bin8005
./redis-cli -p 8005 shutdown
rm -rf appendonly.aof dump.rdb nodes.conf
cd /root/redis/bin8006
./redis-cli -p 8006 shutdown
rm -rf appendonly.aof dump.rdb nodes.conf
然后启动该结束脚本
结束所有节点后,重新启动集群
这个时候,由于我觉得已经好了,所以又尝试删除了一次,现实告诉我,我想多了
所以一定要进行重哈希
完成重哈希后,查看集群信息
可以看到8002的所有槽都被移除了,这个时候我们再进行移除节点
哈哈哈哈,已经可以成功移除了
已经没有8002了,哦耶,移除成功
添加节点前需要保证一个新的节点是干净的,空的redis,意思是我们需要删除持久化文件和节点配置文件
以下以将8002添加为主节点,将8006添加为从节点为例进行操作说明
启动新的节点
查看集群信息
这里有个问题:
我们之前删除8002节点的时候,其从节点还是认为8002是其主节点,所以我们也要移除8002的从节点8006
移除8006后重新启动8006节点
添加新的主节点8002
添加新的从节点8006
好了!结束,睡觉