docker环境下搭建mysql的主从以及数据库配置。

搭建主从数据库是数据库优化的一个非常有效的手段。

主从数据库顾名思义就是 2个数据库。一般来讲就是 一个叫主数据库。另一个叫从数据库。这就是我们所说的一主一从。主从数据库的好处是我们可以对数据操作进行读写分离。也可以这样理解。一台数据库负责写数据。另一台数据库负责读数据。可以减轻数据库同时读写的压力。提高数据库的性能。非常适合在大访问量的应用下使用。

mysql 是 开源的一款关系型数据库。数据库性能非常优秀。因此采用mysql来搭建主从数据库 效果还是不错的。下图是一个比较简单易扩展的服务器集群架构图。我们可以打架多个php-fpm容器 和多个从数据库容器来提升服务器性能和负载量

制作基础镜像容器

编写Dockerfile 镜像文件

vim Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

#设置继承镜像
FROM ubuntu:14.04
#提供一些作者的信息
MAINTAINER xyzphp from (501773740@qq.com)
#下面开始运行命令,此处更改ubuntu的源为国内163的源
RUN echo "deb http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse" > /etc/apt/sources.list
RUN echo "deb http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse" >> /etc/apt/sources.list
RUN apt-get update
#更改系统时区

RUN echo "Asia/Shanghai" > /etc/timezone && dpkg-reconfigure -f noninteractive tzdata
#注意这里要更改系统的时区设置,因为在 web 应用中经常会用到时区这个系统变量,默认的 ubuntu 会让你的应用程序发生不可思议的效果哦



#安装 ssh 服务
RUN apt-get install -y openssh-server
RUN mkdir -p /var/run/sshd
RUN mkdir -p /root/.ssh
#取消pam限制

RUN sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd

#复制配置文件到相应位置,并赋予脚本可执行权限
ADD authorized_keys /root/.ssh/authorized_keys
ADD run.sh /run.sh
RUN chmod 755 /run.sh

#开放端口
EXPOSE 22

#设置自启动命令
CMD ["/run.sh"]

编写run.sh shell脚本

vim run.sh
1
2
3

#!/bin/bash
/usr/sbin/sshd -D

构建一个sshd 的镜像

docker build -t sshd .

构建一个mysql 镜像

git clone https://github.com/DockerPool/mysql.git
cd mysql
docker build -t mysql .

创建一个主数据库容器

docker run -d -e REPLICATION_MASTER=true -e MYSQL_PASS="123456" -P --name mysql mysql

创建一个从数据库容器

docker run -d -e REPLICATION_SLAVE=true -e MYSQL_PASS="123456" -P --link mysql:mysql mysql

查看两个数据库容器是否运行

docker ps -a
1
2
3
4

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c8e37ebffc15 mysql "/run.sh" 22 hours ago Up 22 hours 0.0.0.0:32797->22/tcp, 0.0.0.0:32796->3306/tcp insane_rosalind
ad7f81063654 mysql "/run.sh" 22 hours ago Up 22 hours 0.0.0.0:32795->22/tcp, 0.0.0.0:32794->3306/tcp mysql

主从数据库至此已搭建完成

接下来做个测试吧

主数据库测试

mysql -h127.0.0.1 -P32794 -uadmin -p123456
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

mysql> create database hi_db;
Query OK, 1 row affected (0.00 sec)

mysql> use hi_db;
Database changed

mysql> create table hi_tb(id int(3),name char(10));
Query OK, 0 rows affected (0.00 sec)

mysql> insert into hi_tb values(001,'bobu');
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hi_db |
| mysql |
| test |
+--------------------+
4 rows in set (0.00 sec)

从服务器Mysql查询:

mysql -h127.0.0.1 -P32794 -uadmin -p123456
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

mysql> show databases;

+--------------------+
| Database |
+--------------------+
| information_schema |
| hi_db | //I'M here,大家看到了吧
| mysql |

| test |
+--------------------+
4 rows in set (0.00 sec)

mysql> use hi_db
Database changed
mysql> select * from hi_tb; //查看主服务器上新增的具体数据
+------+------+
| id | name |
+------+------+
| 1 | bobu |
+------+------+
1 row in set (0.00 sec)

从上面的测试可以看出 主数据库插入一条数据后从服务器也会更新出这个条数据。接下来说一下实现的技术原理 是通过两台服务器开启了bin-log日志 通过慢查询日志 让两台数据库的数据进行同步。 剩下我们只管在php的代码里书写业务逻辑就ok。 插入数据的时候 连接主数据库。查询数据的时候连接从数据库。 用金星老师的一句话 完美。