主从复制概念

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower) ; 数据的复制是单向的,只能由主节点到从节点。Master以写为主,Slave以读为主。

默认情况下,每台Redis服务器都是主节点 ;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。

Redis服务启动方式

1.默认启动方式

服务端:./redis-server

client端:./redis-cli

退出: ./redis-cli shutdown

2.指定端口启动

服务端:./redis-server –port 端口号

client端:./redis-cli -p 端口号

退出: ./redis-cli -p 端口号 shutdown

3.指定端口ip连接

服务端:./redis-server –port 端口号

client端:./redis-cli -p 端口号 -h 127.0.0.1

常用命令

1.获取当前redis的信息

注意默认端口为6379,且该端口默认为主节点

1
2
3
4
5
redis-server  //开启redis服务端, 默认port 6380 ip 127.0.0.1

redis-cli //连接到该redis服务端,默认port 6380 ip 127.0.0.1

info replication //查看当前redis的信息,含主从节点信息

2.获取子节点6380的信息

1
2
3
4
5
redis-server --port 6380  //开启端口为6380的服务端

redis-cli -p 6380 (-h 127.0.0.1 若ip未改,默认可不写) //redis的cli(客户端)指定端口与ip连接到指定的服务端

info replication //查看当前redis的信息,含主从节点信息

工作流程

1.复制端口号6379的redis配置文件到redis的执行目录

查询redis的配置文件方法

1
redis-cli config get dir

这个命令返回的是redis的安装目录,配置文件应位于该目录下,注意etc这个位置是其他文件存放位置

2.复制配置文件到要启动的redis其他端口的目录下,然后执行以下命令

1
cp redis.config redis-6380.config

拷贝的配置文件名自己定,如redis-6380.config

3.修改配置文件

下载一个可以打开配置文件的编辑器,推荐subllime

然后打开配置文件,用ctrl+f查询下面的语句然后进行修改

1
2
3
4
5
6
7
8
9
10
11
12
13
# 1. 修改端口号,一主多从模式,此教程中我默认是以6379为主,6380、6381为从

port 6379

# 2.开启守护进程模式运行,默认是no,这个要搜

daemonize yes

# 3. 修改pid文件名,我是以端口来区分的

pidfile "/var/run/redis_6379.pid"

# 4.拷贝多个 redis.conf 配置文件,并按照以上步骤修改配置文件

坑点

因为不了解ubuntu系统,导致我实现主从复制花了2个小时才成功。

首先一定要先知道redis的服务启动方法,因为这个网上找的有些命令是错误的,导致我开启自定义端口的服务端一直有问题,本文所给命令是我经实践后成功的。

其次,redis.config这个配置文件我找了半天,才发现在其他文件位置里。同时,要打开配置文件推荐使用sublime。

最后,不一定要改在配置文件中配置主节点,可以在子节点使用 slaveof 主节点id 主节点端口号 命令来建立主从关系,但如果在配置文件中配置了,那么重启也就不会失效了。

重大发现

原来我的操作还是有很大问题,初步了解了linux的命令行操作过后,发现了一个重点,这是针对我电脑的ubuntu系统实现redis主从复制的关键。

依赖配置文件在服务器端启动redis的方式应该是

1
redis-server 配置文件地址(例如:myredis/redis-6380.conf)

然后,重点来了,执行后,命令行提示我Permission Denied而无法启动redis,然后,我用root权限

1
su root

之后再次输入同样的启动语句,虽然没显示redis启动界面,而且看似好像没有发生任何事一样,你依旧可以输入其他语句。

结果,当我再次打开终端输入

1
redis-cli -p 6380

发现成功在客户端启动这个redis服务器,随后输入的info replication显示的正是我所配置的redis-6380.conf文件.

这个成功实现的方法网上找遍了解决方案都没有找到,居然被我误打误撞找到了原因所在。估计是我的这个root权限有点问题,没设置好的缘故。

然后,就是服务端:./redis-server –port 端口号 这个启动redis服务器的方式估计是操作在默认文件夹下的配置文件,那个配置文件并没有被我修改过,所以查看主从关系时发现没有主从节点。

所以还是要用redis-server 配置文件地址(例如:myredis/redis-6380.conf)这个方式来启动相应文件的redis服务器。

更新日志

9.21日

之前配置实现主从节点后我发现主从的配置文件都变成了所属者为root,估计是以为配置文件里面的某些设置导致了主从设置后将配置文件的所有者改为了root,此外文件的读写权限也变成了只读。而且使用从节点进行写操作时会失败。

修改文件所属者和读写权限只要依照下面两条命令执行即可,之后进行操作时,其所属者和读写权限并不会改变,所以还是不知道是什么原因导致我一开始实现主从复制后。权限改变的原因是什么。

更改文件所属者的命令

1
sudo chown username 配置文件的路径

更改文件读写权限

1
chmod a+rw 配置文件的路径

经过发现,redis配置文件里面有个replica-read-only yes的语句,这个语句表明了当前节点若是从节点的话,只能读取数据,不能修改数据,所以要把yes改为no。

此外,在以普通用户执行redis-server myredis/redis-6380.conf这句命令启动我指定的redis配置文件的服务时,会提示我权限不够,这是因为在配置文件里的语句dir 存放路径没有配置好,导致访问了root权限才能访问的文件夹,这个语句是指定存放rdb文件的位置。