Docker-安装实践(mysql,redis集群,tomcat)

docker实践(提供几个安装案例)

  • 安装Tomcat
# 拉取镜像,可以指定标签不指定默认为最新
docker pull tomcat
docker run -itd -p 8080:8080 --name tomcat tomcat:latest  
#这样内部默认80端口,主机的映射端口会随机分配一个
docker run -itd -P tomcat 
#可以用这个命令查看端口8080是否已经监听
netstat -ntlp 

这里需要注意的是可能访问8080的时候会出现404(往往出现在新版中),是因为新版webapp目录下没有任何呢内容。

docker exec -it tomcat /bin/bash
#官方把欢迎页面放到了另一个位置
mv webapps.dist/ webapps 
  • 安装mysql
    我们以经典的mysql5.7为例
docker pull mysql:5.7
docker run -d -p 13306:3306 --privileged=true -v /data/mysql/logs:/var/log/mysql -v /data/mysql/data:/var/lib/mysql -v /opt/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=654321  --name mysql mysql:5.7

注意我们需要解决乱码的问题
修改配置文件,设置编码

[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
bind-address = 0.0.0.0  #允许所有IP连接,生产环境中不允许这么配置
character_set_server = utf8

配置修改后可以,用下面的命令查看字符集,可以在容器内部用客户端连接也可以用连接工具。

show variables like '%char%'

在这里插入图片描述

  • 安装redis
docker pull redis
docker run  -p 16379:6379 --name redis --privileged=true -v /opt/conf/redis/redis.conf:/etc/redis/redis.conf -v /data/redis/data:/data -d redis:latest redis-server /etc/redis/redis.conf

配置文件,注意生成环境中别这样配置,除了daemonize no这个,这样配置不安全。

bind 127.0.0.1 
daemonize no
protected-mode no

进阶篇

安装进阶

  • mysql主从复制搭建
    安装master
docker run -p 13307:3306 --name mysql-master \
-v /data/mysql-master/log:/var/log/mysql \
-v /data/mysql-master/data:/var/lib/mysql \
-v /data/mysql-master/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=654321 \
-d mysql:5.7

修改配置文件并重启容器

[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```

master容器实例内创建数据同步用户,这是为了安全控制权限

CREATE USER 'slave' @'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave' @'%';

安装从节点

docker run -p 13308:3306 --name mysql-slave \
-v /data/mysql-slave/log:/var/log/mysql \
-v /data/mysql-slave/data:/var/lib/mysql \
-v /data/mysql-slave/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=654321 \
-d mysql:5.7

修改配置文件

[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

在主数据库中查看同步状态,需要进入容器然后 mysql -uroot -p 客户端连接后输入此命令

show master status; 注意啦一定要有分号否则你只会看到输出一个箭头

在这里插入图片描述
在从数据库中配置主从复制,注意也是进入容器内部mysql客户端连接后执行

#这里的参数值都是之前配置的
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:连接失败重试的时间间隔,单位为秒。

查看从数据库的同步状态

show slave status \G;  \G只是换一种方式展示结果

在从数据库开启主从同步

start slave; #需要看到这两个参数是yes

在这里插入图片描述
这里踩坑了,怎么弄第一个都显示connecting, 后面看了下文,是端口不通的问题。
https://dba.stackexchange.com/questions/140929/slave-io-running-connecting-in-master-slave-replication
下面就是在master建表,看看从机有没有就OK。

  • redis 如何存储1-2亿条数据(非常重要,学的是这个设计思想)
    下面先介绍哈希存储的算法
  1. 普通哈希分区(对节点数量进行取余)
    在这里插入图片描述
  2. 一致性哈希算法分区
    就是有一个hash环,这样在迁移的时候不会重新洗牌,迁移少量机器即可。但是这样在数据节点太少的情况下,又会出现数据倾斜的问题。
    在这里插入图片描述
  3. 哈希槽算法
    槽解决的是粒度问题,相当于把粒度变大了,这样便于数据移动。
    在这里插入图片描述
    集群搭建实战(三主三从)
    开启6台redis
#这里注意网络模式都是主机,生成环境中推荐用bridge模式,创建一个自定义网络,将它们部署到统一网络下,这样可以通过服务名访问到服务
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

随便进入一台redis的内部搭建集群关系

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

在这里插入图片描述
然后连接客户端查看相关信息,需要注意我们要指定端口因为我们启动的时候已经指定了端口 redis-cli -p 6381

cluster info
cluster nodes  

在这里插入图片描述
下面注意了我们存储key的时候就需要连接集群了,如果单机只有一部分槽位那能存,如果集群就会自动跳过去。

redis-cli -p 6381 -c  #下图展示了如果不是当前机器的槽位会自动跳

在这里插入图片描述

redis-cli --cluster check 127.0.0.1:6381

在这里插入图片描述
下面可以测试一下(比较简单这里不再演示),停掉一个实例,slave就会上位变成master,保证集群照样可用,后面恢复后也不会复原master的地位变成了slave。

集群扩容
新增节点

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

添加节点

redis-cli --cluster add-node 自己实际IP地址:6387 自己实际IP地址:6381

我们看到虽然加入了集群但是没有分配槽位
在这里插入图片描述
分配槽位(每一台机器各出一些槽位分配给新机器):

redis-cli --cluster reshard 127.0.0.1:6381 #执行会提示填入分区的大小,一般采用均分,然后还需要填入新节点的ID

为主节点分配从节点:

redis-cli --cluster add-node 127.0.0.1:6388 127.0.0.1:6387 --cluster-slave --cluster-master-id 8b242a216d91366916054fca6b5c1ee4129d05b9

集群缩容

#删除88节点
redis-cli --cluster del-node 127.0.0.1:6388 5d149074b7e57b802287d1797a874ed7a1a284a8 
#重新分配槽位,注意将槽位全部删除才能继续删除87节点
redis-cli --cluster reshard 192.168.111.147:6381 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/636414.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于web的亚热带常见自然林病虫害识别系统——开篇

文章目录 前言概要论文组织结构相关理论技术简介TensorflowDjango web 开发框架图像的分类的发展感受 绪论研究背景与意义国内外研究现状 前言 随着年底的到来,我相信越来越多的小伙伴也要开始着手自己的毕业设计,这里打算分享我自己的毕业设计&#xf…

python通过元类为客户类自动添加方法

1 python通过元类为客户类自动添加方法 python为不同的类添加相同的方法,有多种方式。 若已知需添加的方法,可以通过继承添加方法,或对象嵌入的组合进行添加。 若需添加的方法为动态不可知,可以通过辅助函数或元类进行添加。 …

Python-基础篇-数据结构-列表、元组、字典、集合

文章目录 思维导图❓ 大抵是何物数据结构切片 💬具体是何物列表💻 list💻 [ ]自我介绍精神面貌使用说明生理体征增删查改 方法汇总 元组💻 tuple💻 ( )自我介绍使用说明精神面貌生理体征增删查改 字典💻 di…

网络爬虫基本原理介绍

网络爬虫是一种自动化程序,用于从互联网上获取信息并进行数据抓取。它通过发送HTTP请求获取网页内容,并解析网页内容提取所需信息。 一、网络爬虫的基本原理 什么是网络爬虫? 网络爬虫是一种自动化程序,模拟人类在网页上的行为&a…

【C++】vector容器接口要点的补充

接口缩容 在VS编译器的模式下&#xff0c;类似于erase和insert接口的函数通常会进行缩容&#xff0c;因此&#xff0c;insert和erase行参中的迭代器可能会失效。下图中以erase为例&#xff1a; 代码如下&#xff1a; #include <iostream> #include <vector> #inclu…

Python——条形图正负不同色加表格

条形图&#xff0c;当差值大于0时设置一个颜色&#xff0c;反之另一种颜色&#xff0c;并添加表格 import pandas as pd import numpy as np import matplotlib.pyplot as plt import matplotlib.ticker as mtick import matplotlib.ticker as ticker#设置输出结果对齐方式 pd…

Qt 5.15.2 (MSVC 2019)编译 QWT 6.2.0 : 编译MingW或MSVC遇到的坑

MingW下编译QWt 6.2.0 下载qwt最新版本&#xff0c;用git工具 git clone下载源码 git clone https://git.code.sf.net/p/qwt/git qwt-git 或者使用我下载的 qwt 2.6.0 链接&#xff1a;https://pan.baidu.com/s/1KZI-L10N90TJobeqqPYBqw?pwdpq1o 提取码&#xff1a;pq1o 下载…

python-基础篇-高级变量类型

文章目录 高级变量类型目标知识点回顾 01. 列表1.1 列表的定义1.2 列表常用操作del 关键字&#xff08;科普&#xff09;关键字、函数和方法&#xff08;科普&#xff09; 1.3 循环遍历1.4 **应用场景** 02. 元组2.1 元组的定义创建空元组元组中 **只包含一个元素** 时&#xf…

一、基础数据结构——2.队列——2.循环队列

参考资料&#xff1a;《算法竞赛》&#xff0c;罗勇军 郭卫斌 著 本博客作为阅读本书的学习笔记&#xff0c;仅供交流学习。 建议关注 罗勇军老师博客 [NOIP2010 提高组] 机器翻译 题目背景 NOIP2010 提高组 T1 题目描述 小晨的电脑上安装了一个机器翻译软件&#xff0c;他…

教您如何下载保存钉钉视频到电脑本地

教您如何下载保存钉钉视频到电脑和手机相册地瓜网络技术 大家好&#xff0c;我们这边是地瓜网络技术&#xff01;30秒教会你下载钉钉视频&#xff01;现在很多群管理员把视频设置为禁止下载&#xff0c;导致我们无法正常的下载群直播回放视频&#xff0c; 今天我们就教大家如何…

AWS 专题学习 P7 (FSx、SQS、SNS)

文章目录 Amazon FSx – 概述Amazon FSx for LustreFSx Lustre - 文件系统部署选项 Amazon FSx for NetApp ONTAPAmazon FSx for OpenZFSHybrid Cloud 存储AWS 存储云原生选项AWS 存储网关Amazon S3 File GatewayAmazon FSx File GatewayVolume GatewayTape GatewayStorage Gat…

纯前端网页编辑Office文档安全预览之打开Word文档后禁止另存为....

在线办公weboffice的过程中&#xff0c;有时候我们在共享文件时&#xff0c;有一些重要文件&#xff0c;比如合同、客户资源等&#xff0c;常常希望用户可以打开共享文件&#xff0c;但禁止复制共享文件内容&#xff0c;同时也禁止将共享文件另存为本地&#xff0c;那么如何实现…

生产力与生产关系 —— 语音转文字,抛开键盘输入

生产力与生产关系 —— 语音转文字&#xff0c;抛开键盘输入 自从用了语音转文字的识别软件之后&#xff0c;我的码字速度有了快速的提高&#xff0c; 现在的这段文字就是我通过语音识别生成的&#xff0c;传统的键盘输入 在自己一个人的时候不太合适&#xff0c;那个速度太慢了…

【LeetCode】141. 环形链表

leetcode题目链接 141. 环形链表 #include <stdio.h> #include <stdbool.h>struct ListNode {int val;struct ListNode* next; }; typedef struct ListNode ListNode;bool hasCycle(ListNode* head) {ListNode* slow head, * fast head;while (fast &&…

微信小程序 image bindload 事件不触发,图片加载不出来

问题&#xff1a; 当小程序图片页面反复跳转时&#xff0c;或者微信打开小程序页面之后&#xff0c;处于后台运行。 图片加载不出来&#xff0c;我图片加载是通过bindload事件不判断是否下载完成再显示。但是现在bindload不触发&#xff0c;一直显示加载层。 分析&#xff1…

鸿蒙 HarmonyOS ArkTS ArkUI 动画 中心扩展、向下扩展、纵向扩展

EntryComponentstruct Index {State widthA: number 0State heightA: number 0onPageShow():void{animateTo ( {duration: 2000,iterations: -1,curve:Curve.Linear}, () > {this.widthA 200this.heightA 200} )}build() {Column() {// 中心扩展Column(){}.width(this.wi…

什么是中间件?

文章目录 为什么需要中间件&#xff1f;中间件生态漫谈数据库中间件读写分离分库分表引进数据库中间件MyCat 服务端代理模式ShardingJDBC 客户端代理模式 总结 IT 系统从单体应用逐渐向分布式架构演变&#xff0c;高并发、高可用、高性能、分布式等话题变得异常火热&#xff0c…

【Arduino】无法上传程序到开发板,报错 avrdude: ser_open(): can‘t set com-state for “\\.\COM6“

问题描述 在尝试将项目上传到Arduino板子时&#xff0c;尽管开发板已被正确连接&#xff0c;并且IDE中能够正常读取到开发板信息&#xff0c;但是上传过程中仍然出现了问题。 下面是IDE中显示的开发板信息&#xff1a; 当尝试上传程序时&#xff0c;控制台报错信息如下&#…

APP测试基本流程以及APP测试要点梳理,保证您看了不后悔!

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

Pytest 测试框架与Allure 测试报告——Allure2测试报告-L4

目录&#xff1a; 1.allure2报告定制 Allure2报告定制应用场景Allure2报告定制-页面LogoAllure2报告定制-页面标题 1.allure2报告定制 Allure2 报告定制应用场景 应用场景&#xff1a;针对不同的项目可能需要对测试报告展示的效果进行定制&#xff0c;比如修改页面的 logo、…