redis集群主从配置
集群环境安装(ruby的环境云主机和虚拟机都不需要装)
因为集群命令文件需要ruby语言的支持(自行下载)
http://www.ruby-lang.org/en/downloads/ 这个是下载地址
/home/resources/ruby包
到解压目录执行编译
ls查看发现ruby解压成功
进入ruby目录
#./configure 在当前根目录执行编译;
相当于c语言有各种打包,压缩过程,可以将打包压缩的内容解压
编译安装#make && make install(时间较长)
yum安装gems
#yum -y install rubygems
RubyGems(简称 gems)是一个用于对 Ruby组件进行打包的 Ruby
打包系统。 它提供一个分发 Ruby 程序和库的标准格式,还提供一个管理程序包安装的工具。
简单理解就是ruby运行时,需要的各种插件都在gems里;
是一种技术支持;
过程中需要同意操作
#gem install redis//安装redis接口包
下载支持redis的插件内容;
检查版本
#ruby -v
完成ruby环境的安装,就可以利用ruby的环境配置
执行.rb的文件
安装redis
上传redis包,必须是3.0以上版本
解压编译安装
#make make install
c语言编写内容需要编译后,进行编译安装,
rediscluster的具体测试
创建节点
创建集群节点,不同的节点创建对应的目录管理配置文件
例如: 占用8000端口的redis服务,对应redis.conf放到8000的文件夹;
这里我们以节点端口名称为名称,本次创建6个节点的集群目录
mkdir 8000 8001 8002 8003 8004 8005
# ll
查看当前所在目录下的所有内容的详细信息,与ls类似
准备8000-8005启动的redis配置文件,各自的配置文件放到对应的文件夹下
配置文件修改并且上传到指定目录(P代表大致行号)
P61 bind 127.0.0.1//默认ip为127.0.0.1改为其他节点机器可访问的ip 这里可以注释掉
注释掉bind;可以监听连接当前服务的所有-h 后的ip;例如;绑定了127.0.0.1,但是登录时使用-h 10.9.17.153
P80 protected-mode no //yes修改为no
yes表示开启,保护模式下,连接redis服务需要用到密码;no表示不开启,redis-cli登录时,不需要提供安全信息,例如密码;
P84 port 8000 //端口8000-8005
P128 daemonize yes //后台运行
P150 pidfile /var/run/redis_8000.pid //pidfile文件对应8000
当大量的进程启动后,很难通过ps -ef|grep redis直接寻找你需要操作的进程的pid
P163 logfile 8000/redis.log //相对路径,启动时在redis的根目录
log文件记录的内容,就是在启动时,控制台打印的内容,和后续操作redis时所有的日志信息;
P237 dump dump8000.rdb //指定当前服务加载的持久化文件
P593 appendonly yes //默认是rdb方式持久化要改成
P597 appendfilename “appendonly.aof” 指定一个aof格式的持久化文件
AOF模式;
rdb持久化;和aof持久化模式对比
rdb:需要客户端必须调用命令 save完成数据从内存保存到磁盘的操作;没有来得及save的数据一旦丢失,数据出现未命中;
aof:二进制的日志,实时记录 redis客户端操作的所有写命令;没有来得及save的数据不保存在dump里,但是命令内容,保存在了aof文件;恢复时,只需要将每save的所有内容的命令调出来,
小量数据的性能对比: 开启aof模式,比rdb单独使用,多消耗2倍时间
海量数据:同时开启aof和rdb,单独开启rdb 消耗近似;
P721 cluster-enabled yes //加载当前配置文件的redis服务一旦启动需要开启集群模式,否则无法使用集群的各种策略和逻辑
P729 cluster-config-file nodes_8000.conf //集群配置启动后,将会创建这个nodes文件,记录当前服务器上唯一的一个集群状态;例如,搭建了8000-8005这样一个集群,操作失误下,集群失效,重新搭建集群,当前服务器读取这个配置文件会发现,槽道已经被一个集群分配了,新的集群搭建失败;
P735 cluster-node-timeout 15000 //请求超时 默认15秒,可自行设置
利用vim的替换命令,将不同节点的端口在文件中替换拷贝到对应管理的文件夹中
vim中:%s/8000/8001/g
完成之后调用ls检查目录中是否都存在redis.conf文:件
分别启动节点实例,一共启动集群配置的6个进程
redis-server 8000/redis.conf
redis-server 8001/redis.conf
redis-server 8002/redis.conf
redis-server 8003/redis.conf
redis-server 8004/redis.conf
redis-server 8005/redis.conf
检查是否启动成功
#ps -ef|grep redis
搜索关键字redis有关的启动进程信息
#登录集群的客户端命令(cluster)
#redis-cli -c -p 8000
-p 表示端口连接, -c 以集群状态登录节点(本质上是对单个节点的命令封装);
但是这个时候所有的节点并不是集群状态,我们单独登录节点一样无法实现
集群的操作
#redis-cli -c -p 8000
创建集群
<查看>启动文件
在redis根目录src目录下有个文件redis-trib.rb,这个就是用ruby写的命令文件,它是一个语言编写的快速操作集群的命令文件,整合了底层客户端的各种各样的命令,
执行创建集群命令(redis集群最少需要3个master才能正常运行)
./redis-trib.rb 如果我使用的是./说明当前的/etc/profile中没有对PATH进行 ./的配置,所有不在环境变量中的命令文件需要到对应目录调用./启动
./redis-trib.rb create 10.9.17.153:8000 10.9.17.153:8001 10.9.17.153:8002
./redis-trib.rb create --replicas 1
host1:port1….hostn:portn
例如:redis-trib.rb create --replicas 1 节点信息们;
这里的8003 8004 8005暂不添加,后续添加节点使用
解释下, --replicas 1 表示 自动为每一个master节点分配至少一个slave节点 上面有6个节点,程序会按照一定规则生成 3个master(主)3个slave(从)
提问是否同意以上内容的配置结果,yes表示同意
表示集群搭建成功,槽道分配完毕;
后期的连接需要端口开发,防火墙直接关闭;
#service iptables stop //临时关闭防火墙,重启之后防火墙依然开启
#chkconfig iptables off //永久关闭防火墙配置,两个命令配合,
登陆
#redis-cli -c -p 8000
这里注意,如果使用原有的命令没有-c则表示单独登陆节点,没有集群效果
查看集群状态
8000>cluster info
都比较好理解,唯独epoch,epoch是个逻辑计算时间,与节点的所有变化都有关,与集群事件有关;
cluster_current_epoch:6 代表当前集群的最新逻辑计算时间,数字越大,表示操作或者配置越新,整个集群的这个值是保持一致的
cluster_my_epoch:1代表当前节点的逻辑计算时间,
查看集群节点
8000>cluster nodes
查看集群所有节点的信息
这里的内容比较杂乱
节点 ID :例如 3fc783611028b1707fd65345e763befb36454d73 。
ip:port :节点的 IP 地址和端口号, 例如 127.0.0.1:7000 ,
flags :节点的角色(例如 master 、 slave 、 myself 如果标识myself说明当前客户端登录的端口)以及状态(例如 fail ,等等)。
如果节点是一个从节点的话, 那么跟在 flags 之后的将是主节点的节点 ID : 例如 127.0.0.1:7002 的主节点的节点 ID 就是 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 。
master节点最后有一个值的范围,就是hash槽,0~16383(2^14),平均的分配到各master节点。
测试set和get数据体会槽道的原理
登录8000 set name hanlaoshi
集群底层计算判断逻辑:name的哈希取模,5798, 是否归8000管理;转向了8001,存储
动态添加节点(主节点,从节点)
启动新节点8003 8004 8005
执行添加节点命令(将8003添加到当前集群中)
./redis-trib.rb add-node 10.9.17.153:8003 10.9.17.153:8001
前面是新节点,后面是存在的任意一个节点
(重启时添加节点)如果出现如下问题
提示内容:当前新节点已经被集群知道,或者新节点有数据
查看当前节点的数据是否有key存在
登录到新增节点,执行
#8003>cluster nodes
把新增节点的nodes文件删除,重启服务,重新添加
将节点中的数据清空
进入集群查看节点状态(默认情况是master,不管理槽道)
动态添加从节点
–slave 和–master-id 必须同时配置就可以指定给一个master添加从节点,新增节点就是从节点的角色
添加从节点(8004添加到主节点8001)
执行添加节点成为某一台主节点的从节点命令
–slave 指定当前节点以从节点角色添加到集群中
–master-id 后面跟随主节点的masterid值,cluster nodes可以查看
[aaa@qq.com src]# ./redis-trib.rb add-node --slave --master-id 5c90a71b4ace2ed64c28e686072cd40c535980fe 10.9.17.153:8004 10.9.17.153:8003
–master-id后面必须跟着主节点的id(可以使用cluster nodes查看)
检查添加是否成功
8000>cluster nodes 观察结果
新的master要起作用需要保存缓存数据
数据与槽道挂钩,所以需要迁移槽道来
为新的节点分配槽道(只能分配空槽道)
./redis-trib.rb reshard 10.9.17.153:8004
表示将集群中的槽道重新分配,后面的节点信息,已经在集群中存在的任意节点信息,
根据提示操作
1 移动多少槽道
How many slots do you want to move (from 1 to 16384)? 50
将集群中若干个槽道数量从新分配
2 接收移动槽道的节点id是什么
What is the receiving node ID? 指定一个接收分配槽道的节点id8003id
3 源数据节点都有哪些
Please enter all the source node IDs.
Type ‘all’ to use all the nodes as source nodes for the hash slots.
Type ‘done’ once you entered all the source nodes IDs.
如果从固定几个节点获取数据,直接粘贴对应id,必须是主节点
如果从所有id平均分配槽道,all
输入all或者done时,分配计算结束;
Source node #1:all
这里我们就用all
如果使用all将会自动计算从所有主节点平均获取槽道移动
4 确定输入yes
Do you want to proceed with the proposed reshard plan (yes/no)?
5 屏幕滚动移动过程
6 查看cluster nodes 发现8003 已经配有的从各个源数据节点上移动过来的槽道
重新分配槽道,不能重新操作有数据的槽道,空槽道可以reshard,有数据的需要手动迁移数据后在迁移槽道(在补充操作中练习)
高可用验证
停掉一个主的进程
kill掉主节点8001
#ps -ef|grep redis
#kill 8554(执行登录到8001节点 shutdown的命令也可以)
然后登陆集群查看集群节点
8000>cluster nodes
启动停掉的节点会自动拼接成slave加入
等待一定时间,
8000>cluster nodes
发现8001的从节点8004重新选举成新的主节点
删除节点(一旦删除节点,无法直接重新加入)
主节点不能直接删除,需要reshard将槽道全部移出
./redis-trib.rb del-node 10.9.17.153:8000 09a25f98f963e3f90193440be5850bd351eb228b
参数意义: 节点信息是已经存在与集群的节点,id表示删除的节点id
删除从节点(无数据直接删除)
将8001重启之后,称为从节点加入集群,可以测试删除
[aaa@qq.com src]# ./redis-trib.rb del-node 10.9.17.153:8000 5c90a71b4ace2ed64c28e686072cd40c535980fe
redis-trib.rb:能不能再运行的集群维护集群(只有添加删除的功能可以在确定的环境下对运行着的集群做操作,reshard不可以)为了快速的按照集群的设计结构搭建一个集群
重新搭建集群(仅限于测试环境)
可以重新构造不同端口对应的集群;
没有restart类似的重启集群的命令;
重启集群的目的:操作时的各种失误,导致集群失效;
• 杀掉所有进程
• 删掉文件(dump文件,nodes文件,aof文件)
[aaa@qq.com redis-3.2.11]# rm -f nodes*
[aaa@qq.com redis-3.2.11]# rm -f dump*
rm表示删除每删除一个文件,都要询问管理员是否删除 输入yes表示同意
-f是删除命令的选项:表示所有文件强制删除,不要询问
dump* 是参数,表示当前文件夹下所有以dump开始命名的文件
以上命令执行的结果就是,强制删除所有当前文件夹内以dump开始的文件内容
(dump8000.rdb也删除:为了防止启动其他新节点时,读取原有dump的数据导致添加集群节点非空,失败)
然后清除appendonly*
• 重启redis服务供后续操作