Redis集群
Redis持久化的实现方式:RDB和AOF,都开启也不会同时执行避免对磁盘io的影响过大
RDB:异步bgsave的方式保存当前的完整数据,会有部分数据的丢失(保存之后的新增和修改数据)
AOF:类似MySQL的二进制日志,记录每次写操作的命令到文件,而RDB是保存数据本身,写操作文件会随时间长而增大,但redis进程会自动扫描文件然后重写去除多余的冗余操作简化文件内的写操作生成临时文件并替换旧的文件从而减小文件大小
Redis自带主从和读写分离的配置,开启主从时,先全量同步-m将数据快照保存到数据文件中并传送到s,s保存到本地后直接载入内存,之后增量同步-同步主的每一步写操作给从去执行
当m宕机时,就无法接收到写请求,这时就需要用到哨兵模式
哨兵相当于一个redis的监控服务,里面多个节点同时监控m的工作状态和主从架构状态,还可以提供配置功能,获取m的配置信息,当m宕机时,多个节点会互相确认m是否宕机(防止误判和负载均衡),并进行m迁移-将m的相关配置移到一个s上提升为m,整个过程透明快速实现集群的高可用
redis-cluster是一个去中心化的多节点分布式存储集群,优势主要体现在海量数据存储上(一般不配置读写分离),集群内有16384个存储槽来供多个m节点均分,通过特殊算法来决定将key放置在哪个槽位上,所有节点间相互通信保证了c端在任意一个节点上都能获取其他节点的数据信息,每台m都有一台备用s来防止单点故障,动态扩容缩容也很方便(新的节点加入或移除时是对应存储槽的迁移)
一、redis哨兵模式的搭建
准备一台服务器192.168.100.3,实验用不同的端口作为不同节点
端口分配:mss-7000、7001、7002 sentinel:8001、8002、8003
安装依赖包:yum -y install gcc gcc-c++ make cmake zlib zlib-devel openssl-devel
1.搭建redis主从同步mss:
tar -xf redis-3.2.4.tar.gz -C /usr/local/
cd /usr/local/redis-3.2.4/
make&&make install
vi redis.conf #配置master配置文件
bind 192.168.100.3
daemonize yes
protected-mode no
port 7000
pidfile /var/run/redis_7000.pid
logfile "7000.log"
mkdir slave1 && mkdir slave2
cp redis.conf slave1/ && cp redis.conf slave2/
vi slave1/redis.conf #配置slave配置文件,第二个从同样配置
bind 192.168.100.3
protected-mode no
daemonize yes
port 7001
pidfile /var/run/redis_7001.pid
logfile "7001.log"
slaveof 192.168.100.3 7000
redis-server redis.conf #启动master和两个slave
测试主从:
redis-cli -h 192.168.100.3 -p 7000
info replication #查看主从信息
2.搭建sentinel哨兵监控模式
mkdir sentinel
cat sentinel.conf grep -v “#” | grep -v “^$” > sentinel/8001.conf
//复制sentinel主配置
vi sentinel/8001.conf #8002、8003同样配置
port 8001
protected-mode no
logfile "8001.log"
daemonize yes
dir "/tmp"
sentinel monitor mymaster 192.168.100.3 7000 1
redis-sentinel sentinel/8001.conf #启动sentinel
测试:
redis-cli -p 8001
info //查看集群信息
二、Redis-cluster的搭建
一个端口代表一个实例节点,所以实验用一台服务器+6个端口就可以了192.168.100.4
准备好redis包
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
//使用阿里云的centos源(因为自带的centos源yum包实在是太慢)
1.安装好依赖包
yum -y install ruby ruby-devel rubygems rpm-build make cmake gcc gcc-c++ zlib zlib-devel openssl-devel
gem install redis # redis接口的安装
注:这时候可能会报错ruby版本过低
解决:ruby --version 看看现在版本多少
使用ruby-install工具安装最新版本的ruby:
yum -y install mysql-devel //安装依赖
wget -O ruby-install-0.6.1.tar.gz https://github.com/postmodern/ruby-install/archive/v0.6.1.tar.gz //下载工具
tar -xzvf ruby-install-0.6.1.tar.gz
cd ruby-install-0.6.1/
make install # 安装
ruby-install ruby #安装当前稳定版本的ruby(这个工具命令很多有兴趣可以查资料)
ln -s /opt/rubies/ruby-2.7.0/bin/ruby /usr/bin
ruby --version #查看安装成功没
这时再执行
gem install redis #redis接口的安装
2.正式开始搭建cluster集群
wget http://download.redis.io/releases/redis-3.2.4.tar.gz
tar -xf redis-3.2.4.tar.gz -C /usr/local/
cd /usr/local/redis-3.2.4/
make&&make install
cp src/redis-trib.rb /usr/local/bin/ #创建集群的工具
mkdir redis-cluster
cd redis-cluster/
mkdir 7001 #创建节点工作目录,依次创建到7006
cp /usr/local/redis-3.2.4/redis.conf 7001/ #节点主配置,依次复制到7006
配置这些主配置文件:
port 7001 //端口7001-7006
bind 本机ip
daemonize yes //redis守护进程模式运行
pidfile /var/run/redis_7001.pid //文件对应7001-7006
cluster-enabled yes //开启集群 把注释#去掉
cluster-config-file nodes_7000.conf //集群的配置 7001-7006
cluster-node-timeout 15000 //请求超时 默认15秒
appendonly yes
依次启动节点7001-7006:
redis-server redis_cluster/7001/redis.conf
ss -nutlp | grep redis #检查端口启动情况
创建集群:
redis-trib.rb create --replicas 1 192.168.100.4:7001 192.168.100.4:7002 192.168.100.4:7003 192.168.100.4:7004 192.168.100.4:7005 192.168.100.4:7006
redis-cli -c -h 192.168.100.4 -p 7001 #登陆集群
>cluster nodes #查看集群状态
>set a b #插入数据,此时会提示插入到了哪个节点的槽位并切换到该节点
3.测试:
kill掉一个主节点的进程
cluster nodes #查看集群状态(其中一个s被提升为m)
d2967b87a97ed41be15b41bba6939171fb1104f5 192.168.100.4:7005 slave 8d70205df438db611408d465f6a3d8ec36986242 0 1578994059488 5 co
74bee3048a9af9d86ad81b6e3eb04a4aa6910c5b 192.168.100.4:7004 master - 0 1578994060496 8 connected 0-5460
5adc63a99c462a6838d53214ce8a6996ead33767 :0 master,fail,noaddr - 1578993868514 1578993868111 1 disconnected #被kill掉的节点已经显示fail
c6c5b310d4515b6a0d275885db899b5d26bfeeaf 192.168.100.4:7003 myself,master - 0 0 3 connected 10923-16383
d05affda28d0d94fad71bcb0c30305359d7ebb5c 192.168.100.4:7006 slave c6c5b310d4515b6a0d275885db899b5d26bfeeaf 0 1578994058483 6 co
8d70205df438db611408d465f6a3d8ec36986242 192.168.100.4:7002 master - 0 1578994057475 2 connected 5461-10922
启动该故障节点并添加进集群内:
redis-server redis_cluster/7001/redis.conf
./redis-trib.rb add-node 192.168.100.4:7001 192.168.100.4:7002
//第一次节点为新增的节点 第二个节点为集群中的节点(任意一个都行)
默认新增进去都是master状态,但是不会分配存储槽,我们在这里将该节点配置成从
redis-cli -h 192.168.100.4 -p7001 #登陆新增节点内
CLUSTER REPLICATE 74bee3048a9af9d86ad81b6e3eb04a4aa6910c5b
// 将7001配置成无对应s的m的s
cluster nodes #查看集群状态已恢复正常
上面的被kill掉的:0 master,fail,noaddr 如果没有自己消失,由于没有对应节点IP所以可以通过cluster删除:
cluster forget 5adc63a99c462a6838d53214ce8a6996ead33767
测试完成,集群搭建成功
4.延申:如何添加一个主节点并正常存储数据
redis-trib.rb add-node 192.168.100.4:7007 192.168.100.4:7002
redis-trib.rb reshard 192.168.100.4:7001
//槽位分配命令,可以为任意的节点登陆
输入4096个槽位并回车(表示希望分配的槽位数量)
输入新节点7007的ID并回车(表示希望把上面的槽位分配的对象)
输入all并回车(从哪些主节点抽取这些槽到该对象中)
主节点添加完成
如何删除一个主节点:需要先转移节点的槽位
redis-trib.rb reshard 192.168.100.4:7001 //槽位分配命令,可以为任意的节点登陆
输入4096个槽位并回车(被移除节点的槽位数量)
输入新节点7002的ID并回车(表示希望把上面的槽位分配的对象,这里可以填任意m节点)
输入被删除节点的id(表示希望从该节点抽取槽位)
输入done结束
redis-trib.rb del-node 192.168.100.4:7007 fede90723f1bf118c67d689ba3557370fe7ab552
删除命令
主节点删除完成