当前位置: 首页 > Linux

程序员学习Redis

时间:2023-04-06 01:54:21 Linux

程序员学习xxRedis概述其实程序员也要和操作系统打交道,比如最常见的,在自己的电脑上部署开发环境。当然,有时候也有一些好人认为运维或者基础部门的同事实力不够,自己部署服务器或者线上环境。这种情况也是存在的。综上所述,程序员和运维的接触是一样的,只是在集群或者动作原理上有一点点区别。我的目的是花一些时间整理一下这些运维小知识,保证被问到的是完全真实的。大家应该用单集群部署redis,下载源码包,编译。或者使用docker命令拉取。下面是一个集群CLUSTER。CLUSTER一般用于部署6个单元:3master和3slave。如果可以单机部署,其实很简单,修改redis.conf,开启监听端口,节点等选项。主要涉及以下几项:binddaemonizerequirepassmasterauthlogfilecluster-enabledcluster-config-filecluster-node-timeoutdbfilenameappendfilename修改完成后,启动6个redis,登录redis/root/docker_redis_cluster/redis-3.2.11/src/redis-cli-h127.0.0.1-p6379auth123456inforeplication然后使用meet命令添加其他集群CLUSTERMEET172.17.0.36379CLUSTERMEET172.17.0.46379...CLUSTERNODES需要分配槽redis-cli-p6379clusteraddslots{0..5461}redis-cli-p6380clusteraddslots{5462..10922}redis-cli-p6381clusteraddslots{10923..16383}CLUSTERNODESassigned3是master,登录其他3台服务器,分别添加masterto自己完成集群CLUSTERNODESCLUSTERREPLICATE760e4d0039c5ac13d04aa4791c9e6dc28544d7c7#分别登录从机,加入主服务器的id茶歇。昨天,redis集群修好了。一开始没问题,但是看完伪善的描述,我想会有人跳出来:“低货,人家redis集群是用集群脚本安装的。”作为9012的猿猴,虽然Yann认为可以给出100个理由来证明集群脚本的不便,但脚本本身还是可以理解的。这里提到的脚本是名为redis-trib的rb脚本。虽然100个理由比较难,但是还是可以举几个理由:需要ruby环境支持容器,不支持密码。apt-getinstallruby??geminstallredis这里还会有一个坑:使用gem时系统会报ruby版本太低。如何使用rvm修改版本是另一篇文章。对于cleanfreaks(比如yann)来说,没有理由在系统中安装ruby是不能接受的。此外还有派生问题,后面会讲到。命令参数cd/usr/local/src/redis-3.2.11/src./redis-trib.rbhelpcreatecheckinfofixreshard创建集群./redistrib.rbcreate--replicas1127.0.0.1:6479127.0.0.1:6480127.0.0.1:6481127.0.0.1:6482127.0.0.1:6483127.0.0.1:6484ps。可以先添加3组,然后通过添加新节点指定对应的主库不支持密码。第二个原因爆发。Redis-trib.rb会报无法连接集群。您需要修改client.rb文件。修改完源代码文件后,脚本连接到集群上,继续进行其他操作,对集群进行测试。/redis-trib.rbcheck127.0.0.1:6479查看信息。/redis-trib.rbinfo127.0.0.1:6479平衡节点按权重分布,比较实用的功能之一。/redis-trib.rbrebalance127.0.0.1:6479删除节点只能删除没有分配槽的节点。/redis-trib.rbdel-node127.0.0.1:6480添加节点,添加主库。请注意,添加的服务器是第一个。添加从库需要主库id./redis-trib.rbadd-node127.0.0.1:6488127.0.0.1:6479./redis-trib.rbadd-node--slave--master-id77c2a2d5e96d14a4c5b5614cb68ad27d40530f4b127.0.0.1:6480127.0.0.1:6479其实上面的操作都没有完成。原因很简单。Yann使用容器搭建的redis会有2个ip,容器外的ip和容器内的ip。使用容器内的ip将无法运行脚本,使用容器外的ip将无法运行脚本。请自己想想原因。至此,就无法出坑了,虽然可以在容器内部安装ruby解决,但是容器是精简系统,redis文件不完整...redis-trib.rb不能很好地支持容器。茶歇时间采访别人还是很有技巧的。比如你用容器搭建redis,你就知道redis-trib。.rb文件?如何使用redis-trib.rb和刚才搭建的redis做集群?答案是做不到。原因请参考昨天的巨坑。用集群完成生产操作后,可以做一些具体的工作,例如:槽迁移和再平衡单机迁移到集群槽迁移为什么要进行槽迁移?当然是为了集群的扩容/缩容。redis的slot其实是一个很重要的概念。如果slot不分配,集群不能使用,有slot的节点不能删除,slot只分配在master节点上……曹伟:你说我?不行,赶紧滚。。。在线迁移是用来完成集群的在线横向扩缩容。/redis-trib.rbreshard127.0.0.1:6479#勾选后会有交互信息,问多少slotmigrate,生产中常用参数迁移到哪个节点。/redis-trib.rbreshard--from7fa64d250b595d8ac21a42477af5ac8c07c35d83--to5476787f31fa375fda6bb32676a969c8b8adfbc2--slots10127.0.0.1c35d83--to5476787f31fa375fda6bb32676a969c8b8adfbc2--slots10127.0.0.1rebalancedtheslotnewaddedthenodes,rebalancedtheslot:6479,这可以通过重新平衡来解决。还有就是密码问题,修改rb文件或者取消配置文件上的密码,看看大家喜欢什么../redis-trib.rbrebalance127.0.0.1:6479单机迁移到集群常用于处理历史问题。当时需求紧急,上线了12345redis-trib.rbimport--fromip:port:id#源单机--copyip:port#集群密码问题,还需要修改源文件代码:viredis-trib.rb这三天一直在讲集群的使用。今天,我们来解释一下集群的工作原理。虽然都是官方提供的:RedisCluster使用无中心节点可以这样实现,不用proxy,客户端直连redis集群的所有节点,根据hash计算key对应的slot算法,命令在slot对应的Redis上执行。从CAP角度看,RedisCluster属于APAvailability&Partition-Tolerancy,可用和分区容错安全加固Redis是系统的一大漏洞,yann不能关机,需要root权限,是从它的私有环境运行,请勿模仿总之,常用加固如下:开启redis密码认证,禁止使用root用户启动,修改默认端口6379限制访问redis配置文件禁用或重命名危险命令禁止监控开启保护模式on公网开启redis密码认证viredis.confrequirepass#配置强密码禁止使用root用户启动useradd-s/sbin/nolog-Mredissudo-uredis//redis-server//redis.conf修改默认6379端口#80,81,82兄弟在viredis.conf中限制访问redis配置文件chmod600//redis.conf不需要禁用或者重命名危险的命令。毕竟在viredis.conf中rename-commandDEL""#或者rename-commandFLUSHALL都不方便。joYAPNXRPmca禁止在公网viredis上监控。bind127.0.0.1inconf#orlocalip是开启保护模式所必需的,没有密码和bind只能在本地访问viredis。Protected-modeyesquestioninconf之前Yann有一个问题,不知道大家会不会有类似的疑惑:REDIS有master-slave和sentinel模式,为什么需要CLUSTER?今天解决这个问题持久化相关命令参考mysql备份机制rdb相当于物理备份,aof相当于逻辑备份viredis.confdbfilenameappendfilename#主要参数和上下名称相似的各种设置参数更改master方法from数据库:清除从库,然后从新的主库完全同步一份数据,然后继续上传。重做这个过程。主库bg将自己的数据保存到磁盘中。主库将rdb文件发送给从库。从库开始加载并恢复上传。同时开始提供服务。真实数据——但是数据量超过20GB,复制时间超过20如果每分钟有多个从库,时间会加倍。同时需要考虑网卡的瓶颈,使用内存限制viredis.confmaxmemory。还是接受数据需要20多分钟,中断时间太长,同步缓冲区被覆盖,重同步持久化过程阻塞Redis主线程,20G内存需要750ms左右。大家都知道Redis很快,但是到底有多快呢?QPS测试环境i5CPU8GB内存REDIS测试工具cdsrc./redis-benchmark-n1000000-tset,get-q#SET:48936.32requestspersecond#GET:51290.85requestspersecondREDIS的大概数据大概是5wMYSQL测试工具sysbenchurl-shttps://packagecloud.io/install/repositories/akopytov/sysbench/script.deb.sh|sudobashsudoapt-yinstallsysbenchmysql-uroot-p-e“创建数据库基准”sysbench/usr/share/sysbench/oltp_read_write。lua--mysql-user=root--mysql-password=root--mysql-db=benchmark--tables=10--t能够大小=1000000--events=100000000--report-interval=10--threads=4--time=300preparesysbench/usr/share/sysbench/oltp_read_write.lua--mysql-user=root--mysql-password=root--mysql-db=benchmark--tables=10--table-size=1000000--events=100000000--report-interval=10--threads=4--time=300因为用了阿里云RDS所以运行,我没有为这个操作做同样的配置。服务器反馈是单线程REDIS数据大概4000个都在内存中。单线程运行效率最高。多线程上下文切换从内存中读取1MB的连续数据大约需要1500ns。耗时约250us。假设多线程读取1000次,光切换耗时1500ns*1000=1500us。RedisRedis6引入的多线程IO特性优化方向,提升了网络IO的性能。使用DPDK使用多核运行多线程,仅用于处理网络数据和协议分析。实现原理主线程收到连接建立请求,将read事件放入队列中进行处理,主线程将连接分配给其他IO线程,然后主线程等待IO线程读取请求的数据并解析主线程执行命令并清空队列性能对比viredis.confio-threads4io-threads-do-readsyes#仅记录,拿到后测试,需要gcc5.0+redis-benchmark-h192.168.0.49-afoobared-tset,get-n1000000-r100000000--threads4-d${datasize}-c256周报Redis也看了一周,每天测试,做笔记,总结...感觉可以暂停一下,明天会有新的东西。下面是Redis缓存雪崩的最后一部分。所谓缓存雪崩,就是缓存宕机了,所有的请求都跑到数据库去了。这里有两个前提条件:业务流量大的系统没有降级限流设置措施。连接数为200,通常配置为2000,加上只读库可以算作4000,加上一般的连接池操作,一般能抵抗一段时间,一直坚持到redis拉起来。除了限流之外,SpringCloud和Dubbo都可以有Hystrix。与核心业务相比,建议配置Up。如何解决缓存雪崩?系统方面的故障总是好解决的,无论是Redis集群,自身监控还是Mysql的监控,都可以提醒有故障并进行处理。难点是写过期时间等逻辑错误,结果都同时过期。又比如新功能上线时直接没有缓存。它需要预热。缓存穿透很简单,就是不断请求不存在的参数。它被处理了。这也与数量有关,少量无害。如果量大,redis命中率低,直接报警。解决方案有两种:要么Bloomfilter参数不合理,要么干脆缓存空对象,用哪种方式看你自己。REDIS和MYSQL都有一致的缓存,但是一致性很头疼。不仅仅是Redis和Mysql,浏览器缓存,甚至CDN,所有与缓存相关的问题都是头疼的问题。对于读操作,如果数据在缓存中,则直接取缓存返回。如果不在缓存中,先查询数据库,再将结果写入缓存。最后将数据返回给请求。写操作先更新数据库,失败后再操作缓存。比较优雅的方式是在MySQL端定义CRUD触发器,或者在Redis端解析binlog进行操作。更现实的方法是使用消息队列来保证更新操作能够完成。即使对相同数据的请求放在一个队列中,当然也可能全部卡住。更新缓存不涉及更新缓存。其实是定时更新还是逻辑判断有效性,都是根据业务特点来决定的。缓存算法FIFO先进先出LRU近期最少使用,使用时间差LFU最不频繁使用,次数差注:Redis4.0只有LFU。总结从1号到现在,写了很多。大部分集中在坑和生产应用上,日常使用Redis的记录相对较少。没办法,时间还是不够。即便我强烈地驱使自己,我还是有味道的。任何一个申请都可以静下心来弄清楚一个月,但是没有时间。遇到它时请不要失去理智。其他人只能跟进。让我们互相鼓励!本文由博客发布平台OpenWrite发布!欢迎关注最新内容公众号: