ZibuのHippocampus

人生天地间,忽如远行客

为什么需要分布式 ID

以 Mysql 举例,当数据量逐步上升,读写分离和主从同步也遇到性能瓶颈时,我们就需要对数据库进行分库分表,但是分库分表原来的自增表主键就不能使用了,否则就会遇到主键冲突的情况。

当然在微服务的场景下,系统以模块被划分为更细的粒度,因此有一个全局生成分布式 UUID的系统是非常有必要的。

阅读全文 »

Java 中的优先级队列,是使用数组表示的完全二叉树的小顶堆模式.

每次取出的元素都是队列中权值最小的,队列中的元素都经过了排序处理,默认按照自然顺序,也可以通过 Comparator 接口进行自定义排序。

阅读全文 »

Java同步工具类

基于Java AQS类,JUC提供了以下几个方便实用的工具类,用于管理线程之间同步的关系。

  • CountDownLatch: 适用于线程间存在先后顺序关系的场景。某个线程需要等待其他线程完成后,才开始的场景。
  • CyclicBarrier:适用于线程间存在同步的场景,所有线程到达一个检查点就暂停,等待其他线程都到达,再一起继续。
  • Semaphore: 信号量,适用于资源竞争的场景。抢占到资源的线程继续,没有抢占到的则等待。
阅读全文 »

//todo redis reshard 详情

Redis 集群Reshrd操作

交互式Reshard

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
redis-cli --cluster reshard 127.0.0.1:6379 -a enter_your_password

Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing Cluster Check (using node 127.0.0.1:6379)
M: 2ff327433b2eeb5fc0419377896701271f82589e 127.0.0.1:6379
slots:[0-5961],[10923-11421] (6461 slots) master
1 additional replica(s)
S: dd6d82dfae6f51c16a7d91695501b08f4227a4d0 10.10.17.63:6380
slots: (0 slots) slave
replicates a2c8731d7639ec26b10fc023ae9ec429658b08a3
M: a2c8731d7639ec26b10fc023ae9ec429658b08a3 10.10.17.64:6379
slots:[5962-10922] (4961 slots) master
1 additional replica(s)
S: 15252a5e3bc6b6d4e215694a1b853dac477da80d 10.10.17.63:6381
slots: (0 slots) slave
replicates a11b3cf812034b2a5e7afb6b1d887b9f347e3938
S: 48f0c83ec88c27660ba7d0e6b3b1fa072cb9c987 10.10.17.64:6380
slots: (0 slots) slave
replicates a11b3cf812034b2a5e7afb6b1d887b9f347e3938
S: f0db649d480b4a2f0a0cdc41016836067abbd67b 10.10.17.65:6380
slots: (0 slots) slave
replicates 2ff327433b2eeb5fc0419377896701271f82589e
M: a11b3cf812034b2a5e7afb6b1d887b9f347e3938 10.10.17.65:6379
slots:[11422-16383] (4962 slots) master
2 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 1000

lease enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #1:all

自动化Reshard

1
2
3
4
./redis-cli --cluster reshard <host>:<port> --cluster-from <node-id> --cluster-to <node-id> --cluster-slots <number of slots> --cluster-yes -a <redis_cluster_passwprd>

./redis-cli --cluster reshard 10.10.17.63:6379 --cluster-from all --cluster-to 2ff327433b2eeb5fc0419377896701271f82589e --cluster-slots 1000 --cluster-yes -a enter_your_password

reference

https://muyinchen.github.io/2016/12/16/Redis%20%E9%9B%86%E7%BE%A4%E6%93%8D%E4%BD%9C/

简述

问题描述: ES 环境上的索引.security-6(ES用于存储security相关数据的索引,如role definitions, role mappings的等等) 常常会出现分片无法分配的问题。由于Replication Shard无法分配,会导致集群Yellow.

解决方案:加大内存或调整 参数-XX:CMSInitiatingOccupancyFraction的值,来提早触发Major GC,增加MajorGC频次。

Root Cause:ES由于内存空间不足,老年代与年轻代同时GC,触发Concurrent Mode Failure, 收集器降级为Serial-old(单线程,效率低)从而导致ES节点失去响应,因此节点离开集群。

当节点回到集群,由于.security索引被锁,无法在最大同步时长5S实现同步,导致Shard Allocation Failure.

阅读全文 »

CAS(Compare and Swap) 比较和替换

  1. 比较: 读取到一个值 A,在将其更新为 B之前,再次检查原值是否为 A(未被改动)
  2. 设置:如果是,将 A 更新为 B,结束。如果不是,则什么都不做。

这两个操作是原子性的。

原子性: 操作不可分割,要么全部执行,要么完全不执行。不会出现执行了部分的情况

阅读全文 »
0%