docker中Mylsq的主从搭建(超详细)一主多从

database

1. 安装docker

这里可以参考菜鸟教程的CentOS安装docker , https://www.runoob.com/docker/centos-docker-install.html

2. Docker中使用挂载模式安装mysql

          使用docker pull mysql:5.7.31,从docker仓库中拉取mysql5.7.31版本

            使用docker images 查看本地的docker镜像,这个IMAGE ID很重要,虽然docker可以用应用的名称来启动,但是我建议还是使用IMAGE ID,稳一手。

          然后我们进入home目录(home目录是我自己的习惯,你们可以选择其他文件夹),创建以下的文件结构

home  

|                    ├ master

|                    |                    ├ my.cnf mysql外挂配置文件

|                    |                    ├ /mysql mysql数据以及日志文件存储地址

|               |                    ├ /conf.d mysql多配置文件存储地址(本文中未使用)

|                    ├ slave1

|                    |                    ├ my.cnf mysql外挂配置文件

|                    |                    ├ /mysql mysql数据以及日志文件存储地址

|               |                    ├ /conf.d mysql多配置文件存储地址(本文中未使用)

|                    ├ slave2

|                    |                    ├ my.cnf mysql外挂配置文件

|                    |                    ├ /mysql mysql数据以及日志文件存储地址

|               |                    ├ /conf.d mysql多配置文件存储地址(本文中未使用)

            /home/master/my.cnf/home/slave1/my.cnf/home/slave2/my.cnf写入基础的mysql配置,这个步骤主要是要实现配置文件的挂载,稍后会写入主从的配置,写完my.cnf文件之后把文件权限设置为chmod 755 my.cnfchmod 777 mysql/chmod 777 conf.d/,否则docker无法读取文件和文件夹。

[mysqld]

user=mysql

datadir = /var/lib/mysql/data

character-set-server=utf8

default_authentication_plugin=mysql_native_password

[client]

default-character-set=utf8

[mysql]

default-character-set=utf8

运行命令

docker run --restart=always --privileged=true -d -v /home/mysql/master/mysql/:/var/lib/mysql -v /home/mysql/master/conf.d:/etc/mysql/conf.d -v /home/mysql/master/my.cnf:/etc/mysql/my.cnf -p 0.0.0.0:3307:3306/tcp --name mysql-master-dev -e MYSQL_ROOT_PASSWORD=123456 d05c76dbbfcf(这里替换成你自己的镜像源ID)

参数解析:

--restart 设置容器自动重启。

-- privileged 设置容器内的bash用户权限为root

-v 挂载环境,后面携带的参数和你要挂载的mysql类型一致,例如Master使用master文件夹下的文件和文件夹,Slave用对应slave下的文件和文件夹。

-p 端口号,端口我们修改一下,Master使用3307Slave1使用3317Slave2使用3327

--name 容器名,docker容器的名字是唯一的,不可重复。

-e 容器启动参数,这里我们设置mysql的root用户密码

 

            启动完三个mysql之后,可以看一下我们在运行的容器 docker ps。可以看到我们的主从mysql都已经启动完毕了。

3. 配置mysql的主从

      创建测试用的demo数据库,三个mysql中都创建,如果配置已有数据的数据库,则先停止mysqlMaster写入功能,将数据库备份至从库。

配置Master:编辑 /home/mysql/master/my.cnf文件

[mysqld]

user = mysql

datadir = /var/lib/mysql/data

character-set-server = utf8

default_authentication_plugin = mysql_native_password

#新增配置(记得把注解删掉,文本的编码不一致时,mysql无法识别配置文件)

#服务器ID,要求唯一,主从的server_id不能相同

server_id = 1

#log_bin文件地址(docker容器中地址)

log-bin = /var/lib/mysql/data/logs/mysql-bin

#需要同步的数据库,可以有多个

binlog-do-db = demo

#binlog-do-db=demo2

#开启Slave记录日志

log-slave-updates

#执行事物多少次之后,将执行sql记录到磁盘中

sync_binlog = 1

#自增偏移量:自增长字段从那个数开始,他的取值范围是

auto_increment_offset = 1

#自增步长:自增长字段每次递增的量

auto_increment_increment = 1

#日志清理时间(天)

expire_logs_days = 7

#信任存储函数创建者

log_bin_trust_function_creators = 1

#bin_log日志记录模式

#bin_log复制类型

#          Statement(默认格式):每一条会修改数据的 SQL 都会记录到 master 的 bin-log 中。slave 在复制的时候 SQL 进程会解析成和原来 master 端执行过的相同的 SQL 再次执行。

#          Row:日志中会记录成每一行数据被修改的形式,然后在 slave 端再对相同的数据进行修改。

#          Mixed:MySQL 会根据执行的每一条具体的 SQL 语句来区分对待记录的日志形式,也就是在 statement 和 row 之间选择一种。

binlog_format=mixed

#新增配置(记得把注解删掉,文本的编码不一致时,mysql无法识别配置文件)

[client]

default-character-set=utf8

[mysql]

default-character-set=utf8

            使用docker ps命令,查看Master主机的CONTAINER ID

            重启Master主机:docker restart cbff024b99f9(你自己的container id -t 1

            配置Slave:编辑/home/mysql/slave1/my.cnf文件

            使用docker ps命令,查看Slave主机的CONTAINER ID

            重启Slave1主机:docker restart cbff024b99f9(你自己的container id -t 1

[mysqld]

user=mysql

datadir = /var/lib/mysql/data

character-set-server=utf8

default_authentication_plugin=mysql_native_password

#新增配置(记得把注解删掉,文本的编码不一致时,mysql无法识别配置文件)

#与Master相同配置不再赘述

server_id = 2

log-bin = mysql-bin

log-slave-updates

sync_binlog = 0

innodb_flush_log_at_trx_commit = 0       

#从机复制那个库

replicate-do-db = demo     

#设置在多少秒没收到主库传来的Binary Logs events之后,从库认为网络超时,Slave IO线程会重新连接主库。

slave-net-timeout = 60                   

log_bin_trust_function_creators = 1

#新增配置(记得把注解删掉,文本的编码不一致时,mysql无法识别配置文件)

[client]

default-character-set=utf8

[mysql]

default-character-set=utf8

            同理,修改Slave2的配置。

           

            使用docker inspect cbff024b99f9(你自己的container id,

            查看MasterSlavedocker内的IP地址:

           

            可以看到MasterIPAddress172.17.0.2

            同理可得Slave1IPAddress172.17.0.3Slave2IPAddress172.17.0.4

            创建Slave的账号,登录Master机器,

            grant replication slave on *.* to "slave1Slave1用户名)"@"172.17.0.3Slave1IP地址)" identified by "123456Slave1密码)";

grant replication slave on *.* to "slave2Slave2用户名)"@"172.17.0.4Slave2IP地址)" identified by "123456Slave2密码)";

            flush privileges;

 

            然后查看Master的状态,show master status

            进入Slave1,执行

            change master to master_host="172.17.0.2",master_user="slave1",master_password="123456",master_log_file="mysql-bin.000001",master_log_pos=3379;

            master_log_file为刚刚查看主机状态的File值。

            master_log_pos为刚刚查看主机状态的Position值。

            Slave2同理

4. 测试主从

进入demo数据库,创建demo表,

CREATE TABLE `demo` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `name` varchar(255) DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

insert into demo(name) values ("张三"),("李四")

 

然后查看slave1和slave2的demo表中数据,如果与mater中数据一致,则docker中主从搭建成功。

以上是 docker中Mylsq的主从搭建(超详细)一主多从 的全部内容, 来源链接: utcz.com/z/534980.html

回到顶部