Redis主从复制 配置

在Redis中,要实现主从复制架构非常简单,只需要在从数据库的配置文件中加上如下命令即可:
1、主数据库不需要任务配置,创建一个从数据库:
— port 6380 //从服务的端口号
—slaveof 127.0.0.1 6379 //指定主服务器
./bin/redis-server ./redis.conf —port 6380 —slaveof 127.0.0.1 6379
加上slaveof参数启动另一个Redis实例作为从库,并且监听6380端口
2、登录到从服务客户端:
./bin/redis-cli -p 6380 -a guoweixin



变回主: slaveof on one //不是任何从
变回从: slaveof ip地址 端口号

哨兵

image.png
image.png
image.png

集群


Redis集群搭建的方式有多种,但从redis 3.0之后版本支持redis-cluster集群,至少需要3(Master)+3(Slave)才能建立集群。Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有 节点连接。

image.png
image.png

image.pngRedis Cluster高可用

Redis Cluster主从模式
redis cluster 为了保证数据的高可用性,加入了主从模式,一个主节点对应一个或多个从节点,主节点提供数据存取,从节点则是从主节点拉取数据备份,当这个主节点挂掉后,就会有这个从节点选取一个来充当主节点,从而保证集群不会挂掉。

集群有ABC三个主节点, 如果这3个节点都没有加入从节点,如果B挂掉了,我们就无法访问整个集群了。A和C的slot也无法访问。

所以我们在集群建立的时候,一定要为每个主节点都添加了从节点, 比如像这样, 集群包含主节点A、B、C, 以及从节点A1、B1、C1, 那么即使B挂掉系统也可以继续正确工作。

B1节点替代了B节点,所以Redis集群将会选择B1节点作为新的主节点,集群将会继续正确地提供服务。 当B重新开启后,它就会变成B1的从节点。

不过需要注意,如果节点B和B1同时挂了,Redis集群就无法继续正确地提供服务了。

Redis Cluster总结:
将数据自动切分split到多个节点的能力。
当集群中的一部分节点失效或者无法进行通讯时, 仍然可以继续处理命令请求的能力

1. Redis Cluster集群搭建

1.1. 简介

集群中至少应该有奇数个节点,所以搭建集群最少需要3台主机。同时每个节点至少有一个备份节点,所以下面最少需要创建使用6台机器,才能完成Redis Cluster集群(主节点、备份节点由redis-cluster集群确定)

真集群: 准备6条服务器
192.168.1.110:6739
192.168.1.111:6739
192.168.1.112:6739

假集群:一台服务器存在6个redis服务
192.168.1.111:6739 6380 6381 6382…

1.2. 搭建流程

1、创建Redis节点安装目录
mkdir /usr/local/redis_cluster //指定目录下 创建 redis_cluster
2、在redis_cluster目录下,创建7001-7006个文件夹下
mkdir 7001 7002 7003 7004 7005 7006
3、并将redis-conf分别拷贝到7001-7006文件夹下
cp /root/redis-4.0.1/redis.conf ./7001
4、分别修改如下配置文件,修改如下内容
同时protected-mode 是为了禁止公网访问redis cache,加强redis安全的。
它启用的条件,有两个: 1**) 没有bind IP
2) 没有设置访问密码
由于Linux上的redis处于安全保护模式,这就让你无法从虚拟机外部去轻松建立连接。
如果外部访问:redis.conf中设置保护模式为
protected-mode no**


5、启动各个redis节点:
将桌面redis-4.0.1/ 下src文件拷贝到各个redis 7001-7006目录下。
cd redis-4.0.1 //进入桌面redis解压目录下
cp -r ./src /usr/local/redis_cluster/7001 //进行拷贝 依次复制7001-7006


**启动各个Redis节点:
cd /usr/local/redis_cluster/ //进入redis集群配置文件目录下
./7001/src/redis-server ./7001/redis.conf //依次启动 7001-7006各节点服务


6、检查Redis启动情况
ps -ef | grep -i redis**


1.3. 创建集群

Redis 官方提供了 redis-trib.rb 这个工具,就在解压目录的 src 目录中。(为了方便操作)将其文件复制到/usr/local/bin目录下,可直接访问此命令
cd redis-4.0.1/
cd src
cp redis-trib.rb /usr/local/bin/

可以直接在命令行中执行: ip:port格式
redis-trib.rb create —replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006

如果出现此错误:


这个工具是用 ruby 实现的,所以需要安装 ruby。

1.4. 安装ruby

安装ruby
yum -y install ruby ruby-devel rubygems rpm-build



如上错误原因:Centos默认支持ruby到2.0.0,可gem 安装redis需要最低是2.2.2
解决办法是 先安装rvm,再把ruby版本提升

1.4.1. 1. 安装RVM

gpg —keyserver hkp://keys.gnupg.net —recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB

curl -sSL https://get.rvm.io | bash -s stable


find / -name rvm -print
source /usr/local/rvm/scripts/rvm
rvm list known //查看rvm库中已知的ruby版本

**

1.4.2. 安装一个ruby版本


使用一个ruby

设置默认ruby

查看ruby

安装

**

1.5. Redis Cluster集群搭建


ruby安装完成后,再次执行此命令:
可以直接在命令行中执行: ip:port格式
redis-trib.rb create —replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006



2. Redis Cluster集群验证

Redis集群测试:
为方便测试,可将redis-cli 客户端命令放到/usr/local/bin目录下
cd /root/redis-4.0.1/src //进入该目录
cp redis-cli /usr/local/bin


在某台机器上(或)连接集群的7001端口的节点:
redis-cli -h 127.0.0.1 -c -p 7001
加参数 -C 可连接到集群,因为上面 redis.conf 将 bind 改为了ip地址,所以 -h 参数不可以省略。
(在该节点下 添加对应key数据)
启动另一个集群中的客户节点:例如:7005
进行读取命令。

redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据

2.1. 基本命令

info replication 通过Cluster Nodes命令和Cluster Info命令来看看集群效果

2.2. 测试集群数据

2.2.1. 输入命令 cluster nodes

每个Redis的节点都有一个ID值,此ID将被此特定redis实例永久使用,以便实例在集群上下文中具有唯一的名称。 每个节点都会记住使用此ID的每个其他节点,而不是通过IP或端口。IP地址和端口可能会发生变化,但唯一的节点标识符在节点的整个生命周期内都不会改变。 我们简单地称这个标识符为节点ID。

2.2.2. 测试数据

3. Redis Cluster集群重新开启


启动各个Redis节点:
cd /usr/local/redis_cluster/ //进入redis集群配置文件目录下
./7001/src/redis-server ./7001/redis.conf //依次启动 7001-7006各节点服务

检查Redis启动情况
ps -ef | grep -i redis
在某台机器上(或)连接集群的7001端口的节点:
redis-cli -h 127.0.0.1 -c -p 7001
加参数 -C 可连接到集群,因为上面 redis.conf 将 bind 改为了ip地址,所以 -h 参数不可以省略。
(在该节点下 添加对应key数据)

4. 代码示例

4.1. 开启端口权限

依次开放端口7001 7002…7006(如下命令只针对Centos7以上)
查看已经开放的端口:firewall-cmd —list-ports
开启端口:
firewall-cmd —zone=public —add-port=7001/tcp —permanent
重启防火墙
firewall-cmd —reload #重启


• 参考文贡:https://www.sojson.com/blog/203.html

Set nodes = new LinkedHashSet();
nodes.add(new HostAndPort(“192.168.46.131”, 7001));
nodes.add(new HostAndPort(“192.168.46.131”, 7002));
nodes.add(new HostAndPort(“192.168.46.131”, 7003));
nodes.add(new HostAndPort(“192.168.46.131”, 7004));
nodes.add(new HostAndPort(“192.168.46.131”, 7005));
nodes.add(new HostAndPort(“192.168.46.131”, 7006));

JedisCluster cluster =new JedisCluster(nodes);