xyz327

hakuna matata

redis 命令

Strings

get

set

getset

append

阅读全文 »

搭建docker私服

推荐直接本地从阿里云pull 然后重新tag

k8s.base(192.168.1.199) 上也安装并启动docker

启动nexus3

1
2
3
# 以root用户启动(需要开启80端口)
# 除8081外,再暴露 80(docker pull) 和9001(docker push) 两个端口
docker run -u root -d -p 8081:8081 -p 9001:9001 -p 80:80 --name nexus sonatype/nexus3

配置nexus

阅读全文 »

初始化机器

VMware 使用Centos7初始化四台机器(2C4G)

1
2
3
4
192.168.1.101 k8s.master01 
192.168.1.111 k8s.node01
192.168.1.112 k8s.node02
192.168.1.199 k8s.base # docker私服加速k8s相关镜像

设置机器配置(一下使用root用户登录)

允许 iptables 检查桥接流量

1
2
3
4
5
6
7
8
9
10
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

sudo sysctl --system
阅读全文 »

RESP

REdis Serialization Protocol 用于redis的client和server 交互的协议

RESP 遵循的原则

  1. 实现简单(simple to implement)
  2. 快速解析(fast to parse)
  3. 人类可读 (human readable)

请求响应模型(Request-Response Model)

RESP 就是一个简单的请求响应,处理两个特殊情况

阅读全文 »

Redis Strings操作命令

set(设置字符串)

时间复杂度: O(1)

设置一个key:value 如果key已存在,那就会直接覆盖掉value(不管类型)

1
set key vale [EX seconds | PX milliseconds | EXAT timestamp |PXAT milliseconds-timestamp | KEEPTTL | NX | XX] [GET]

参数说明

阅读全文 »

Cluster

redis cluster 基于哈希槽(hashslot) 来实现cluter

hashslot

redis固定总共有16384个哈希槽.然后将这个些槽平均分配并映射到集群中的redis节点中去.()

设计目标(按重要性排列)

  1. 高性能和可线性扩展到1000个节点的伸缩性(不使用代理,异步复制,并且没有值合并操作)
阅读全文 »

Redis-cli 是redis提供给我们的运维工具。其中包含一些运维的命令

一下命令都可以使用-i 0.1 来指定

stat

打印服务的相关统计, key数量,内存使用, 客户端数量等等

1
2
3
4
5
6
redis-cli  --stat
------- data ------ --------------------- load -------------------- - child -
keys mem clients blocked requests connections
126248 254.28M 372 0 10527283 (+0) 914755
126248 254.15M 372 0 10527286 (+3) 914755
126248 254.07M 372 0 10527458 (+172) 914755

latency

阅读全文 »

redis大key

带来的问题

大key 那肯定就会redis保存的数据量会大,

  1. 增加服务和redis之间的数据传输压力
  2. 由于redis是单线程的所以会造成redis处理的时间过长而阻塞后续的请求。拖慢redis的请求处理速度
  3. 删除大key时也会造成阻塞

定位大key

使用redis-cli (内部使用scan实现)

1
2
# -i 0.1 ,每隔100条就会休眠0,.1秒
redis-cli --bigkeys -i 0.1

解决方案

优化redis key的保存方案.尽量减少redis key的数据量.把一个key分割成多个分别保存到集群各个节点中

大key的删除方案

  1. 使用scan 类的命令分多次删除,每次值删除部分数据
  2. redis>=4.0 使用 unlink 异步删除

redis热点key

带来的问题

由于某一个key是保存在某个节点上。如果热点key就是访问量激增。造成大量的流量都打到某个特定的节点上。严重可能导致节点挂掉

定位热点key

  1. 业务预估,例如秒杀场景
  2. 在客户端做统计收集
  3. 如果redis集群是有前置proxy的话就可以在proxy层统计收集
  4. 使用redis-cli --hotkeys -i 0.1命令来统计

解决方案

  1. 本地缓存,做一个二级缓存,先查服务本地内存,然后没有再去redis查
    1.1. 需要知道有哪些热点key
    1.2. 本地服务内存容量有限
    1.3. 可能会导致数据不一致的时间增加
  2. 多副本方案,再集群多个节点中都保存key,然后再key+random(N).N 为副本节点数量

k8s提供了一些核心的组件概念.

_

refresh方法概览

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
37
38
39
40
41
42
43
44
45
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh");
// Prepare this context for refreshing.
prepareRefresh();
// Tell the subclass to refresh the internal bean factory.
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// Prepare the bean factory for use in this context.
prepareBeanFactory(beanFactory);
try {
// Allows post-processing of the bean factory in context subclasses.
postProcessBeanFactory(beanFactory);
StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");
// Invoke factory processors registered as beans in the context.
invokeBeanFactoryPostProcessors(beanFactory);
// Register bean processors that intercept bean creation.
registerBeanPostProcessors(beanFactory);
beanPostProcess.end();
// Initialize message source for this context.
initMessageSource();
// Initialize event multicaster for this context.
initApplicationEventMulticaster();
// Initialize other special beans in specific context subclasses.
onRefresh();
// Check for listener beans and register them.
registerListeners();
// Instantiate all remaining (non-lazy-init) singletons.
finishBeanFactoryInitialization(beanFactory);
// Last step: publish corresponding event.
finishRefresh();
} catch (BeansException ex) {
// Destroy already created singletons to avoid dangling resources.
destroyBeans();
// Reset 'active' flag.
cancelRefresh(ex);
// Propagate exception to caller.
throw ex;
} finally {
// Reset common introspection caches in Spring's core, since we
// might not ever need metadata for singleton beans anymore...
resetCommonCaches();
contextRefresh.end();
}
}
}
阅读全文 »