nosql----redis集群部署
redis
安装依赖包
yum -y install gcc gcc-c++
解压安装包并进入
make MALLOC=libc
make install PREFIX=/usr/local/redis
在安装目录下创建配置文件目录
mkdir /usr/local/redis/etc
cp /tools/redis-5.0.0/redis.conf /usr/local/redis/etc
为了后续redis的配置,可将/tools/redis-5.0.0/src/下的可执行脚本复制到/usr/local/redis/bin下面
配置 redis.conf
开机自启动
daemonize yes
允许远程连接
这里bind的意思是,允许从本地的那个接口来接入redis,假如是127.0.0.1,那当然就只有本地能接入了。但是假设服务器有三个ip,这里写入ip1的话,就表示可以通过这个ip来连接redis
因此,这里的意思并不是说开放哪个网段可以连接进来,而是允许外部通过本地的那个接口进来。假如在这里配置一个非本服务器的ip,那么很遗憾,redis连启动都启动不了,他会报错。
注释掉bind
#bind 127.0.0.1
关闭保护模式
protected-mode no
开发防火墙
firewall-cmd --add-port=6379/tcp --permanent
firewall-cmd --reload
配置环境变量
vim /etc/profile
PATH=$PATH:/usr/local/redis/bin
export PATH
启动redis
redis-server /usr/local/redis/etc/redis.conf
测试连接
redis-cli -h 127.0.0.1 -p 6379 ping
进入redis
redis-cli -h 127.0.0.1 -p 6379
停止redis
redis-cli -h 127.0.0.1 -p 6379 shutdown 又或者你可暴力杀掉
redis集群部署
环境:
master1:172.16.1.31:8000
master2:172.16.1.32:8000
master3:172.16.1.33:8000
slave1:172.16.1.34:8000
slave2:172.16.1.35:8000
slave3:172.16.1.36:8000
官方推荐redis集群至少拥有6个节点 3主3从
集群建立后,往集群插入数据的时候,会经过插槽运算去给数据分配一个插槽(slots),其插槽可以是集群上插槽的任意一个,也就是说,可能是在三台主redis的任意一台上的一个插槽。
备份redis会备份好主redis上的数据,当主redis故障或者down机的时候,备redis就是将自身状态切换到主redis。
配置redis(所有节点)
vim /usr/local/redis/etc/redis.conf
port 8000 #启动端口
pidfile /var/run/redis_8000.pid #pid文件
dir /usr/local/redis/etc/ #生产文件默认路径
cluster-enabled yes #开启集群
cluster-config-file nodes_8000.conf #集群节点配置文件
appendonly yes #开启AOF持久化
requirepass tqw961110 #设置密码
masterauth tqw961110 #这个配置需要在从服务器上加上,不然当主redis坏掉的时候,slave不能自动切换成master
旧版本会使用redis-trib.rb这个脚本,但是新版本将该脚本的命令全部移动到redis-cli下面了
格式为redis-cli --cluster 加上下图的参数
redis-cli --cluster help 可以看到--cluster参数的所有用法
--cluster-replicas 1 的意思是集群中一个主对于一个从
./redis-cli --cluster create 172.16.1.31:8000 172.16.1.32:8000 172.16.1.33:8000 172.16.1.34:8000 172.16.1.35:8000 172.16.1.36:8000 --cluster-replicas 1 -a tqw961110
执行命令后如果出现 Waiting for the cluster to join 并一直处于等待状态没有反应。
redis集群不仅需要开通redis客户端连接的端口,而且需要开通集群总线端口
集群总线端口为redis客户端连接的端口 + 10000
如redis端口为8000
则集群总线端口为18000
故,所有服务器的点需要开通redis的客户端连接端口和集群总线端口
firewall-cmd --add-port=8000/tcp --permanent
firewall-cmd --add-port=18000/tcp --permanent
firewall-cmd --reload
查看集群状态
redis-cli -c -p 8000 -a tqw961110 cluster nodes
测试
建立集群后,必须通过集群模式连接redis,也就是加入-c参数,不然后报错。
在31上插入数据
redis-cli -c -h 172.16.1.31 -p 8000 -a tqw961110
>set name1 aaaa
可以看到数据插入到12933这个slots里面,对应的主redis是33节点的redis
在32上插入数据
redis-cli -c -h 172.16.1.32 -p 8000 -a tqw961110
>set name2 bbbb
可以看到数据插入到742这个slots里面,对应的主redis是31节点的redis
由此可见,证明了上文所述的,插入数据时候,会根据插槽算法去分配数据究竟分配在哪个slots里面。
在31节点上查看数据
redis-cli -c -h 172.16.1.31 -p 8000
>get name1
>get name2
可以看到,31节点上的redis可以查询到刚才在32上插入的数据,证明集群的建立是成功的。
而查询数据是根据对应的slots去匹配的。
增加集群节点
增加主节点
redis-cli --cluster add-node 172.16.1.37:8000 172.16.1.31:8000 -a tqw961110 (增加节点ip:端口 已有节点ip:端口)
系统提示节点已经添加成功。
查看一下集群的状态。
可以发现37节点目前还没有分配slots,因此他现在还不能插入数据。
因此需要从别的节点上迁移数据过来。
我们从33节点上将数据迁移过来
redis-cli --cluster reshard 127.0.0.1:8000 --cluster-from 3839342e9a6e6a2a024f2dde98de3f0058279f26 -a tqw961110
他会问需要迁移多少个,我们选择2000个
他会询问这些数据需要那个节点来接收,这里我们输入37节点的id
然后会询问是否按照原本的计划迁移数据,这里我们选择yes即可。
短暂的等待后,数据迁移完毕,这时查看集群的状态。
可以看到37节点上已经有2000个slots,这个时候就可以插入数据。
增加从节点
在增加完主节点后,我们还需要为其增加一个从节点,以实现高可用。
redis-cli --cluster add-node 172.16.1.38:8000 172.16.1.37:8000 --cluster-slave --cluster-master-id f837c6db1a6d96d7db719010b78078360ee1ee29 -a tqw961110 (知道添加的节点为从节点,并且知道其master的id。)
再查看一下集群的状态
可以看到,37、38两个节点已经添加进集群中,并处于主从同步状态。
删除集群节点
redis-cli --cluster del-node ip:端口 node_id -a 密码
对于从节点,可以直接用上述命令删除,但是对于主节点,必须要先把主节点上的数据迁移到别的节点上,不然会报下列错误
因此,我们可以按下列步骤把数据迁移到其他节点
查看主节点当前状态,查看其对应的id和分配到的slots的数量
redis-cli --cluster check 172.16.1.33:8000 -a tqw961110
迁移数据
redis-cli --cluster reshard 127.0.0.1:8000 --cluster-from 删除数据的节点的id -a tqw961110
这里问我们要迁移多少个slot,我们上面看到当前节点一共有5461个slots,因此这里我们输入5461。
然后系统会问我们获取接受这些slots的节点id,这里我们选择本地节点的id。
这里选择yes
当slots数量比较多的时候,这里可能需要等一两分钟。
redis-cli --cluster check 172.16.1.33:8000 -a tqw961110
可以看到,33节点上的slots数量已经变成0
这时候就可以删除节点了
redis-cli --cluster del-node 172.16.1.33:8000 60bb940881a1297e0be5391ba1220bc0c3ba7f1f -a tqw961110
查看集群中是否还有该节点
已经只剩下本地的节点了
这个时候还没完,因为集群建立的时候会在本地新建.aof,.rdb,还有集群对应的.conf文件。
先把redis停掉,再把这三个文件删除,然后重启,这样才算完全清除了集群配置。
故障测试
测试一下一台master故障的down掉的时候,他对应的从服务器是否会自动切换到master的角色。
上图32节点为主redis,35为其对应的slave,先把32的redis停掉。
一定的时间后,可以看到32节点已经退出集群,并且经过·选举,35成为了新的master。
这个时候我们可以对32服务器的redis进行抢救
抢救完成后,先把它的集群配置文件备份然后删掉。
这是由于业务的数据已经增加了,所以32的redis需要作为slave从新加进集群里面,这样就可以同步到主redis上的业务数据。
重启redis,然后执行如下命令(新的节点ip:端口 已有的节点ip:端口 --cluster-slave --cluster-master-id 主redis的id )
redis-cli --cluster add-node 172.16.1.32:8000 172.16.1.35:8000 --cluster-slave --cluster-master-id 3699fc16cb9a78fdbcf82333216c7e7657048176 -a tqw961110
看到上述提示,则证明节点添加成功。
再查看一下集群状态
此时,35和32已经完成了主从切换的操作。