-
目录
-
redis搭建(所有命令以及操作针对于redis>5.0)
- 基于docker搭建redis集群模式
-
docker run --net host --name dmp-redis -v /etc/localtime:/etc/localtime:ro -v /home/dmp/redis/slave01/data:/data --log-driver=none -p 对外端口:内部端口-p 对外集群通讯端口(对外端口+10000):集群通讯端口(内部端口+10000) redis:5.0 redis-server --port 工作端口 --requirepass "密码" --masterauth "集群密码" --cluster-announce-ip 集群通讯ip --cluster-announce-port 8579 --cluster-announce-bus-port 18579 --cluster-node-timeout 10000 //连接超时时间 --appendonly yes //开启appendomle备份,默认备份文件为appendonly.aof --protected-mode no //关闭守护进程,否则会出现其他节点找不到此节点 --cluster-enabled yes //开启集群模式 --slave-read-only yes //当当前节点为slave时,此节点为只读节点
创建集群
-
redis-cli --cluster create ip1:port1 ip2:port2 ip3:port3 --cluster-replicas 1 -a 密码
添加节点,在创建集群之前
-
cluster meet ip:port
指定slave
-
在节点之下执行redis命令:cluster slaveOf master
-
-
本地搭建
-
首先在每个节点创建redis.conf文件,内容为配置文件
-
然后在每个节点redis/src目录下执行./redos-server redis.conf
-
创建集群分配slot:redis-cli -a 密码 --cluster create ip:port ...
-
检查集群状态:redis-cli --cluster check ip:port
-
查看slot分配信息:redis-cli --cluster info ip:port
-
- 基于docker搭建redis集群模式
-
水平扩展集群节点
- 将redis目录文件拷贝到新的主机上(docker直接pull相同版本)
- 启动redis实例,并检查是否成功-> ps -ef | grep redis 查看端口
- 查看集群的帮助命令-> ./redis-cli --cluster help
- create :创建集群-> host1:port1.......host2:port2
- call:可以执行redis命令
- add-node:将节点添加到集群里,第一个参数为新节点的ip:port 第二个参数为集群中的任一节点ip:port
- reshard:重新分片
- check:检查集群状态
- 使用add-node命令新增一个主节点-> ./redis-cli -a '' --cluster add-node ip:port(新增节点) ip:port(集群中任一节点)
- 进入任一节点查看cluster nodes是否添加成功
-
重新分片
- 使用redis-cli命令为新节点(ip6:port6)分配slot槽点,找到集群中任一节点,对其进行重新分片 -> ./redis-cli --cluster reshard ip1:port1
-
How many slots do you want to move (from 1 to 16384)? 4000 (ps:需要多少个槽移动到新的节点上,自己设置,比如4000个hash槽) What is the receiving node ID? 44b0bd6cf056af7dbbfa0dd9497def1cfc21eb6d (ps:把这4000个hash槽移动到哪个节点上去,需要指定节点id) 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. Source node 1:all (ps:输入all为从所有主节点中分别抽取相应的槽数指定到新节点中,抽取的总槽数为4000个;或者输入原节点ID然后输入done,意思将输入的节点ID,抽取的总槽数为4000个) Do you want to proceed with the proposed reshard plan (yes/no)? yes (ps:输入yes确认开始执行分片任务)
查看最新的集群状态
- 添加从节点
- 同样执行上述添加节点命令
- 进入新节点,执行cluster replicate +主节点ID 指定该节点为主节点ID的从节点
-
水平伸缩
- 从节点:直接删除从节点,使用del-node命令移除从节点,指定ip和端口:./redis-cli -a 密码 --cluster del-node ip:port
- 主节点:需要注意不可直接删除节点,因为分配了slot会造成数据丢失,所以需要将slot迁移到其他master节点上,在执行删除命令
- 槽点迁移:./redis-cli --cluster reshard ip:port
-
How many slots do you want to move (from 1 to 16384)? 4000 (ps:需要多少个槽移动到新的节点上,自己设置,比如4000个hash槽) What is the receiving node ID? e7f80ba80749904838b6d779a0646e7f22313624 (ps:把这4000个hash槽移动到哪个节点上去,需要指定节点id) Please enter all the source node IDs. Type 'all' to use all the nodes as source nodes for the hash slots.//从所有节点均匀抽取4000个slot进行分配 Type 'done' once you entered all the source nodes IDs.//从指定节点抽取4000个slot进行分配 Source node 1:44b0bd6cf056af7dbbfa0dd9497def1cfc21eb6d Source node 1:done (ps:输入all为从所有主节点中分别抽取相应的槽数指定到新节点中,抽取的总槽数为4000个;或者输入原节点ID然后输入done,意思将输入的节点ID,抽取的总槽数为4000个) Do you want to proceed with the proposed reshard plan (yes/no)? yes (ps:输入yes确认开始执行分片任务)
迁移之后需要检查是否有剩余slot:cluster nodes
-
- 很有成就的任务已经完事了,并且查询的时候依然可以从指定slot返回相关数据集
- 但是当你查看挂载的数据文件目录,以及内存占用情况就会发现,当前新增节点数据目录下并没有数据源,而是redis作为一个无中心数据库而言,数据并没有像添加slave那样,理所当然的继承了父类的所有属性并且获取了所有财产(数据)
- 这样虽然redis依然可以外部访问并且提供服务,但是仔细观察就会发现,当你的slot已经被成功的分配到了N太服务器上,如果你没有将数据迁移的话N=1,相当于并没有优化,实际而言可能还会变慢
- 解决重分配slot没有数据
- 执行del-node移除节点
redis-搭建,水平扩展,水平伸缩
最新推荐文章于 2022-07-06 12:23:57 发布