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"