一:redis的安装:
wget http://redis.googlecode.com/files/redis-3.2.6.tar.gz
解压到/opt
tar –zxvf redis-3.2.6.tar.gz -C /opt
编译
需要说明的事,redis的安装非常简单,已经有现成的Makefile文件,直接运行make命令即可。
make
make install
启动redis
[root@localhost bin]# /opt/redis-3.2.6/bin/redis-server /opt/redis-3.2.6/conf/redis.conf
8603:M 04 May 14:03:38.356 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
8603:M 04 May 14:03:38.356 # Server started, Redis version 3.2.6
8603:M 04 May 14:03:38.356 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
8603:M 04 May 14:03:38.356 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
8603:M 04 May 14:03:38.356 * DB loaded from disk: 0.000 seconds
8603:M 04 May 14:03:38.356 * The server is now ready to accept connections on port 6379
Redis 由四个可执行文件:redis-benchmark、redis-cli、redis-server、redis-stat 这四个文件,加上一个redis.conf就构成了整个redis的最终可用包。它们的作用如下:
- redis-server:Redis服务器的daemon启动程序
- redis-cli:Redis命令行操作工具。当然,你也可以用telnet根据其纯文本协议来操作
- redis-benchmark:Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能
- redis-stat:Redis状态检测工具,可以检测Redis当前状态参数及延迟状况
注意,默认redis.conf文件的daemonize参数为no,所以redis不会在后台运行,这时要测试,我们需要重新开一个终端。修改为yes则为后台运行redis。另外配置文件中规定了pid文件,log文件和数据文件的地址,如果有需要先修改,默认log信息定向到stdout.
二:redis主从
主Redis:192.168.8.115 6379
从redis: 192.168.8.116 6380
一、主从配置
1、将主从redis配置文件redis.conf中的daemonize no 改为
yes
2、修改从redis配置文件redis.conf中的port 6379 改为 6380,添加
slaveof 192.168.8.115 6379
3、启动主从服务
[root@redis_server ~]# /opt/redis-3.2.6/bin/redis-server /opt/redis-3.2.6/conf/redis.conf
4、测试数据同步
主redis:
[root@redis_server ~]# bin/redis-cli -p 6379
127.0.0.1:6379> set name haha
OK
127.0.0.1:6379> get name
"haha"
127.0.0.1:6379>
从redis:
[root@redis_slave1 ~]# src/redis-cli -p 6380
127.0.0.1:6380> get name
"haha"
127.0.0.1:6380>
5、默认是读写分离的
在从redis:
[root@redis_slave1 ~]# bin/redis-cli -p 6380
127.0.0.1:6380> set name 123
(error) READONLY You can't write against a read only slave.
二、主从切换
1、停止主redis
[root@redis_server ~]# bin/redis-cli -n 6379 shutdown
[root@redis_server ~]# bin/redis-cli -p 6379
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected>
2、将从redis设成主redis
[root@redis_slave1 ~]# bin/redis-cli -p 6380 slaveof NO ONE
OK
3、测试从redis是否切换从主redis
[root@redis_slave1 ~]# bin/redis-cli -p 6380
127.0.0.1:6380> set name 123
OK
127.0.0.1:6380> get name
"123"
127.0.0.1:6380>
4、原来的主redis恢复正常了,要重新切换回去
1)将现在的主redis的数据进行保存
[root@redis_slave1 ~]# src/redis-cli -p 6380
127.0.0.1:6380> set name 123
OK
127.0.0.1:6380> get name
"123"
127.0.0.1:6380> save
OK
127.0.0.1:6380> get name
"123"
127.0.0.1:6380>
2)将现在的主redis根目录下dump.rdb文件拷贝覆盖到原来主redis的根目录
[root@redis_slave1 redis-3.2.6]# scp -r dump.rdb root@192.168.8.115:/opt/redis-3.2.6/dump.rdb
3)启动原来的主redis
[root@redis_server ~]# /opt/redis-3.2.6/bin/redis-server /opt/redis-3.2.6/conf/redis.conf
4)在现在的主redis中切换
[root@redis_server ~]#bin/redis-cli -p 6380 slaveof 192.168.8.115 6379
OK
三:redis集群搭建
ruby环境
redis集群管理工具redis-trib.rb依赖ruby环境,首先需要安装ruby环境:
安装ruby
yum install ruby
yum install rubygems
安装ruby和redis的接口程序
gem install redis
集群结点规划
这里在同一台服务器用不同的端口表示不同的redis服务器,如下:
主节点:192.168.8.116:6471 192.168.8.116:6472 192.168.8.116:6473
从节点:192.168.8.116:6474 192.168.8.116:6475 192.168.8.116:6476
在/usr/local下创建redis-cluster目录,其下创建6471..6476目录,如下:
[root@redis_slave1 redis_cluster]# for i in `seq 6471 6476`;do mkdir $i;done
[root@redis_slave1 redis_cluster]# ll
total 48
drwxr-xr-x 2 root root 4096 Jul 18 17:27 6471
drwxr-xr-x 2 root root 4096 Jul 18 17:27 6472
drwxr-xr-x 2 root root 4096 Jul 18 17:27 6473
drwxr-xr-x 2 root root 4096 Jul 18 17:27 6474
drwxr-xr-x 2 root root 4096 Jul 18 17:27 6475
drwxr-xr-x 2 root root 4096 Jul 18 17:27 6476
将redis安装目录bin下的文件拷贝到6471-6476目录内,同时将redis源码目录src下的redis-trib.rb拷贝到redis-cluster目录下。
修改6471-6476目录下的redis.conf配置文件:
port 6471 //端口6471、6472..6476
bind 本机ip //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群
daemonize yes //redis后台运行
pidfile /var/run/redis_6471.pid //pidfile文件对应6471、6472..6476
cluster-enabled yes //开启集群 把注释#去掉
cluster-config-file nodes_6471.conf //集群的配置 配置文件首次启动自动生成 6471、6472..6476
cluster-node-timeout 15000 //请求超时 默认15秒,可自行设置
appendonly yes //aof日志开启 有需要就开启,它会每次写操作都记录一条日志
启动每个节点redis服务,其他结点类似
[root@redis_slave1 bin]# cd /usr/local/redis_cluster/
[root@redis_slave1 redis_cluster]# cd 6471/
[root@redis_slave1 6471]# ./redis-server redis.conf
查看进程
执行创建集群命令
在/usr/local/redis-cluster/
执行redis-trib.rb,此脚本是ruby脚本,它依赖ruby环境。
[root@redis_slave1 redis_cluster]# ./redis-trib.rb create --replicas 1 192.168.8.116:6471 192.168.8.116:6472 192.168.8.116:6473 192.168.8.116:6474 192.168.8.116:6475 192.168.8.116:6476
8. 集群验证
连接方式为 redis-cli -h 192.168.8.116 -c -p 6471 ,加参数 -C 可连接到集群,因为上面 redis.conf 将 bind 改为了ip地址,所以 -h 参数不可以省略。
在6471节点执行命令set name haha 在6472结点执行 get name 执行结果如下:
说明:
redis集群至少需要3个主节点,每个主节点有一个从节点总共6个节点
replicas指定为1表示每个主节点有一个从节点
简单说一下原理
redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。
Redis 集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽 (hash slot)
的方式来分配的。redis cluster 默认分配了 16384 个slot,当我们set一个key 时,会用CRC16
算法来取模得到所属的slot
,然后将这个key 分到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16384。所以我们在测试的时候看到set 和 get 的时候,直接跳转到了7000端口的节点。
Redis 集群会把数据存在一个 master 节点,然后在这个 master 和其对应的salve 之间进行数据同步。当读取数据时,也根据一致性哈希算法到对应的 master 节点获取数据。只有当一个master 挂掉之后,才会启动一个对应的 salve 节点,充当 master 。
需要注意的是:必须要3个或以上
的主节点,否则在创建集群时会失败,并且当存活的主节点数小于总节点数的一半时,整个集群就无法提供服务了。