docker复杂安装详细说明
docker安装mysql主从复制
主从搭建步骤
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
cd/mydata/mysql-master/conf vim my.cnf
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 REPLCATION 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
cd/mydata/mysql-slave/conf vim my.cnf
8.修改完配置后重启slave实例
docker restart mysql-slave
9.在主数据库中查看主从同步状态
show master status
10.进入mysql-slave实例
docker exec -it mysql-slave /bin/bash mysql urrot -proot
11.在从数据库中配置主从复制
docker exec -it mysql -slave/bin/bash change master to master_host="宿主机ip", //主数据库的IP地址 master_user='slave', //在主数据库创建的用于同步数据的用户账号 master_password='123456', //在主数据库创建的用于同步数据的用户密码 master_port=3307, //主数据库的运行端口 master_log_file='mall-mysql-bin.000001', //指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取 File参数 master_log_pos=617, //指定从数据库那个位置开始复制数据,通过查看主数据的状态,获取Position参数 master_connect_retry=30; //连接失败重试的时间间隔,单位为秒 change master to master_host="192.168.111.167", master_user='slave',master_password='123456', master_port=3307,master_log_file='mall-mysql-bin.000001', master_log_pos=617,master_connect_retry=30;
12.在从数据库中查看主从同步状态
show slave status \G Slave_IO_Running:NO Slave_SQL_Running:NO
13.在从数据库中开启主从同步
start slave
14.查看从数据库状态发现已经同步
show slave status \G Slave_IO_Running:YES Slave_SQL_Running:YES
15.主从复制测
主机新建库 使用表 新建表-插入数据 ok 从机使用库,查看记录
cluster(集群)模式-docker版
哈希槽分区进行亿级数据存储
问: 1-2亿条数据需要缓存,请问如何设计这个存储案例
分布式存储用redis如何落地?
3种解决方案:
1.哈希取余分区
假设有3台机器构成一个集群,用户每次读写操作都是根据公式,hash(key)%N个机器台数,计算出哈希值,用来决定数据映射到哪一个节点上。
优点:简单,直接有效,只要预估好数据,规划好节点,列如3台,8台,10台,就能保证一段时间的数据支撑,使用Hash算法让固定的一部分请求落在同一台服务器上,这样每台服务器固定处理一部分请求,(并维护这些请求信息),起到负载均衡+分而治之的作用。
缺点,原来规划好的节点,进行扩容或者缩容,就比较麻烦了,不管扩容,每次数据变动导致节点有变动,映射关系需要重新进行计算,在 服务器个数固定不变时没有问题,如果需要弹性扩容或故障停机的情况下,原来的取模公式就会发生变化:Hash(key) /3会变成Hash(key)/? 此时地址经过某个redis机器宕机。由于数量变化,会导致hash取余全部重新洗牌。
2.一致性哈希算法分区(分布式缓存数据变动和映射问题,某个机器宕机了,分母数量改变了,自然取余数不OK了)
目的是当服务器个数发生变动时,尽量减少影响客户端到服务器的映射关系
算法构建一致性哈希环。
将集群中各个IP节点映射到环上的某一个位置
将各个服务器使用Hash进行一个哈希,具体可以选择服务器的IP或者主机名作为关键字进行哈希,这样每台机器就能确定其在环上的位置
优点: 容错性高,可扩展性。
缺点:一致性hash算法在节点太少时,容易因为节点分布不均匀造成数据倾斜,(被缓存的对象大部分集中缓存在某一台服务器上)
3.哈希槽分区 (解决一致性哈希算法的数据倾斜问题)
解决均匀分配的问题,在数据和节点之间又加了一层,把这层称为哈希槽slot,
用于管理数据和节点直接的关系,现在就想当与节点上放的是槽,槽里放的是数据
一个集群只能有16384个槽,(0-2^14-1)
3主3从redis集群扩缩容配置案咧
1.redis集群配置:
1.关闭防火墙,启动docker后台服务 systemctl start docker 2.新建6个docker容器实例 docker run -d //创建并运行docker实例 --name redis-node-1 //容器名字 --net host //使用宿主机的IP和端口,默认 --privileged=true //获取宿主机的root权限 -v /data/redis/share/redis-node-1:/data //容器卷 宿主机地:docker内部地址 redis:6.0.8 //redis镜像和版本号 --cluster-enabled yes //是否开启集群 --appendonly yes //开启持久化 --port 6381 //redis端口号 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 ......一共开6个 3.进入容器 docker -exec -it redis-node-1/bin/bash 构建主从关系 redis-cli --cluster create 192.168.111.167:6381 192.168.111.167:6382 192.168.111.167:6383 192.168.111.167:6384 192.168.111.167:6385 192.168.111.167:6386 --cluster-replicas 1 //表示为每个master创建一个slave节点 4.链接进入6381作为切入点 查看节点状态 redis -cli -p 6381 cluster nodes 查看节点关系 主从容错切换迁移案列: 数据读写存储: 启动6机构成的集群并通过exec进入 docker exec -it redis -node-1/bin/bash 防止路由失效加参数 -c redis-cli -p 6381 -c 查看集群信息: redis -cli --cluster check 192.168.111.167:6381 5. 主从扩容 新建2个节点, 进入6387容器实列内部, docker exec -it redis -node-7/bin/bash 将新增加的6387作为master节点加入集群 redis-cli-cluser add-node 自己实际IP地址:6387 自己实际IP地址:6381 重新分配槽号 redis -cli --cluster reshard ip地址:端口号 redis -cli reshard 192.168.111.147:6381 重新分配成本太高,所以3家各自匀出来一部分,从之前的3个旧节点分别匀出1364个节点给6387 为主节点分6387分配从节点,6388 redis-cli --cluster add-node 192.168.111.6388//新的slave端口: 192.168.111.6387//新的master端口 --cluster-slave --cluster -master-id 新主机节点ID 6.主从缩容 先清除从节点 6388 redis -cli cluster del-node ip:从机端口 丛机6388节点ID 将6387的槽号清空,重新分配,将清出来的槽号都给6381 redis -cli cluster reshard 192.168.111.167:6381 将6387从集群中删除 redis -cli cluster del-node ip:从端口6387节点ID