redis学习系列(一)--redis主从,哨兵,集群 墨蓝 2022-06-01 07:42 197阅读 0赞 ### **关于redis主从、哨兵、集群** ### ### **一、主从** ### 通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失(或少量损失)数据,因为持久化会把内存中数据保存到硬盘上,重启会从硬盘上加载数据。 但是由于数据是存储在一台服务器上的,如果这台服务器出现硬盘故障等问题,也会导致数据丢失。为了避免单点故障,通常的做法是将数据库复制多个副本以部署在不同的服务器上,这样即使有一台服务器出现故障,其他服务器依然可以继续提供服务。为此, Redis 提供了复制(replication)功能,可以实现当一台数据库中的数据更新后,自动将更新的数据同步到其他数据库上。 在复制的概念中,数据库分为两类,一类是主数据库(master),另一类是从数据库(slave)。主数据库可以进行读写操作,当写操作导致数据变化时会自动将数据同步给从数据库。而从数据库一般是只读的,并接受主数据库同步过来的数据。一个主数据库可以拥有多个从数据库,而一个从数据库只能拥有一个主数据库。 #### **主从数据库的配置** #### master slave 主不用配置,从redis的conf文件加入 slaveof ip port 就可以了 或者从redis启动时 redis-server --port 6380 --slaveof 127.0.0.1 6379 从数据库一般是只读,可以改为可写,但写入的数据很容易被主同步没,所以还是只读就可以。 也可以在运行是使用slaveof ip port命令,停止原来的主,切换成刚刚设置的主 slaveof no one会把自己变成主 #### **复制原理** #### 当从数据库启动时,会向主数据库发送sync命令,主数据库接收到sync后开始在后台报错快照rdb,在保存快照期间受到的命名缓存起来,当快照完成时,主数据库会将快照和缓存的命令一块发送给从。复制初始化结束。 之后,主每受到1个命令就同步发送给从。 当出现断开重连后,2.8之后的版本会将断线期间的命令传给重数据库。增量复制 主从复制是乐观复制,当客户端发送写执行给主,主执行完立即将结果返回客户端,并异步的把命令发送给从,从而不影响性能。也可以设置至少同步给多少个从主才可写。 无硬盘复制:如果硬盘效率低将会影响复制性能,2.8之后可以设置无硬盘复制,repl-diskless-sync yes ### **二、哨兵** ### 当主数据库遇到异常中断服务后,开发者可以通过手动的方式选择一个从数据库来升格为主数据库,以使得系统能够继续提供服务。然而整个过程相对麻烦且需要人工介入,难以实现自动化。 为此,Redis 2.8中提供了哨兵工具来实现自动化的系统监控和故障恢复功能。 哨兵的作用就是监控redis主、从数据库是否正常运行,主出现故障自动将从数据库转换为主数据库。 顾名思义,哨兵的作用就是监控Redis系统的运行状况。它的功能包括以下两个。 (1)监控主数据库和从数据库是否正常运行。 (2)主数据库出现故障时自动将从数据库转换为主数据库。 可以用info replication查看主从情况 例子: 1主2从 1哨兵,可以用命令起也可以用配置文件里 可以使用双哨兵,更安全, 哨兵配置文件 sentinel.conf sentinel monitor mymaster 192.168.0.167 6379 1 其中mymaster表示要监控的主数据库的名字,可以自己定义一个。这个名字必须仅由大小写字母、数字和“.-\_”这 3 个字符组成。后两个参数表示主数据库的ip地址和端口号,这里我们要监控的是主数据库6379。最后一个参数表示投举票数,及某从数据库的票数为n时即为master 注意: 1、使用时不能用127.0.0.1,需要用真实IP,不然java程序通过哨兵会连到java程序所在的机器(127.0.0.1 ) 2、配置哨兵监控一个系统时,只需要配置其监控主数据库即可,哨兵会自动发现所有复制该主数据库的从数据库,这样哨兵就能监控主6379和从6380、6381,一旦6379挂掉,哨兵就会在2个从中选择一个作为主,根据优先级选,如果一样就选个id小的,当6379再起来就作为从存在。 主从切换过程: (1) slave leader升级为master (2) 其他slave修改为新master的slave (3) 客户端修改连接 (4) 老的master如果重启成功,变为新master的slave 哨兵监控1主2从,停掉主,哨兵会选出1个从作为主,变成1主1从。然而当我把原来的主再起来,它不会作为从,只是个独立的节点。 ### 三、集群 ### 即使使用哨兵,redis每个实例也是全量存储,每个redis存储的内容都是完整的数据,浪费内存且有木桶效应。为了最大化利用内存,可以采用集群,就是分布式存储。即每台redis存储不同的内容, 共有16384个slot。每个redis分得一些slot,hash\_slot = crc16(key) mod 16384 找到对应slot,键是可用键,如果有\{\}则取\{\}内的作为可用键,否则整个键是可用键 集群至少需要3主3从,且每个实例使用不同的配置文件,主从不用配置,集群会自己选。 修改每个实例的配置文件: cluster-enabled yes --开启集群 cluster-config-file nodes-6382.conf --集群配置文件名,每个实例配置的要不同,redis会根据文件名自动新建 ##### **用集群工具创建集群:** ##### 我们可以用集群工具进行集群,该工具是redis源码包中,用ruby编写,所以需要先安装ruby。 1、安装rubygems yum install ruby yum install rubygems gem install redis 注:若安装过程中提示: ERROR: Could not find a valid gem 'redisa' (>= 0) in any repository ![SouthEast][] 请查看 2、把6个redis实例都起来,每个实例的集群都打开。(可以复制n份redis.conf,更改文件内的端口号及集群配置文件名,然后再以redis-service ./redis-6380.conf 启动redis实例) 3、redis安装目录的src执行 ./redis-trib.rbcreate\--replicas1 10.100.50.23:638010.100.50.23:6381 10.100.50.23:638210.100.50.23:6383 10.100.50.23:6384 10.100.50.23:6385 提示信息如下 ![SouthEast 1][] 输入yes,这样集群就建立了。 登录任一台redis,执行 info cluster,提示cluster\_enabled:1 ##### **集群过程:** ##### 首先redis-trib.rb会以客户端的形式尝试连接所有的节点,并发送PING命令以确定节点能够正常服务。如果有任何节点无法连接,则创建失败。同时发送 INFO 命令获取每个节点的运行ID以及是否开启了集群功能(即cluster\_enabled为1)。 准备就绪后集群会向每个节点发送 CLUSTER MEET命令,格式为 CLUSTER MEET ip port,这个命令用来告诉当前节点指定ip和port上在运行的节点也是集群的一部分,从而使得6个节点最终可以归入一个集群。 然后redis-trib.rb会分配主从数据库节点,分配的原则是尽量保证每个主数据库运行在不同的IP地址上,同时每个从数据库和主数据库均不运行在同一IP地址上,以保证系统的容灾能力 3主3从,当1个主故障,大家会给对应的从投票,把从立为主,若没有从数据库可以恢复则redis集群就down了。 ##### **客户端连接:** ##### 使用redis-cli -c -p 任意一个端口 [SouthEast]: /images/20220601/cd23bb9682f74e0f82963ef1a72d0a81.png [SouthEast 1]: /images/20220601/e71e2d7c818d40dd9e157600dabb620c.png
还没有评论,来说两句吧...