一、主从复制
1、概念
主从复制就是主机数据更新后根据配置和策略,自动同步到备机的master/slave机制,master以写为主,slave以读为主。
2、优点
3、配置
- 拷贝多个redis.conf文件include
- 开启daemonize yes
- pid文件名字pidfile
- 指定端口port
- log文件名字
- dump.rdb名字dbfilename
- appendonly关闭或换名字
- info replication 打印主从复制的相关信息
- slaveof 成为某个实例的从服务
4、一主二仆模式演示
- 数据一致
- 主服务器能读能写
- 从服务器只能读,不能写。
- 从服务关闭,再次上线,需要再次slaveof设置为从服务器,数据任然一致。
- 主服务器关闭,从服务原地待命,再次上线后主动设为主服务器,任然保持数据一致。
5、复制原理
- 每次从机连通后,都会给主机发送sync指令
- 主机立刻进行存盘操作,发送rdb文件给从机。
- 从机收到rdb文件后,进行全盘加载。
- 之后每次主机的写操作,都会立刻发送给从机,从机执行相同的命令。
6、主从复制之薪火相传
- 上一个slave可以是下一个slave的master,slave同样可以接收其他slaves的连接和同步请求,那么该slave作为链条中下一个的master,可以有效减轻master的写压力,去中心化降低风险。
- 用slaveof
- 中途变更转向:会清除之前的数据,重新建立拷贝最新的。
- 风险是一旦某个slave宕机,后面的slave都没法备份
- 当一个master宕机后,后面的slave可以立刻升为master,其后面的slave不用做任何修改。
- 用slaveof no one 将从机变为主机。
7、主从复制之哨兵模式(sentinel)
- 薪火相传的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库。
- 新建sentinel.conf文件 sentinel monitor mymaster 127.0.0.1 6379 1
- mymaster为监控对象的服务器名称,1为至少有多少个哨兵同意迁移。
- 启动哨兵 redis-sentinel /myredis/sentinel.conf
二、集群
1、问题
- 容量不够,redis如何进行扩容?
- 并发写操作,redis如何分摊?
2、redis集群
- redis集群实现了对redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N。
- redis集群通过分区(partiton)来提供一定程度的可用性,availiability:即时集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求
3、安装
- 安装ruby环境 高版本不需要安装
- redis-3.2.0.gem
- gem install --local redis-3.2.0.gem
- 制作多个实例,与主从复制一致
- 添加如下配置
cluster-enabled yes --打开集群模式 cluster-config-file node-7788.conf --设置节点配置文件名 cluster-node-timeout 15000 --设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换 - 合体
cd /opt/reids-3.2.5/src ./redis-trib.rb crrate --replicas 1 192.168.242.132:6379 192.168.242.132:6380 192.168.242.132:6381 - 以集群的方式进入客户端redis-cli -c -p port
- 通过cluter nodes 命令查看集群状态
4、redis cluster如何分配这六个节点?
- 一个集群至少要有三个主节点
- 选项 --replicas 1表示我们希望为集群的每一个主节点创建一个从节点
- 分配原则尽量保证每一个主数据库运行在不同的ip地址,每个从库和主库不在一个ip地址上。
5、什么是slots?
- 一个redis集群包含16384个插槽,数据库中的每个键都属于16384个插槽的其中的一个。
- 集群中的每个节点负责处理一部分插槽
6、在集群中录入值
- 在redis-cli每次录入、查询键值,redis都会计算key应该送往的插槽,如果不是该服务器对应的插槽,redis会报错,并告知应前往的redis实例地址和端口。
- redis-cli客户端提供可-c参数实现自定重定向
- 不在一个slot下的键值,是不能使用mget,mset等多键操作的。
- 可以通过{}来定义组的概念,从而是key中{}内相同内容的键值对放到一个slot中去。
7、集群操作
cluster keyslot --计算键key应该被放置在哪个槽上 cluster countkeyinslot --返回槽slot目前包含的键值对的数量 cluster getkeysinslot --返回count个slot槽中的键
8、故障恢复
- 主节点下线,选其中某个从节点中选取主节点。
- 主节点恢复后,变成从节点。
- 如果所有某一段插槽的主节点都宕掉,redis服务将不能继续服务。
- redis.conf中的参数 cluster-require-full-coverage yes 16384个slot都正常的时候才能对外提供服务。
9、redis集群优点
10、redis集群缺点
- 多键操作不被支持
- 多键的redis事务不被支持,lua脚本不被支持。
- 由于集群方案出现较晚,很多公司已经采用了其他的集权方案,而代理或者客户端分片的方案想要迁移至集群,需要整体迁移而不是逐渐过渡,复杂度较大。
|