Redis主从复制和集群配置
-
redis主从复制是什么
主机数据更新后根据配置和策略, 自动同步到备机的master/slaver机制,Master(主)以写为主,Slave(仆)以读为主。 -
redis主从复制能干嘛
- 实现读写分离,性能的扩展
- 容灾快速恢复
-
主从复制的示例图
-
主从复制怎么配置
-
把redis进行解压
-
进入到redis 的目录下 ,执行
make
命令进行编译。
> 可能报错 :如果没有准备好 C语言的编译环境 ,make会报错 ,
> : 报错信息 : -Jemalloc / jemalloc.h: 没有这个文件
> 解决方案 : 先执行命令gcc --version
检查是否安装了 gcc 是否安装成功 ,如果没有安装 执行命令yum install gcc
, 再执行命令运行make distclean
,清除之间编译的文件 ,再次执行make
。 -
没有报错 ,编译好后 执行命令进行安装
make install
, 安装成功后 默认会安装在 /usr/local/bin目录下。
- 安装好后 查看 /usr/local/bin 下有的默认文件(如下):
>redis-benchmark : 性能测试工具 ,可以再自己本子上运行 ,看自己的笔记本性能怎么样
>redis-check-aof : 修复有问题的AOF文件
>redis-check-dump : 修复有问题的dump.rdb文件
>redis-sentinel: Redis集群使用
>redis-server: Redis服务启动命令
>redis-cli :客户端 ,操作入口
-
搭建集群
- 复制安装目录下的redis.conf文件做备份到/etc/redis文件夹下(没有该文件夹就创建)。
- 先修改里面的配置文件,把appendonly关掉,开启daemonize yes(后台启动)。
- 创建文件redis6379.conf(文件名字自己取,最好是按照规则来)。
- 往redis6379.conf配置文件中写入配置文件
include /etc/redis/redis.conf #这个是引入redis的那个配置文件
pidfile /var/run/redis_6379.pid # 指定启动进程
port 6379 # 设置端口号
dbfilename dump6379.rdb # 数据存储
logfile "6379.log" # 日志输出
- 同样的配置文件复制2份(此处配置一主两从,所以需要三个配置文件),并且修改里面的配置信息
5.1. 比如创建redis6380.conf,然后里面的配置文件修改成
include /etc/redis/redis.conf #这个是引入redis的那个配置文件
pidfile /var/run/redis_6380.pid # 指定启动进程
port 6380 # 设置端口号
dbfilename dump80.rdb # 数据存储
logfile "6380.log" # 日志输出
-
然后再当前目录下分别启动3台redis:
命令: redis-server redis6379.conf
redis-server redis6380.conf
redis-server redis6381.conf -
然后使用分别命令启动客户端连接redis服务端:
redis-cli -p 6379 # -p 是指定端口号
redis-cli -p 6380
redis-cli -p 6381 -
再客户端使用命令 : info replication 查看主从复制的相关信息
-
再redis6380和redis6381客户端分别使用命令 slaveof host port 指定他的主机是谁
# 这里配置 127.0.0.1 ,因为是当前本机的redis,所以使用127.0.0.1 指定6379端口的主机为主机(master)
slaveof 127.0.0.1 6379
- 再次使用命令 info replication 就可以看到6380和6381变成了从机,而且6379端口显示的是自己有两个从机。
注意点
- 如果redis设置了密码的话,如果光按照上面的操作,会发现redis6379显示没有从机,所以设置了密码的话需要在redis6380.conf和redis6381.conf的配置文件中添加配置
masterauth 123456 # 这里的123456就是你redis里面的设置的密码
- 配置了主从复制之后,主机可以进行读和写操作,但是从机只能执行读的操作,如果在从机中进行写的操作就会报错,报错信息如下:
(error) READONLY You can't write against a read only replica.
- 如果当主机宕机了,配置的从机不会主动顶上去变成主机,他还是从机,当主机重启之后,之前的这台主机的从机也还是不会变,这是就不能进行写的操作,但是可以读。
- 如果当从机宕机了,重启之后,他会变成单独的主机,不会变成从机,需要再次执行命令 slaveof host port 再次指定主机是谁。
- 当从机宕机之后,然后这时主机插入了数据,当从机指定了主机,数据还是会同步到从机中去。
- 我们可以配置哨兵模式,当主机宕机的时候,从机自动顶上去变成主机:
哨兵模式的配置:
1. 在当前文件夹下创建一个sentinel.conf 配置文件(这个名字不能错)
2. 在sentinel.conf 配置文件中编写配置
# mymaster 这个名字可以自己取,为监控对象起的服务器名称
# 127.0.0.1 6379 这个是主机所在的IP和对应的端口
# 1 为至少有多少个哨兵同意迁移的数量
sentinel monitor mymaster 127.0.0.1 6379 1
3. 启动哨兵 redis-sentinel /etc/redis/sentinel.conf 就可以自动替代主机了。
redis的集群配置(无中心化集群配置)
注意:如果我们要搭建一个主从集群,那我们就至少搭建3个master主节点,3个slave节点,因为在redis的集群中如果想要提供服务的话就必须要有超过一半的master能够正常使用,如果允许n台master节点可以宕机的话,那公式就是2n + 1 个master,需要搭建这么多的master节点,所以我们这里搭建的是3个master节点,3个slave节点。
- 还是像上面一样复制redis.conf这个文件做备份到/etc/redis文件夹下(没有就创建)。
- 还是需要创建redis6379.conf,80,81,89,90,91文件
- 并且里面的配置为:
include /etc/redis/redis.conf # 这个是安装的redis之前的redis.conf备份文件
pidfile /var/run/redis_6379.pid # 指定进程
port 6379 # 指定端口
dbfilename dump6379.rdb 指定存储文件
logfile "6379.log" # 指定日志
cluster-enabled yes #指定开启集群模式
cluster-config-file nodes-6379.conf # 指定节点配置文件名
cluster-node-timeout 15000 # 设置连接超时时间(毫秒),超过这时间就自动的进行主从切换
masterauth 123456 # 这个是我的redis设置了密码,要加这个,如果redis没有设置密码就不需要加这个
-
按照上面6379的配置文件复制5份,然后修改里面的对应的端口号和名字。
-
然后分别启动这6个节点,例如:redis-server redis6379.conf
-
然后发现在当前文件夹下会产生对应的文件,如下:
-
然后进行你安装redis的目录,进入src下面,我的在/opt/redis/src,里面有一个redis-cli脚本,执行脚本
# 注意这里必须使用自己机器的真实IP
# 这个 1 代表使用最简单的默认进行主从分配,一台主机,一台从机
# -a 123456 是因为我redis设置了密码,所以需要,如果没有设置,就不需要加这个
# 当执行这命令之后,后面会提示是否继续,这里需要输入 yes ,不能输入 y(必须输入yes,代表继续)
# --cluster-replicas 1 表示我们希望为集群中的每个主节点创建一个从节点
redis-cli --cluster create --cluster-replicas 1 192.168.26.131:6379 192.168.26.131:6380 192.168.26.131:6381 192.168.26.131:6389 192.168.26.131:6390 192.168.26.131:6391 -a 123456
- 然后执行命令 redis-cli -p 6379 -c -a 123456 ,因为我设置了密码所以需要加 -a 123456,redis没有设置密码就不需要加这个参数,-c 代表的是采用集群策略连接,设置数据会自动切换到相应的写主机。
- 输入命令: cluster nodes 可以查看所有的节点,集群信息