配置redis高可用集群:redis集群规定至少有3台master,因此最少需要6台redis主机。
1、环境准备:
通过一台管理主机(MGM)对redis集群进行管理,MGM可以在一台redis服务器上,也可以是单独的主机。
client:192.168.4.50
MGM:192.168.4.100
A:192.168.4.51,redis端口6351
B:192.168.4.52,redis端口6352
C:192.168.4.53,redis端口6353
D:192.168.4.54,redis端口6354
E:192.168.4.55,redis端口6355
F:192.168.4.56,redis端口6356
2、配置MGM管理主机:(192.168.4.100)
# 集群是通过ruby编写的管理脚本进行管理的,
# redis中有编写好的脚本redis-4.0.8/src/redis-trib.rb
yum -y install ruby rubygems #ruby是解释器,rubygems用于安装gem软件
gem install redis-3.2.1.gem
tar -zxvf redis-4.0.8.tar.gz #解压redis源码包
cd redis-4.0.8/src/
cp redis-trib.rb /root/bin/ #放到/root/bin下方便直接使用
chmod +x /root/bin/redis-trib.rb #赋予执行权限
redis-trib.rb help #查看命令帮助
3、创建集群:
# 为每台redis服务器开启redis集群功能,并且启动redis服务
①、开启redis集群功能:(redis服务器上)
vim /etc/redis/6379.conf
bind 192.168.4.51 #修改ip
port 6351 #修改端口(可选配置)
cluster-enabled yes #启用集群功能,814行左右
cluster-config-file nodes-6379.conf #存储集群信息的配置文件,822行左右
cluster-node-timeout 5000 #集群节点通信超时时间,828行左右
②、启动redis服务:(redis服务器上)
rm -fr /var/lib/redis/6379/* #清空redis数据
vim +43 /etc/init.d/redis_6379 #修改启动脚本
$CLIEXEC -h 192.168.4.51 -p 6351 shutdown
/etc/init.d/redis_6379 start #启动redis服务
# 集群配置文件(nodes-6379.conf)会在启动服务的时候自动在数据库目录下生成
netstat -utnlp | grep redis-server #查看redis端口,一个是redis本身的,一个是集群的
③、创建集群:(在MGM上运行ruby脚本)
redis-trib.rb create --replicas 1 \
192.168.4.51:6351 192.168.4.52:6352 192.168.4.53:6353 \
192.168.4.54:6354 192.168.4.55:6355 192.168.4.56:6356
# 一般选择前3个当做master
# --replicas 1 表示一台master配置一台slave
# master对应的slave是随机分配的
# 集群创建完毕之后,只会为主服务器分配槽(slot)用于存取数据,从服务器没有槽
④、检查集群信息:(MGM上)
# ip可以是集群中的任意ip,端口是ip对应的端口
redis-trib.rb info 192.168.4.51:6351 #查看集群信息
redis-trib.rb check 192.168.4.51:6351 #检测集群,详细信息
四、client访问集群:(192.168.4.50)
redis-cli -c -h 192.168.4.51 -p 6351
# -c表示集群,ip可以是集群中的任意ip,端口是ip对应的端口
xxx> set name bob #存数据
xxx> get name #取数据
五、集群存取数据的方式:
前面提到过,在集群创建完毕之后会为每一个master分配对应范围的槽(slot)
存取数据的时候会根据对应的key算出一个槽的值,然后进行存取
数据只会存到master主机当中,slave会自动从master中同步数据
槽的编号是:0~16383
key--->crc16--->hash值---->槽值 #hash值对16383取余
六、故障
master发生故障以后,与其对应的slave会自动升级成为master
当主机故障被修复之后,会自动成为当前master的slave,并且自动同步数据
一对主从仅能坏一个,如果master和slave全部故障,则丢失数据
写总结的第四十八天!!!
补充:
1. 主从同步无磁盘复制:
master在内存中直接创建rdb文件,然后发送给slave,无需落盘
vim /etc/redis/6379.conf
repl-diskless-sync no # 349行,开启无磁盘复制
repl-diskless-sync-delay 5 # 361行,等待5秒钟开始复制
2. 过期key的处理:
slave不会处理过期的key,当master的一个key过期了(某个key被淘汰了),会向slave发送一个模拟的del命令,slave会删除对应的key。