overcommit_memory文件指定了内核针对内存分配的策略,其值能够是0、一、2。 node
0, 表示内核将检查是否有足够的可用内存供应用进程使用;若是有足够的可用内存,内存申请容许;不然,内存申请失败,并把错误返回给应用进程。
1, 表示内核容许分配全部的物理内存,而无论当前的内存状态如何。
2, 表示内核容许分配超过全部物理内存和交换空间总和的内存git
jenkins_service@jenkinsservice:~/redis-3.0.1$ sudo sysctl vm.overcommit_memory=1github
vm.overcommit_memory = 1redis
THP(Transparent Huge Pages)是一个使管理Huge Pages自动化的抽象层。算法
目前须要注意的是,因为实现方式问题,THP会形成内存锁影响性能,尤为是在程序不是专门为大内内存页开发的时候,简单介绍以下:服务器
操做系统后台有一个叫作khugepaged的进程,它会一直扫描全部进程占用的内存,在可能的状况下会把4kpage交换为Huge Pages,在这个过程当中,对于操做的内存的各类分配活动都须要各类内存锁,直接影响程序的内存访问性能,而且,这个过程对于应用是透明的,在应用层面不可控制,对于专门为4k page优化的程序来讲,可能会形成随机的性能降低现象。app
Redis Cluster 命令行socket
//集群(cluster) 性能
开启cluster的redis必须是空服务器测试
修改redis.conf开启cluster
设置3个cluster
10.24.6.7:6379
10.24.6.4:6379
10.24.6.6:6379
启动三个节点上的Redis服务器。此时,三个Redis服务器节点均会以Redis Cluster的方式开始运行,但并无自动构建集群,由于三者还处于“我不认识你,你不属于我”的状态,它们每一个都是孤零零的Redis节点,或者是只包含了一个节点的集群。咱们能够经过Redis客户端链接到服务器查看它们的状态,图一给出了状态查询方法和查询结果,其中cluster nodes命令用于查看当前Redis节点所属的Redis集群中的全部节点,而cluster info则用于查看当前Redis节点所属的Redis集群的总体状态。由图中咱们能够看到,Redis集群中仅包含一个Redis节点,也就是当前节点,整个集群的状态是fail。
经过上面的操做,咱们已经将三个各自为政的Redis节点规划到一个相同的集群中,那么咱们如今是否就已经完成了集群搭建的全部工做了呢?非也!经过图二中对集群状态的查看咱们能够知道,当前集群的状态仍是fail,此时的Redis集群是不工做的,没法处理任何Redis命令。那么集群的状态为何仍是fail呢?本博主经过查看官方文档说明找到了缘由所在,现摘录原文以下:
The FAIL state for the cluster happens in two cases.
1) If at least one hash slot is not served as the node serving it currently is in FAIL state.
2) If we are not able to reach the majority of masters (that is, if the majorify of masters are simply in PFAIL state, it is enough for the node to enter FAIL mode).
很明显,致使咱们的集群处于fail状态的缘由不是第二个条,也就是说至少有一个hash slot没有被服务!稍微考虑一下,可不是!何止有一个hash slot没有被服务,压根儿就没有Redis节点为任何hash slot服务!众所周知,Redis Cluster经过hash slot将数据根据主键来分区,因此一条key-value数据会根据算法自动映射到一个hash slot,可是一个hash slot存储在哪一个Redis节点上并非自动映射的,是须要集群管理者自行分配的。那么咱们须要为多少个hash slot分配Redis节点呢?根据源码可知是16384个,即咱们要将16384个hash slot分配到集群内的三个节点上。Redis中用于分配hash slot的命令有不少,其中包括cluster addslots、cluster delslots和cluster setslot。鉴于咱们如今是集群的初始化阶段,因此咱们能够选择cluster addslots来分配hash slot,该命令的语法为cluster addslots slot1 [slot2] ... [slotN]。
每一个redis客户端单独分配本身负责的部分
修改内容以下:cda76a0a094d2ce624e33bed7f3c75689a4128fd :0 myself,master - 0 0 connected 0-5000(注意是在自身节点的描述,也就是包含了myself那一行的后面追加hash slot的范围)。相似的,Redis Cluster Node2上nodes-6379.conf文件中追加5001-10000,Redis Cluster Node3上nodes-6379.conf文件中追加10001-16383。通过这样的配置后,Redis Cluster Node1负责存储0至5000之间的全部hash slots,Redis Cluster Node2负责存储5001至10000之间的全部hash slots,Redis Cluster Node3负责存储10001至16383的全部hash slots。
这里所谓的搭建集群,说白了就是让以前启动的三个Redis节点彼此连通,意识到彼此的存在,那么如何作到这一点呢?答案就是cluster meet命令。该命令的做用就是将当前节点主动介绍给另一个节点认识,图二给出了cluster meet命令的执行方法和执行效果,由图中可知咱们使用cluster meet命令分别将Redis Cluster Node1介绍给了Redis Cluster Node2(节点IP地址为192.168.32.3,运行端口为6379)和Redis Cluster Node3(节点IP地址为192.168.32.4,运行端口为6379),以后咱们再次查看集群节点和集群状态就能够知道,三个节点已经成功合并到了同一个集群中。
这里找到了3个节点
查看10.24.6.6客户端
至此,3个结点
搭建完成标识:
在集群状态显示为ok以后,咱们就能够像在Redis单机版上同样执行Redis命令了。
非集群模式客户端在cluster跳转时会提示MOVED错误
from redis.sentinel import Sentinel
sentinel = Sentinel([('10.24.6.7', 26379)], socket_timeout=0.1)
master = sentinel.master_for('10.24.6.5master', socket_timeout=0.1)
print master
master.set('aaaaaaaaaaaaaaa', 'bar')
master.set('bbbbbbbbbbbbbbbb', 'bar')
print master.get('aaaaaaaaaaaaaaa')
print master.get('bbbbbbbbbbbbbbbb')
Traceback (most recent call last):
File "E:/HomeInternet/server/utest_workspace/utest_utils/utest_unit/__init__.py", line 23, in <module>
master.set('bbbbbbbbbbbbbbbb', 'bar')
File "build\bdist.win32\egg\redis\client.py", line 1055, in set
File "build\bdist.win32\egg\redis\client.py", line 565, in execute_command
File "build\bdist.win32\egg\redis\client.py", line 577, in parse_response
File "build\bdist.win32\egg\redis\sentinel.py", line 55, in read_response
File "build\bdist.win32\egg\redis\connection.py", line 574, in read_response
redis.exceptions.ResponseError: MOVED 9577 10.24.6.6:6379
集群模式客户端在跳转时会自动进行结点转向
https://github.com/Grokzen/redis-py-cluster
from rediscluster import StrictRedisCluster
startup_nodes = [{"host": "10.24.6.7", "port": "6379"}]
rc = StrictRedisCluster(startup_nodes=startup_nodes, decode_responses=True)
print rc.set("bbbbbbbbbbbbbbbb", "bar")
True
print rc.get("bbbbbbbbbbbbbbbb")
from redis.sentinel import Sentinel
from redisclusterimport StrictRedisCluster
sentinel = Sentinel([('10.24.6.7', 26379)], socket_timeout=0.1)
ip, port = sentinel.discover_master('10.24.6.5master')
rc = StrictRedisCluster(host=ip, port=port, decode_responses=True)
print rc.set("bbbbbbbbbbbbbbbb", "bar")
print rc.get("bbbbbbbbbbbbbbbb")