使用 Docker 建立 Mysql 集群
软件环境介绍
操作系统:Ubuntu server 64bit 14.04.1
Docker 版本 1.6.2
数据库:Mariadb 10.10 (Mariadb 是 MySQL 之父在 MySQL 被 Oracle 收购之后
创建的分支,性能上优于 MySQL 开源版本)
第一步 安装 Docker
对于 Ubuntu,建议直接联网安装 Docker 最新版本,apt-get 中版本较老。
首先获取安装脚本:
wget https://get.docker.com
下下来的虽然名字是 index.html,但其实是脚本文件,所以我们
chmod +x index.html
这样我们就可以执行这个文件:
sudo ./index.html
安装完成后根据提示,可以将当前用户加到 docker 用户组里,这样就不用每次
执行 docker 都需要 sudo 了。
sudo usermod -aG docker <你的用户名>
对于 Centos6,首先要把企业常用软件包的软件源安装上
yum install epel-release
然后再
yum install docker-io
第二步 运行 Mariadb 容器
首先要将数据镜像拉下来
docker pull mariadb:latest
注意,如果不加:latest 标签,docker 会把所有的镜像版本都拉下来。
然后我们就可以启动镜像了,参数方面需要注意的有一下几点:
1,-name <给容器取个好记的名称>
2,-e MYSQL_ROOT_PASSWORD =‘<给数据库一个 root 用户密码>’
3,-p <映射到本机的端口>:3306
4,-v <本机的数据库存放目录>:/var/lib/mysql
5,设定 MYSQL_USER、MYSQL_PASSWORD、MYSQL_DATABASE 环境变量可以使容器在
运行时同时创建你所需要的数据库和带有全部权限的用户及其对应密码
6,设定 TERM 环境变量的值可以解决容器不能进入 mysql 控制台的问题。
对于不是自己建立的镜像,建立出来的容器未必能一次达到要求,建议是将 run
命令写成脚本,创建后使用
docker inspect <容器名>
仔细查看容器信息,关注镜像公开的端口和文件目录。如果发现达不到要求,使
用
docker rm -f <容器名>
删除容器后修改 run 脚本再次运行,直到满意为止。
下面是我的 run 命令:
docker run --name mdb1 \
-p 13306:3306 \
-v /home/wonders/docker_mdb1_data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=wondersgroup \
-e MYSQL_USER=medical_waste \
-e MYSQL_PASSWORD=medical_waste \
-e MYSQL_DATABASE=medical_waste \
-e TERM=linux \
-d mariadb
第三步 配置一主一从集群
3.1
接下来启动另一个容器作为从数据库, 因为镜像不支持在容器内进入 mysql 控制
台,所以依然需要把端口暴露出来以供局域网访问,但主数据库容易可以链接进
来作为一个可访问的主机 master_db。
docker run --name <从数据库名> -e MYSQL_ROOT_PASSWORD=<从数据库 root
密码> --link <主数据库容器名>:master_db -d mariadb
3.2
接下来就需要配置两个数据库了,前提工作是镜像中并没有自带 vi,所以在两
个容器内都需要:
apt-get update
apt-get install vim
这样我们才能在容器内修改配置文件。
还有一种方法,就是我们在主数据库容器中操作,之后,使用
docker commit <主数据库容器名> mariadb
这样再创建的容器就包含 vi 了。
3.3
为讲述方便,现在假设:我们有了连个数据库,mdb1 和 mdb2, mdb1 我们作为主
数据库,mdb2 作为从数据库。
首先修改主数据库:
docker exec -it mdb1 /bin/bash
进入主数据库容器内之后,
vi /etc/mysql/my.cnf
把“server-id = 1”行的注释去掉即可,保存,退出容器,然后
docker restart mdb1
同样的,把从数据库的 my.cnf 修改“server-id = 2”,需要是比主 server-id
大的数字,mdb2 同样需要重启。
3.4
使用客户端连接上主数据库,这里我使用的是 mysql workbench,从数据库因为
安全考虑并没有公开端口给主机,只能进入容器的 mysql 控制台进行操作。
在主数据库中执行 SQL 脚本:
/*设定用于同步的账号、密码*/
grant replication slave on *.* to ‘sync’@'%' identified by 'sync';
/*保存权限设定*/
flush privileges;
/*查看主数据日志状态,需要记住查询结果 File 和 Position 值,是从数据库复
制的日志起点*/
show master status;
在从数据库中执行 SQL 脚本:
/*如果已经开启了同步,停止同步*/
stop slave;
/*设定主数据库*/
change master to
master_host='master_db',
master_user='sync',
master_password='sync',
master_port=3306,
master_log_file='<主数据库查询得到的 File 值>',
master_log_pos=<主数据库查询得到的 Positions 值>;
下面是我的脚本例子:
change master to
master_host='master_db',
master_user='sync',
master_password='sync',
master_port=3306,
master_log_file='mariadb-bin.000004',
master_log_pos=789;
/*开启从数据库复制*/
start slave;
最后可以通过
show slave status;
查看同步情况。
至此我们就建立了一个基于 Docker 的 Mariadb 数据库
使用 Docker 建立 Mysql 集群的更多相关文章
- docker 下 mysql 集群的搭建
下载程序&&创建docker容器 从mysql官网https://dev.mysql.com/downloads/cluster/上下载mysql集群库mysql-cluster-gp ...
- Docker部署Mysql集群
单节点数据库的弊病 大型互联网程序用户群体庞大,所以架构必须要特殊设计 单节点的数据库无法满足性能上的要求 单节点的数据库没有冗余设计,无法满足高可用 单节点MySQL的性能瓶领颈 2016年春节微信 ...
- docker 搭建Mysql集群
docker基本指令: 更新软件包 yum -y update 安装Docker虚拟机(centos 7) yum install -y docker 运行.重启.关闭Docker虚拟机 servic ...
- docker搭建mysql集群
目录 一.集群方案 二.安装PXC集群 三.Haproxy负载均衡 四.访问测试 五.节点宕机或重启 六.参考 一.集群方案 1.Replication 速度快,但仅能保证弱一致性,适用于保存价值不高 ...
- docker PXC MYSQL集群节点启动失败/节点顺序消失/只剩一个节点存在问题的解决
转载于:https://my.oschina.net/u/4884318/blog/4908669 大牛 佩服此人 截取本人遇到的问题: "error:0407008A:rsa routin ...
- Docker安装MySQL集群【读写分离】
Centos7系统Docker安装 目录 Centos7系统Docker安装 目录 Centos7系统Docker安装 1.下载mysql镜像 2.创建Master实例并启动 参数说明 3.创建Sla ...
- MySQL集群之MyCat
MySQL集群之MyCat 一.MyCat简介及分析 1.1 MyCat是什么? 1.2 关键特性及应用场景 1.2.1 关键特性 1.2.2 应用场景 1.2.3 MyCat不适合的应用场景 1.3 ...
- Docker环境下的前后端分离项目部署与运维(六)搭建MySQL集群
单节点数据库的弊病 大型互联网程序用户群体庞大,所以架构必须要特殊设计 单节点的数据库无法满足性能上的要求 单节点的数据库没有冗余设计,无法满足高可用 单节点MySQL的性能瓶领颈 2016年春节微信 ...
- docker搭建基于percona-xtradb-cluster方案的mysql集群
一.部署环境 序号 hostname ip 备注 1 manager107 10.0.3.107 centos7;3.10.0-957.1.3.el7.x86_64 2 worker68 10.0.3 ...
随机推荐
- SQL里的EXISTS与in、not exists与not in
系统要求进行SQL优化,对效率比较低的SQL进行优化,使其运行效率更高,其中要求对SQL中的部分in/not in修改为exists/not exists 修改方法如下: in的SQL语句 SELEC ...
- ASP.Net 5 上传文件通过虚拟路径存储
先贴上代码 [HttpPost] public IActionResult ImportTeaching(IFormFile file) { string root = @"Temp/tea ...
- C#编程总结 dynamic(转)
介绍 Visual C# 2010 引入了一个新类型 dynamic. 该类型是一种静态类型,但类型为 dynamic 的对象会跳过静态类型检查. 大多数情况下,该对象就像具有类型 object 一样 ...
- 读<你必须知道的.NET>IL指令笔记
IL指令笔记: 1.newObj和initObj MSDN解释:newObj用于分配和初始化对象,而initObj用户初始化值类型 newObj解释: (1):从托管堆分配指定类型所需要的全部内存空间 ...
- tolua.cast的实用方法
local name = (tolua.cast(sender, "ccui.Button")):getTitleText()
- windows路径操作API函数
备用,方便查找: PathRemoveArgs 去除路径的参数 PathRemoveBackslash 去除路径最后的反斜杠"\" PathAddBackslash 在 ...
- reverse array java
/* package whatever; // don't place package name! */ import java.util.*; import java.lang.*; import ...
- 他们在军训,我在搞 OI(四)
(怎么自动变成两天一更了?) ——因为我菜啊 T_T Day 5 今天上午刷得爽啊!5 道 NOIP,前四题直接 1A,然而最后一题还是 WA 了一发才 A... 第一题是个简单的贪心,题意大概是 n ...
- Python机器学习库scikit-learn实践
原文:http://blog.csdn.net/zouxy09/article/details/48903179 一.概述 机器学习算法在近几年大数据点燃的热火熏陶下已经变得被人所“熟知”,就算不懂得 ...
- sql注入攻击的预防函数
/* 待更新 */ addslashes htmlspecialchars mysql_escape_string($string) mysql_real_escape_string($strin ...