【Docker安装mysql主从复制和安装redis集群】

本笔记内容为尚硅谷Docker高级篇安装mysql主从复制和安装redis集群部分

目录

一、mysql主从复制

1、什么是mysql主从复制

2、主从搭建步骤

二、安装redis集群(重点)

1、面试题

哈希取余分区

一致性哈希算法分区

哈希槽分区 

2、开打步骤

3主3从redis集群配置

主从容错切换迁移案例 

主从扩容案例

主从缩容案例


一、mysql主从复制


1、什么是mysql主从复制

MySQL主从复制是其最重要的功能之一。主从复制是指一台服务器充当主数据库服务器,另一台或多台服务器充当从数据库服务器,主服务器中的数据自动复制到从服务器之中。对于多级复制,数据库服务器即可充当主机,也可充当从机。MySQL主从复制的基础是主服务器对数据库修改记录二进制日志,从服务器通过主服务器的二进制日志自动执行更新。

2、主从搭建步骤

1.新建主服务器容器实例3307

docker run -p 3307:3306 --name mysql-master 

-v /mydata/mysql-master/log:/var/log/mysql 

-v /mydata/mysql-master/data:/var/lib/mysql 

-v /mydata/mysql-master/conf:/etc/mysql 

-e MYSQL_ROOT_PASSWORD=root  

-d mysql:5.7     

2.​进入/mydata/mysql-master/conf目录下新建my.cnf

[mysqld]

## 设置server_id,同一局域网中需要唯一

server_id=101 

## 指定不需要同步的数据库名称

binlog-ignore-db=mysql  

## 开启二进制日志功能

log-bin=mall-mysql-bin  

## 设置二进制日志使用内存大小(事务)

binlog_cache_size=1M  

## 设置使用的二进制日志格式(mixed,statement,row)

binlog_format=mixed  

## 二进制日志过期清理时间。默认值为0,表示不自动清理。

expire_logs_days=7  

## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。

## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致

slave_skip_errors=1062

3. 修改完配置后重启master实例 

docker restart mysql-master

4. 进入mysql-master容器 

docker exec -it mysql-master /bin/bash

mysql -uroot -proot

5. master容器实例内创建数据同步用户

CREATE USER 'slave'@'%' IDENTIFIED BY '123456'; 

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

6. 新建从服务器容器实例3308

docker run -p 3308:3306 --name mysql-slave 

-v /mydata/mysql-slave/log:/var/log/mysql 

-v /mydata/mysql-slave/data:/var/lib/mysql 

-v /mydata/mysql-slave/conf:/etc/mysql 

-e MYSQL_ROOT_PASSWORD=root  

-d mysql:5.7

7.​进入/mydata/mysql-slave/conf目录下新建my.cnf

vim my.cnf

[mysqld]

## 设置server_id,同一局域网中需要唯一

server_id=102

## 指定不需要同步的数据库名称

binlog-ignore-db=mysql  

## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用

log-bin=mall-mysql-slave1-bin  

## 设置二进制日志使用内存大小(事务)

binlog_cache_size=1M  

## 设置使用的二进制日志格式(mixed,statement,row)

binlog_format=mixed  

## 二进制日志过期清理时间。默认值为0,表示不自动清理。

expire_logs_days=7  

## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。

## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致

slave_skip_errors=1062  

## relay_log配置中继日志

relay_log=mall-mysql-relay-bin  

## log_slave_updates表示slave将复制事件写进自己的二进制日志

log_slave_updates=1  

## slave设置为只读(具有super权限的用户除外)

read_only=1

8. 修改完配置后重启slave实例

docker restart mysql-slave 

9. 在主数据库中查看主从同步状态 

show master​ status;

10. 进入mysql-slave容器 

docker exec -it mysql-slave /bin/bash

mysql -uroot -proot

11. 在从数据库中配置主从复制

change master to master_host='宿主机ip', master_user='slave', master_password='123456', master_port=3307, master_log_file='mall-mysql-bin.000001', master_log_pos=617, master_connect_retry=30;

 主从复制命令参数说明

master_host:主数据库的IP地址;

master_port:主数据库的运行端口;

master_user:在主数据库创建的用于同步数据的用户账号;

master_password:在主数据库创建的用于同步数据的用户密码;

master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;

master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;

master_connect_retry:连接失败重试的时间间隔,单位为秒。

12. 在从数据库中查看主从同步状态

show slave status \G;

13. 在从数据库中开启主从同步

14. 查看从数据库状态发现已经同步

15. 主从复制测试

主机新建库-使用库-新建表-插入数据,ok

从机使用库-查看记录,ok

二、安装redis集群(重点)


cluster(集群)模式-docker版哈希槽分区进行亿级数据存储

1、面试题

1~2亿条数据需要缓存,请问如何设计这个存储案例

回答:单机单台100%不可能,肯定是分布式存储,用redis如何落地?

上述问题阿里P6~P7工程案例和场景设计类必考题目,一般业界有3种解决方案

哈希取余分区

一致性哈希算法分区

是什么?

一致性Hash算法背景

  一致性哈希算法在1997年由麻省理工学院中提出的,设计目标是为了解决

分布式缓存数据变动和映射问题,某个机器宕机了,分母数量改变了,自然取余数不OK了

能干嘛? 

提出一致性Hash解决方案。目的是当服务器个数发生变动时,尽量减少影响客户端到服务器的映射关系

3大步骤

算法构建一致性哈希环

 服务器IP节点映射

key落到服务器的落键规则

优点

一致性哈希算法的容错性

一致性哈希算法的扩展性

缺点

一致性哈希算法的数据倾斜问题

小总结

为了在节点数目发生改变时尽可能少的迁移数据

将所有的存储节点排列在收尾相接的Hash环上,每个key在计算Hash后会顺时针找到临近的存储节点存放。

而当有节点加入或退出时仅影响该节点在Hash环上顺时针相邻的后续节点。  

优点

加入和删除节点只影响哈希环中顺时针方向的相邻的节点,对其他节点无影响。 

缺点 

数据的分布和节点的位置有关,因为这些节点不是均匀的分布在哈希环上的,所以数据在进行存储时达不到均匀分布的效果。

哈希槽分区 

是什么?

 哈希槽计算

2、开打步骤

3主3从redis集群配置

1.关闭防火墙+启动docker后台服务

systemctl start docker

2.新建6个docker容器redis实例 

docker run -d --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381

docker run -d --name redis-node-2 --net host --privileged=true -v /data/redis/share/redis-node-2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6382

docker run -d --name redis-node-3 --net host --privileged=true -v /data/redis/share/redis-node-3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6383

docker run -d --name redis-node-4 --net host --privileged=true -v /data/redis/share/redis-node-4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6384

docker run -d --name redis-node-5 --net host --privileged=true -v /data/redis/share/redis-node-5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6385

docker run -d --name redis-node-6 --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386

 命令分步解释

3.进入容器redis-node-1并为6台机器构建集群关系

进入容器(顺便选个点作为切入点都行)

docker exec -it redis-node-1 /bin/bash

构建主从关系 

//注意,进入docker容器后才能执行一下命令,且注意自己的真实IP地址 

redis-cli --cluster create 192.168.111.147:6381 192.168.111.147:6382 192.168.111.147:6383 192.168.111.147:6384 192.168.111.147:6385 192.168.111.147:6386 --cluster-replicas 1

--cluster-replicas 1 表示为每个master创建一个slave节点 

一切OK的话,3主3从搞定

4.链接进入6381作为切入点,查看集群状态

链接进入6381作为切入点,查看节点状态

cluster info

cluster nodes

主从容错切换迁移案例 

1.数据读写存储

启动6机构成的集群并通过exec进入

对6381新增两个key

查看集群信息

redis-cli --cluster check 192.168.111.147:6381

2.容错切换迁移

主6381和从机切换,先停止主机6381

6381主机停了,对应的真实从机上位

6381作为1号主机分配的从机以实际情况为准,具体是几号机器就是几号

再次查看集群信息 

先还原之前的3主3从

1.先启6381

docker start redis-node-1

2.再停6385

docker stop redis-node-5

3.再启6385

docker start redis-node-5

主从机器分配情况以实际情况为准 

查看集群状态

redis-cli --cluster check 自己IP:6381

主从扩容案例

1.新建6387、6388两个节点+新建后启动+查看是否8节点

docker run -d --name redis-node-7 --net host --privileged=true -v /data/redis/share/redis-node-7:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6387
docker run -d --name redis-node-8 --net host --privileged=true -v /data/redis/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388
docker ps

2.进入6387容器实例内部 

docker exec -it redis-node-7 /bin/bash

3.将新增的6387节点(空槽号)作为master节点加入原集群 

将新增的6387作为master节点加入集群
redis-cli --cluster  add-node 自己实际IP地址: 6387 自己实际IP地址: 6381
6387 就是将要作为master新增节点
6381 就是原来集群节点里面的领路人,相当于6387拜拜6381的码头从而找到组织加入集群

4.检查集群情况第1次

redis-cli --cluster check 真实ip地址:6381

5.重新分派槽号

命令:redis-cli --cluster reshard IP地址:端口号
redis-cli --cluster reshard 192.168.111.147:6381

6.检查集群情况第2次

槽号分派说明

为什么6387是3个新的区间,以前的还是连续?

重新分配成本太高,所以前3家各自匀出来一部分,从6381/6382/6383三个旧节点分别匀出1364个坑位给新节点6387

7.为主节点6387分配从节点6388

命令:redis-cli --cluster add-node ip:新slave端口 ip:新master端口 --cluster-slave --cluster-master-id 新主机节点ID

 
redis-cli --cluster add-node 192.168.111.147:6388 192.168.111.147:6387 --cluster-slave --cluster-master-id e4781f644d4a4e4d4b4d107157b9ba8144631451-------这个是6387的编号,按照自己实际情况

8.检查集群情况第3次

redis-cli --cluster check 192.168.111.147:6382

主从缩容案例

1.目的:6387和6388下线

2.检查集群情况1获得6388的节点ID

3.将6388删除从集群中将4号从节点6388删除

命令:redis-cli --cluster del-node ip:从机端口 从机6388节点ID

 
redis-cli --cluster del-node 192.168.111.147:6388 5d149074b7e57b802287d1797a874ed7a1a284a8

 redis-cli --cluster check 192.168.111.147:6382

4.将6387的槽号清空,重新分配,本例将清出来的槽号都给6381

redis-cli --cluster reshard 192.168.111.147:6381

5.检查集群情况第二次

redis-cli --cluster check 192.168.111.147:6381

 
4096个槽位都指给6381,它变成了8192个槽位,相当于全部都给6381了,不然要输入3次,一锅端

6.将6387删除 

命令:redis-cli --cluster del-node ip:端口 6387节点ID

 
redis-cli --cluster del-node 192.168.111.147:6387 e4781f644d4a4e4d4b4d107157b9ba8144631451

7.检查集群情况第三次

redis-cli --cluster check 192.168.111.147:6381

结束!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值