Redis主从安装
主从复制简介
主从复制是为了达成高可用
-
为了避免单点Redis服务器故障,准备多台服务器,互相连通。将数据复制多个副本保存在不同的服
务器上,连接在一起,并保证数据是同步的。 -
即使有其中一台服务器宕机,其他服务器依然可以继续提供服务,实现Redis的高可用,同时实现数据冗余备份。
主从复制 -
主从复制即将master中的数据即时、有效的复制到slave中
-
一个master可以拥有多个slave,一个slave只对应一个master
-
职责
-
master:
- 写数据
- 执行写操作时,将出现变化的数据自动同步到slave
- 读数据(可忽略)
-
slave:
- 读数据
- 写数据(禁止)
-
主从复制的概念
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower) ; 数据的复制是单向的,只能由主节点到从节点。Master以写为主,Slave以读为主。
默认情况下,每台Redis服务器都是主节点 ;
且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。
主从复制的作用
读写分离:主节点写,从节点读,提高服务器的读写负载能力
数据冗余︰主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
故障恢复︰当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复 ; 实际上是一种服务的冗余。
负载均衡︰在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载 ; 尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
高可用(集群)基石︰除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。
Redis主从复制部署
master主机上操作
[root@master ~]# yum -y install systemd-devel gcc gcc-c++ tcl-devel make wget
[root@master ~]# cd /usr/src/
[root@master src]# wget https://download.redis.io/releases/redis-6.2.6.tar.gz
--2021-12-14 11:26:22-- https://download.redis.io/releases/redis-6.2.6.tar.gz
正在解析主机 download.redis.io (download.redis.io)... 45.60.125.1
正在连接 download.redis.io (download.redis.io)|45.60.125.1|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:2476542 (2.4M) [application/octet-stream]
正在保存至: “redis-6.2.6.tar.gz”
redis-6.2.6.ta 100% 2.36M 137KB/s 用时 32s
2021-12-14 11:26:58 (76.0 KB/s) - 已保存 “redis-6.2.6.tar.gz” [2476542/2476542])
[root@master src]# tar xf redis-6.2.6.tar.gz
[root@master src]# ls
debug kernels redis-6.2.6 redis-6.2.6.tar.gz
[root@master src]# cd redis-6.2.6/
[root@master redis-6.2.6]# make MALLOC=libc USE_SYSTEMD=yes && \
> make install PREFIX=/usr/local/redis
[root@master redis-6.2.6]# mkdir -p /usr/local/redis/conf
[root@master redis-6.2.6]# cp redis.conf /usr/local/redis/conf/
[root@master redis-6.2.6]# vi /usr/lib/systemd/system/redis_server.service
[Unit]
Description=Redis data structure server
Documentation=https://redis.io/documentation
Wants=network-online.target
After=network-online.target
[Service]
ExecStart=/usr/local/redis/bin/redis-server /usr/local/re
dis/conf/redis.conf --supervised systemd
Type=notify
[Install]
WantedBy=multi-user.target
[root@master redis-6.2.6]# echo 511 > /proc/sys/net/core/somaxconn
[root@master redis-6.2.6]# echo vm.overcommit_memory = 1 >> /etc/sysctl.conf
[root@master redis-6.2.6]# sysctl -p
vm.overcommit_memory = 1
[root@master redis-6.2.6]# systemctl daemon-reload
[root@master redis-6.2.6]# systemctl enable --now redis_server.service
Created symlink /etc/systemd/system/multi-user.target.wants/redis_server.service → /usr/lib/systemd/system/redis_server.service.
[root@master redis-6.2.6]# ss -anlt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 511 127.0.0.1:6379 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 511 [::1]:6379 [::]:*
LISTEN 0 128 [::]:22 [::]:*
[root@master ~]# vim /usr/local/redis/conf/redis.conf
requirepass 123456
[root@master bin]# ./redis-cli
127.0.0.1:6379> ping
(error) NOAUTH Authentication required.
127.0.0.1:6379> exit
[root@master bin]# ./redis-cli -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> ping
PONG
slave主机上操作
[root@slave ~]# yum -y install systemd-devel gcc gcc-c++ tcl-devel make wget
[root@slave ~]# cd /usr/src/
[root@slave src]# wget https://download.redis.io/releases/redis-6.2.6.tar.gz
--2021-12-14 11:27:30-- https://download.redis.io/releases/redis-6.2.6.tar.gz
正在解析主机 download.redis.io (download.redis.io)... 45.60.125.1
正在连接 download.redis.io (download.redis.io)|45.60.125.1|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:2476542 (2.4M) [application/octet-stream]
正在保存至: “redis-6.2.6.tar.gz”
redis-6.2.6.ta 100% 2.36M 65.1KB/s 用时 77s
2021-12-14 11:29:02 (31.3 KB/s) - 已保存 “redis-6.2.6.tar.gz” [2476542/2476542])
[root@slave src]# tar xf redis-6.2.6.tar.gz
[root@slave src]# ls
debug kernels redis-6.2.6 redis-6.2.6.tar.gz
[root@slave src]# cd redis-6.2.6/
[root@slave redis-6.2.6]# make MALLOC=libc USE_SYSTEMD=yes && \
> make install PREFIX=/usr/local/redis
[root@slave redis-6.2.6]# mkdir -p /usr/local/redis/conf
[root@slave redis-6.2.6]# cp redis.conf /usr/local/redis/conf/
[root@slave redis-6.2.6]# vi /usr/lib/systemd/system/redis_server.service
[Unit]
Description=Redis data structure server
Documentation=https://redis.io/documentation
Wants=network-online.target
After=network-online.target
[Service]
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf --supervised systemd
Type=notify
[Install]
WantedBy=multi-user.target
[root@slave redis-6.2.6]# echo 511 > /proc/sys/net/core/somaxconn
[root@slave redis-6.2.6]# echo vm.overcommit_memory = 1 >> /etc/sysctl.conf
[root@slave redis-6.2.6]# sysctl -p
vm.overcommit_memory = 1
[root@slave redis-6.2.6]# systemctl daemon-reload
[root@slave redis-6.2.6]# systemctl restart redis_server.service
[root@slave redis-6.2.6]# ss -anlt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 511 127.0.0.1:6379 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 511 [::1]:6379 [::]:*
LISTEN 0 128 [::]:22 [::]:*
配置Redis主从
[root@slave ~]# vim /usr/local/redis/conf/redis.conf
replicaof 192.168.200.133 6379
[root@slave ~]# systemctl restart redis_server.service
验证
[root@master bin]# ./redis-cli -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> set name tom
OK
127.0.0.1:6379> get name
"tom"
127.0.0.1:6379> exit
[root@slave ~]# cd /usr/local/redis/bin/
[root@slave bin]# ./redis-cli
127.0.0.1:6379> get name
"tom"
127.0.0.1:6379>
127.0.0.1:6379> set name abc
(error) READONLY You can't write against a read only replica.