mysql 主从复制 docker_Docker如何实现MySQL主从复制

MySQL实现主从复制

84ae53c192c09b22b9bb73847aaa2850.png

Docker容器

一、安装Centos 7纯净镜像

前提条件:已正确安装Docker

1.拉取一个纯净Centos 7镜像

从阿里镜像中心拉取一个纯净Centos 7纯净镜像[root@localhost ~]# docker pull centos

2.创建2个容器 Mysql_Master/Mysql_Slave

查看已经拉取的镜像[root@localhost ~]# docker images

REPOSITORY                                          TAG                 IMAGE ID            CREATED             SIZE

centos                                              latest              e934aafc2206        2 weeks ago         199MB

创建mysql_master 容器[root@localhost ~]# docker run --privileged -ti --name mysql_master centos:latest /usr/sbin/init

创建mysql_slave 容器[root@localhost ~]# docker run --privileged -ti --name mysql_slave centos:latest /usr/sbin/init

查看已经存在的容器列表信息[root@localhost ~]# docker ps -a

CONTAINER ID        IMAGE                                COMMAND                  CREATED              STATUS                     PORTS                                                                                                                      NAMES81c75e5b943d        e934aafc2206                         "/usr/sbin/init"         About a minute ago   Up About a minute                                                                                                                                     mysql_slave4c17cbb73b09        e934aafc2206                         "/usr/sbin/init"         3 minutes ago        Up 3 minutes                                                                                                                                          Mysql_master

3.上传Mysql安装RPM源文件进行Mysql安装

拷贝宿主机安装源文件到docker容器[root@localhost home]# docker cp /home/mysql57-community-release-el7-11.noarch.rpm  mysql_master:/root/

[root@localhost home]# docker cp /home/mysql57-community-release-el7-11.noarch.rpm  mysql_slave:/root/

进入docker 容器,进行Mysql安装[root@localhost home]# docker exec -it mysql_master /bin/bash

[root@4c17cbb73b09 ~]# rpm -ivh mysql57-community-release-el7-11.noarch.rpm

开始Master容器安装Mysql[root@4c17cbb73b09 ~]# yum install -y mysql-server

启动容器的Mysql[root@e314477e8ba4 ~]# systemctl start mysqld

同样的操作,进入mysql_slave 节点,进行Mysql安装[root@localhost ~]# docker cp /home/mysql57-community-release-el7-11.noarch.rpm  mysql_slave:/root/

[root@localhost ~]# docker exec -it mysql_slave /bin/bash

[root@e85d5de9eb0d ~]# rpm -ivh mysql57-community-release-el7-11.noarch.rpm

[root@4c17cbb73b09 ~]# yum install -y mysql-server

查看master节点Mysql默认密码[root@e85d5de9eb0d ~]# grep 'temporary password' /var/log/mysqld.log

设置mysql初始密码mysql> set global validate_password_policy=0;

mysql> set global validate_password_length=1;

mysql> set password = password('zyl00712');

允许root远程登录mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'zyl00712' WITH GRANT OPTION;

mysql> flush privileges;

同理,登录slave节点,设置slave mysql默认密码,授权远程访问,此处不再赘述。

二、Mysql主从复制的配置实现

7a67c8bbb9b101d855fcc0d324b6bcb9.png

主从复制实现原理

主从复制实现原理:

主从复制通过BinLog+中继日志文件实现MySQL数据同步,其中BinLog为二进制文件,MySQL日志文件记录了DDLhe DML

Relay-log(中继日志):主要永固同步的中间过程

1. 创建同步复制的用户mysql> create user 'repl'@'172.17.0.%' identified by 'zyl00712';

2.给同步用户赋权mysql> grant replication slave on *.* to 'repl'@'172.17.0.%' identified by 'zyl00712';

mysql> flush privileges;

3.开启binLog二进制日志

修改 /etc/my.cnf 文件增加以下内容

[client]

port                        = 3306

socket                      = /var/lib/mysql/mysql.sock

[mysqld]

# 此server-id 每台机器唯一

server-id                    = 2

port                         = 3306

datadir                      = /var/lib/mysql

socket                       = /var/lib/mysql/mysql.sockdefault-storage-engine       = InnoDBlog-bin                      = mysql-binlog-bin-index                = mysql-bin.index

relay-log                    = mysql-relay

relay-log-index               = mysql-relay.index

expire-logs-days              = 10

max-binlog-size              = 100M

max_binlog_cache_size        = 8Mlog-slave-updates             = 1

binlog_cache_size            = 4M

replicate-wild-ignore-table  = mysql.%

sync_binlog                  = 1

relay_log_recovery           = 1

log_slave_updates            = 1

binlog_format                = MIXED

sql_mode=STRICT_TRANS_TABLES

[mysqldump]

quick

max_allowed_packet = 32M

注意:

Replication-do-db的坑,如果多个库则使用多行Replication-do-db进行配置

Replication-ignore-db的坑,如果忽略多个库则使用多行Replication-ignore-db进行配置

配置完成重启Mysql服务[root@e85d5de9eb0d etc]# systemctl restart mysqld

重启完成之后会生成mysql-bin.index 日志文件[root@e85d5de9eb0d mysql]# pwd

/var/lib/mysql

[root@e85d5de9eb0d mysql]# ll

total 122928

-rw-r-----. 1 mysql mysql       56 Apr 23 13:36 auto.cnf

-rw-r-----. 1 mysql mysql      342 Apr 24 12:14 ib_buffer_pool

-rw-r-----. 1 mysql mysql 50331648 Apr 24 12:14 ib_logfile0

-rw-r-----. 1 mysql mysql 50331648 Apr 23 13:36 ib_logfile1

-rw-r-----. 1 mysql mysql 12582912 Apr 24 12:14 ibdata1

-rw-r-----. 1 mysql mysql 12582912 Apr 24 12:14 ibtmp1

drwxr-x---. 2 mysql mysql     4096 Apr 23 13:37 mysql

-rw-r-----. 1 mysql mysql      154 Apr 24 12:14 mysql-bin.000001

-rw-r-----. 1 mysql mysql       19 Apr 24 12:14 mysql-bin.index

srwxrwxrwx. 1 mysql mysql        0 Apr 24 12:14 mysql.sock

-rw-------. 1 mysql mysql        4 Apr 24 12:14 mysql.sock.lock

drwxr-x---. 2 mysql mysql     8192 Apr 23 13:37 performance_schema

drwxr-x---. 2 mysql mysql     8192 Apr 23 13:37 sys

查看二进制同步文件内容[root@e85d5de9eb0d mysql]# mysqlbinlog --start-position=0 ./mysql-bin.000001

mysql命令查看binlog

mysql> show binlog events;

+------------------+-----+----------------+-----------+-------------+---------------------------------------+| Log_name         | Pos | Event_type     | Server_id | End_log_pos | Info                                  |

+------------------+-----+----------------+-----------+-------------+---------------------------------------+

| mysql-bin.000001 |   4 | Format_desc    |         2 |         123 | Server ver: 5.7.22-log, Binlog ver: 4 || mysql-bin.000001 | 123 | Previous_gtids |         2 |         154 |                                       |

+------------------+-----+----------------+-----------+-------------+---------------------------------------+

2 rows in set (0.00 sec)

mysql> show binlog events in 'mysql-bin.000001';

mysql> show binlog events in 'mysql-bin.000001' from 4;

mysql> show binlog events in 'mysql-bin.000001' from 4\G;  # 详细信息

查看主机节点状态mysql> show master status\G

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

File: mysql-bin.000001

Position: 154

Binlog_Do_DB:

Binlog_Ignore_DB:

Executed_Gtid_Set:

1 row in set (0.00 sec)

4.配置mysql_slave 子节点信息实现主从复制【此模式从节点不能新增数据】[client]

port                        = 3306

socket                      = /var/lib/mysql/mysql.sock

[mysqld]

# 此server-id 每台机器唯一

server-id                    = 3

port                         = 3306

datadir                      = /var/lib/mysql

socket                       = /var/lib/mysql/mysql.sockdefault-storage-engine       = InnoDBlog-bin                      = mysql-binlog-bin-index                = mysql-bin.index

relay-log                    = mysql-relay

relay-log-index               = mysql-relay.index

expire-logs-days              = 10

max-binlog-size              = 100M

max_binlog_cache_size        = 8Mlog-slave-updates             = 1

binlog_cache_size            = 4M

replicate-wild-ignore-table  = mysql.%

sync_binlog                  = 1

relay_log_recovery           = 1

log_slave_updates            = 1

binlog_format                = MIXED

sql_mode=STRICT_TRANS_TABLES

[mysqldump]

quick

max_allowed_packet = 32M

重启 slave 节点mysql的服务[root@e314477e8ba4 etc]# systemctl restart mysqld

从机节点Slave 节点Mysql命令行执行以下命令

· 第一步mysql> stop slave;

· 第二步【关键步骤】Change master to

Master_host='172.17.0.2',

Master_user='repl',

Master_password='zyl00712',

Master_log_file='mysql-bin.000001',

Master_log_pos=154;

注意:

master_log_pos 位置需要根据Master主节点的日志记录位置开始,不可随意指定。

· 第三步 启动从节点mysql> start slave;

查看从节点状态mysql> show slave status\G;

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

Slave_IO_State: Waiting for master to send event

Master_Host: 172.17.0.2

Master_User: repl

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysql-bin.000001

Read_Master_Log_Pos: 154

Relay_Log_File: mysql-relay.000002

Relay_Log_Pos: 320

Relay_Master_Log_File: mysql-bin.000001

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Replicate_Do_DB:

Replicate_Ignore_DB:

Replicate_Do_Table:

Replicate_Ignore_Table:

Replicate_Wild_Do_Table:

Replicate_Wild_Ignore_Table: mysql.%

Last_Errno: 0

Last_Error:

Skip_Counter: 0

Exec_Master_Log_Pos: 154

Relay_Log_Space: 523

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: 0

Master_SSL_Verify_Server_Cert: No

Last_IO_Errno: 0

Last_IO_Error:

Last_SQL_Errno: 0

Last_SQL_Error:

Replicate_Ignore_Server_Ids:

Master_Server_Id: 2

Master_UUID: 662aa548-46fb-11e8-99db-0242ac110002

Master_Info_File: /var/lib/mysql/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:

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:

1 row in set (0.00 sec)

ERROR:No query specified

mysql> show processlist;

+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+| Id | User        | Host      | db   | Command | Time | State                                                  | Info             |

+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+

|  2 | root        | localhost | NULL | Query   |    0 | starting                                               | show processlist ||  3 | system user |           | NULL | Connect | 1137 | Waiting for master to send event                       | NULL             |

|  4 | system user |           | NULL | Connect | 1137 | Slave has read all relay log; waiting for more updates | NULL             |

+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+3 rows in set (0.00 sec)

这种模式简答的实现了主从复制,记录主从复制的搭建和了解主从复制的原理过程。

本文由职坐标整理发布,欢迎关注职坐标MySQL频道,学习更多数据库知识!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值