近况
最近一段时间在学redis,今天29号,redis学的快差不多了,再过几天把笔记放上来
先来了解一下Linux系统中是如何配置Redis主从复制和哨兵的吧
配置Redis主从复制,实现读写分离
登录你的linux系统,推荐ubuntu,在ubuntu系统上直接输入以下命令
#apt是Debian系操作系统的包管理工具 sudo apt update #安装redis-server,redis-sentinel sudo apt install redis-server sudo apt install redis-sentinel 使用apt命令安装后,可以直接在命令行中输入redis-server或redis-sentinel启动服务
如果你使用不了apt命令,则在安装redis之前需要配置其他环境
安装gcc环境
#CentOS系统下安装gcc yum -y install gcc #Ubuntu系统下安装gcc apt install gcc #查看gcc版本 gcc -v gcc环境是C语言的环境,redis底层是C语言编写的
安装make环境
#CentOS系统下安装make yum -y install make #Ubuntu系统下安装make apt install make #查看make版本 make -v 注意:使用这些命令是需要linux联网的
最后安装redis环境
#下载redis安装包,解压,进入redis目录使用make命令编译 wget http://download.redis.io/releases/redis-6.0.8.tar.gz tar xzf redis-6.0.8.tar.gz cd redis-6.0.8 make 使用apt安装redis与这种解压方式安装redis有一点区别 1,使用apt安装比使用这种方式简单 2,使用apt安装redis后,使用redis命令简单 直接使用redis-server 自定义redis.conf文件路径,启动redis服务 使用redis-cli -p 指定redis端口号 启动redis测试客户端 而使用解压编译方式安装redis,则需要进入redis/src目录下使用 [./redis-server 自定义redis.conf文件路径],启动redis服务 启动redis测试客户端也需要进入redis/src目录下才能使用。
redis安装完毕后,下面开始搭建主从复制,本次实验是一主二从,一主多从也是类似
在根目录/下创建一个自定义文件夹,存放redis配置信息,例如文件名:redisFile
修改redis.conf配置文件信息,如果是apt命令安装redis,则redis.conf文件在
/etc/redis/redis.conf
1)注释bind 127.0.0.1,不注释只能本机访问 2)将protected-mode修改成no,将本机访问保护模式设置no #保护模式是如果你没有设置redis密码,则只能本机访问,改成no后表示就算没有设置密码,其他电脑也能访问
拷贝redis.conf文件到自定义目录下,即/redisFile下
创建三个配置文件,配置文件名是:redis6379.conf,redis6380.conf,redis6381.conf
并在三个配置文件中输入以下内容include /redisFile/redis.conf pidfile /var/run/redis6379.pid[redis6380.pid,redis6381.pid] port 6379[6380,6381] dbfilename dump6379.rdb[dump6380.rdb,dump6381.rdb] 注意:[]中是可变内容,自行替换成相应端口号和文件名
使用这三个配置文件来启动三台redis进程,在启动之前使用
ps -ef | grep redis
命令查看是否
有已经运行的redis服务,如果有则使用kill -9 进程pid
命令杀掉该进程,如果使用kill命令杀不掉
则使用/etc/init.d/redis-server stop
命令杀掉默认启动的redis进程使用三个配置文件启动三台redis服务器,并使用测试客户端连接各个redis进程,查看具体信息
#如果使用的是apt安装的redis redis-server /redisFile/redis6379.conf redis-server /redisFile/redis6380.conf redis-server /redisFile/redis6381.conf #如果使用解压编译的方式安装redis,则需要进入redis/src目录下执行 ./redis-server /redisFileredis6379.conf ./redis-server /redisFileredis6380.conf ./redis-server /redisFileredis6381.conf #启动后可以通过ps -ef | grep redis命令查看redis进程信息 root@redis:~# ps -ef | grep redis root 11759 2083 0 02:05 pts/0 00:00:00 ./redis-server 127.0.0.1:6379 root 11772 11671 0 02:06 pts/1 00:00:00 ./redis-server 127.0.0.1:6380 root 11881 11846 0 02:09 pts/2 00:00:00 ./redis-server 127.0.0.1:6381 root 11971 11955 0 02:10 pts/3 00:00:00 grep --color=auto redi #启动无误后,可以通过测试客户端查看各个redis #如果使用的是apt安装的redis redis-cli -p 6379 redis-cli -p 6380 redis-cli -p 6381 #如果使用解压编译的方式安装redis,则需要进入redis/src目录下执行 ./redis-cli -p 6379 ./redis-cli -p 6380 ./redis-cli -p 6381 #使用测试客户端进入相应的redis进程中后,通过info replication命令可以查看该redis进程信息 root@redis:/redisFile/redis-6.0.8/src# ./redis-cli -p 6379 127.0.0.1:6379> info replication # Replication role:master connected_slaves:0 master_replid:df6a076596335950973293f1deb7c7b443357a48 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:0 second_repl_offset:-1 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 127.0.0.1:6379> 通过info replicatio命令,我们可以看到当前三个redis服务都是主机, 还需要配置一下才能将6380,6381的redis进程改成从机
将6380,6381redis进程设置为从机
1)进入6380测试客户端 redis-cli -p 6380 2)执行以下命令,将6380redis进程设置为从机 127.0.0.1:6380> slaveof 127.0.0.1 6379 这里我6380从机连接的是本地的6379的主机,实际开发中都是一个linux一台redis服务器 从机连接远程的主机ip和端口号 3)再次使用命令查看6379redis进程的信息 root@redis:/redisFile/redis-6.0.8/src# ./redis-cli -p 6379 127.0.0.1:6379> info replication # Replication role:master connected_slaves:1 #这里可以看到,主机已经拥有了一个从机6380 slave0:ip=127.0.0.1,port=6380,state=online,offset=28,lag=1 master_replid:2d032ee4c3f0951c9c5097bd38923b9d86e1f303 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:28 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:28 6381redis进程也是同样的设置
测试,搭建好一主两从后,则我们只能在主机上进行增删改操作,从机只能进行查询操作
在从机上添加数据: 127.0.0.1:6381> set age 22 (error) READONLY You can't write against a read only replica. 在主机上添加数据: 127.0.0.1:6379> set age 22 OK 在从机上查看数据: 127.0.0.1:6381> get age "22"
主从复制的三个经典问题
一主二仆
- 特点1:当通过命令配置主从关系,这种关系只是临时的,如果从机关闭后,
重启后,该从机会变成主机,所以如果想当从机重启后还保持主从关系,
就需要把配置主从关系命令写到从机的配置文件中。 - 特点2:当从机挂掉,重新启动后,之前的被主机插入的数据仍然能查看到
(主服务器会将数据恢复到从服务器中) - 特点3:当主机挂掉后,从机并不会上位,还是从服务器,并且能在从服务器中看到主服务器挂掉了。
主机重启后,仍然能看到两个从服务器。
1)slave1,slave2是从头开始复制还是从切入点开始复制? 答:是可以的,当从机重新启动时,k1,k2,k3仍然可以查看到。 2)从机是否可以执行写操作?set可否 答:否 3)主机shutdown后情况如何?从机是上位还是原地待命? 答:原地待命
- 特点1:当通过命令配置主从关系,这种关系只是临时的,如果从机关闭后,
薪火相传
- 指的是从机可以作为主机来用,上一个从机可以是下一个从机的主机,从机同样可以接收其他从机的连接
和同步请求,那么该从机作为了链条中下一个从机的主机,可以有效减轻master的写压力,
去中心化降低风险 - 如果链条中的从机中途变更转向,即某个主机的从机更改成其他主机的从机,则会清除之前的记录,
重新建立拷贝最新的 - 风险是一旦某个从机宕机,后面的从机都没法备份,主机挂了,从机还是从机,无法写数据了。
- 指的是从机可以作为主机来用,上一个从机可以是下一个从机的主机,从机同样可以接收其他从机的连接
反客为主
当一个主机宕机后,后面的从机可以立刻升为主机,其后面的从机不用做任何修改,在从机客户端中执行命令slaveof no one
即可将该从机升为主机,这种方式是手动将从机升为主机,可不可以当主机宕机后,从机自动升为主机呢?可以,哨兵模式!
搭建哨兵
首先通过命令查看下是否有默认启动的哨兵进程
#一般通过apt安装的redis。都有默认启动的redis进程服务 #关掉默认的redis-server进程服务 /etc/init.d/redis-server stop #关掉默认的redis-sentinel哨兵 /etc/init.d/redis-sentinel stop
在自定义的目录中创建sentinel.conf文件,名字不能错,例如/redisFile/sentinel.conf
#创建sentinel.conf文件 touch sentinel.conf #在该文件中编写如下内容 sentinel monitor mymaster 127.0.0.1 6379 1 其中mymaster是为监控对象(主机)起的服务器名称,1为至少有多少个哨兵同意迁移的数量
启动哨兵进程,先启动哨兵进程再启动三台redis进程
#如果是apt命令安装则执行 redis-sentinel 自定义sentinel.conf的路径 #如果使用解压编译的方式安装redis,则需要进入redis/src目录下执行 ./redis-sentinel 自定义sentinel.conf的路径
当主机6379redis进程宕机后,大概十几秒后,哨兵服务器会自动根据一些规则选举某个从机作为新主机
选举后的从机作为新主机,而当原主机恢复后便自动成为新主机的从机。#具体哪个从机会被选举为主机呢?即选举的策略 1)首先选择优先级靠前的,redis服务器的优先级在配置文件中进行配置 slave-priority(redis6.0版本时,名字为replica-priority),默认是100,值越小优先级越高 2)选择偏移量最大的,偏移量是指获取原主机数据最全的 3)选择runid最小的从机,每一个redis实例启动后都会随机生成一个40位的runid