docker---mysql容器的主从同步

目录

 

mysql主从复制同步

一 前提条件

二 mysql集群配置文件

1  创建配置集结构如下

2 创建节点配置文件(master.cnf与slave.cnf)

三、搭建mysql环境

创建mysql容器

创建从库容器

创建主库容器

主库从库赋权

主库

从库

结构模式-----各种不同的结构模式上面的为一主一从(多从)


mysql主从复制同步

一 前提条件

1 具有docker环境的centos7

yum install docker

service docker start

2 mysql镜像5.7或5.7.28(更高版本主从复制配置不同)

docker pull mysql:8.0

 

二 mysql集群配置文件

1  创建配置集结构如下

 

mkdir  /docker/mysql/data/master    MySQL主库数据位置

mkdir  /docker/mysql/data/slave MySQL从库数据位置

mkdir  /docker/mysql/master MySQL主库配置文件

mkdir  /docker/mysql/slave MySQL主库配置文件

2 创建节点配置文件(master.cnf与slave.cnf)

cd /docker/mysql/master

vim master.cnf

cd /docker/mysql/slave

vim slave.cnf

主库内容如下

 

[mysqld]

user=mysql

character-set-server=utf8

lower_case_table_names = 1

#开启二进制日志   名字为日志文件的名字随便填即可

log_bin=master1_log

#开启主从在局域网内应该有唯一的server_id  1~255

server_id=1

binlog_format="mixed"



[client]

default-character-set=utf8



[mysql]

default-character-set=utf8

从库内容如下

[mysqld]

user=mysql

character-set-server=utf8

lower_case_table_names = 1

server_id=2



[client]

default-character-set=utf8



[mysql]

default-character-set=utf8

 

 

 

三、搭建mysql环境

创建mysql容器

从dockerhub拉去一个5.7.28或者5.7的镜像

Docker pull mysql:5.7.28

创建从库容器

docker run --privileged=true --name mysqlslave -p 3340:3306 -v /docker/mysql/slave/slave.cnf:/etc/mysql/my.cnf -v /docker/mysql/data/slave:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.28

创建主库容器

docker run --privileged=true --name mysqmaster -p 3339:3306 -v /docker/mysql/master/master.cnf:/etc/mysql/my.cnf -v /docker/mysql/data/master:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.28

 

*根据实际情况修改路径

 

--privileged=true #赋予权限

--name #别名

-p #端口映射

-v #容器数据卷my.cnf为配置文件

MYSQL_ROOT_PASSWORD        #mysql数据库的账号密码

 

查看运行状态

 

docker ps -a

全部在运行状态就是正常的

 

主库从库赋权

主库

查看容器局域网

docker network inspect bridge

 

可以看到容器局域网内的连接信息

远程连接主库mysql

Mysql -uroot -proot -h 127.18.0.3       ##-u数据库账号  -p数据库密码 -h 数据库局域网ip地址

 

如果连接不上可以用navicat连接

 

然后右键连接-------->命令列界面

Grant replication slave on  *.*  root@172.18.0.3 identified by ‘root’

grant replication slave on *.* to '用户名'@'ip' identified by '密码';#授权给从服务器,单个数据库授权无效,必须设置*.*   ip是从库的内网ip

输入show master status;

 

从库

远程连接从库mysql

在命令列界面输入

mysql> change master to

    -> master_host='ip',     #主库的内网ip

    -> master_user='root', #主库登陆账号

    -> master_password='root', #主库登录密码

-> master_log_file='master1_log.000003',  #与主库binlog日志名相同

-> master_log_pos=1908;    #偏移量,与主库相同 

然后运行

start slave;

扩展配置不需要加

Log_slave_update   记录从库更新,允许链式复制(a-b-c)

Relay_log=dbsvr2-relay-bin指定中继日志文件名

Replicate_do_db=mysql仅复制指定库,其他库将被忽略,此选项可设置多条

Replicate_ignore_d=test   不复制哪些库,其他库将被忽略

输入show slave status\G找到

Slave_IO_Running: Yes 
Slave_SQL_Running: Yes

即主从同步成功

如果有一个为no即同步失败

下面介绍两种解决方法: 
方法一:忽略错误后,继续同步 
该方法适用于主从库数据相差不大,或者要求数据可以不完全统一的情况,数据要求不严格的情况 
解决: 
stop slave; 
#表示跳过一步错误,后面的数字可变 
set global sql_slave_skip_counter =1; 
start slave; 
之后再用mysql> show slave status\G 查看: 
Slave_IO_Running: Yes 
Slave_SQL_Running: Yes 
ok,现在主从同步状态正常了。。。 

方式二:重新做主从,完全同步 
该方法适用于主从库数据相差较大,或者要求数据完全统一的情况 
解决步骤如下: 
1.先进入主库,进行锁表,防止数据写入 
使用命令: 
mysql> flush tables with read lock; 
注意:该处是锁定为只读状态,语句不区分大小写 
2.进行数据备份 
#把数据备份到mysql.bak.sql文件 
[root@server01 mysql]#mysqldump -uroot -p -hlocalhost > mysql.bak.sql 
这里注意一点:数据库备份一定要定期进行,可以用shell脚本或者python脚本,都比较方便,确保数据万无一失 
3.查看master 状态 
mysql> show master status; 
+-------------------+----------+--------------+-------------------------------+ 
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | 
+-------------------+----------+--------------+-------------------------------+ 
| mysqld-bin.000001 | 3260 | | mysql,test,information_schema | 
+-------------------+----------+--------------+-------------------------------+ 
1 row in set (0.00 sec) 
4.把mysql备份文件传到从库机器,进行数据恢复 
#使用scp命令 
[root@server01 mysql]# scp mysql.bak.sql [email protected]:/tmp/ 
5.停止从库的状态 
mysql> stop slave; 
6.然后到从库执行mysql命令,导入数据备份 
mysql> source /tmp/mysql.bak.sql 
7.设置从库同步,注意该处的同步点,就是主库show master status信息里的| File| Position两项 
change master to master_host = '192.168.128.100', master_user = 'rsync', master_port=3306, master_password='', master_log_file = 'mysqld-bin.000001', master_log_pos=3260; 
8.重新开启从同步 
mysql> stop slave; 
9.查看同步状态 
mysql> show slave status\G 查看: 
Slave_IO_Running: Yes 
Slave_SQL_Running: Yes 

 

 

验证主从

主库创建任何数据,从库随即更新!

 

结构模式-----各种不同的结构模式上面的为一主一从(多从)

--结构模式

基本应用

单向复制:主-->从

扩展应用

链式复制:主-->从-->从   #主从从

互为主从:主<-->主   #不能同时被访问,不能单独使用

一主多从:从<--主-->从

1)一主多从

[root@mysql-51 ~]# mysqldump -uroot -p123456 db1 > db1.sql

[root@mysql-51 ~]# scp db1.sql 192.168.4.53:/root

mysql> create database db1;    #53主机

mysql> source /root/db1.sql;    #可以直接执行sql语句

[root@mysql-53 ~]# mysql -uroot -p123456 db1 <  db1.sql

[root@mysql-53 ~]# vim /etc/my.cnf

[mysqld]

server_id=53

[root@mysql-53 ~]# systemctl restart mysqld

mysql> change master to

    -> master_host="192.168.4.51",

    -> master_user="repluser",

    -> master_password="123456",

    -> master_log_file="master51.000005",

    -> master_log_pos=574;

mysql> start slave;

mysql> show slave status\G;

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

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 192.168.4.51

                  Master_User: repluser

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: master51.000005

          Read_Master_Log_Pos: 574

               Relay_Log_File: mysql-53-relay-bin.000002

                Relay_Log_Pos: 319

        Relay_Master_Log_File: master51.000005

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

2)主从从

#延续上面的实验

[root@mysql-52 mysql]# vim /etc/my.cnf   #设置52即为从又为主库

[mysqld]

log_bin=master52

binlog_format="mixed"

server_id=52

Log_slave_updates                           #记录从库更新,允许链式复制

[root@mysql-52 mysql]# systemctl restart mysqld

mysql> show master status\G;

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

             File: master52.000001

         Position: 154

     Binlog_Do_DB:

 Binlog_Ignore_DB:

Executed_Gtid_Set:

1 row in set (0.00 sec)

mysql> grant replication slave on *.* to repluuser@'%'

    -> identified by '123456';

配置53的主库是52

mysql> change master to

    -> master_host="192.168.4.52",

    -> master_user="repluser",

    -> master_password="123456",

    -> master_log_file='master52.000001',

    -> master_log_pos=442;

mysql> start slave;

注意:

Slave-io线程读取主库中binlog日志放入中继日志(relay-log),slave-sql线程在执行中继日志的语句时是不写入binlog日志中,需要添加Log_slave_updates才能写入binlog日志中

3)互为主从

主机54:

[root@mysql-54 ~]# vim /etc/my.cnf

[mysqld]

log_bin=master54

server_id=54

binlog_format="mixed"

[root@mysql-54 ~]# systemctl restart mysqld

mysql> grant replication slave on *.* to masteruser@'%' identified by '123456';

mysql> show master status\G;

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

             File: master54.000001

         Position: 443

....

mysql> change master to \

    -> master_host='192.168.4.55',

    -> master_user='masteruser2',

    -> master_password='123456',

    -> master_log_file='master55.000001',

    -> master_log_pos=444;

mysql> start slave;

mysql> show slave status\G;

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

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 192.168.4.55

                  Master_User: masteruser2

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: master55.000001

          Read_Master_Log_Pos: 444

               Relay_Log_File: mysql-54-relay-bin.000002

                Relay_Log_Pos: 319

        Relay_Master_Log_File: master55.000001

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

 

主机55:

[root@mysql-55 ~]# vim /etc/my.cnf

[root@mysql-55 ~]# systemctl restart mysqld

mysql> grant replication slave on *.* to masteruser2@'%' identified by '123456';

mysql> show master status\G;

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

             File: master55.000001

         Position: 444

.....

mysql> change master to\

    -> master_host="192.168.4.54",

    -> master_user="masteruser",

    -> master_password="123456",

    -> master_log_file='master54.000001',

    -> master_log_pos=443;

mysql> start slave;

mysql> show slave status\G;

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

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 192.168.4.54

                  Master_User: masteruser

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: master54.000001

          Read_Master_Log_Pos: 595

               Relay_Log_File: mysql-55-relay-bin.000002

                Relay_Log_Pos: 471

        Relay_Master_Log_File: master54.000001

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

              Replicate_Do_DB:

          Replicate_Ignore_DB:

           Replicate_Do_Table:

       Replicate_Ignore_Table:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章