Redis多机主从

准备工作

开启三台虚拟主机Redis-1、Redis-2、Redis-3,分别安装redis;

 # 关闭主机防火墙
 systemctl status firewalld          #查看防火墙状态
 systemctl stop firewalld            #关闭防火墙
 systemctl disable firewalld         #关闭防火墙

配置主机和从机

Redis-1为主机,修改配置文件redis.conf

 # 编辑配置文件
 vim /usr/local/redis/etc/redis.conf
 ​
 # 主机配置
 bind 0.0.0.0                            # 将bind注释掉 或 bind 0.0.0.0
 port 6379                               # 改变其服务端口
 daemonize yes                           # 修改服务为后台运行
 pidfile /var/run/redis_6379.pid         # 指定不同的pid文件,注意三份配置文件不同。
 logfile "/usr/local/redis/logs/redis.log"   # 指定log日志路径,自己配,要求不同。
 dir /usr/local/redis/data               # 这个指定rdb文件和aof文件的路径配置,要求改成不同。
 masterauth 123456                       # 都配上吧,从服务到主服务的认证密码。
 requirepass 123456                      # 三份文件都配置,客户端访问需要密码验证。
 ​
 从机配置
 replicaof 192.168.7.61 6379  #主服务这句话注释,从服务配置的两台需要开启。配置主服务的ip的port。

Redis-2为从机、Redis-3,为从机修改配置文件redis.conf

 # 编辑配置文件
 vim /usr/local/redis/etc/redis.conf
 ​
 # 从机配置
 bind 0.0.0.0                    # 或 bind本机IP
 protected-mode no
 port 6379
 daemonize yes
 pidfile /var/run/redis_6379.pid
 logfile "/usr/local/redis/logs/redis.log"
 dir /usr/local/redis/data
 requirepass 123456
 masterauth 123456
 replicaof 192.168.7.61 6379     # 主节点真实IP

设置开机自启

 # 编辑配置文件
 vim /etc/systemd/system/redis.service
 ​
 [Unit]
 Description=Redis
 After=network.target
 ​
 [Service]
 Type=forking
 PIDFile=/run/redis_6379.pid
 ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
 ExecStartPost=/bin/bash -c 'for i in {1..20}; do [ -f /var/run/redis_6379.pid ] && exit 0; sleep 0.1; done; exit 1'
 ExecStop=/usr/local/redis/bin/redis-cli -p 6379 -a 123456 shutdown
 ExecReload=/bin/kill -s HUP $MAINPID
 Restart=on-failure
 PrivateTmp=true
 ​
 [Install]
 WantedBy=multi-user.target

设置刷新配置和启动服务

 # 重新加载 systemd
 systemctl daemon-reload
 ​
 # 停掉当前手动运行的 Redis
 pkill redis-server
 ​
 # 用 systemctl 启动
 systemctl start redis
 ​
 # 设置开机自启
 systemctl enable redis
 ​
 # 检查状态
 systemctl status redis

设置环境变量永久生效

 # 编辑文件
 vim /etc/profile
 ​
 # 在末尾添加
 export PATH=$PATH:/usr/local/redis/bin
 ​
 # 重新加载系统环境变量配置文件,立即生效
 source /etc/profile

启动服务

分别启动三台主机的redis服务器端服务

 # 启动服务
 redis-server /usr/local/redis/etc/redis.conf
 ​
 # 查询是否成功
 ps -ef|grep redis

分别启动三台主机客户端服务

 # 启动客户端
 redis-cli -p 6379 -a 123456

查看主从信息info replication

 # 执行命令查看主从信息
 info replication

信息提示

 # 主信息显示
 127.0.0.1:6379> info replication
 # Replication
 role:master
 connected_slaves:2
 slave0:ip=192.168.7.62,port=6379,state=online,offset=518,lag=0
 slave1:ip=192.168.7.63,port=6379,state=online,offset=518,lag=0
 master_failover_state:no-failover
 master_replid:d11575ecef74664b7242de53c710020c5402b471
 master_replid2:0000000000000000000000000000000000000000
 master_repl_offset:518
 second_repl_offset:-1
 repl_backlog_active:1
 repl_backlog_size:1048576
 repl_backlog_first_byte_offset:1
 repl_backlog_histlen:518
 ​
 # 从1信息显示
 127.0.0.1:6379> info replication
 # Replication
 role:slave
 master_host:192.168.7.61
 master_port:6379
 master_link_status:up
 master_last_io_seconds_ago:4
 master_sync_in_progress:0
 slave_read_repl_offset:518
 slave_repl_offset:518
 slave_priority:100
 slave_read_only:1
 replica_announced:1
 connected_slaves:0
 master_failover_state:no-failover
 master_replid:d11575ecef74664b7242de53c710020c5402b471
 master_replid2:0000000000000000000000000000000000000000
 master_repl_offset:518
 second_repl_offset:-1
 repl_backlog_active:1
 repl_backlog_size:1048576
 repl_backlog_first_byte_offset:1
 repl_backlog_histlen:518
 ​
 # 从2信息显示
 127.0.0.1:6379> info replication
 # Replication
 role:slave
 master_host:192.168.7.61
 master_port:6379
 master_link_status:up
 master_last_io_seconds_ago:2
 master_sync_in_progress:0
 slave_read_repl_offset:518
 slave_repl_offset:518
 slave_priority:100
 slave_read_only:1
 replica_announced:1
 connected_slaves:0
 master_failover_state:no-failover
 master_replid:d11575ecef74664b7242de53c710020c5402b471
 master_replid2:0000000000000000000000000000000000000000
 master_repl_offset:518
 second_repl_offset:-1
 repl_backlog_active:1
 repl_backlog_size:1048576
 repl_backlog_first_byte_offset:1
 repl_backlog_histlen:518

读写分离测试

Redis-1为Master,Redis-2、Redis-3为Slave

Master为写

 127.0.0.1:6379> set str helloworld
 OK

Slave为读

 127.0.0.1:6379> get str
 "helloworld"
 127.0.0.1:6379> set ss fdfd
 (error) READONLY You can't write against a read only replica.

手动设置主从

当Redis-1虚拟机死机后,如何去手动设置我们的主从,Redis-2为主,Redis-3为从

Redis-2执行slaveof no one

执行命令 SLAVEOF NO ONE 将使得这个从属服务器关闭复制功能,并从从属服务器转变回主服务器,原来同步所得的数据集不会被丢弃。

 127.0.0.1:6379> slaveof no one
 OK
 127.0.0.1:6379> info replication
 # Replication
 role:master
 connected_slaves:0
 master_failover_state:no-failover
 master_replid:169110a988897f74bea06927edd2419526af24b6
 master_replid2:77997787def8422f9c759d966bd42fdabd8c28ff
 master_repl_offset:9176
 second_repl_offset:9177
 repl_backlog_active:1
 repl_backlog_size:1048576
 repl_backlog_first_byte_offset:1
 repl_backlog_histlen:9176

Redis-3执行slaveof host port

执行 SLAVEOF host port 将使当前服务器停止对旧主服务器的同步,丢弃旧数据集,转而开始对新主服务器进行同步。

 127.0.0.1:6379> slaveof 192.168.7.62 6379
 OK
 127.0.0.1:6379> info replication
 # Replication
 role:slave
 master_host:192.168.7.62
 master_port:6379
 master_link_status:up
 master_last_io_seconds_ago:5
 master_sync_in_progress:0
 slave_read_repl_offset:9176
 slave_repl_offset:9176
 slave_priority:100
 slave_read_only:1
 replica_announced:1
 connected_slaves:0
 master_failover_state:no-failover
 master_replid:169110a988897f74bea06927edd2419526af24b6
 master_replid2:77997787def8422f9c759d966bd42fdabd8c28ff
 master_repl_offset:9176
 second_repl_offset:9177
 repl_backlog_active:1
 repl_backlog_size:1048576
 repl_backlog_first_byte_offset:1
 repl_backlog_histlen:9176