day40 redis 主从复制 集群


I know, i know
地球另一端有你陪我




一、主从复制 Replication

现实环境中,服务器更多的被用来执行读命令
为了缓解读压力,一个 Redis 服务可以有多个该服务的复制品
这个 Redis 服务称为Master,其他复制品称为 Slaves

只要网络连接正常,Master会一直将自己的数据更新同步给Slaves,保持主从同步

只有Master可以执行写命令,Slaves只能执行读命令,单向性

(master 主人,slave 奴隶,感觉有点恶趣味)


二、主从复制创建 slaveof

先将redis文件复制到其他节点

	scp -r redis node1:/usr/local/soft/

1、开启服务时建立主从关系

1.1 创建开启主节点中的 redis 服务,端口默认6379

	cd /usr/local/soft/redis/bin
	nohup redis-server redis.conf &
	redis-cli

1.2 创建并开启从节点中的 redis 服务,端口设置为6380
      注:由于没有设置路径,因此启动程序需要使用 ./

	cd /usr/local/soft/redis/bin
	./redis-server --port 6380 --slaveof master 6379
	./redis-cli -p 6380

2、服务运行时指向

1.1 创建开启主节点中的 redis 服务,端口默认6379

	cd /usr/local/soft/redis/bin
	nohup redis-server redis.conf &
	redis-cli

1.2 创建并开启从节点中的 redis 服务,端口设置为6380

	cd /usr/local/soft/redis/bin
	./redis-server --port 6380
	./redis-cli -p 6380

1.3 开启服务后,指向主从关系

	slaveof master 6379

      亦可解除关系,变为主节点,不会丢弃已同步数据

	slaveof no one

3、配置文件中指向

更改配置文件 redis.conf
使用配置文件启动

	slaveof <masterip> <masterport>
	slaveof 192.168.x.xx 6379

4、主从复制特点

1、一个 Master 可以有多个 Slaves
2、Slave 下线,只是读请求的处理性能下降
3、Master 下线,写请求无法执行
4、其中一台 Slave 使用 SLAVEOF no one 命令成为 Master,
      其它 Slaves 执行 SLAVEOF 命令指向这个新的 Master,从它这里同步数据
以上过程是手动的,能够实现自动,这就需要Sentinel哨兵,实现故障转移Failover操作


三、Redis 集群

3.0支持
由多个 Redis 服务器组成的分布式网络服务集群
每一个 Redis 服务器称为节点 Node,节点之间会互相通信。两两相连
Redis 集群无中心节点

1、Redis 集群节点

Redis集群的每个节点都有两种角色可选:
主节点master node、从节点slave node

其中主节点用于存储数据,而从节点则是某个主节点的复制品,同主从复制完全相同

2、Redis 集群故障转移

Redis集群的主节点内置了类似 Redis Sentinel 的节点故障检测和自动故障转移功能,
当集群中的某个主节点下线时,集群中的其他在线主节点会注意到这一点,
并对已下线的主节点进行故障转移

在集群里面,故障转移是由集群中其他在线的主节点负责进行的,
因此一般设置正在运行的主节点服务器一般是奇数个,防止逻辑出错(平票)


3、Redis 集群分片

集群将整个数据库分为 16384(0-16383)个槽位(slot),
所有键(key)存放于这些 slot 中的一个,
key 的槽位计算公式为 slot_number = crc16(key)%16384,
其中crc16为16位的循环冗余校验和函数

集群中的每个主节点都可以处理0个至16383个槽(得益于重定向),
当16384个槽都有节点在负责处理时,集群进入上线状态
并开始处理客户端发送的数据命令请求

个人理解:虽然每个主节点独立,但是必须形成整体才能正常运行,并不是完全的去中心化
(存在一个抽象的大中心)

4、Redis 集群 转向 Redirect

由于Redis集群无中心节点,请求可能会发给任意主节点

主节点只会处理自己负责槽位的命令请求,其它槽位的命令请求,
该主节点会返回客户端一个转向错误,
客户端根据错误中包含的地址和端口重新向正确的负责的主节点发起命令请求

5、Redis 集群 搭建

1 创建安装目录 在master ,node1 ,node2中分别创建

	mkdir /usr/local/soft/redis-cluster

2 将 redis 复制到 redis-cluster 目录下修改名字为7000

	cp -r /usr/local/soft/redis  /usr/local/soft/redis-cluster
	mv /usr/local/soft/redis-cluster/redis /usr/local/soft/redis-cluster/7000

3 删除单机版缓存文件(可能会影响最终集群的正常运行)

	rm -rf appendonly.aof
	rm -rf dump.rdb

4 修改配置文件

	vim redis.conf
	daemonize    yes                     //redis后台运行
	pidfile  /var/run/redis_7000.pid     //pidfile文件对应7000
	port  7000                           //端口7000
	cluster-enabled  yes                 //开启集群   把注释的"#"去掉
	cluster-config-file  nodes.conf      //集群的配置  配置文件首次启动自动生成
	cluster-node-timeout   5000          //请求超时  设置5秒够了
	appendonly  yes                      //aof持久化,有需要就开启,

5 复制多个,用于分发

	cp -r 7000 7001
	cp -r 7000 7002
	cp -r 7000 7003
	cp -r 7000 7004
	cp -r 7000 7005

6 分发前修改每一个配置文件

	vim /usr/local/soft/redis-cluster/7001/bin/redis.conf

	//把7000改成对应的端口号
	pidfile /var/run/redis_7001.pid
	port 7001

7 分发给 node1 和 node 2

	scp -r /usr/local/soft/redis-cluster/7002 node1:/usr/local/soft/redis-cluster/
	scp -r /usr/local/soft/redis-cluster/7003 node1:/usr/local/soft/redis-cluster/

	scp -r /usr/local/soft/redis-cluster/7004 node2:/usr/local/soft/redis-cluster/
	scp -r /usr/local/soft/redis-cluster/7005 node2:/usr/local/soft/redis-cluster/

8 启动 master node1 node2 的 redis

	//1、在master中执行
	cd /usr/local/soft/redis-cluster/7000/bin
	./redis-server redis.conf
	cd /usr/local/soft/redis-cluster/7001/bin
	./redis-server redis.conf

	//2、在node1中执行
	cd /usr/local/soft/redis-cluster/7002/bin
	./redis-server redis.conf
	cd /usr/local/soft/redis-cluster/7003/bin
	./redis-server redis.conf

	//3、在node2中执行
	cd /usr/local/soft/redis-cluster/7004/bin
	./redis-server redis.conf
	cd /usr/local/soft/redis-cluster/7005/bin
	./redis-server redis.conf

9 通过工具构建集群 在 master 中安装

	//安装工具
	yum -y install ruby ruby-devel rubygems rpm-build
	//外部上传 redis-3.0.0.gem  于/usr/local/module 目录下
	gem install -l redis-3.0.0.gem  

	//放在/usr/local/bin/  该目录下的命令可以在任何一个位置运行
	cp /usr/local/module/redis-3.0.0/src/redis-trib.rb /usr/local/bin/redis-trib 

10 启动集群 第一次使用需要 后面重启不需要使用 此处 ip 地址需要手写完整

	redis-trib create --replicas 1 192.168.133.xxx:7000 192.168.133.xxx:7001 192.168.133.xxx:7002 192.168.133.xxx:7003 192.168.133.xxx:7004 192.168.133.xxx:7005

11 客户端访问reids集群

	//-p  端口号   -h  节点ip  -c  自动重定向
	关于重定向:可以保证正常操作其他服务器的片区
	redis-cli -p 7000 -h master -c
	./redis-cli -p 7002 -h node1 -c
	./redis-cli -p 7004 -h node2 -c

12 查看信息

	//查看集群信息
	cluster info

	//查看节点信息
	cluster nodes

1、集群搭建成功后,节点信息如下:
在这里插入图片描述
2、当主节点7004被手动关闭后,节点信息如下:
在这里插入图片描述
此时 7004 的从节点 7005,已经成功上位,成为新的主节点

3、当节点7004被再次打开后,节点信息如下:
在这里插入图片描述
此时尽管 7004 已经重启,只能成为 7005 主节点的从节点

6、Redis 集群 特点

Redis集群是一个由多个节点组成的分布式服务集群,它具有复制、高可用和分片特性

Redis的集群没有中心节点,并且带有复制和故障转移特性,
这可用避免单个节点成为性能瓶颈,或者因为某个节点下线而导致整个集群下线

集群中的主节点负责处理槽(储存数据),而从节点则是主节点的复制品

Redis集群将整个数据库分为16384个槽,数据库中的每个键都属于16384个槽中的其中一个
集群中的每个主节点都可以负责0个至16384个槽,当16384个槽都有节点在负责时,集群进入上线状态,可以执行客户端发送的数据命令

主节点只会执行和自己负责的槽有关的命令,当节点接收到不属于自己处理的槽的命令时,它将会处理指定槽的节点的地址返回给客户端,而客户端会向正确的节点重新发送


总结

关于设置 redis 密码
1、临时设置

redis 127.0.0.1:6379>    config set requirepass test123

2、永久设置

	vim redis.conf
	requirepass 123456

3、使用密码登录 redis

	redis-cli -a 123456

1.1 创建安装目录 在master ,node1 ,node2中分别创建

	mkdir /usr/local/soft/redis-cluster

Guess you like

Origin blog.csdn.net/qq_41464008/article/details/121373321