NoSQL之Redis探析
发布时间:2020-12-13 13:57:34 所属栏目:百科 来源:网络整理
导读:下载地址:wget http://download.redis.io/releases/redis-2.8.8.tar.gz 安装steps: 1 下载 Official Website : http://redis.io/ 文档地址 address: http://redis.io/documentation 主从复制文档地址 : http://www.redis.io/topics/replication 2 解压缩安
下载地址:wget http://download.redis.io/releases/redis-2.8.8.tar.gz
安装steps: 1 下载 Official Website : http://redis.io/ 文档地址 address: http://redis.io/documentation 主从复制文档地址 : http://www.redis.io/topics/replication 2 解压缩安装 tar -xvf redis-2.8.8.tar.gz cd redis-2.8.8 make PS: make install 也可以make install,这样就是把可运行文件复制到/usr/local/bin里而已。 .......... Hint: To run 'make test' is a good idea ;) INSTALL install make[1]: Leaving directory `/root/redis-2.8.8/src' 3 make test验证 run the command to check the redis status: [root@localhost redis-2.8.8]# make test cd src && make test make[1]: Entering directory `/root/redis-2.8.8/src' You need tcl 8.5 or newer in order to run the Redis test make[1]: *** [test] 错误 1 make: *** [test] 错误 2 [root@localhost redis-2.8.8]# cd src [root@localhost src]# make test make: *** [test] 错误 1 提示需要安装tcl 8.5 然后到Tcl的官方网站http://www.tcl.tk/下载8.5版本 找到 http://www.activestate.com/activetcl/downloads 下载下来。 如果手动下载失败,那么可以考虑yum安装,比如yum install tcl -y; official website download failure,go to http://download.csdn.net/detail/zouyongjin/4490216 to download the tar gz. 如果官方网站下载失败,就去csdn上面搜索tcl8.5.12-src.tar.gz 下载。 #tar xvzf tcl8.5.12-src.tar.gz #cd tcl8.5.13/unix/ #./configure #make #make test #make install 4 redis参数研究以及启动关闭 redis 配置文件 /opt/redis-2.8.8/redis.conf,所有的参数都在这个配置文件里面配置,redis启动的时候,会加载这个配置文件。 4.1添加master主库数据保存目录: mkdir -p /data/redis/master 4.2 save参数解读: save 900 1 save 300 10 save 60 10000 在900秒(15分钟)内,至少有1次数据变更; 或者300秒内,有至少10次数据变更; 或者60秒内,有至少1000次数据变更;时间+数据变更次数,共同影响内存快照的出现。 4.3 appendonly no 4.4 port 6389 redis启动的端口号码,对外服务,外部程序通过此端口号码与redis建立连接,对redis进行数据变更和数据访问。 4.5 redis启动 运行redis: 2.2.7版本,redis-server被放到了src文件夹下,要这么运行: 在安装目录下# cd src #./redis-server ./../redis.conf 或者全路径启动: /root/redis-2.8.8/src/redis-server /opt/redis-2.8.8/redis.conf 或者nohup后台启动: nohup /root/redis-2.8.8/src/redis-server /root/redis-2.8.8/redis.conf & 附注: 2.0.4以前的老版本,运行很简单,在安装目录下: #./redis-server 就可以了。如果没有更改daemonize no配置,会看见运行的信息。 4.6 测试启动 redis-cli ping 返回PONG,启动成功。 查看端口是否被占用:netstat –ntlp |grep 6379 4.7 redis服务关闭 /usr/local/bin/redis-cli shutdown 或者/usr/local/bin/redis-cli -h 192.168.1.17 shutdown
5 主从机制以及原理理解 redis主从使用以及配置起来非常简单,搭建一套master-slave服务意味着slave redis服务是主库的一份精确的数据备份: redis主从基本特征如下描述: 5.1 redis采用异步复制,从redis2.8版本开始,slaves开始定期从复制流上确认数据处理的数量。 5.2 一个master可以对应多个slaves。 5.3 slave还可以接受其他slave发过来的请求,除了多个slave能连接一个master之外,slaves还可以被其他slaves以graph-like结构方式进行连接。 5.4 redis复制在master上面是不阻塞的,这意味着当一个或者多个slave复制开始初始化以及运行后,master还可以继续处理请求。 5.5 复制在从库上也是无阻塞的,当slave进行首次初始化同步时,slave可以使用旧的数据集合来处理请求,如果你在redis.conf里面配置了的话。 ?哪里配置?另外,如果复制流down了,你也可以配置一些redis slave返回一个error给客户端。然而,在同步初始化完成后,旧的数据被删除,新的数据会被加载进去,在这短暂的加载瞬间,slave会阻塞住进来的连接请求。 5.6 slave可以用来扩展,有多个slaves处理查询请求(例如,大的SORT操作可以在slave上执行),或者也简单的用来数据备份。 5.7 可以用replication来避免在master库上数据写入磁盘,减轻master压力,仅仅在master的redis.conf里面把所有save参数注释掉即可。然后可以在从库上slave上面开启save参数来做到数据实时写入到磁盘上面。 5.8 slave工作原理 (1) 如果建立了一个slave从库,slave会发一个SYNC的命令的connection到master库,不管这是否是第一次连接。 (2) master然后开始启动一个saving的背景线程,并缓存已经接收到的修改数据集的新的命令,当saving背景线程结束后,master会把数据文件传送给slave,并且save到磁盘,最后加载到内存。master将会发送所有的缓存命令给slave。 这些是以基于Redis协议的一系列连续的命令流来完成的。 (3) 当master-slave由于一些原因down之后,slave会自动连接master。 (4) 当连接断开之后,master和slave会重新连接,一次全同步会执行,然而,从redis2.8开始,一个局部的再同步也是可行的。 5.9 局部再同步 主要是在master这一边的复制流上面做了一个in-memory backlog,master和slave都会基于一个共同的replication offset和a master run id,因此当连接断开之后,slave将会重新连接并且咨询master去继续复制, 假如master run id是同一个,并且offset在复制backlog里面是可用的,复制将会从这个留下的偏移来恢复。如果这些条件不满足,那么一个全新的再同步会被执行。 当旧的实现机制用了SYNC之后,新的局部再同步用了一个内部命令PSYNC。 【Note】当Redis2.8察觉出来服务如果不支持PSYNC,就会使用SYNC命令。 6 搭建从库,从库配置文件 cp /root/redis-2.8.8/redis.conf /root/redis-2.8.8/redis.slave.conf slave config: port 6399 # 从库端口号 slaveof 127.0.0.1 6389 #主库ip地址以及端口号 #save参数,从库开启save,减轻主库的读写压力。 7 启动start the master and slave #修改一下redis-conf里面的 daemonize no,把no改为yes,可以后台启动。 /root/redis-2.8.8/src/redis-server /root/redis-2.8.8/redis.conf /root/redis-2.8.8/src/redis-server /root/redis-2.8.8/redis.slave.conf 在后台启动 nohup /root/redis-2.8.8/src/redis-server /root/redis-2.8.8/redis.conf & nohup /root/redis-2.8.8/src/redis-server /root/redis-2.8.8/redis.slave.conf > /root/redis_slave.log & 8 check master & slave 访问主库 /root/redis-2.8.8/src/redis-cli -p 6389 登录从库 /root/redis-2.8.8/src/redis-cli -p 6399 验证主从数据一致性: [root@localhost redis]# /root/redis-2.8.8/src/redis-cli -p6389 Unrecognized option or bad number of args for: '-p6389' [root@localhost redis]# /root/redis-2.8.8/src/redis-cli -p 6389 127.0.0.1:6389> 127.0.0.1:6389> set name jame #往主库中设置2组key-value值 OK 127.0.0.1:6389> set age 20 127.0.0.1:6389> exit [root@localhost redis]# /root/redis-2.8.8/src/redis-cli -p 6399 127.0.0.1:6399> get name #获取主库设置的key-value值,看是否已经从主库传递到从库了。 "jame" 127.0.0.1:6399> get age "20" 127.0.0.1:6399> 9 验证过程 如何判断哪个是主哪个是从呢? 只需调用 info 这个命令就可以得到主从的信息了,我们在从库上执行 info 命令,如下所示: 127.0.0.1:6399> info # Server redis_version:2.8.8 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:a90848107b5eaf7f redis_mode:standalone os:Linux 2.6.32-358.el6.x86_64 x86_64 arch_bits:64 multiplexing_api:epoll gcc_version:4.4.7 process_id:19513 run_id:c97e05680da496d58894963fb38045b9fba1b13d tcp_port:6399 uptime_in_seconds:2672 uptime_in_days:0 hz:10 lru_clock:4722614 config_file:/root/redis-2.8.8/redis.slave.conf # Clients connected_clients:2 client_longest_output_list:0 client_biggest_input_buf:0 blocked_clients:0 # Memory used_memory:829360 used_memory_human:809.92K used_memory_rss:7933952 used_memory_peak:829360 used_memory_peak_human:809.92K used_memory_lua:33792 mem_fragmentation_ratio:9.57 mem_allocator:jemalloc-3.2.0 # Persistence loading:0 rdb_changes_since_last_save:0 rdb_bgsave_in_progress:0 rdb_last_save_time:1397230798 rdb_last_bgsave_status:ok rdb_last_bgsave_time_sec:0 rdb_current_bgsave_time_sec:-1 aof_enabled:0 aof_rewrite_in_progress:0 aof_rewrite_scheduled:0 aof_last_rewrite_time_sec:-1 aof_current_rewrite_time_sec:-1 aof_last_bgrewrite_status:ok aof_last_write_status:ok # Stats total_connections_received:1 total_commands_processed:271 instantaneous_ops_per_sec:0 rejected_connections:0 sync_full:0 sync_partial_ok:0 sync_partial_err:0 expired_keys:0 evicted_keys:0 keyspace_hits:2 keyspace_misses:0 pubsub_channels:0 pubsub_patterns:0 latest_fork_usec:3483 # Replication role:slave master_host:127.0.0.1 master_port:6389 master_link_status:up master_last_io_seconds_ago:9 master_sync_in_progress:0 slave_repl_offset:3867 slave_priority:100 slave_read_only:1 connected_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 # CPU used_cpu_sys:0.66 used_cpu_user:0.15 used_cpu_sys_children:0.01 used_cpu_user_children:0.00 # Keyspace db0:keys=2,expires=0,avg_ttl=0 9 附带redis短连接 redis r = redis.connect(xx) r.set() r.get() r.close() redis长连接,那就是如果不用的话,线程就是sleep,如果用的话,那么就是query等的状态。 10 redis的一些参数优化 vm-enabled设置为no maxmemory :告诉Redis当使用了多少物理内存后就开始拒绝后续的写入请求,该参数能很好的保护好你的Redis不会因为使用了过多的物理内存而导致swap,最终严重影响性能甚至崩溃。有个说法是一般不超过物理内存的3/5 Redis Hash 存储: hash-max-zipmap-entries 64 hash-max-zipmap-value 512 hash-max-zipmap-entries 同样类似的参数有 list-max-ziplist-entries 512 说明:list数据类型多少节点以下会采用去指针的紧凑存储格式。 list-max-ziplist-value 64 说明:list数据类型节点值大小小于多少字节会采用紧凑存储格式。 set-max-intset-entries 512 说明:set数据类型内部数据如果全部是数值型,且包含多少节点以下会采用紧凑格式存储。 另外redis 的6种过期策略 redis 中的默认的过期策略是volatile-lru 。设置方式 config set maxmemory-policy volatile-lru maxmemory-policy 六种方式 volatile-lru:只对设置了过期时间的key进行LRU(默认值) allkeys-lru : 是从所有key里 删除 不经常使用的key volatile-random:随机删除即将过期key allkeys-random:随机删除 volatile-ttl : 删除即将过期的 noeviction : 永不过期,返回错误 maxmemory-samples 3 是说每次进行淘汰的时候 会随机抽取3个key 从里面淘汰最不经常使用的(默认选项) save 参数解读: PS:在主库上注释掉save功能,在从库开启save功能,会减少主库的读写压力。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |