redis主从复制 ,(高可用)主从切换,redis集群

redis的主从复制

实验环境

server2为master server3,server4为slave

 

server2(master)

1:解压压缩包,编译安装

[root@server2 ~] # tar zxf redis-5.0.3.tar.gz  ##解压压缩包

[root@server2 ~]# cd redis-5.0.3

[root@server2 redis-5.0.3]# yum install gcc -y ##安装编译器

[root@server2 redis-5.0.3]# make && make install  ##安装

2: 执行启动脚本

root@server2 redis-4.0.8]# cd utils/

[root@server2 utils]# ./install_server.sh ##执行启动脚本
Welcome to the redis service installer

This script will help you easily set up a running redis server

Please select the redis port for this instance: [6379]

Selecting default: 6379

Please select the redis config file name [/etc/redis/6379.conf]

Selected default - /etc/redis/6379.conf

Please select the redis log file name [/var/log/redis_6379.log]

Selected default - /var/log/redis_6379.log

Please select the data directory for this instance [/var/lib/redis/6379]

Selected default - /var/lib/redis/6379

Please select the redis executable path [/usr/local/bin/redis-server]

Selected config:

Port           : 6379

Config file    : /etc/redis/6379.conf

Log file       : /var/log/redis_6379.log

Data dir       : /var/lib/redis/6379

Executable     : /usr/local/bin/redis-server

Cli Executable : /usr/local/bin/redis-cli

Is this ok? Then press ENTER to go on or Ctrl-C to abort.

Copied /tmp/6379.conf => /etc/init.d/redis_6379

Installing service...

Successfully added to chkconfig!

Successfully added to runlevels 345!

Starting Redis server...

Installation successful!

3:编辑配置文件

 

[root@server1 utils]# cd /etc/redis/

[root@server1 redis]# vim 6379.conf      ##编辑配置文件
#bind 127.0.0.1

protected-mode no                    ##是否开启保护模式,默认开启,最好关闭设置成成no

4:启动服务

 

[root@server2 redis]# systemctl restart redis_6379   ##重新启动服务

[root@server2 redis]# redis-cli         ##验证

127.0.0.1:6379> config get bind

1) "bind"

2) "127.0.0.1"

127.0.0.1:6379>

 

server3(slave):

1:解压压缩包,编译安装

[root@server3 ~]# tar zxf redis-5.0.3.tar.gz   ##解压安装包

[root@server3 ~]# cd redis-5.0.3

[root@server3 redis-5.0.3]# yum install gcc -y  ##安转gcc编译器

[root@server3 redis-5.0.3]# make && make install  ##安装

2:执行启动脚本

[root@server3 redis-5.0.3]# cd utils/

[root@server3 utils]# ./install_server.sh     ##执行启动脚本

3:编辑配置文件

[root@server3 redis]# vim 6379.conf       ##编辑配置文件

#bind 127.0.0.1

protected-mode no

slaveof 172.25.36.2 6379

4:重新启动服务

[root@server3 redis]# systemctl restart redis_6379   ##重新启动服务

server4上操作和server3上一样

 

验证:

[root@server2 redis]# redis-cli

127.0.0.1:6379> set name  yz

OK

127.0.0.1:6379> get name

"yz"
server3:

[root@server3 redis]# redis-cli

127.0.0.1:6379> get name

"yz"
server4:

[root@server4 redis]# redis-cli

127.0.0.1:6379> get name

"yz"

发现主从复制成功

 

info replication显示更详细的数据:查看此时的主机状态等

127.0.0.1:6379> info replication

# Replication

role:master

connected_slaves:1

slave0:ip=172.25.36.3,port=6379,state=online,offset=994,lag=1

master_replid:2f52b2c456ec796f1cfbc58545e93c0d7f551f74

master_replid2:0000000000000000000000000000000000000000

master_repl_offset:994

second_repl_offset:-1

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:1

repl_backlog_histlen:994

 

 

====================================================================================

 

 

 

redis高可用(主从切换)

实验环境:server2为master,server3和server4为slave

1:编辑配置文件

[root@server2 redis]# cd

[root@server2 ~]# cd redis-5.0.3

[root@server2 redis-5.0.3]# cp sentinel.conf /etc/redis

[root@server2 redis-5.0.3]# cd /etc/redis/
[root@server2 redis]# vim sentinel.conf         ##编辑配置文件

protected-mode no

port 26379

dir /tmp

sentinel monitor mymaster 172.25.36.2 6379 2

sentinel down-after-milliseconds mymaster 10000 #超过100s进行切换

sentinel parallel-syncs mymaster 1

sentinel failover-timeout mymaster 180000

2:加载

[root@server2 redis]# grep -v ^# sentinel.conf

 

protected-mode no

port 26379

daemonize no

pidfile /var/run/redis-sentinel.pid

logfile ""

dir /tmp

sentinel monitor mymaster 172.25.36.2 6379 2

sentinel down-after-milliseconds mymaster 10000

sentinel parallel-syncs mymaster 1

sentinel failover-timeout mymaster 180000

sentinel deny-scripts-reconfig yes

3:将配置文件分发给server3,server4

[root@server2 redis]# scp sentinel.conf server3:/etc/redis/        ##分发配置文件‘

sentinel.conf                                             100% 9710     9.5KB/s   00:00    

[root@server2 redis]# scp sentinel.conf server4:/etc/redis/

sentinel.conf                                             100% 9710     9.5KB/s  

 00:00  

4:打入后台进行运行

[root@server2 redis]# redis-sentinel /etc/redis/sentinel.conf &

[root@server3 redis]# redis-sentinel /etc/redis/sentinel.conf &

[root@server4 redis]# redis-sentinel /etc/redis/sentinel.conf &

检测:

此时在master(server2)上:

[root@server2 redis]# redis-cli

127.0.0.1:6379> info replication

# Replication

role:master

connected_slaves:2

slave0:ip=172.25.36.3,port=6379,state=online,offset=7195,lag=0

slave1:ip=172.25.36.4,port=6379,state=online,offset=7195,lag=1

master_replid:9b430314a8aae4d1d58e799472ac15fd91aaeeb7

master_replid2:0000000000000000000000000000000000000000

master_repl_offset:7332

second_repl_offset:-1

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:1

repl_backlog_histlen:7332

127.0.0.1:6379> shutdown        ##关闭
关闭了之前的master(server2),新的msater在server3和server4之间随机产生

 

 

[root@server3 redis]# redis-cli   ##此时发现server4为master,主从切换成功

127.0.0.1:6379> info replication

# Replication

role:slave

master_host:172.25.36.4

master_port:6379

master_link_status:up

master_last_io_seconds_ago:0

master_sync_in_progress:0

slave_repl_offset:20742

slave_priority:100

slave_read_only:1

connected_slaves:0

master_replid:28fd394b05ff5ee56426e002513d2af62df241d8

master_replid2:9b430314a8aae4d1d58e799472ac15fd91aaeeb7

master_repl_offset:20742

second_repl_offset:11060

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:1

repl_backlog_histlen:20742

 

[root@server4 redis]# redis-cli     ##在server4上查看,srever4为master

127.0.0.1:6379> info replication

# Replication

role:master

connected_slaves:1

slave0:ip=172.25.36.3,port=6379,state=online,offset=16604,lag=1

master_replid:28fd394b05ff5ee56426e002513d2af62df241d8

master_replid2:9b430314a8aae4d1d58e799472ac15fd91aaeeb7

master_repl_offset:16878

second_repl_offset:11060

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:1

repl_backlog_histlen:16878

127.0.0.1:6379>



 

此时server2是无法连接的

[root@server2 redis]# vim /etc/redis/6379.conf   ##修改配置文件,将server2变成slave

 

slaveof 172.25.60.4 6379

 

[root@server2 redis]# systemctl restart redis_6379

[root@server2 redis]# 2167:X 27 Feb 2019 00:24:24.003 # -sdown slave 172.25.36.2:6379 172.25.36.2 6379 @ mymaster 172.25.36.4 6379

 

[root@server2 redis]# redis-cli

127.0.0.1:6379> info replication

# Replication

role:slave

master_host:172.25.36.4

master_port:6379

master_link_status:up

master_last_io_seconds_ago:1

master_sync_in_progress:0

slave_repl_offset:221860

slave_priority:100

slave_read_only:1

connected_slaves:0

master_replid:28fd394b05ff5ee56426e002513d2af62df241d8

master_replid2:9b430314a8aae4d1d58e799472ac15fd91aaeeb7

master_repl_offset:221860

second_repl_offset:11060

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:11060

repl_backlog_histlen:210801

127.0.0.1:6379>

 

[root@server3 redis]# vim /etc/redis/6379.conf   ##修改配置文件

 slaveof 172.25.36.4 6379

[root@server3 redis]# systemctl restart redis_6379

[root@server3 redis]# 2182:X 27 Feb 2019 00:30:08.944 * +reboot slave 172.25.36.3:6379 172.25.36.3 6379 @ mymaster 172.25.36.4 6379

 

拓展:调整master配置文件参数。该参数不是必须的可以写也可以不写

min-replocas-to-writer 1  ##设置最少有几个slave时,master才具有写的功能
min-replocas-max-lag 10

     

 

redis集群   

在一台主机上开启多个端口,模拟多个虚拟机,和使用多台虚拟机的效果是一样的

server2:

1:创建目录,模拟多个端口

[root@server2 ~]# sysctl vm.overcommit_memory
vm.overcommit_memory=0
[root@server2 ~]# sysctl -w vm.overcommit_memory=1
vm.overcommit_memory=1
[root@server2 ~]# mkdir /usr/local/rediscluster
[root@server2 ~]# cd /usr/local/rediscluster/
[root@server2 rediscluster]# mkdir 700{1..6}
[root@server2 rediscluster]# ls
7001  7002  7003  7004  7005  7006

2:编辑配置文件

[root@server2 rediscluster]# cd 7001/
[root@server2 7001]# ls
[root@server2 7001]# vim redis.conf
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
pidfile "/usr/local/rediscluster/7001/redis.pid"
logfile "/usr/local/rediscluster/7001/redis.log"
daemonize yes
dir "/usr/local/rediscluster/7001"

3:启动,会自动生成相应的目录

[root@server2 7001]# redis-server redis.conf 
[root@server2 7001]# ls
appendonly.aof  nodes.conf  redis.conf  redis.log  redis.pid

4:查看服务是否启动

[root@server2 7001]# ps -ax

 2324 ?        Ssl    0:00 redis-server *:7001 [cluster]

5:从7001端口登录redis

[root@server2 7001]# redis-cli -p 7001
127.0.0.1:7001> info replication
# Replication
role:master
connected_slaves:0
master_replid:398f6873fbc429e23d1ec43d6cc3528d77465996
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:7001> info 

6:复制配置文件修改配置文件

[root@server2 7001]# cp redis.conf ../7002/
[root@server2 7001]# cp redis.conf ../7003/
[root@server2 7001]# cp redis.conf ../7004/
[root@server2 7001]# cp redis.conf ../7005/
[root@server2 7001]# cp redis.conf ../7006/

7:剩下的依次修改配置文件,记住修改端口,其他的不变(后面的操作都一样)

[root@server2 7001]# cd ..
[root@server2 rediscluster]# cd 7002/
[root@server2 7002]# ls
redis.conf
[root@server2 7002]# vim redis.conf 
[root@server2 7002]# redis-server redis.conf 
[root@server2 7002]# ps -ax
 2324 ?        Ssl    0:00 redis-server *:7001 [cluster]
 2340 ?        Ssl    0:00 redis-server *:7002 [cluster]

8:最后的结果:

 2324 ?        Ssl    0:04 redis-server *:7001 [cluster]
 2340 ?        Ssl    0:04 redis-server *:7002 [cluster]
 2347 ?        Ssl    0:04 redis-server *:7003 [cluster]
 2354 ?        Ssl    0:04 redis-server *:7004 [cluster]
 2361 ?        Ssl    0:04 redis-server *:7005 [cluster]
 2368 ?        Ssl    0:04 redis-server *:7006 [cluster]

9:创建集群

[root@server2 bin] # redis-cli --cluster create --cluster-replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006


>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> slots 0 -5460
Master[1] -> slots 5461 - 10922
Master[2] -> slots 10923 - 16383
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
Adding replica 127.0.0.1:7003 to 127.0.0.1:7003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 5ce21dc1800362223f47368fcb0fdd092ca97986 127.0.0.1:7001
   slots:0-5460 (5461 slots) master
M: fbb437dd78e28c94a596ab675312e03f25c916ab 127.0.0.1:7002
   slots:5461-10922 (5462 slots) master
M: 12e878af3ddea913cfcc2585ac54ae5f55d73d7a 127.0.0.1:7003
   slots:10923-16383 (5461 slots) master
S: 5f9cbd9552380f737ea3e8e1212372ab346e9bbf 127.0.0.1:7004
   replicates fbb437dd78e28c94a596ab675312e03f25c916ab
S: 888d91dd8d5c54fd914432dc68b9aec57850cf70 127.0.0.1:7004
   replicates 12e878af3ddea913cfcc2585ac54ae5f55d73d7a
S: 5b945386e888f9f3c05ee7c629888d3d5a9d2457 127.0.0.1:7006
   replicates 5ce21dc1800362223f47368fcb0fdd092ca97986

10:登录

[root@server2 ~] # redis-cli --cluster info 127.0.0.1:7001

127.0.0.1:7001 (b14f476d...) -> 0 keys | 5461 slots | 1 slave.
127.0.0.1:7002 (0a3913h3...) -> 0 keys | 5461 slots | 1 slave.
127.0.0.1:7003 (fc1191h3...) -> 0 keys | 5461 slots | 1 slave.
         redis集群中的matser     数据      hasi槽个数    master对应的slave的个数     

注意:

当一个节点挂掉之后数据不会丢失,但是如果hasi槽不完整的话,当master宕机的话,slave会顶替,当一整个节点的master和slave都宕机时,此时该集群就会挂掉,或者整个集群中半数以上的master挂掉的话,集群也会挂掉,整个集群都会挂掉。默认只有master可写,如果在slave中写的话,会自动保存到master中。

11:登录,无论从那个节点登录的情况都是一样的

 

尝试其他节点登录:

 

 

测试把关闭一个节点的master:

 

 

测试:尝试破坏该集群:

之前7002宕机了,此时将7004也宕机,此时该redis集群中的该节点master和slave都宕机了

 

 

所有的操作都会保存在配置文件中:

 

 

 

恢复redis集群:

 

 

 

添加节点:此处将主机名换成server1(本人自行进行的操作,存粹无聊,对实验没有一点影响)

1:建立目录,编辑配置文件(只需要修改端口号)

2:添加:

3:给7007(master )添加7008(slave)

 

 

此时发现7007(master)上是没有哈希槽的

实验1:给7007添加哈希槽:

实验2:所有的master均分哈希槽

此时查看所有的master的哈希槽的数目都是相等的

 

===========================================================================================

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

         

 

 

猜你喜欢

转载自blog.csdn.net/yinzhen_boke_0321/article/details/88191813