精华内容
下载资源
问答
  • 推荐观看:十年架构师实战...​www.bilibili.com模式类型主从模式redis2.8版本之前的模式)、哨兵sentinel模式redis2.8及之后的模式)、redis cluster模式redis3.0版本之后)主从模式原理同Mysql主从复制的...

    推荐观看:

    十年架构师实战Redis—用Redis实现:秒杀/抢购/排行榜/推荐系统/抽奖系统!从Redis到分布式架构,通过Redis学AKF划分原则、CAP定理!www.bilibili.com

    模式类型

    主从模式(redis2.8版本之前的模式)、哨兵sentinel模式(redis2.8及之后的模式)、redis cluster模式(redis3.0版本之后)

    主从模式原理

    同Mysql主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况。为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构,Redis主从复制可以根据是否是全量分为全量同步和增量同步。下图为级联结构。

    5638f047b93661aa32a8fefe6f6c704b.png

    31d5822d1920c94efe0fae8cebed6d71.png

    优点:

    1、解决数据备份问题

    2、做到读写分离,提高服务器性能

    缺点:

    1、每个客户端连接redis实例的时候都是指定了ip和端口号的,如果所连接的redis实例因为故障下线了,而主从模式也没有提供一定的手段通知客户端另外可连接的客户端地址,因而需要手动更改客户端配置重新连接

    2、主从模式下,如果主节点由于故障下线了,那么从节点因为没有主节点而同步中断,因而需要人工进行故障转移工作

    3、无法实现动态扩容

    sentinel模式

    Sentinel(哨兵)是Redis的高可用性解决方案:由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器。

    例如:

    ebe1866130a7702bb5b1c504532d9ef2.png

    优点

    1、Master 状态监测

    2、如果Master 异常,则会进行Master-slave 转换,将其中一个Slave作为Master,将之前的Master作为Slave

    3、Master-Slave切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换

    缺点:

    1、如果是从节点下线了,sentinel是不会对其进行故障转移的,连接从节点的客户端也无法获取到新的可用从节点

    2、无法实现动态扩容

    cluster模式

    在这个图中,每一个蓝色的圈都代表着一个redis的服务器节点。它们任何两个节点之间都是相互连通的。客户端可以与任何一个节点相连接,然后就可以访问集群中的任何一个节点。对其进行存取和其他操作。

    一般集群建议搭建三主三从架构,三主提供服务,三从提供备份功能。每一个节点都存有这个集群所有主节点以及从节点的信息。

    它们之间通过互相的ping-pong判断是否节点可以连接上。如果有一半以上的节点去ping一个节点的时候没有回应,集群就认为这个节点宕机了,然后去连接它的备用节点。如果某个节点和所有从节点全部挂掉,我们集群就进入faill状态。还有就是如果有一半以上的主节点宕机,那么我们集群同样进入发力了状态。这就是我们的redis的投票机制,具体原理如下图所示:

    01bc64af55dd0782c02ffca013398056.png

    (1)投票过程是集群中所有master参与,如果半数以上master节点与master节点通信超时(cluster-node-timeout),认为当前master节点挂掉.

    (2):什么时候整个集群不可用(cluster_state:fail)?

    a:如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完整时进入fail状态. ps : redis-3.0.0.rc1加入cluster-require-full-coverage参数,默认关闭,打开集群兼容部分失败.

    b:如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态.

    原理:

    6ee26a11211f3c5cf3eb5dc0caafc10d.png

    优点:

    1、有效的解决了redis在分布式方面的需求

    2、遇到单机内存,并发和流量瓶颈等问题时,可采用Cluster方案达到负载均衡的目的

    3、可实现动态扩容

    4、P2P模式,无中心化

    5、通过Gossip协议同步节点信息

    6、自动故障转移、Slot迁移中数据可用

    缺点:

    1、架构比较新,最佳实践较少

    2、为了性能提升,客户端需要缓存路由表信息

    3、节点发现、reshard操作不够自动化

    总结

    主从复制是为了数据备份,哨兵是为了高可用,Redis主服务器挂了哨兵可以切换,集群则是因为单实例能力有限,搞多个分散压力,简短总结如下:

    主从模式:备份数据、负载均衡,一个Master可以有多个Slaves。

    sentinel发现master挂了后,就会从slave中重新选举一个master。

    cluster是为了解决单机Redis容量有限的问题,将数据按一定的规则分配到多台机器。

    sentinel着眼于高可用,Cluster提高并发量。

    1.主从模式:读写分离,备份,一个Master可以有多个Slaves。

    2.哨兵sentinel:监控,自动转移,哨兵发现主服务器挂了后,就会从slave中重新选举一个主服务器。

    3.集群:为了解决单机Redis容量有限的问题,将数据按一定的规则分配到多台机器,内存/QPS不受限于单机,可受益于分布式集群高扩展性。

    原文出处:出自公众号:Java杂记
    原文链接:https://mp.weixin.qq.com/s/Q2ghAdE8dg_5TMr2ATj3pg

    推荐观看:

    十年架构师实战Redis—用Redis实现:秒杀/抢购/排行榜/推荐系统/抽奖系统!从Redis到分布式架构,通过Redis学AKF划分原则、CAP定理!www.bilibili.com
    展开全文
  • Redis 模式类型

    2019-10-07 14:07:45
    主从模式,主从复制(redis2.8版本之前的模式) * * * * 哨兵sentinel模式redis2.8及之后的模式) * * * * 集群(proxy型) * * * * 集群(直连型) * * * * redis cluster模式redis3.0版本之后) * * * * Ser.....

    Redis 教程 | 菜鸟教程  
    ASP.NET Core 和 Redis  

    单机版
    *

    *
    *
    *
    主从模式,主从复制(redis2.8版本之前的模式)
    *

    *
    *
    *
    哨兵sentinel模式(redis2.8及之后的模式)
    *

    *
    *
    *
    集群(proxy型)
    *

    *
    *
    *
    集群(直连型)
    *

    *
    *
    *
    redis cluster模式(redis3.0版本之后)
    *
    *
    *
    *
    ServerStack.Redis
    *

    *
    *
    *

    展开全文
  • seata 1.3 redis模式重构性能对比

    千次阅读 2020-09-23 20:06:22
    非官方数据,数据为尝试重构server端redis模式下,中间过程的测试数据。!!! 测试目的 比较server端redis模式下,全局锁及事务信息存储,使用string和hash两种数据结构的性能差异。 此结果仅仅代表这一种场景下,...

    !!!非官方数据,此压测数据为server端redis模式重构过程中,中间过程的测试数据。!!!
    测试目的
    在server端redis模式重构期间,测试server端不同的存储数据结构的性能差异,以对部分代码重构提供参考依据。
    主要测试:

    • 1.develop分支,db模式,mysql;
    • 2.1.3.0版本,redis模式,lock string结构,session string结构;
    • 3.合并lock 重构pr之前,redis模式,lock string结构,session string结构;
    • 4.develop分支,redis模式,lock hash结构,session string结构;
    • 5.develop分支,redis模式,lock hash结构,session hash结构;

    声明:
    本测试数据,受限测试机,服务器,中间件配置,网络因素,以及技术选型,业务场景,仅仅代表个人压测数据,不代表实际生产部署的性能。重点在于显式几种结构下的对比差距,没有任何绝对性能参考依据。测试使用的部分代码来自于未被合并的pr,部分pr不一定会merge到主干!!!因此,数据不具有稳定版本的性能参考意义。请复制黏贴党不要断章取义!

    声明:
    本测试数据,受限测试机,服务器,中间件配置,网络因素,以及技术选型,业务场景,仅仅代表个人压测数据,不代表实际生产部署的性能。重点在于显式几种结构下的对比差距,没有任何绝对性能参考依据。测试使用的部分代码来自于未被合并的pr,部分pr不一定会merge到主干!!!因此,数据不具有稳定版本的性能参考意义。请复制黏贴党不要断章取义!

    场景:order服务 - > storage服务 -> account服务
    每次请求修改数据为
    order服务 insert 1条 - > storage服务修改5条 -> account服务修改1条。
    注意:storage表中只有5条数据,account表中1条数据。此测试场景,并发请求的数据完全相同,每一个请求,都会出现锁冲突,且由于并发较高,会造成严重的全局锁冲突,重试,超时。
    工具:jmeter
    测试项目:springcloud-eureka-feign-mybatis-seata
    配置:均默认配置,未做调整;
    部署:seata windows10本地启动
    redis 阿里云 1核1G docker启动
    mysql 阿里云 1核1G docker启动
    结果:数据采用95%Line 3次平均值:

    在这里插入图片描述

    1.业务链路正常测试数据

    5并发

    lock hash,session hash
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    lock hash,session string
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    lock string,session string
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    lock string,session string 特定pr为止
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    mysql
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    50并发

    lock hash,session hash
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    lock hash,session string
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    lock string,session string
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    lock string,session string 特定pr为止
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    mysql
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    100并发

    lock hash,session hash
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    lock hash,session string
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    lock string,session string

    在这里插入图片描述
    在这里插入图片描述
    lock string,session string 特定pr为止
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    mysql
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    压测异常

    redis模式下,压测过程主要异常如下:
    io.seata.core.exception.BranchTransactionException: Global lock acquire failed xid = 100.64.20.95:8091:52520571292217344 branchId = 52520852440608769

    22:19:07.035  INFO --- [       TxTimeoutCheck_1_1] i.s.s.coordinator.DefaultCoordinator     : Global transaction[100.64.20.95:8091:52520574958039040] is timeout and will be rollback.
    22:19:07.049 ERROR --- [verHandlerThread_1_31_500] i.s.c.e.AbstractExceptionHandler         : Catch TransactionException while do RPC, request: xid=100.64.20.95:8091:52520571292217344,branchType=AT,resourceId=jdbc:mysql://116.62.62.26/seata-storage,lockKey=storage:1,2,3,4,5
    ==>
    io.seata.core.exception.BranchTransactionException: Global lock acquire failed xid = 100.64.20.95:8091:52520571292217344 branchId = 52520852440608769
    	at io.seata.server.transaction.at.ATCore.branchSessionLock(ATCore.java:48)
    	at io.seata.server.coordinator.AbstractCore.lambda$branchRegister$10(AbstractCore.java:77)
    	at io.seata.server.storage.redis.session.RedisSessionManager.lockAndExecute(RedisSessionManager.java:194)
    	at io.seata.server.session.SessionHolder.lockAndExecute(SessionHolder.java:275)
    	at io.seata.server.coordinator.AbstractCore.branchRegister(AbstractCore.java:72)
    	at io.seata.server.coordinator.DefaultCore.branchRegister(DefaultCore.java:97)
    	at io.seata.server.coordinator.DefaultCoordinator.doBranchRegister(DefaultCoordinator.java:192)
    	at io.seata.server.AbstractTCInboundHandler$4.execute(AbstractTCInboundHandler.java:184)
    	at io.seata.server.AbstractTCInboundHandler$4.execute(AbstractTCInboundHandler.java:179)
    	at io.seata.core.exception.AbstractExceptionHandler.exceptionHandleTemplate(AbstractExceptionHandler.java:116)
    	at io.seata.server.AbstractTCInboundHandler.handle(AbstractTCInboundHandler.java:179)
    	at io.seata.core.protocol.transaction.BranchRegisterRequest.handle(BranchRegisterRequest.java:136)
    	at io.seata.server.coordinator.DefaultCoordinator.onRequest(DefaultCoordinator.java:427)
    	at io.seata.core.rpc.processor.server.ServerOnRequestProcessor.onRequestMessage(ServerOnRequestProcessor.java:116)
    	at io.seata.core.rpc.processor.server.ServerOnRequestProcessor.process(ServerOnRequestProcessor.java:77)
    	at io.seata.core.rpc.netty.AbstractNettyRemoting.lambda$processMessage$2(AbstractNettyRemoting.java:265)
    	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    	at java.lang.Thread.run(Thread.java:745)
    <==
    
    22:19:07.105  INFO --- [       TxTimeoutCheck_1_1] i.s.s.coordinator.DefaultCoordinator     : Global transaction[100.64.20.95:8091:52520571720036352] is timeout and will be rollback.
    22:19:07.106  INFO --- [verHandlerThread_1_30_500] io.seata.server.coordinator.DefaultCore  : Rollback global transaction successfully, xid = 100.64.20.95:8091:52520571195748352.
    

    io.seata.core.exception.GlobalTransactionException: Could not register branch into global session xid = 100.64.20.95:8091:52520571598401536 status = TimeoutRollbacking while expecting Begin

    22:19:09.724  INFO --- [     batchLoggerPrint_1_1] i.s.c.r.p.server.BatchLogHandler         : SeataMergeMessage xid=100.64.20.95:8091:52520571598401536,branchType=AT,resourceId=jdbc:mysql://116.62.62.26/seata-storage,lockKey=storage:1,2,3,4,5
    ,clientIp:100.64.20.95,vgroup:default
    22:19:09.753  INFO --- [       TxTimeoutCheck_1_1] i.s.s.coordinator.DefaultCoordinator     : Global transaction[100.64.20.95:8091:52520571967500288] is timeout and will be rollback.
    22:19:09.773 ERROR --- [verHandlerThread_1_46_500] i.s.c.e.AbstractExceptionHandler         : Catch TransactionException while do RPC, request: xid=100.64.20.95:8091:52520571598401536,branchType=AT,resourceId=jdbc:mysql://116.62.62.26/seata-storage,lockKey=storage:1,2,3,4,5
    ==>
    io.seata.core.exception.GlobalTransactionException: Could not register branch into global session xid = 100.64.20.95:8091:52520571598401536 status = TimeoutRollbacking while expecting Begin
    	at io.seata.server.coordinator.AbstractCore.globalSessionStatusCheck(AbstractCore.java:102)
    	at io.seata.server.coordinator.AbstractCore.lambda$branchRegister$10(AbstractCore.java:73)
    	at io.seata.server.storage.redis.session.RedisSessionManager.lockAndExecute(RedisSessionManager.java:194)
    	at io.seata.server.session.SessionHolder.lockAndExecute(SessionHolder.java:275)
    	at io.seata.server.coordinator.AbstractCore.branchRegister(AbstractCore.java:72)
    	at io.seata.server.coordinator.DefaultCore.branchRegister(DefaultCore.java:97)
    	at io.seata.server.coordinator.DefaultCoordinator.doBranchRegister(DefaultCoordinator.java:192)
    	at io.seata.server.AbstractTCInboundHandler$4.execute(AbstractTCInboundHandler.java:184)
    	at io.seata.server.AbstractTCInboundHandler$4.execute(AbstractTCInboundHandler.java:179)
    	at io.seata.core.exception.AbstractExceptionHandler.exceptionHandleTemplate(AbstractExceptionHandler.java:116)
    	at io.seata.server.AbstractTCInboundHandler.handle(AbstractTCInboundHandler.java:179)
    	at io.seata.core.protocol.transaction.BranchRegisterRequest.handle(BranchRegisterRequest.java:136)
    	at io.seata.server.coordinator.DefaultCoordinator.onRequest(DefaultCoordinator.java:427)
    	at io.seata.core.rpc.processor.server.ServerOnRequestProcessor.onRequestMessage(ServerOnRequestProcessor.java:116)
    	at io.seata.core.rpc.processor.server.ServerOnRequestProcessor.process(ServerOnRequestProcessor.java:77)
    	at io.seata.core.rpc.netty.AbstractNettyRemoting.lambda$processMessage$2(AbstractNettyRemoting.java:265)
    	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    	at java.lang.Thread.run(Thread.java:745)
    <==
    
    22:19:09.833  INFO --- [       TxTimeoutCheck_1_1] i.s.s.coordinator.DefaultCoordinator     : Global transaction[100.64.20.95:8091:52520572613423104] is timeout and will be rollback.
    22:19:09.888  INFO --- [     batchLoggerPrint_1_1] i.s.c.r.p.server.BatchLogHandler         : SeataMergeMessage xid=100.64.20.95:8091:52520571329966080,extraData=null
    ,clientIp:100.64.20.95,vgroup:default
    

    io.seata.core.exception.GlobalTransactionException: Could not found global transaction xid = 100.64.20.95:8091:52520574215647232, may be has finished.

    22:19:30.670  INFO --- [     batchLoggerPrint_1_1] i.s.c.r.p.server.BatchLogHandler         : SeataMergeMessage xid=100.64.20.95:8091:52520574131761152,extraData=null
    ,clientIp:100.64.20.95,vgroup:default
    22:19:30.747  INFO --- [     batchLoggerPrint_1_1] i.s.c.r.p.server.BatchLogHandler         : SeataMergeMessage xid=100.64.20.95:8091:52520574215647232,branchType=AT,resourceId=jdbc:mysql://116.62.62.26/seata-storage,lockKey=storage:1,2,3,4,5
    ,clientIp:100.64.20.95,vgroup:default
    22:19:30.787 ERROR --- [rverHandlerThread_1_9_500] i.s.c.e.AbstractExceptionHandler         : Catch TransactionException while do RPC, request: xid=100.64.20.95:8091:52520574215647232,branchType=AT,resourceId=jdbc:mysql://116.62.62.26/seata-storage,lockKey=storage:1,2,3,4,5
    ==>
    io.seata.core.exception.GlobalTransactionException: Could not found global transaction xid = 100.64.20.95:8091:52520574215647232, may be has finished.
    	at io.seata.server.coordinator.AbstractCore.assertGlobalSessionNotNull(AbstractCore.java:120)
    	at io.seata.server.coordinator.AbstractCore.branchRegister(AbstractCore.java:71)
    	at io.seata.server.coordinator.DefaultCore.branchRegister(DefaultCore.java:97)
    	at io.seata.server.coordinator.DefaultCoordinator.doBranchRegister(DefaultCoordinator.java:192)
    	at io.seata.server.AbstractTCInboundHandler$4.execute(AbstractTCInboundHandler.java:184)
    	at io.seata.server.AbstractTCInboundHandler$4.execute(AbstractTCInboundHandler.java:179)
    	at io.seata.core.exception.AbstractExceptionHandler.exceptionHandleTemplate(AbstractExceptionHandler.java:116)
    	at io.seata.server.AbstractTCInboundHandler.handle(AbstractTCInboundHandler.java:179)
    	at io.seata.core.protocol.transaction.BranchRegisterRequest.handle(BranchRegisterRequest.java:136)
    	at io.seata.server.coordinator.DefaultCoordinator.onRequest(DefaultCoordinator.java:427)
    	at io.seata.core.rpc.processor.server.ServerOnRequestProcessor.onRequestMessage(ServerOnRequestProcessor.java:116)
    	at io.seata.core.rpc.processor.server.ServerOnRequestProcessor.process(ServerOnRequestProcessor.java:77)
    	at io.seata.core.rpc.netty.AbstractNettyRemoting.lambda$processMessage$2(AbstractNettyRemoting.java:265)
    	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    	at java.lang.Thread.run(Thread.java:745)
    <==
    
    22:19:30.936  INFO --- [     batchLoggerPrint_1_1] i.s.c.r.p.server.BatchLogHandler         : SeataMergeMessage xid=100.64.20.95:8091:52520574173704192,extraData=null
    ,clientIp:100.64.20.95,vgroup:default
    

    db模式mysql,下,压测过程主要异常如下:

    10:55:12.122  INFO --- [     batchLoggerPrint_1_1] i.s.c.r.p.server.BatchLogHandler         : SeataMergeMessage xid=192.168.158.80:8091:52710864220127232,extraData=null
    ,clientIp:192.168.158.80,vgroup:default
    10:55:12.124 ERROR --- [verHandlerThread_1_14_500] i.s.c.e.AbstractExceptionHandler         : Catch TransactionException while do RPC, request: xid=192.168.158.80:8091:52710864304013312,branchType=AT,resourceId=jdbc:mysql://116.62.62.26/seata-storage,lockKey=storage:1,2,3,4,5
    ==>
    io.seata.core.exception.GlobalTransactionException: Could not register branch into global session xid = 192.168.158.80:8091:52710864304013312 status = TimeoutRollbacking while expecting Begin
    	at io.seata.server.coordinator.AbstractCore.globalSessionStatusCheck(AbstractCore.java:102)
    	at io.seata.server.coordinator.AbstractCore.lambda$branchRegister$10(AbstractCore.java:73)
    	at io.seata.server.storage.db.session.DataBaseSessionManager.lockAndExecute(DataBaseSessionManager.java:197)
    	at io.seata.server.session.SessionHolder.lockAndExecute(SessionHolder.java:275)
    	at io.seata.server.coordinator.AbstractCore.branchRegister(AbstractCore.java:72)
    	at io.seata.server.coordinator.DefaultCore.branchRegister(DefaultCore.java:97)
    	at io.seata.server.coordinator.DefaultCoordinator.doBranchRegister(DefaultCoordinator.java:192)
    	at io.seata.server.AbstractTCInboundHandler$4.execute(AbstractTCInboundHandler.java:184)
    	at io.seata.server.AbstractTCInboundHandler$4.execute(AbstractTCInboundHandler.java:179)
    	at io.seata.core.exception.AbstractExceptionHandler.exceptionHandleTemplate(AbstractExceptionHandler.java:116)
    	at io.seata.server.AbstractTCInboundHandler.handle(AbstractTCInboundHandler.java:179)
    	at io.seata.core.protocol.transaction.BranchRegisterRequest.handle(BranchRegisterRequest.java:136)
    	at io.seata.server.coordinator.DefaultCoordinator.onRequest(DefaultCoordinator.java:427)
    	at io.seata.core.rpc.processor.server.ServerOnRequestProcessor.onRequestMessage(ServerOnRequestProcessor.java:116)
    	at io.seata.core.rpc.processor.server.ServerOnRequestProcessor.process(ServerOnRequestProcessor.java:77)
    	at io.seata.core.rpc.netty.AbstractNettyRemoting.lambda$processMessage$2(AbstractNettyRemoting.java:265)
    	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    	at java.lang.Thread.run(Thread.java:745)
    <==
    
    10:55:12.134  INFO --- [     RetryRollbacking_1_1] io.seata.server.coordinator.DefaultCore  : Rollback global transaction successfully, xid = 192.168.158.80:8091:52710862731149312.
    10:55:12.158  INFO --- [     batchLoggerPrint_1_1] i.s.c.r.p.server.BatchLogHandler         : SeataMergeMessage xid=192.168.158.80:8091:52710864270458880,extraData=null
    ,clientIp:192.168.158.80,vgroup:default
    
    10:55:07.945  INFO --- [     batchLoggerPrint_1_1] i.s.c.r.p.server.BatchLogHandler         : SeataMergeMessage xid=192.168.158.80:8091:52710861707739136,branchType=AT,resourceId=jdbc:mysql://116.62.62.26/seata-storage,lockKey=storage:1,2,3,4,5
    ,clientIp:192.168.158.80,vgroup:default
    10:55:07.966  INFO --- [verHandlerThread_1_39_500] i.s.s.s.db.lock.LockStoreDataBaseDAO     : Global lock on [storage:1] is holding by xid 192.168.158.80:8091:52710861548355584 branchId 52711108743856129
    10:55:07.980 ERROR --- [verHandlerThread_1_39_500] i.s.c.e.AbstractExceptionHandler         : Catch TransactionException while do RPC, request: xid=192.168.158.80:8091:52710861707739136,branchType=AT,resourceId=jdbc:mysql://116.62.62.26/seata-storage,lockKey=storage:1,2,3,4,5
    ==>
    io.seata.core.exception.BranchTransactionException: Global lock acquire failed xid = 192.168.158.80:8091:52710861707739136 branchId = 52711110014730241
    	at io.seata.server.transaction.at.ATCore.branchSessionLock(ATCore.java:48)
    	at io.seata.server.coordinator.AbstractCore.lambda$branchRegister$10(AbstractCore.java:77)
    	at io.seata.server.storage.db.session.DataBaseSessionManager.lockAndExecute(DataBaseSessionManager.java:197)
    	at io.seata.server.session.SessionHolder.lockAndExecute(SessionHolder.java:275)
    	at io.seata.server.coordinator.AbstractCore.branchRegister(AbstractCore.java:72)
    	at io.seata.server.coordinator.DefaultCore.branchRegister(DefaultCore.java:97)
    	at io.seata.server.coordinator.DefaultCoordinator.doBranchRegister(DefaultCoordinator.java:192)
    	at io.seata.server.AbstractTCInboundHandler$4.execute(AbstractTCInboundHandler.java:184)
    	at io.seata.server.AbstractTCInboundHandler$4.execute(AbstractTCInboundHandler.java:179)
    	at io.seata.core.exception.AbstractExceptionHandler.exceptionHandleTemplate(AbstractExceptionHandler.java:116)
    	at io.seata.server.AbstractTCInboundHandler.handle(AbstractTCInboundHandler.java:179)
    	at io.seata.core.protocol.transaction.BranchRegisterRequest.handle(BranchRegisterRequest.java:136)
    	at io.seata.server.coordinator.DefaultCoordinator.onRequest(DefaultCoordinator.java:427)
    	at io.seata.core.rpc.processor.server.ServerOnRequestProcessor.onRequestMessage(ServerOnRequestProcessor.java:116)
    	at io.seata.core.rpc.processor.server.ServerOnRequestProcessor.process(ServerOnRequestProcessor.java:77)
    	at io.seata.core.rpc.netty.AbstractNettyRemoting.lambda$processMessage$2(AbstractNettyRemoting.java:265)
    	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    	at java.lang.Thread.run(Thread.java:745)
    <==
    
    10:55:08.016  INFO --- [     batchLoggerPrint_1_1] i.s.c.r.p.server.BatchLogHandler         : SeataMergeMessage xid=192.168.158.80:8091:52710861745487872,branchType=AT,resourceId=jdbc:mysql://116.62.62.26/seata-storage,lockKey=storage:1,2,3,4,5
    ,clientIp:192.168.158.80,vgroup:default
    
    

    特定pr之前的代码压测
    先是

    2020-09-25 19:30:14.998 ERROR --- [Thread_1_16_500] i.s.c.e.AbstractExceptionHandler         : Catch TransactionException while do RPC, request: xid=192.168.158.80:8091:52840600355274752,branchType=AT,resourceId=jdbc:mysql://116.62.62.26/seata-storage,lockKey=storage:1,2,3,4,5
    ==>
    io.seata.core.exception.BranchTransactionException: Global lock acquire failed xid = 192.168.158.80:8091:52840600355274752 branchId = 52840743536230401
    	at io.seata.server.transaction.at.ATCore.branchSessionLock(ATCore.java:48)
    	at io.seata.server.coordinator.AbstractCore.lambda$branchRegister$2(AbstractCore.java:77)
    	at io.seata.server.storage.redis.session.RedisSessionManager.lockAndExecute(RedisSessionManager.java:194)
    	at io.seata.server.session.SessionHolder.lockAndExecute(SessionHolder.java:275)
    	at io.seata.server.coordinator.AbstractCore.branchRegister(AbstractCore.java:72)
    	at io.seata.server.coordinator.DefaultCore.branchRegister(DefaultCore.java:97)
    	at io.seata.server.coordinator.DefaultCoordinator.doBranchRegister(DefaultCoordinator.java:192)
    	at io.seata.server.AbstractTCInboundHandler$4.execute(AbstractTCInboundHandler.java:184)
    	at io.seata.server.AbstractTCInboundHandler$4.execute(AbstractTCInboundHandler.java:179)
    	at io.seata.core.exception.AbstractExceptionHandler.exceptionHandleTemplate(AbstractExceptionHandler.java:116)
    	at io.seata.server.AbstractTCInboundHandler.handle(AbstractTCInboundHandler.java:179)
    	at io.seata.core.protocol.transaction.BranchRegisterRequest.handle(BranchRegisterRequest.java:136)
    	at io.seata.server.coordinator.DefaultCoordinator.onRequest(DefaultCoordinator.java:427)
    	at io.seata.core.rpc.processor.server.ServerOnRequestProcessor.onRequestMessage(ServerOnRequestProcessor.java:116)
    	at io.seata.core.rpc.processor.server.ServerOnRequestProcessor.process(ServerOnRequestProcessor.java:77)
    	at io.seata.core.rpc.netty.AbstractNettyRemoting.lambda$processMessage$2(AbstractNettyRemoting.java:265)
    	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    	at java.lang.Thread.run(Thread.java:745)
    <==
    

    后出现

    2020-09-25 19:30:44.975  INFO --- [Rollbacking_1_1] io.seata.server.coordinator.DefaultCore  : Rollback global transaction successfully, xid = 192.168.158.80:8091:52840601164775424.
    2020-09-25 19:30:44.994  INFO --- [Rollbacking_1_1] io.seata.server.coordinator.DefaultCore  : Rollback global transaction successfully, xid = 192.168.158.80:8091:52840601672286208.
    2020-09-25 19:30:45.011  INFO --- [Rollbacking_1_1] io.seata.server.coordinator.DefaultCore  : Rollback global transaction successfully, xid = 192.168.158.80:8091:52840602343374848.
    2020-09-25 19:30:45.029  INFO --- [Rollbacking_1_1] io.seata.server.coordinator.DefaultCore  : Rollback global transaction successfully, xid = 192.168.158.80:8091:52840602599227392.
    2020-09-25 19:30:45.047  INFO --- [Rollbacking_1_1] io.seata.server.coordinator.DefaultCore  : Rollback global transaction successfully, xid = 192.168.158.80:8091:52840601630343168.
    2020-09-25 19:30:45.065 ERROR --- [Thread_1_12_500] i.s.c.e.AbstractExceptionHandler         : Catch TransactionException while do RPC, request: xid=192.168.158.80:8091:52840602301431808,branchType=AT,resourceId=jdbc:mysql://116.62.62.26/seata-storage,lockKey=storage:1,2,3,4,5
    ==>
    io.seata.core.exception.GlobalTransactionException: Could not register branch into global session xid = 192.168.158.80:8091:52840602301431808 status = TimeoutRollbacking while expecting Begin
    	at io.seata.server.coordinator.AbstractCore.globalSessionStatusCheck(AbstractCore.java:102)
    	at io.seata.server.coordinator.AbstractCore.lambda$branchRegister$2(AbstractCore.java:73)
    	at io.seata.server.storage.redis.session.RedisSessionManager.lockAndExecute(RedisSessionManager.java:194)
    	at io.seata.server.session.SessionHolder.lockAndExecute(SessionHolder.java:275)
    	at io.seata.server.coordinator.AbstractCore.branchRegister(AbstractCore.java:72)
    	at io.seata.server.coordinator.DefaultCore.branchRegister(DefaultCore.java:97)
    	at io.seata.server.coordinator.DefaultCoordinator.doBranchRegister(DefaultCoordinator.java:192)
    	at io.seata.server.AbstractTCInboundHandler$4.execute(AbstractTCInboundHandler.java:184)
    	at io.seata.server.AbstractTCInboundHandler$4.execute(AbstractTCInboundHandler.java:179)
    	at io.seata.core.exception.AbstractExceptionHandler.exceptionHandleTemplate(AbstractExceptionHandler.java:116)
    	at io.seata.server.AbstractTCInboundHandler.handle(AbstractTCInboundHandler.java:179)
    	at io.seata.core.protocol.transaction.BranchRegisterRequest.handle(BranchRegisterRequest.java:136)
    	at io.seata.server.coordinator.DefaultCoordinator.onRequest(DefaultCoordinator.java:427)
    	at io.seata.core.rpc.processor.server.ServerOnRequestProcessor.onRequestMessage(ServerOnRequestProcessor.java:116)
    	at io.seata.core.rpc.processor.server.ServerOnRequestProcessor.process(ServerOnRequestProcessor.java:77)
    	at io.seata.core.rpc.netty.AbstractNettyRemoting.lambda$processMessage$2(AbstractNettyRemoting.java:265)
    	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    	at java.lang.Thread.run(Thread.java:745)
    <==
    
    
    展开全文
  • DENIED Redis is running in protected mode (保护模式) 异常现象 Exception in thread "main" redis.clients.jedis.exceptions.JedisDataException: DENIED Redis is running in protected mode because ...

    DENIED Redis is running in protected mode (保护模式)

    异常现象

    Exception in thread "main" redis.clients.jedis.exceptions.JedisDataException: DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients. In this mode connections are only accepted from the loopback interface. If you want to connect from external computers to Redis you may adopt one of the following solutions: 1) Just disable protected mode sending the command 'CONFIG SET protected-mode no' from the loopback interface by connecting to Redis from the same host the server is running, however MAKE SURE Redis is not publicly accessible from internet if you do so. Use CONFIG REWRITE to make this change permanent. 2) Alternatively you can just disable the protected mode by editing the Redis configuration file, and setting the protected mode option to 'no', and then restarting the server. 3) If you started the server manually just for testing, restart it with the '--protected-mode no' option. 4) Setup a bind address or an authentication password. NOTE: You only need to do one of the above things in order for the server to start accepting connections from the outside.
    	at redis.clients.jedis.Protocol.processError(Protocol.java:127)
    	at redis.clients.jedis.Protocol.process(Protocol.java:161)
    	at redis.clients.jedis.Protocol.read(Protocol.java:215)
    	at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:340)
    	at redis.clients.jedis.Connection.getStatusCodeReply(Connection.java:239)
    	at redis.clients.jedis.Jedis.set(Jedis.java:121)
    	at cn.com.qihang.spring.boot.stater.redis.App.main(App.java:21)
    

    问题分析

    报错信息很长,但是主要是说redis开启了protected mode,这也是Redis3.2加入的新特性,开启保护模式的redis只允许本机登录,同样设置在配置文件redis.conf中

    解决方法

    方式一:直接编辑配置文件redis.conf

    在这里插入图片描述

    修改配置:

    可以填密码也可以填no代表关闭,我们这里选择关闭保护模式,wq保存退出后再重启redis-server。
    

    在这里插入图片描述

    方式二:直接通过命令更改

    1.进入redis的src目录下

    输入:./redis-cli
    
    将受保护模式选项设置为“no”,为了让服务器开始从外部接受连接
    
    输入:config set protected-mode "no"
    

    在这里插入图片描述

    二、添加认证,设置密码

    后来就查看配置发现redis.conf 该行(#requirepass foobared)也是注释的:

    requirepass foobared

    requirepass redis123456
    

    再次验证

    展开全文
  • Redis模式匹配删除key

    2016-05-27 11:49:00
    Redis keys命令支持模式匹配,但是del命令不支持模式匹配,有时候需要根据一定的模式来模糊删除key,这时只能结合shell命令来完成了。 具体命令是: redis-cli KEYS "pattern" | xargs redis-cli DEL ...
  • 阿里云redis:0>hset map123 key va "1" 阿里云redis:0>hset map123 key1 va1 "1" 阿里云redis:0>hset map123 key1 va2 "0" 所以,暂时还是没有想到,什么好方法。watch是目前能想到的唯一方式。
  • 1.四种授权码模式 授权码模式 密码模式 客户端模式 简化模式 2.密码模式 http://localhost:9001/oauth/token?username=user&password=user&grant_type=password&client_id=client&client_secret=...
  • redis的安装https://mp.csdn.net/console/editor/html/108639018redis的四种模式 单机版、主从复制、哨兵、以及集群模式,其中单机版不用于生产环境。主从模式(master-slaves)的作用做备份数据,这样当一个节点...
  • redis的安装https://mp.csdn.net/console/editor/html/108639018redis的四种模式 单机版、主从复制、哨兵、以及集群模式,其中单机版不用于生产环境。主从模式(master-slaves)的作用做备份数据,这样当一个节点...
  • redis的安装 https://mp.csdn.net/console/editor/html/108639018 主从模式的作用 做备份数据,这样当一个节点损坏(指不可恢复的硬件损坏)时,数据 因为有备份,可以方便恢复。 做负载均衡,所有客户端都访问...
  • 一、 在之前有看到过redis集群部署的三种方案,不过性能最高的还是redis官方推荐的redis-cluster,性能最高,下面介绍一下redis-cluster这种模式。1、redis-clusterA、采用去中心化的思想,没有中心节点的说法,它...
  • redis集群模式

    万次阅读 2020-10-12 22:31:31
    现在的redis也不断在更新,现在的rediscluster,原生的redis集群模式,就可以做到在多台机器上部署多个redis实例,每个实例存储一部分数据,同时每个redis可以挂redis从实例,自动确保说,如果redis主实例挂了,会...
  • Redis——Redis 哨兵模式

    千次阅读 2021-04-19 10:19:40
    Redis 哨兵模式哨兵模式的简介哨兵的作用启用哨兵模式配置哨兵启动哨兵哨兵模式的工作原理阶段一:监控阶段阶段二:通知阶段阶段三:故障转移阶段发现故障选出领头sentinel挑选备选master主从切换总结 哨兵模式的...
  • 直接上代码/*** Class RedisConnManager** 单例模式redis实例的操作的进一步封装* 主要目的:防止过多的连接,一个页面只能存在一个声明连接** @author :cuihuan*/class RedisManager{private static $redis...
  • 下面由Redis教程栏目给大家介绍关于java基于redis有序集合实现排行榜,希望对需要的朋友有所帮助!哨兵是一个独立的进程。...当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从...
  • Redis哨兵模式

    2020-12-21 17:31:42
    Redis哨兵模式Redis主从原理全量同步增量同步Redis主从同步策略流程主从复制的目的Redis项目部署主从拓补图安装redis配置主服务器配置备服务器在主负服务器上查看主从效果哨兵模式原理概述哨兵模式的作用监控通知...
  • Redis主从模式

    千次阅读 2019-01-14 14:16:25
    Redis主从模式  目录: 1、Redis主从模式简单介绍: 2、Redis主从模式的部署安装: 3、测试从服务器的只读: 4、测试主节点宕机故障恢复: 1、Redis主从模式简单介绍: 图1.1 主从模式架构 主从模式: ...
  • redis哨兵模式

    万次阅读 2020-05-24 16:00:00
    Sentinel(哨兵)是用于监控redis集群中Master状态的工具,是Redis 的高可用性解决方案,sentinel哨兵模式已经被集成在redis2.4之后的版本中。sentinel是redis高可用的解决方案,sentinel系统可以监视一个或者多个...
  • Redis集群模式与代理模式

    万次阅读 2020-09-08 17:59:22
    Redis集群模式与代理模式 为了解决redis主从复制或者哨兵模式一个实例存储全量的数据,内存空间可能不足的问题,需要对数据进行分区(Partitioning)。 分区的实现方式 客户端分区:例如原来一个商城的所有缓存都...
  • redis旁路模式

    2020-09-23 15:58:47
    redis旁路模式 概述 redis的旁路模式采用双缓存设计,监控redis,避免redis宕机后,全面命中数据库或全依赖redis的服务造成直接无法对外服务; 避免,当缓存redis服务宕机时,启用本地缓存,避免发生蝴蝶效应、全面...
  • Redis部署模式

    2019-11-24 20:34:13
    standaloan 是redis单机模式,及所有服务连接一台redis服务,该模式不适用生产。如果发生宕机,内存爆炸,就可能导致所有连接改redis的服务发生缓存失效引起雪崩。 ssentinel(哨兵模式redis-Sentinel(哨兵模式...
  • Redis升级——Redis哨兵模式 如果要手动恢复redis数据库,需要严格按照上一篇所讲的内容进行三步。整个过程需要人工介入,这样就很难实现自动化。 而redis哨兵模式就是在这样的情况下出现的,哨兵的出现解决了不能...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,645
精华内容 9,058
关键字:

redis模式

redis 订阅