forked from zz412000428/technology-talk
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
664eaf9
commit f111b0f
Showing
27 changed files
with
395 additions
and
77 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,80 @@ | ||
``` | ||
import java.nio.charset.Charset; | ||
import java.security.NoSuchAlgorithmException; | ||
import java.security.SecureRandom; | ||
import java.util.ArrayList; | ||
import java.util.List; | ||
import java.util.UUID; | ||
import java.util.concurrent.atomic.AtomicLong; | ||
import java.util.concurrent.locks.ReentrantLock; | ||
import com.google.common.hash.HashFunction; | ||
import com.google.common.hash.Hashing; | ||
/** | ||
* 用于生成随机token | ||
* | ||
* @author onlyone | ||
*/ | ||
public class RandomService { | ||
private ReentrantLock lock = new ReentrantLock(); | ||
private AtomicLong resetCounter = new AtomicLong(0); | ||
private HashFunction sha1 = Hashing.sha1(); | ||
private int resetThreshold = 10000; | ||
private Charset encoding = Charset.forName("UTF-8"); | ||
private SecureRandom random; | ||
public RandomService(){ | ||
this.resetSecureRandom(); | ||
} | ||
private void resetSecureRandom() { | ||
this.lock.lock(); | ||
try { | ||
this.random = SecureRandom.getInstance("NativePRNGNonBlocking"); | ||
// this.random = SecureRandom.getInstanceStrong(); // for windows | ||
this.random.generateSeed(32); | ||
} catch (NoSuchAlgorithmException e) { | ||
} finally { | ||
this.lock.unlock(); | ||
} | ||
} | ||
public String getToken() { | ||
if (this.resetCounter.incrementAndGet() > this.resetThreshold) { | ||
this.resetSecureRandom(); | ||
this.resetCounter.set(0); | ||
} | ||
byte[] bytes = new byte[32]; | ||
this.random.nextBytes(bytes); | ||
byte[] seedBytes = UUID.randomUUID().toString().getBytes(this.encoding); | ||
byte[] seeds = new byte[seedBytes.length + bytes.length]; | ||
System.arraycopy(bytes, 0, seeds, 0, bytes.length); | ||
System.arraycopy(seedBytes, 0, seeds, bytes.length - 1, seedBytes.length); | ||
return this.sha1.hashBytes(bytes).toString(); | ||
} | ||
public static void main(String[] args) { | ||
RandomService randomService = new RandomService(); | ||
List<String> list = new ArrayList<String>(200000); | ||
List<String> repetition = new ArrayList<String>(); | ||
for (int i = 0; i < 200000; i++) { | ||
String t = randomService.getToken(); | ||
if (list.contains(t)) { | ||
repetition.add(t); | ||
} else { | ||
list.add(t); | ||
} | ||
System.out.println(t); | ||
System.out.println("i=" + i + ", 重复列表" + repetition + ",list size=" + list.size()); | ||
} | ||
} | ||
} | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
## FastDFS(分布式文件存储系统) | ||
---- | ||
|
||
|
||
* [server 源代码](https://github.com/happyfish100/fastdfs) | ||
|
||
* [client 源代码](https://github.com/happyfish100/fastdfs-client-java) | ||
|
||
* [开源文档](https://www.oschina.net/p/fastdfs) | ||
|
||
* [FastDFS分布式文件系统集群安装与配置](http://blog.csdn.net/xyang81/article/details/52928230) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
## zookeeper适用场景 | ||
|
||
--- | ||
|
||
* dubbo | ||
|
||
做为其注册中心,网上资料比较多,就不多描述,可自行baidu。 | ||
|
||
* canal | ||
|
||
主要用于其主备切换。 | ||
|
||
出于容灾考虑,往往会配置两个Canal Server负责一个mysql数据库实例的数据增量复制。为了减少Canal Server 的dump请求对mysql master带来的性能影响,要求不同的Canal Server上的instance在同一时刻只能有一个处于Running状态,其他的instance处于Standby状态。具体步骤: | ||
|
||
a)尝试启动。所有Canal Server上的instance都会向zk尝试创建一个临时节点,哪个Canal Server创建成功了,那么就让哪个Server启动 | ||
|
||
b)启动instance。将自己的信息写入该节点。其它的Canal Server对该节点注册Watch监听。 | ||
|
||
c)主备切换。如果服务节点与zk的会话失效,临时节点会被删除,从而所有的实例会重新竞争上岗,从而实现主备切换。但有一个问题,服务节点可能存在假死情况,网络出现闪断,导致zk认为其会话失效,从而释放Running节点,但此时Cannal Server对应的JVM并没未退出。解决策略: | ||
|
||
状态为Standby的Cannal Sever在收到Running节点释放通知后,会延迟一段时间(通常5秒)抢占Running节点,而原本处于Running状态的instance可以不需要等待延迟,直接重新取得Running节点。 | ||
|
||
更多资料可参考《从Paxos到ZooKeeper》P219 | ||
|
||
* otter | ||
|
||
* hbase | ||
|
||
* Hadoop | ||
|
||
* Kafka | ||
|
||
* 分布式锁 | ||
|
||
* 分布式协调/通知 | ||
|
||
* 集群管理 | ||
|
||
* master选举 | ||
|
||
分布式高并发情况下创建节点一定是全局唯一性,zk会保证客户端无法重复创建一个已经存在的数据节点。 | ||
|
||
客户端集群每天定时往zk上创建一个临时节点,例如 /master-selection/2017-10-20/binding,抢节点时,只有一个客户端创建成功,那么创建节点的客户端就成了master。其他客户端在/master-selection/2017-10-20上注册一个Watcher事件,用于监控Master机器是否存活,一旦发现当前Master挂了,其余的客户端会重新进行Master选举。 | ||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,4 @@ | ||
## 搭建Redis的主从复制 | ||
## Redis安装及主从复制 | ||
|
||
--- | ||
|
||
|
Oops, something went wrong.