单机最大的弊端:容量有瓶颈、QPS瓶颈(高可用)、读写分离
生产环境不能在一台机器上。
一主一从,主就是master 从就是slave
一主多从,主就是master 从就是多个slave
它的数据流向是单项的,只能从master到slave
实现方式有两种:
slaveof 命令:
通过命令来做主从复制
(命令在slave机器上输入)
取消主从复制
配置:
通过配置文件来做主从复制
slaveof ip port //master的ip和端口
slave-read-only yes //从节点只能读
对这两种方式优缺点进行总结:
现在我们就使用docker来演示一下
首先我们先下载redis
1 |
docker pull redis |
然后创建第一台redis,master
1 docker run -it --name redis01 -p 6379:6379 -d redis进入新建的redis01主机
12345678 docker exec -it redis01 bashroot@182588e44755:/data# redis-cli127.0.0.1:6379> set username zhangsanOK127.0.0.1:6379> get username"zhangsan"127.0.0.1:6379>
当然我们可以使用便捷的方式,创建第一台redis,master
1 |
docker run -p 6379:6379 -v $PWD/data:/data -d redis redis-server --appendonly yes |
命令说明:
-p 6379:6379 : 将容器的6379端口映射到主机的6379端口
-v $PWD/data:/data : 将主机中当前目录下的data挂载到容器的/data
redis-server –appendonly yes : 在容器执行redis-server启动命令,并打开redis持久化配置
连接容器
1 |
docker exec -it 43f7a65ec7f8 redis-cli |
查看容器
1 2 3 4 5 6 7 8 9 10 |
172.17.0.1:6379> info # Server redis_version:3.2.0 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:f449541256e7d446 redis_mode:standalone os:Linux 4.2.0-16-generic x86_64 arch_bits:64 multiplexing_api:epoll |
二、主从复制
1.运行redis镜像
首先使用docker启动3个redis容器服务,分别使用到6379、6380、6381端口
1 2 3 |
docker run --name redis-6379 -p 6379:6379 -d redis redis-server docker run --name redis-6380 -p 6380:6379 -d redis redis-server docker run --name redis-6381 -p 6381:6379 -d redis redis-server |
2.配置redis集群
使用如下命令查看容器内网的ip地址等信息
1 |
docker inspect containerid(容器ID) |
3个redis的内网ip地址为:
1 2 3 |
redis-6379 172.17.0.2 redis-6380 172.17.0.3 redis-6381 172.17.0.4 |
进入docker容器内部,查看当前redis角色(主master还是从slave)(命令:info replication)
1 2 3 4 5 6 7 8 9 10 11 12 |
[root@localhost /]# docker exec -it 007f7ab412b9 redis-cli 127.0.0.1:6379> info replication # Replication role:master connected_slaves:0 master_repl_offset:3860 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:3859 127.0.0.1:6379> |
可以看到当前3台redis都是master角色,使用redis-cli命令修改redis-6380、redis-6381的主机为172.17.0.2:6379
1 |
SLAVEOF 172.17.0.2 6379 |
再次查看redis-6379主机info,已经有两个从机了.
测试
主
1 2 3 4 |
127.0.0.1:6379> set master master OK 127.0.0.1:6379> get master "master" |
slave1
1 2 |
127.0.0.1:6379> get master "master" |
slave2
1 2 |
127.0.0.1:6379> get master "master" |
好了,redis主从配置完毕了。
注意,如果在从节点机器上set key value后,再slaveof,之前的数据会被清空。
读写分离
master负责写,slave负责读
危险:有可能,你的主机宕机了,恢复时没有争取持久化,从节点机器会复制主节点的空数据,完蛋了
运维需要,人工提前从从节点中选择一条作为主节点,并执行slaveof no one 命令。很麻烦。