docker+mysql+中数据_docker+mysql 构建数据库的主从复制

docker+mysql 构建数据库的主从复制

在最近的项目中,决定将项目改造成数据库读写分离的架构,后续会有博文详细讲述我的开发改造,本文主要记录我是如何一步步的构建数据库的主从复制。

为什么使用docker

资源有限

虚拟机搭建对机器配置有要求,并且安装mysql步骤繁琐

一台机器上可以运行多个Docker容器

Docker容器之间相互独立,有独立ip,互不冲突

Docker使用步骤简便,启动容器在秒级别

最主要是穷,没有多的服务器供我用

首先拉取docker镜像,我这里直接拉取最新的mysql

docker pull mysql

根据拉取的对象,分别启动两个容器:

Master:

docker run -d -p 3339:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 mysql

Slave

docker run -d -p 3340:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 mysql

之后可以使用docker ps命令查看正在运行的容器

951f892f6095328d134eb988272c7e6d.jpg

接下来开始写配置文件

配置Master(主)

docker exec -it mysql-master /bin/bash 进入到master容器内

vim /etc/mysql/my.cnf 编辑mysql的配置文件,一般会出现如下错误:

bash: vi: command not found

说明该镜像还没有安装该命令,这时只需要我们使用 apt-get install vim即可,当然了,敲完这个命令可能出现如下图所示的错误,原因是包没有更新,我们只需要执行 apt-get update ,之后再执行上述命令即可。

2dc171643ebb1763402b7e0c699d979e.jpg

3. 然后我们就可以使用vim编辑my.cnf,在my.cnf中添加如下配置

[mysqld]

## 同一局域网内注意要唯一

server-id=100

## 开启二进制日志功能,可以随便取(关键)

log-bin=mysql-bin

4.下一步在Master数据库创建数据同步用户,首先使用mysql -u root -p123456 进入到mysql客户端中,执行下述语句,授予用户 slave REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据。

CREATE USER 'slave'@'%' IDENTIFIED BY '123456';

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

4.退出容器(使用ctl + q + p同时多按几次即可退出),执行docker restart mysql-master重启容器,然后再次进入到容器的mysql服务之中,

5.执行 show master status 查看master状态,记住这两个值

437b29b22cd3d5674cfa246da6136d26.jpg

配置Master(从)

和配置Master(主)一样,在Slave配置文件my.cnf中添加如下配置:

[mysqld]

## 设置server_id,注意要唯一

server-id=101

## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用

log-bin=mysql-slave-bin

## relay_log配置中继日志

relay_log=edu-mysql-relay-bin

链接Master(主)和Slave(从)

在Slave中进入到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=2830, master_connect_retry=30;

命令说明:

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

858b3e2ea86a32f37128ea9b02b3f2df.jpg

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;用于查看主从同步状态。

e7ad5bcfbbe048db9ee85f4db5ea1a62.jpg

了解Mysql主从复制的都知道这两个线程的作用,IO线程主要用来链接主节点,简单来说就是捞数据用到,SQL线程将捞过来的数据进行解析并运行,这样主从之间的数据就进行了同步。

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

a14cc9eb2495e025ccd71e7302db0e15.jpg

当图中两个线程均是yes的时候说明启动正常,至此配置结束,但是,一般会出现以下的情况:

mysql> show slave status \G

*************************** 1. row ***************************

Slave_IO_State: Connecting to master

Master_Host: 192.168.1.3

Master_User: replication

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysql-bin.000002

Read_Master_Log_Pos: 734

Relay_Log_File: mysql-relay-bin.000002

Relay_Log_Pos: 4

Relay_Master_Log_File: mysql-bin.000002

Slave_IO_Running: Connecting

Slave_SQL_Running: Yes

Replicate_Do_DB:

Replicate_Ignore_DB:

Replicate_Do_Table:

Replicate_Ignore_Table:

Replicate_Wild_Do_Table:

Replicate_Wild_Ignore_Table:

Last_Errno: 0

Last_Error:

Skip_Counter: 0

Exec_Master_Log_Pos: 734

Relay_Log_Space: 155

Until_Condition: None

Until_Log_File:

Until_Log_Pos: 0

Master_SSL_Allowed: No

Master_SSL_CA_File:

Master_SSL_CA_Path:

Master_SSL_Cert:

Master_SSL_Cipher:

Master_SSL_Key:

Seconds_Behind_Master: NULL

Master_SSL_Verify_Server_Cert: No

Last_IO_Errno: 2061

Last_IO_Error: error connecting to master 'replication@192.168.1.3:3306' - retry-time: 60 retries: 12

Last_SQL_Errno: 0

Last_SQL_Error:

Replicate_Ignore_Server_Ids:

Master_Server_Id: 0

Master_UUID:

Master_Info_File: mysql.slave_master_info

SQL_Delay: 0

SQL_Remaining_Delay: NULL

Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates

Master_Retry_Count: 86400

Master_Bind:

Last_IO_Error_Timestamp: 190129 14:09:22

Last_SQL_Error_Timestamp:

Master_SSL_Crl:

Master_SSL_Crlpath:

Retrieved_Gtid_Set:

Executed_Gtid_Set:

Auto_Position: 0

Replicate_Rewrite_DB:

Channel_Name:

Master_TLS_Version:

Master_public_key_path:

Get_master_public_key: 0

Slave_IO_Running线程一直显示正在连接状态,错误码是2061,是因为我们拉取的惊醒默认是最新的,也就是Mysql8.0,MySQL8.0默认指定使用需要SSL的身份验证插件caching_sha2_password,而我们在创建同步复制账号时候没有指定REQUIRE SSL。为了降低这件事情的复杂性,我们选择了社区的解决方法,选择绕过SSL插件的验证,改为mysql_native_password验证来做同步复制。

解决:

重新创建MySQL复制账号,创建账号时指定身份验证方法

mysql> CREATE USER 'slave'@'%' IDENTIFIED WITH 'mysql_native_password' BY '123456';

mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

mysql> FLUSH PRIVILEGES;

此时再查看该用户的密码加密方式,plugin为mysql_native_password

mysql> select user,host,plugin,authentication_string from user \G

*************************** 1. row ***************************

user: repl

host: 192.168.1.3

plugin: mysql_native_password

authentication_string: *47C25685DDCE2754F1175C38F437961FF6C5AC53

再次设置同步成功

4c8e2ea4f1c2d800b84a7ec663684338.jpg

测试主从复制

我们可以在master上创建一个数据库,然后检查slave是否也创建了该库。

Master:

583077c665ad9d61f20f6fd54d893781.jpg

Slave:

0706344020e3b077cf0021e01ef436b0.jpg

至此,大功告成!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
未来社区的建设背景和需求分析指出,随着智能经济、大数据、人工智能、物联网、区块链、云计算等技术的发展,社区服务正朝着数字化、智能化转型。社区服务渠道由分散向统一融合转变,服务内容由通用庞杂向个性化、服务导向转变。未来社区将构建数字化生态,实现数据在线、组织在线、服务在线、产品智能和决策智能,赋能企业创新,同时注重人才培养和科研平台建设。 规划设计方面,未来社区将基于居民需求,打造以服务为心的社区管理模式。通过统一的服务平台和应用,实现服务内容的整合和优化,提供灵活多样的服务方式,如推送式、订阅式、热点式等。社区将构建数据与应用的良性循环,提高服务效率,同时注重生态优美、绿色低碳、社会和谐,以实现幸福民生和产业发展。 建设运营上,未来社区强调科学规划、以人为本,创新引领、重点突破,统筹推进、整体提升。通过实施院落+社团自治工程,转变政府职能,深化社区自治法制化、信息化,解决社区治理的重点问题。目标是培养有活力的社会组织,提高社区居民参与度和满意度,实现社区治理服务的制度机制创新。 未来社区的数字化解决方案包括信息发布系统、服务系统和管理系统。信息发布系统涵盖公共服务类和社会化服务类信息,提供政策宣传、家政服务、健康医疗咨询等功能。服务系统功能需求包括办事指南、公共服务、社区工作参与互动等,旨在提高社区服务能力。管理系统功能需求则涉及院落管理、社团管理、社工队伍管理等,以实现社区治理的现代化。 最后,未来社区建设注重整合政府、社会组织、企业等多方资源,以提高社区服务的效率和质量。通过建立社区管理服务综合信息平台,提供社区公共服务、社区社会组织管理服务和社区便民服务,实现管理精简、高效、透明,服务快速、便捷。同时,通过培育和发展社区协会、社团等组织,激发社会化组织活力,为居民提供综合性的咨询和服务,促进社区的和谐发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值