暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

第一篇:centos7+Docker+Mysql主从

重塑之路 2020-04-19
430

        由于下一步Nacos需要数据库环境,所以先把数据库搭建完成,顺便先做个redis单机

        以下环境基于上一篇说过的环境,不在叙述,以后默认window10开发,组件环境基于docker容器,不在详说。

        开始。


            

下载最新VMware Workstation 15 Player 安装过程不详述,。

在VM中安装Centos7,过程不详述,有问题请百度。

安装docker:

yum install -y docker
复制


 补充命令:

启动:systemctl start docker
开机启动:systemctl enable docker
重启:systemctl restart docker
复制

Docker 镜像加速:

编辑  vi /etc/docker/daemon.json
复制


搭建Mysql 主从:

拉取Mysql镜像:

docker pull mysql:8.0
复制

启动镜像,一主(mysqlmaster)二从(mysqlslave1、mysqlslave2)

docker run -p 3000:3306 --name mysqlmaster -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0
docker run -p 3001:3306 --name mysqlslave1 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0
docker run -p 3002:3306 --name mysqlslave2 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0
复制

执行过程

[root@localhost was]# docker images 
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@localhost was]# docker pull mysql:8.0
Trying to pull repository docker.io/library/mysql ...
8.0: Pulling from docker.io/library/mysql
123275d6e508: Pull complete
27cddf5c7140: Pull complete
c17d442e14c9: Pull complete
5fc78b1e06f8: Pull complete
cd38802f42bb: Pull complete
b370e336f220: Pull complete
f519d6d4d2f6: Pull complete
c52c0310cd34: Pull complete
cd74fd7796ae: Pull complete
3f08e322a29c: Pull complete
2caa0eda62a7: Pull complete
eac28354a6fe: Pull complete
Digest: sha256:7901b65a6be478f7f15348dec0440c491a364af202112c61cb3925d7fb67d8f4
Status: Downloaded newer image for docker.io/mysql:8.0
[root@localhost was]# docker run -p 3000:3306 --name mysqlmaster -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0
87b18ef6fdd08f04e4707e91e68b1e2ea555968b8273a3472700f119bf65157d
[root@localhost was]# docker run -p 3001:3306 --name mysqlslave1 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0
8894535bf6da2c14b1df74a0a7f66a6e58d748bfdfe489780366e6bec580335e
[root@localhost was]# docker run -p 3002:3306 --name mysqlslave2 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0
b19c6b9d0845b06287b78627e1b45a2a6524c6382a2ab00608cbd8630bf3e64d
[root@localhost was]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/mysql 8.0 0f39f4b4d96c 28 hours ago 547 MB
[root@localhost was]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b19c6b9d0845 mysql:8.0 "docker-entrypoint..." 23 seconds ago Up 18 seconds 33060/tcp, 0.0.0.0:3002->3306/tcp mysqlslave2
8894535bf6da mysql:8.0 "docker-entrypoint..." 41 seconds ago Up 36 seconds 33060/tcp, 0.0.0.0:3001->3306/tcp mysqlslave1
87b18ef6fdd0 mysql:8.0 "docker-entrypoint..." 52 seconds ago Up 51 seconds 33060/tcp, 0.0.0.0:3000->3306/tcp mysqlmaster
[root@localhost was]
复制

docker images:查看当前镜像

docker pull mysql:8.0 从中央仓库(上面修改镜像加速的地址)拉取名称为mysql:8.0的镜像

docker run -p 3000:3306 --name mysqlmaster -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0
复制


docker run 启动镜像

-p 3000:3306 使用宿主机3000端口映射容器3306端口

--name mysqlmaster 容器名称为 mysqlmaster 

-e MYSQL_ROOT_PASSWORD=123456 设置mysql密码为 123456

-d mysql:8.0 容器使用镜像名称为mysql:8.0的镜像启动

docker ps -a  查看当前容器

CONTAINER ID 容器ID

IMAGE 容器使用镜像

COMMAND 最后执行命令

CREATED  创建时间

STATUS  容器状态

PORTS 容器端口

NAMES 容器名称


开始主从配置

搭建过程参考: https://www.cnblogs.com/songwenjie/p/9371422.html

[root@localhost was]# docker ps -a 
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b19c6b9d0845 mysql:8.0 "docker-entrypoint..." About an hour ago Up About an hour 33060/tcp, 0.0.0.0:3002->3306/tcp mysqlslave2
8894535bf6da mysql:8.0 "docker-entrypoint..." About an hour ago Up About an hour 33060/tcp, 0.0.0.0:3001->3306/tcp mysqlslave1
87b18ef6fdd0 mysql:8.0 "docker-entrypoint..." About an hour ago Up About an hour 33060/tcp, 0.0.0.0:3000->3306/tcp mysqlmaster
[root@localhost was]# docker exec -it 87b18ef6fdd0 /bin/bash
root@87b18ef6fdd0:/# cd /etc/mysql
root@87b18ef6fdd0:/etc/mysql# vi my.cnf
bash: vi: command not found
root@87b18ef6fdd0:/etc/mysql# apt-get install vim
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package vim
root@87b18ef6fdd0:/etc/mysql# apt-get update
·········


复制

docker exec -it 87b18ef6fdd0 /bin/bash 进入容器ID为87b18ef6fdd0 (Master)的容器

vi my.cnf  编辑MySql配置文件

因为镜像没有vim,所以需要先安装vim,安装vim如果报错,需要先更新apt-get update

vim my.cn
复制

然后在[mysqld]节点下添加

[mysqld]
## 同一局域网内注意要唯一
server-id=100
## 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin
复制

保存退出容器,然后重启容器

docker restart mysqlmaster
复制

 连接mysql数据库,并创建主从同步账户

root@87b18ef6fdd0:/# mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor......


mysql> CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.10 sec)
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
Query OK, 0 rows affected (0.01 sec)
复制

配置从库以mysqlslave1为例:

进入容器,编辑my.cnf

[mysqld]
## 设置server_id,注意要唯一
server-id=101
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-slave1-relay-bin
复制

完成后重启容器

mysqlslave2同样操作,注意mysqlslave2的server-id=102

Master(主)和Slave(从)配置

在Master容器中进入mysql,执行show master status;

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 711 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
复制

记住 File Position后面要用

进入mysqlslave1 容器,进入mysql执行:

change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 711, master_connect_retry=30;
复制

命令说明:

master_host :Master的地址,指的是容器的独立ip,可以通过docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称|容器id
查询容器的ip

[root@localhost was]# docker inspect --format='{{.NetworkSettings.IPAddress}}' mysqlmaster
172.17.0.2
[root@localhost was]# docker inspect --format='{{.NetworkSettings.IPAddress}}' mysqlslave1
172.17.0.3
[root@localhost was]# docker inspect --format='{{.NetworkSettings.IPAddress}}' mysqlslave2
172.17.0.4
复制

master_port:Master的端口号,指的是容器的端口号

master_user:用于数据同步的用户

master_password:用于同步的用户的密码

master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值

master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值

master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒

在Slave 中的mysql终端执行show slave status \G;
用于查看主从同步状态。

正常情况下,SlaveIORunning 和 SlaveSQLRunning 都是No,因为我们还没有开启主从复制过程。使用start slave
开启主从复制过程,然后再次查询主从同步状态show slave status \G;

如果SlaveIORunning一直是Connecting,则说明主从复制一直处于连接状态,看err信息,应该是密码问题。

解决方法:

进入master容器的mysql执行:

输入ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

然后重新配置主从关联即可

注意:需要先停止主从同步: stop slave ;

然后在master重新执行查询:

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 994 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)


复制

在mysqlslave1 重新配置主从关联,修改master_log_pos的值为新的Position

mysql> stop slave ;
Query OK, 0 rows affected (0.03 sec)


mysql> change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 994, master_connect_retry=30;
Query OK, 0 rows affected, 2 warnings (0.03 sec)
复制

SlaveIORunning 和 SlaveSQLRunning 都是Yes,说明主从复制已经开启。此时可以测试数据同步是否成功。

mysqlslave2 同样进行主从同步配置


使用数据库连接工具连接一主二从数据库


在主库创建数据库测试

刷新从库:

看到两个从库都已经更新,说明主从配置成功。

缺陷,这种做法,所有从库可接受主库的变更,而主库不接受从库的变更。


本篇到此为止,后续有更深的研究使用后续再更新,目前知识仅到这里。欢迎拍砖!

如果你觉得对你有用,请关注下呗,点个在看也行!

文章转载自重塑之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论