Docker学习笔记(三)

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
       
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值