首页 文章 精选 留言 我的

精选列表

搜索[数据库分片],共10021篇文章
优秀的个人博客,低调大师

Centos-redis安装与分片设置

win系统 1、进入到redis的目录下面 D:\360安全浏览器下载\redis-2.4.5-win32-win64\64bit 2、输入以下命令: redis-server.exe redis.conf 3、然后再打开一个dos命令栏,进入到redis的目录下,输入以下命令测试: redis-cli.exe -h 127.0.0.1 -p 6379 Linux系统 解压 tar -zxvf redis-3.0.2.tar.gz 编译 cd /usr/nacp/redis-3.0.2 make make install 错误解决 cc: Command not found 异常原因:没有安装gcc 解决方案:rpm -ivh gcc-c++-4.4.7-16.el6.x86_64.rpm error: jemalloc/jemalloc.h: No such file or directory 解决方案:make distclean。清理一下,然后再make。 couldn't execute "tclsh8.5": no such file or directory 异常原因:没有安装tcl 解决方案:rpm -ivh tcl-8.5.7-6.el6.x86_64.rpm 权限修改 查看权限:ls -l /usr/nacp/redis-3.0.2/src chmod 777 /usr/nacp/redis-3.0.2/src 创建集群需要的目录 mkdir -p /usr/local/cluster cd /usr/local/cluster mkdir 8000 mkdir 8002 mkdir 9004 mkdir 8001 mkdir 8003 mkdir 9005 修改配置文件redis.conf cp /usr/nacp/redis-3.0.2/redis.conf /usr/local/cluster vim redis.conf 修改配置文件中的下面选项 port 8000 daemonize yes cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes 修改完redis.conf配置文件中的这些配置项之后把这个配置文件分别拷贝到8000/8002/9004/8001/8003/9005目录下面 cp /usr/local/cluster/redis.conf /usr/local/cluster/8000/redis.conf cp /usr/local/cluster/redis.conf /usr/local/cluster/8002 cp /usr/local/cluster/redis.conf /usr/local/cluster/9004 cp /usr/local/cluster/redis.conf /usr/local/cluster/8001 cp /usr/local/cluster/redis.conf /usr/local/cluster/8003 cp /usr/local/cluster/redis.conf /usr/local/cluster/9005 注意:拷贝完成之后要修改8000/8002/9004/8001/8003/9005目录下面redis.conf文件中的port参数,分别改为对应的文件夹的名称 vim /usr/local/cluster/8000/redis.conf vim /usr/local/cluster/8001/redis.conf 分别启动这6个redis实例 redis-server /usr/local/cluster/8000/redis.conf redis-server /usr/local/cluster/8001/redis.conf redis-server /usr/local/cluster/8002/redis.conf redis-server /usr/local/cluster/8003/redis.conf redis-server /usr/local/cluster/9004/redis.conf redis-server /usr/local/cluster/9005/redis.conf 启动之后使用命令查看redis的启动情况ps -ef|grep redis 如下显示则说明启动成功 root 13703 1 0 10:03 ? 00:00:00 redis-server *:8000 [cluster] 所有机器安装好并启动redis后 执行redis的创建集群命令创建集群 #redis-trib.rb的create子命令构建 #--replicas 则指定了为Redis Cluster中的每个Master节点配备几个Slave节点 #节点角色由顺序决定,先master之后是slave 创建方式 cd /usr/nacp/redis-3.0.2/src /usr/nacp/redis-3.0.2/src/redis-trib.rb create --replicas 1 192.168.2.233:8000 192.168.2.233:8002 192.168.2.235:9004 192.168.2.233:8001 192.168.2.233:8003 192.168.2.235:9005 注意:如出现某机器端口错误或没找到,找到相对机器删除redis路径下的aof rdb conf log格式文件再启动一下端口就可以了 报错解决方法 错误内容:/usr/bin/env: ruby: No such file or directory 所以需要安装ruby的环境,这里推荐使用yum install ruby安装 yum install ruby 错误内容:./redis-trib.rb:24:in `require': no such file to load -- rubygems (LoadError)from ./redis-trib.rb:24 提示缺少rubygems组件 yum install rubygems 错误内容:/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- redis (LoadError)from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'from ./redis-trib.rb:25 提示不能加载redis,是因为缺少redis和ruby的接口,使用gem 安装 gem install redis 或者 升级ruby 安装gem rpm -ivh puppetlabs-release-5-6.noarch.rpm rpm -ivh ruby-1.8.7.374-4.el6_6.x86_64.rpm rpm -ivh ruby-devel-1.8.7.374-4.el6_6.x86_64.rpm rpm -ivh rubygems-1.3.7-5.el6.noarch.rpm rpm -ivh rpm-build-4.8.0-47.el6.x86_64.rpm rpm -ivh redhat-rpm-config-9.0.3-44.el6.centos.noarch.rpm rpm -ivh rpm-4.8.0-47.el6.x86_64.rpm rpm -ivh rpm-libs-4.8.0-47.el6.x86_64.rpm rpm -ivh rpm-python-4.8.0-47.el6.x86_64.rpm 检查 ruby 版本: #ruby -v ruby 1.8.7 (2013-06-27 patchlevel 374) [x86_64-linux] 是否安装rubygems: # rpm -qa|grep ruby ruby-rdoc-1.8.7.374-2.el5 ruby-1.8.7.374-2.el5 ruby-devel-1.8.7.374-2.el5 ruby-devel-1.8.7.374-2.el5 ruby-mode-1.8.5-24.el5 ruby-irb-1.8.7.374-2.el5 ruby-libs-1.8.7.374-2.el5 ruby-libs-1.8.7.374-2.el5 rubygems-1.3.7-1.el5 gem 安装redis ruby 接口 gem install redis 首先要链接redis客户端 redis-cli redis-cli -h host -p port 然后要通过key来查找你存的数据,相当于一个数组,有key,有value,通过key来查看value的值。 keys * 注:列出当前redis存储的全部key。 keys W* 注:列出当前redis存储的key名里第一个是“W”的全部key。 找到key名字后,就可以查看key里存了什么值了。 get WXOX 注:WXOX是你查出来的key的名字。 然后就可以看到WXOX里存了什么东西了,可能存了一个字符串,也可能存了一个对象,要是空的话,就会输出nil,意思是啥也没有! 清理reids数据 select 库号 flushdb

优秀的个人博客,低调大师

RocketMQ 主题扩分片后遇到的坑

消息组接到某项目组反馈,topic 在扩容后出现部分队列无法被消费者,导致消息积压,影响线上业务? 考虑到该问题是发送在真实的线上环境,为了避免泄密,本文先在笔者的虚拟机中来重现问题。 1、案情回顾 1.1 集群现状 集群信息如下:例如业务主体名 topic_dw_test_by_order_01 的路由信息如图所示:当前的消费者信息:broker 的配置信息如下: brokerClusterName = DefaultCluster brokerName = broker-a brokerId = 0 deleteWhen = 04 fileReservedTime = 48 brokerRole = ASYNC_MASTER flushDiskType = ASYNC_FLUSH brokerIP1=192.168.0.220 brokerIP2-192.168.0.220 namesrvAddr=192.168.0.221:9876;192.168.0.220:9876 storePathRootDir=/opt/application/rocketmq-all-4.5.2-bin-release/store storePathCommitLog=/opt/application/rocketmq-all-4.5.2-bin-release/store/commitlog autoCreateTopicEnable=false autoCreateSubscriptionGroup=false 备注:公司对 topic、消费组进行了严格的管控,项目组需要使用时需要向运维人员申请,故 broker 集群不允许自动创建主题与自动创建消费组。 由于该业务量稳步提升,项目组觉得该主题的队列数太少,不利于增加消费者来提高其消费能力,故向运维人员提出增加队列的需求。 1.2、RocketMQ 在线扩容队列 运维通过公司自研的消息运维平台,直接以指定集群的方式为 topic 扩容,该运维平台底层其实使用了RocketMQ 提供的 updateTopic 命令,其命令说明如下:从上图可以得知可以通过 -c 命令来指定在集群中所有的 broker 上创建队列,在本例中,将队列数从 4 设置为 8,具体命令如下: sh ./mqadmin upateTopic -n 192.168.0.220:9876 -c DefaultCluster -t topic_dw_test_by_order_01 -r 8 -w 8 执行效果如图所示,表示更新成功。我们再来从 rocketmq-console 中来看命令执行后的效果:从上图可以得知,主题的队列数已经扩容到了8个,并且在集群的两台broker上都创建了队列。 1.3 消息发送 从 RocketMQ 系列可知,RocketMQ 是支持在线 topic 在线扩容机制的,故无需重启 消息发送者、消息消费者,随着时间的推移,我们可以查看topic的所有队列都参与到了消息的负载中,如图所示:我们可以清晰的看到,所有的16个队列(每个 broker 8个队列)都参与到了消息发送的,运维小哥愉快的完成了topic的扩容。 2、问题暴露 该 topic 被 5个消费组所订阅,突然接到通知,其中有两个消费组反馈,部分队列的消息没有被消费,导致下游系统并没有及时处理。 3、问题分析 当时到项目组提交到消息组时,我第一反应是先看消费者的队列,打开该主题的消费情况,如图所示:发现队列数并没有积压,备注(由于生产是4主4从,每一个 broker上8个队列,故总共32个队列),当时由于比较急,并没有第一时间发现这个界面,竟然只包含一个消费者,觉得并没有消息积压,又由于同一个集群,其他消费组没有问题,只有两个消费组有问题,怀疑是应用的问题,就采取了重启,打印线程栈等方法。 事后诸葛亮:其实这完成是错误的,为什么这样说呢?因为项目组(业务方)已经告知一部分业务未处理,说明肯定有队列的消息积压,当根据自己的知识,结合看到的监控页面做出的判断与业务方反馈的出现冲突时,一定是自己的判断出了问题。 正在我们“如火如荼”的认定是项目有问题时,团队的另一成员提出了自己的观点,原来在得到业务方反馈时,他得知同一个主题,被5个消费组订阅,只有其中两个有问题,那他通过rocketmq-console来找两者的区别,找到区别,找到规律,就离解决问题的路近了。 他通过对比发现,出问题的消费组只有两个客户端在消费(通常生产环境是4节点消费),而没有出现问题的发现有4个进程都在处理,即发现现象:出错的消费组,并没有全员参与到消费。正如上面的图所示:只有其中一个进程在处理8个队列,另外8个队列并没有在消费。 那现在就是要分析为啥topic共有16个队列,但这里只有1个消费者队列在消费,另外一个消费者不作为? 首先根据RocketMQ 消息队列负载机制,2个消费者,只有1个消费者在消费,并且一个有一个明显的特点是,只有broker-a上的队列在消费,broker-b上的队列一个也没消费。 正在思考为啥会出现这种现象时,他又在思考是不是集群是不是broker-b(对应我们生产环境是broker-c、broker-d上的队列都未消费)是新扩容的机器?扩容的时候是不是没有把订阅关系在新的集群上创建?提出了疑问,接下来肖工就开始验证猜想,通过查阅broker-c、broker-d在我们系统中创建的时间是2018-4月的时候,就基本得出结论,扩容时并没有在新集群上创建订阅消息,故无法消费消息。 于是运维小哥使用运维工具创建订阅组,创建方法如图所示:创建好消费组后,再去查看topic的消费情况时,另外一个消费组也开始处理消息了,如下图所示: 4、问题复盘 潜在原因:DefaultCluster 集群进行过一次集群扩容,从原来的一台消息服务器( broker-a )额外增加一台broker服务器( broker-b ),但扩容的时候并没有把原先的存在于 broker-a 上的主题、消费组扩容到 broker-b 服务器。 触发原因:接到项目组的扩容需求,将集群队列数从4个扩容到8个,这样该topic就在集群的a、b都会存在8个队列,但Broker不允许自动创建消费组(订阅关系),消费者无法从broker-b上队列上拉取消息,导致在broker-b队列上的消息堆积,无法被消费。 解决办法:运维通过命令,在broker-b上创建对应的订阅消息,问题解决。 经验教训:集群扩容时,需要同步在集群上的topic.json、subscriptionGroup.json文件。 RocketMQ 理论基础,消费者向 Broker 发起消息拉取请求时,如果broker上并没有存在该消费组的订阅消息时,如果不允许自动创建(autoCreateSubscriptionGroup 设置为 false),默认为true,则不会返回消息给客户端,其代码如下:问题解决后,我们团队的成员也分享了一下他在本次排查问题的处理方法:寻找出现问题的规律、推断问题、 然后验证问题。规律可以是问题本身的规律 也可以是和正常对比的差。 原文发布时间为:2019-09-08本文作者:丁威,《RocketMQ技术内幕》作者。本文来自中间件兴趣圈,了解相关信息可以关注中间件兴趣圈。

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册