docker进阶笔记(高级版)

1. mysql主从复制

  1. mysql-master
# 新建mysql-master容器
docker run -d -p 3307:3306 --privileged=true \
-v /Users/yaoqiang/app/data/mysql-master/log:/var/log/mysql \
-v /Users/yaoqiang/app/data/mysql-master/data:/var/lib/mysql \
-v /Users/yaoqiang/app/data/mysql-master/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=root \
--name mysql-master mysql:8

配置my.cnf文件

[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101
## 知道不需要同步的数据库名称
binlog-ignore-db=msyql
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed, statement,row)
binlog_format=mixed
## 二进制日志过期清理时间,默认为0:表示不自动清理
expire_logs_days=7
slave_skip_errors=1062

重启mysql容器,如果报错就把data目录下的mysql.sock删掉,再重启

在mysql-master内执行

CREATE USER 'SLAVE'@'%' IDENTIFIED BY 'ROOT';
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'SLAVE '@'%'; 
# 新建mysql-master容器
docker run -d -p 3307:3306 --privileged=true \
-v /Users/yaoqiang/app/data/mysql-master/log:/var/log/mysql \
-v /Users/yaoqiang/app/data/mysql-master/data:/var/lib/mysql \
-v /Users/yaoqiang/app/data/mysql-master/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=root \
--name mysql-master mysql:8
  1. mysql-slave
# 新建mysql-slave容器
docker run -d -p 3308:3306 --privileged=true \
-v /Users/yaoqiang/app/data/mysql-slave/log:/var/log/mysql \
-v /Users/yaoqiang/app/data/mysql-slave/data:/var/lib/mysql \
-v /Users/yaoqiang/app/data/mysql-slave/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=root \
--name mysql-slave mysql:8

配置my.cnf文件

[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
## 知道不需要同步的数据库名称
binlog-ignore-db=msyql
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed, statement,row)
binlog_format=mixed
## 二进制日志过期清理时间,默认为0:表示不自动清理
expire_logs_days=7
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
  1. 配置主从
master_host:主数据库的ip地址
master_port:
master_user:在主数据库创建的用于同步数据的用户账号
master_password:
master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
	(这个要提前在主数据库中通过命令show master status;查看)
master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
master_connect_retry:连接失败重试的事件间隔,单位为秒.
# 在slave中的mysql中执行
change master to master_host='10.31.1.36' ,master_user='root', master_password='root',master_port=3307,master_log_file='mall-mysql-bin.000001',master_log_pos=712,master_connect_retry=30;
  1. 查看slave状态
# 在slave中的mysql中执行
# \G表示结果将翻转,以竖行的形式展示
show slave status \G;
# 查看Slave_IO_Running和Slave_SQL_Running结果是否为no
  1. 开启主从同步
# 在slave中的mysql中执行
start slave;
# 查看Slave_IO_Running和Slave_SQL_Running结果是否为yes

出现以下错误

Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection. Error_code: MY-002061

解决方法

主数据库执行以下语句;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
  1. 开始玩耍。在主数据库插入数据然后在从数据库查询。

2. 面试题:1-2亿条数据需要缓存,需要用到分布式redis.

  • 哈希取余分区 :例如有三台机器,则hash(key)/3。
    缺点:如果有一台挂掉或者需要扩缩容,映射关系需要重新计算,会导致hash取余全部数据重新洗牌.
  • 一致性哈希算法分区:
    一致性哈希环:一致性哈希算法对232取模.一致性哈希算法将整个哈希值空间组织成一个虚拟的圆环,232 后一个节点就是0,我们把这个由232个点组成的圆环成为hash环。
    服务器ip节点映射:将集群中的各个IP节点映射到环上的某一个位置.
    key落到服务器的落健规则:hash(key)以后计算出哈希值并确定在环上的位置,从此位置沿环顺时针“行走”,把数据存储到遇到的第一台服务器上。
    优点:容错性和扩展性
    缺点: 会导致数据倾斜,若两个节点距离很近,这它们两个之间的数据会放到第二个节点上,剩下的数据都会放到第一个节点上.
    在这里插入图片描述
  • 哈希槽分区:(大厂必用)
    哈希槽实质是一个数组[0,214-1]共16384个hash slot空间.(1000个以内的集群,16384个槽足矣.)
    槽是数据和节点之间的一层,相当于节点上是槽,槽内是数据.
    redis会根据节点数量大致均等的将哈希槽映射到不同的节点.
    把key对16384取余,余数是多少就落入相应的槽里,这样以槽为单位移动数据会比较容易.
  1. 搭建三主三从redis集群

# 新建6个redis容器,把以下的1改成2-6
# --appendonly yes 开启持久化
docker run -d --name redis-node-1 --net host --privileged=true \
-v /Users/yaoqiang/app/data/redis-node-1/data:/data  \
redis:6.0.8 --cluster-enabled yes 
--appendonly yes --port 6381
  1. 构建集群

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

我的电脑是mac,运行上述命令错误,原因:

The host networking driver only works on Linux hosts, and is not supported on Docker Desktop for Mac, Docker Desktop for Windows, or Docker EE for Windows Server.

暂停学习,等我有空在linux上安装docker再说吧.




时间2022-12-8,我又回来了,上次说到主机模式不可以,大家可以看一下我的另一篇文章docker- network,里面写了如何使用网络.
linux系统可以使用host模式.
其他系统使用网桥模式.

  1. 新建网络

docker network create rediscluster
docker network ls
  1. 搭建三主三从redis集群

# 新建6个redis容器,把以下的1改成2-6
# --appendonly yes 开启持久化
docker run -d -p 6381:6379 --name redis-node-1  \
--network rediscluster --privileged=true \
-v /Users/yaoqiang/app/data/redis-node-1/data:/data  \
redis:6.0.8 --cluster-enabled yes 
--appendonly yes
  1. 构建集群

# 172.18.0.x为容器的ip
redis-cli --cluster create 172.18.0.2:6379 172.18.0.3:6379 172.18.0.4:6379 172.18.0.5:6379 172.18.0.6:6379 172.18.0.7:6379 --cluster-replicas 1

输入yes
运行结果如下图

请添加图片描述


请添加图片描述

M为master,S位slave,S挂在M上.

  1. 集群各种命令
# 进入redsi-node-1
redis-cli -p 6379
# 输入
cluster info
cluster nodes
# 进入redis-node-1
# 输入(-c 可以把数据存入其他节点)
redis-cli -p 6379 -c
set k1 v1
# 出现Redirected,即重定向到别的节点存储数据
# 检查集群情况
redis-cli --cluster check ip:端口 
  1. 主从容错切换迁移

停止node1节点

docker stop redsi-node-1

进入node2,检查节点发现:node1已经fail,node4成为了master.
如果想让node1重新成为maste,只需要把node4停掉,再开启即可

  1. 主从扩容

三主三从->四主四从,涉及到哈希槽点重新分配.

  • 重新新增两个节点:node7和8.
docker run -d -p 6387:6379 --name redis-node-7  \
--network rediscluster --privileged=true \
-v /Users/yaoqiang/app/data/redis-node-7/data:/data  \
redis:6.0.8 --cluster-enabled yes 
--appendonly yes
  • 进入node7节点内部运行
redis-cli --cluster add-node 自己的ip:6379 node1的ip:6379
# 例如
redis-cli --cluster add-node 172.18.0.8:6379 172.18.0.2:6379

以上选择了node1节点,其实选其他节点也有相同的效果,因为在这里6个容器是一体的.下面的操作也类似.

  • 重新分配槽号
# ip为node1的ip
redis-cli --cluster reshard 172.18.0.2:6379

输入4096,因为10384/4=4096
输入node7的id
输入all

检查一下分配情况,如下图
请添加图片描述

发现槽位并不是均匀重新分配,而是其它master节点匀了一点给node7.

  • 为node7分配slave node8
redis-cli --cluster add-node node8的ip:6379 node7的ip:6379 --cluster-slave --cluster-master-id node7的id
# 例如
redis-cli --cluster add-node 172.18.0.9:6379 172.18.0.8:6379 --cluster-slave --cluster-master-id ade95bd0f054cc58965d30e2a9afc71c205b1325
  1. 主从缩容
  • 删除node8节点 (从节点)
redis-cli --cluster del-node node8的ip:6379 node8的id
# 例如
redis-cli --cluster del-node 172.18.0.9:6379 14b674c5c851426790baf39fa778d4ccc29bd6c6
  • 重新分配槽号
# ip为node1的ip
redis-cli --cluster reshard 172.18.0.2:6379

how many slots do you want to move (from 1 to 16384)? 4096
What is the receiving node ID? node1的id(这里的意思是谁来接收释放的槽位)‘
Please enter all the source node IDs.
Type ‘all’ to use all the nodes as source nodes for the hash slots.
Type ‘done’ once you entered all the source nodes IDs.
Source node #1: node7(要释放槽位的节点id)
Source node #2: done

  • 删除node7节点 (主节点)
redis-cli --cluster del-node node8的ip:6379 node8的id
# 例如
redis-cli --cluster del-node 172.18.0.8:6379 ade95bd0f054cc58965d30e2a9afc71c205b1325
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值