主从复制
1)、定义
主机数据更新数据后更具配置和策略,自动同步到备机的master/slave机制
读写分离,性能扩展;容灾快速恢复
2)、特点
①Master以写为主(也可读),Slave以读为主(不能写)
②中途设置关系,从服务器还是会复制主服务器所有数据
3)、配置(配从不配主,以一台机器为例)
①建立一个redis.conf,通过include引入原redis.conf文件
include redis.conf路径
②pid文件名
pidfile /var/run/redis6379.conf
③指定port
port 端口号
④Log文件名
⑤RDB名
dbfilename 文件名
⑥关闭/修改appendonly文件名
从机配置主机密码:masterauth password
⑦指定不同的配置文件启动服务
配置
启动
⑧成为某个实例的从服务器:slaveof ip port
打印主从复制的相关信息:info replication
将6380设置为6379的从机:
⑨此时从机关闭服务器后,关系断开;主机关闭服务器,不会断开
⑩如何配置永久主从复制
在配置文件中配置:slaveof 主IP 主PORT 即设置
4)、复制原理
每次从机联通,都会给主机发送sync指令
主机立刻进行存盘操作,发送RDB文件给从机
从机收到RDB文件后,进行全盘加载
之后每次主机的写操作,都会立刻发送给从机
①薪火相传
上一个slave可以作为下一个slave的Master
有效减轻master的写压力,去中心化降低风险
风险:一旦中间某个slave宕机,后续从机就接收不到信息
当主机宕机后,可在第一个从机执行:slaveof no one来将其作为主机####
②哨兵模式(sentinel)
反客为主的自动版,能够后台监视主机是否故障
如果故障了根据投票数自动将从库转换为主库
新建一个sentinel.conf文件,文件中填写 sentinel monitor mymaster IP PORT 1
mymaster为监控对象起的服务器名称,1为至少有多个哨兵同意迁移的数量
开启:redis-sentinel sentinel.conf
特点:
新主登基:从服务器选择一个成为新主服务器(条件依次为:优先级靠前/小、偏移量大、runid最小)
优先级为redis.conf中的slave-priority 100;偏移量指获得原主数据最多;每个redis实例启动随机生成40位runid
群仆俯首:其它从服务器选择新主服务器
旧主俯首:旧主服务器作为新主服务器的从机
Redis集群(解决内存压力)
1)、作用
实现了 Redis的水平扩容,启动N个redis节点
将整个数据库分布存储在这N个节点中,每个节点存储总数居为1/N
Redis集群通过分区来提供一定程度的可用性:集群中一部分节点失效,也可以继续处理请求
2)、安装ruby环境
①yum install ruby
yum install rubygems
或②在ISO映射文件中获取rpm包
拷贝redis-3.2.0.gem到/opt目录下
opt下执行:gem install --local redis-3.0.2.gem
3)、设置(一台机器设置六个实例)
①新建配置文件(和主从复制一样),追加:
cluster-enabled yes:打开集群模式
cluster-config-file nodes-***.conf:设定节点的配置文件名
cluster-node-timeout 15000:设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换
②组合集群
组合前确认所有redis实例启动后,生成nodes-****.conf文件都生成正常
进入 /opt/redis/src下,执行(不能使用127.0.0.1,使用真实IP):
./redis-trib.rb create --replicas 1 IP1:PORT1 IP2:PORT2 …
会自动建立集群和主从关系:
一个集群至少要有三个主节点
–replicas 1:表示希望为集群中的每个主节点创建一个从节点
分配原则尽量保证每个主数据库运行在不同的IP,每个从库和主库不在同一个IP
4)、以集群的方式进入客户端
①redis-cli 启动
每次录入时,若插槽和节点不匹配则会报错
②redis-cli -c -p 端口号 来启动
通过一个客户端计算出数据对应的插槽,重定向到不同的服务器
通过 cluster nodes 查看集群信息
5)、插槽(slots)
①一个Redis集群包含16384个插槽,数据库中每个键都属于插槽中的一个
集群使用公式CRC16(key)%16384来进行计算
集群中每个系节点但那负责处理一部分插槽
②不在一个slot下的键值,不能使用mget、mset等多建操作
可通过{}来定义组的概念,从而使key中{}内相同内容的键值对放到一个slot中去
即set key1{group} value,set key2{group} value 在同一个节点
③指令
cluster keyslot key 计算key:应该放置在哪个插槽
cluster countkeysinslot slot::返回槽slot目前包含的键值对数量
cluster getkeysinslot slot count: 返回count个slot槽中的键
6)、故障恢复
①主节点下线,从节点自动升为主节点,旧主节点上线,变为从节点
②某一段插槽所有节点下线,redis服务不能继续使用
redis.conf中存在参数 cluster-require-full-coverage yes(默认值)
表明16384个插槽都正常才能对外提供服务
7)、优点和不足
优点:实现扩容、分摊压力、无中心配置相对简单
不足:多键操作不支持;多键的Redis事务不被支持;lua脚本不被支持;出现较晚,被其它方案替代