Linux服务搭建 || Redis集群搭建与简单使用

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个或以上的主节点,否则在创建集群时会失败,并且当存活的主节点数小于总节点数的一半时,整个集群就无法提供服务了。

IP地址 端口 节点配置
192.168.10.11 7001 /opt/redis-cluster/nodes-7001/redis.conf
192.168.10.11 7002 /opt/redis-cluster/nodes-7002/redis.conf
192.168.10.11 7003 /opt/redis-cluster/nodes-7003/redis.conf
192.168.10.12 7001 /opt/redis-cluster/nodes-7001/redis.conf
192.168.10.12 7002 /opt/redis-cluster/nodes-7002/redis.conf
192.168.10.12 7003 /opt/redis-cluster/nodes-7003/redis.conf

一、环境安装

在两台主机上执行

# cd /opt/
# wget http://download.redis.io/releases/redis-4.0.11.tar.gz
# tar zxf redis-4.0.11.tar.gz
# cd redis-4.0.11
# yum install tcl -y
# make && make install
# cp -a src/redis-server src/redis-cli src/redis-sentinel src/redis-trib.rb src/redis-check-aof src/redis-check-rdb src/redis-benchmark /usr/local/bin/                      //#将redis的执行脚本拷贝到PATH变量所在目录或加入全局环境变量

二、配置redis集群文件

在两台主机上执行

# mkdir -p /opt/redis-cluster/nodes-{7001,7002,7003}
# ln -s  /opt/redis-4.0.11 redis

编辑redis-cluster/nodes-7001/redis.conf ---以192.168.10.11 7001端口为例

bind 192.168.10.11                       //bind 本机ip 
protected-mode yes
port 7001                                      //同一台主机这里要修改
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes                                  //redis后台运行
supervised no
pidfile /var/run/redis_7001.pid                              //pidfile文件对应7000,7001,7002
cluster-enabled  yes                                               //开启集群
cluster-config-file  nodes_7001.conf                      //集群的配置  配置文件首次启动自动生成 7000,7001,7002
cluster-node-timeout  15000                               //请求超时  默认15秒,可自行设置
loglevel notice
logfile ""
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
slave-lazy-flush no
appendonly yes                                            //aof日志开启  有需要就开启,它会每次写操作都记录一条日志 
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble no
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes

三、启动各个节点

在两台机器上执行

# redis-server /opt/redis_cluster/7001/redis.conf
# redis-server /opt/redis_cluster/7002/redis.conf
# redis-server /opt/redis_cluster/7003/redis.conf
# ps -ef | grep redis 
# netstat -tnlp | grep redis

四、创建集群

在两台机器上安装ruby-redis.gem

# gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.com/                    //删除国外源并添加国内源
# gem sources -l                //查看源
# gem install redis -v 3.3.5    #注:不要使用4.x版本,不然后期增加实例,迁移哈希槽会失败

在192.168.10.11创建集群

# redis-trib.rb  create  --replicas  1  192.168.10.11:7001 192.168.10.11:7002  192.168.10.11:7003 192.168.10.12:7001  192.168.10.12:7002  192.168.10.12:7003
# redis-cli -h 192.168.10.11 -c -p 7001
192.168.10.11:7001> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:64
cluster_stats_messages_pong_sent:66
cluster_stats_messages_sent:130
cluster_stats_messages_ping_received:61
cluster_stats_messages_pong_received:64
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:130
192.168.10.11:7001> cluster nodes
b7fa7d71c629d9ad5d072c74f8da0f196fd9e49b 192.168.10.12:7001@17001 master - 0 1547300694626 4 connected 5461-10922
f4e9a057dab8e613b755f6ffb0e23611a19717f3 192.168.10.11:7002@17002 master - 0 1547300694000 2 connected 10923-16383
481a9264b15167f46bd15f4bdfaa0c5ed9da6a70 192.168.10.11:7001@17001 myself,master - 0 1547300691000 1 connected 0-5460
d284751ab60f934b297d124add677d63b11c4169 192.168.10.12:7003@17003 slave 481a9264b15167f46bd15f4bdfaa0c5ed9da6a70 0 1547300696683 6 connected
80fd975c77a5fa6ed5d883c7c3dbea410a9ecbdd 192.168.10.11:7003@17003 slave b7fa7d71c629d9ad5d072c74f8da0f196fd9e49b 0 1547300693000 4 connected
88ee2c7b4527f968c89795d8c8ed311b9d8bdbe3 192.168.10.12:7002@17002 slave f4e9a057dab8e613b755f6ffb0e23611a19717f3 0 1547300695660 5 connected

五、集群测试

在192.168.10.11设置键值

192.168.10.11:7001> set hello world
OK
192.168.10.11:7001> get hello
"world"

在192.168.10.12查看
# redis-cli -h 192.168.10.12 -c -p 7001
192.168.10.12:7001> get hello
-> Redirected to slot [866] located at 192.168.10.11:7001
"world"

把192.168.10.11的7001端口的redis宕掉

# ps -ef|grep redis
root      16129      1  0 08:09 pts/1    00:00:04 src/redis-server 127.0.0.1:21325
root      16156      1  0 08:09 pts/1    00:00:04 src/redis-server 127.0.0.1:21326
root      16474      1  0 08:34 ?        00:00:03 redis-server 192.168.10.11:7001 [cluster]
root      16479      1  0 08:35 ?        00:00:03 redis-server 192.168.10.11:7002 [cluster]
root      16484      1  0 08:35 ?        00:00:04 redis-server 192.168.10.11:7003 [cluster]
root      16586  10227  0 09:12 pts/1    00:00:00 grep --color=auto redis
# kill -9 16474
# ps -ef|grep redis
root      16129      1  0 08:09 pts/1    00:00:04 src/redis-server 127.0.0.1:21325
root      16156      1  0 08:09 pts/1    00:00:04 src/redis-server 127.0.0.1:21326
root      16479      1  0 08:35 ?        00:00:04 redis-server 192.168.10.11:7002 [cluster]
root      16484      1  0 08:35 ?        00:00:04 redis-server 192.168.10.11:7003 [cluster]
root      16588  10227  0 09:12 pts/1    00:00:00 grep --color=auto redis
# redis-cli -h 192.168.10.11 -c -p 7002
192.168.10.11:7002> get hello                         //发现还是可以获取到数据的
-> Redirected to slot [866] located at 192.168.10.12:7003
"world"
在192.168.10.12机器上连接测试
# redis-cli -h 192.168.10.12 -c -p 7002
192.168.10.12:7002> get hello                       //发现还是可以获取到数据的
-> Redirected to slot [866] located at 192.168.10.12:7003
"world"
posted @ 2019-01-12 23:44  reaperhero  阅读(480)  评论(0编辑  收藏  举报