环境准备
6台服务器、启用集群功能
[root@host51 ~]# yum -y install gcc
[root@host51 ~]# tar -xf redis-4.0.8.tar.gz
[root@host51 ~]# cd redis-4.0.8/
[root@host51 ~]# make && make install
[root@host51 ~]# ./utils/install_server.sh 遇到提示就回车
[root@host51 ~]# /etc/init.d/redis_6379 stop
[root@host51 ~]# vim /etc/redis/6379.conf
bind 192.168.88.51
port 6379
cluster-enabled yes #启用集群功能
cluster-config-file nodes-6379.conf #保存集群信息的配置文件
cluster-node-timeout 5000 #集群中主机的连接超时时间
[root@host51 ~]#
[root@host51 ~]# /etc/init.d/redis_6379 start
[root@host51 ~]# netstat -utnlp | grep redis-server
tcp 0 0 192.168.88.51:16379 0.0.0.0:* LISTEN 4249/redis-server 1
tcp 0 0 192.168.88.51:6379 0.0.0.0:* LISTEN 4249/redis-server 1
工作原理
hash solt
redis采用hash槽的方式来进行数据存储的。
redis定义了16384个虚拟的哈希槽,将这16384个槽分配带集群各个节点上,然后多key通过crc16算法得到一个值,然后对16384取模,得到0到16383之间的一个数字。然后就会将key存储到对应数字的节点上。
通过CRC16算法匹配不同的slot 来决定在哪个服务器上存储.
存储数据和查询数据时 调用集群算法 集群算法会计算出1个数字, 数字
在哪个主服务占用的槽范围内 ,就连接对应的主服务器存储数据或查询数据。
部署管理主机
部署ruby脚本运行环境
创建管理集群脚本redis-trib.rb
]#yum -y install ruby
]#gem install redis-3.2.1.gem
]#mkdir /root/bin //创建命令检索目录
]#tar -xf redis-4.0.8.tar.gz
]#cp redis-4.0.8/src/redis-trib.rb /root/bin/
]#chmod +x /root/bin/redis-trib.rb //设置执行权限
]#redis-trib.rb help (能看到帮助信息为成功)
创建集群
redis-trib.rb create --replicas 数字 ip地址:端口 ip地址:端口 ip地址:端口 ....
--replicas 从服务器的台数(指定每个主服务器有几台从服务器)
按顺序前三个主,后三个为slave
[root@mgm57 ~]# redis-trib.rb create --replicas 1 192.168.88.51:6379 192.168.88.52:6379 192.168.88.53:6379 192.168.88.54:6379 192.168.88.55:6379 192.168.88.56:6379
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.88.51:6379
192.168.88.52:6379
192.168.88.53:6379
Adding replica 192.168.88.55:6379 to 192.168.88.51:6379
Adding replica 192.168.88.56:6379 to 192.168.88.52:6379
Adding replica 192.168.88.54:6379 to 192.168.88.53:6379
M: 0eb3b7aa0493a19189cba35b0c658202cc20884b 192.168.88.51:6379
slots:0-5460 (5461 slots) master
M: a9cb8ccd31bf3eb70433c00906c9f1a99b5e8441 192.168.88.52:6379
slots:5461-10922 (5462 slots) master
M: f2c1bdb78d8d224c3666fa6440bdf80ba563c581 192.168.88.53:6379
slots:10923-16383 (5461 slots) master
S: bdba77868965371680fa825badff59bf8ef95a81 192.168.88.54:6379
replicates f2c1bdb78d8d224c3666fa6440bdf80ba563c581
S: 11510f42bfd9cf667bab5f31c01476d94984200a 192.168.88.55:6379
replicates 0eb3b7aa0493a19189cba35b0c658202cc20884b
S: fe572ce003ee634c52adc4b42d92d15f847937d7 192.168.88.56:6379
replicates a9cb8ccd31bf3eb70433c00906c9f1a99b5e8441
Can I set the above configuration? (type 'yes' to accept): yes 同意
....
....
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered. #创建成功的提示
查看集群信息
查看集群统计信息
redis-trib.rb info 192.168.88.51:6351
查看集群详细
redis-trib.rb check 192.168.88.51:6379
在任意一台redis服务器本机,查看集群信息
[root@host51 ~]# redis-cli -h 192.168.88.51 -p 6379
192.168.88.51:6379> cluster info //查看集群信息
cluster_state:ok
……
……
cluster_known_nodes:6
cluster_size:3
192.168.88.51:6351> cluster nodes //查看集群节点信息
d9634ba0aa5c1a07193da4a013da6051c1515922 192.168.88.54:6354@16379 slave 9e44139cffb8ebd7ed746aabbf4bcea9bf207645 0 1561357552212 4 connected
894dd0008053f6fb65e9e4a36b755d9351607500 192.168.88.56:6356@16379 slave 324e05df3f143ef97e50d09be0328a695e655986 0 1561357554216 6 connected
d9f8fe6d6d9dd391be8e7904501db1535e4d17cb 192.168.88.51:6351@16379 myself,master - 0 1561357545000 1 connected 0-5460
324e05df3f143ef97e50d09be0328a695e655986 192.168.88.52:6352@16379 master - 0 1561357553214 2 connected 5461-10922
9e44139cffb8ebd7ed746aabbf4bcea9bf207645 192.168.88.53:6353@16379 master - 0 1561357554216 3 connected 10923-16383
2d343a9df48f6f6e207949e980ef498466a44dad 192.168.88.55:6355@16379 slave d9f8fe6d6d9dd391be8e7904501db1535e4d17cb 0 1561357553716 5 connected
192.168.88.51:6379>
访问集群
连接集群中的任意一台服务器都可以查询数据和存储数据)
-c 连接集群中的主机 使用集群算法存储数据
集群算法每次只有一个计算结果,向集群中的主机存储数据一次只能存储一个变量
redis-cli -c -h redis服务器的ip -p 端口号
测试集群功能
测试服务高可用
master宕机后对应的slave自动被选举为master,原master修好后做当前master的slave
测试数据自动备份
连接服务器查看数据 keys *
slave服务器只读
添加服务器
- 部署新redis服务器
- 添加master角色主机到集群里
- 添加slave角色主机到集群里
]#yum -y install gcc
]#tar -xf redis-4.0.8.tar.gz
]#cd redis-4.0.8/
]#make
]#make install
]#./utils/install_server.sh
]# /etc/init.d/redis_6379 stop
vim /etc/redis/6379.conf
bind 192.168.88.58
port 6379
cluster-enabled yes //启用集群
cluster-config-file nodes-6379.conf //存储集群信息文件
cluster-node-timeout 5000
]# /etc/init.d/redis_6379 start
redis-trib.rb add-node 192.168.88.58:6379 192.168.88.51:6379
重新分配hash槽(reshard)
[root@mgm57 ~]# redis-trib.rb reshard 192.168.88.53:6379
How many slots do you want to move (from 1 to 16384)?4096 //拿出4096个hash 槽给主机192.168.4.58
What is the receiving node ID? c5e0da48f335c46a2ec199faa99b830f537dd8a0 //主机192.168.4.58的id值
Source node #1:all //从当前所有master服务器获取hash槽
Do you want to proceed with the proposed reshard plan (yes/no)?yes //同意以上配置
...
添加slave角色主机到集群里
]#yum -y install gcc
]#tar -xf redis-4.0.8.tar.gz
]#cd redis-4.0.8/
]#make
]#make install
]#./utils/install_server.sh
]# /etc/init.d/redis_6379 stop
vim /etc/redis/6379.conf
bind 192.168.88.59
port 6379
cluster-enabled yes //启用集群
cluster-config-file nodes-6379.conf //存储集群信息文件
cluster-node-timeout 5000
]# /etc/init.d/redis_6379 start
在管理主机,添加slave角色主机
redis-trib.rb add-node --slave 192.168.88.59:6379 192.168.88.51:6379 //执行添加命令
redis-trib.rb info 192.168.88.51:6379 //查看信息
移除服务器
- 移除slave角色服务器 del-node
- 移除master角色服务器 del-node
1. redis-trib.rb check 192.168.88.51:6379 | grep 192.168.88.59 查找要删除对应的主机的id
1.redis-trib.rb del-node 192.168.88.51:6379 7f3fa4f20c8c516d5b412ecc22550ed8e7bb8d7a
2. 释放占用的hash槽
redis-trib.rb reshard 192.168.88.51:6379
//移除4096个数槽
How many slots do you want to move (from 1 to 16384)?4096
//接收槽master主机ID
What is the receiving node ID? bc5c4e082a5a3391b634cf433a6486c867cfc44b
//192.168.88.58的ID
Source node #1: c5e0da48f335c46a2ec199faa99b830f537dd8a0
Source node #2:done //设置完毕
redis-trib.rb info 192.168.88.51:6379 此时查看集群信息只有0个槽
3.移除master
redis-trib.rb check 192.168.88.51:6379 | grep 192.168.88.58
redis-trib.rb del-node 192.168.88.51:6379 4fe1fa467ad237802021f5aac5f1d5b3e0db47ef //删除谁+删除的id
在管理主机,查看集群信息
redis-trib.rb info 192.168.88.51:6351 此时就删除了
你需要知道
1 阐述redis集群存取数据工作原理。
当客户端存储数据到集群主机时,获取变量名与CRC16算法做hash计算,然后用计算结果与16384做取余运算,再根据余数值,把数据存储到对应的master 服务器。
2 阐述redis配置文件中,下列配置项的作用 。
bind IP地址 Redis服务IP地址
port xxxx Redis服务端口号
cluster-enabled yes 启用集群功能
cluster-config-file nodes-xxxx.conf 保存集群信息文件
cluster-node-timeout 5000 与主服务器建立连接超时时间(单位毫秒)
3 简述访问集群命令格式?
redis-cli -c -h 192.168.4.53 -p 6353
-c 集群模式