一、简介
1、什么是主从复制
主机数据更新后根据配置和策略,自动同步到备机的master/slave机制,Matser以写为主,Slave以读为主,简单来说如下图
2、主从复制的好处
- 读写分离:Matser以写为主,Slave以读为主
- 容灾的快速恢复:当一台从服务器发生宕机,可以快速切换到其他的从服务器提供读操作
二、搭建一主多从
由于我本地只有一台虚拟机,所以我打算开启三个redis进程来模拟一主多从
1、在根目录创建myredis文件夹
mkdir myredis
2、复制我们当前的redis配置文件到/myredis文件夹路径下
cp /opt/decade/redis.conf /myredis/redis.conf
3、配置一主两从,创建配置文件
touch redis6379.conf
4、分别修改配置文件的内容
可以使用include来引入我们原本的redis.conf
然后修改pid、端口和RDB相关配置,如果开启aof,那也要修改对应配置
include /myredis/redis.conf
pidfile /var/run/redis_6379.pid
port 6379
dbfilename dump6379.rdb
然后使用cp拷贝一下redis6379.conf,使用vi
修改配置
5、分别启动三个redis服务
cd /opt/decade/redis/bin/
redis-server /myredis/redis6379.conf
redis-server /myredis/redis6380.conf
redis-server /myredis/redis6381.conf
6、客户端使用指定端口号连接服务器
redis-cli -p 6379
redis-cli -p 6380
redis-cli -p 6381
使用info replication
获取 主/从 服务器的详细信息
127.0.0.1:6379> info replication
# Replication
role:master //当前角色 : 主服务器
connected_slaves:0 //连接的从服务器的个数
master_failover_state:no-failover
master_replid:b1642741686dc1a03075ae00a67269a41b53b0e8
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>
7、设置从机
只需要使用客户端连接指定端口号的服务器
使用slaveof [ip] [port]
就可以,我们使用6380和6381执行此命令
然后分别使用info replication
查看主从服务器详情,并且在master上执行set操作
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6381,state=online,offset=70,lag=1
slave1:ip=127.0.0.1,port=6380,state=online,offset=70,lag=1
master_failover_state:no-failover
master_replid:09702c2e350d2ddaebeeda41fed8e0396031bce7
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:70
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:70
127.0.0.1:6379>
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379>
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> keys *
1) "k1"
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379>
我们发现,master上设置的数据会同步到slave上,但是slave不能使用set操作,这就是上面说的读写分离
[root@192 bin]# redis-cli -p 6380
127.0.0.1:6380>
127.0.0.1:6380> slaveof 127.0.0.1 6379
OK
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:10
master_sync_in_progress:0
slave_read_repl_offset:42
slave_repl_offset:42
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:09702c2e350d2ddaebeeda41fed8e0396031bce7
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:42
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:29
repl_backlog_histlen:14
127.0.0.1:6380>
127.0.0.1:6380> get k1
"v1"
127.0.0.1:6380> set k2 v2
(error) READONLY You can't write against a read only replica.
127.0.0.1:6380>
[root@192 bin]# redis-cli -p 6381
127.0.0.1:6381>
127.0.0.1:6381> slaveof 127.0.0.1 6379
OK
127.0.0.1:6381> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_read_repl_offset:56
slave_repl_offset:56
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:09702c2e350d2ddaebeeda41fed8e0396031bce7
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:56
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15
repl_backlog_histlen:42
127.0.0.1:6381>
127.0.0.1:6381> get k1
"v1"
127.0.0.1:6381>
三、复制原理和一主二仆
明天继续更新咯~