Docker 安装mysql 主从复制

一:安装docker

第一种安装方式:

yum install docker

第二种安装方式:

curl -fsSL https://get.docker.com/ | sh

或者:
$ wget -qO- https://get.docker.com/ | sh

如果想尝鲜使用最新功能,可以使用下面的脚本来安装预发布版本。但要注意,预发布版本往往意味着功能还不够稳定,不要在生产环境中使用:
$ curl -fsSL https://test.docker.com/ | sh

如果有提示,一路y下去

安装成功后,查看版本

docker version
Client:
 Version:         1.13.1
 API version:     1.26
 Package version: <unknown>
 Go version:      go1.8.3
 Git commit:      774336d/1.13.1
 Built:           Wed Mar  7 17:06:16 2018
 OS/Arch:         linux/amd64

Server:
 Version:         1.13.1
 API version:     1.26 (minimum version 1.12)
 Package version: <unknown>
 Go version:      go1.8.3
 Git commit:      774336d/1.13.1
 Built:           Wed Mar  7 17:06:16 2018
 OS/Arch:         linux/amd64
 Experimental:    false

出现版本信息,则安装成功

启动Docker

启动Docker并设置为开机自启动

[root@VM_0_17_centos ~]# systemctl  start docker.service
[root@VM_0_17_centos ~]# systemctl  enable docker.service

另外,对于CentOS、Redhat等系统,服务可能是通过systemd来管理,与此略有不同,可以查阅systemd相关手册。
例如,需要通过systemctl命令来管理Docker服务:
$ sudo systemctl start docker.service

二:拉去镜像

docker pull mysql:5.7.13


 

运行MySQL从容器

首先运行从容器

[root@VM_0_17_centos ~]# docker run --name slave1 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.13

 

创建配置文件目录

目录结构如下

/usr/local/mysql/master

/usr/local/mysql/slave1

/usr/local/mysql/slave2

拷贝一份MySQL配置文件

docker cp master:/etc/mysql/my.cnf  /usr/local/mysql/master/my.cnf

进到master目录下,已存在拷贝的my.cnf

 

修改my.cnf,在 [mysqld] 节点最后加上后保存

log-bin=mysql-bin

server-id=1

 

 

og-bin=mysql-bin 使用binary logging,mysql-bin是log文件名的前缀

server-id=1 唯一服务器ID,非0整数,不能和其他服务器的server-id重复

将修改后的文件覆盖Docker中MySQL中的配置文件

[root@VM_0_17_centos master]# docker cp /usr/local/mysql/master/my.cnf master:/etc/mysql/my.cnf

重启 mysql 的docker , 让配置生效

[root@VM_0_17_centos master]# docker restart master

log-bin=mysql-binserver-id=2

别忘记,重启

 

 

启动

docker run --name mysql-master -p 12345:3306 -e MYSQL_ROOT_PASSWORD=123456 -d docker.io/mysq

 

开启访问端口

firewall-cmd --zone=public --add-port=80/tcp --permanent

firewall-cmd --reload

进入

docker exec -it  cc81d96756d4 bash

 

设置外部访问

ALTER user 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';  

 FLUSH PRIVILEGES;

 

 

进入master查看状态

show master status;

记录FilePosition的值

 

状态查看:


 show slave status \G;

错误:
 Connecting to master 
 查看日志
 docker logs slave -f
 链接不上主机
 查看主机ip ifconfig  
 选择 Eth0的ip,
 切换到从机 stop slave
 然后
   change master to
     Master_host='172.18.196.130',
     Master_user='root',
     Master_password='123456',
    master_log_file='mysql-bin.000001',
     master_log_pos=155;

master_host是宿主机的IP(ifconfig查到的操作系统IP,不是容器的IP,一定不能搞错)

master_port是主服务器的映射到3306的端口(默认3306)

master_user为创建的备份用户

master_password备份用户的密码

master_log_file和master_log_pos则是show master status列表里面的两个值,分别是mysql日志名和起始备份位置 

重启 start slave
查看状态:show slave status;
完成     

 

SQL_Slave_Running :NO

重启docker  然后重启服务

设置命令:

mysql> set global read_only=1;    #1是只读,0是读写

mysql> show global variables like "%read_only%";

 

、数据库只读设置

对于mysql单实例数据库和master库,如果需要设置为只读状态,需要进行如下操作和设置:
      将MySQL设置为只读状态的命令:
# mysql -uroot -p
mysql> show global variables like "%read_only%";
mysql> flush tables with read lock;
mysql> set global read_only=1;
mysql> show global variables like "%read_only%";


将MySQL从只读设置为读写状态的命令:
mysql> unlock tables;
mysql> set global read_only=0;


      对于需要保证master-slave主从同步的salve库,如果要设置为只读状态,需要执行的命令为:
mysql> set global read_only=1;


     将salve库从只读状态变为读写状态,需要执行的命令是:
mysql> set global read_only=0;


     对于数据库读写状态,主要靠 “read_only”全局参数来设定;默认情况下,数据库是用于读写操作的,所以read_only参数也是0或faluse状态,这时候不论是本地用户还是远程访问数据库的用户,都可以进行读写操作;如需设置为只读状态,将该read_only参数设置为1或TRUE状态,但设置 read_only=1 状态有两个需要注意的地方:
      1.read_only=1只读模式,不会影响slave同步复制的功能,所以在MySQL slave库中设定了read_only=1后,通过 show slave status\G 命令查看salve状态,可以看到salve仍然会读取master上的日志,并且在slave库中应用日志,保证主从数据库同步一致;
      2.read_only=1只读模式,可以限定普通用户进行数据修改的操作,但不会限定具有super权限的用户的数据修改操作;在MySQL中设置read_only=1后,普通的应用用户进行insert、update、delete等会产生数据变化的DML操作时,都会报出数据库处于只读模式不能发生数据变化的错误,但具有super权限的用户,例如在本地或远程通过root用户登录到数据库,还是可以进行数据变化的DML操作;


      为了确保所有用户,包括具有super权限的用户也不能进行读写操作,就需要执行给所有的表加读锁的命令 “flush tables with read lock;”,这样使用具有super权限的用户登录数据库,想要发生数据变化的操作时,也会提示表被锁定不能修改的报错。


        这样通过 设置“read_only=1”和“flush tables with read lock;”两条命令,就可以确保数据库处于只读模式,不会发生任何数据改变,在MySQL进行数据库迁移时,限定master主库不能有任何数据变化,就可以通过这种方式来设定。


       但同时由于加表锁的命令对数据库表限定非常严格,如果再slave从库上执行这个命令后,slave库可以从master读取binlog日志,但不能够应用日志,slave库不能发生数据改变,当然也不能够实现主从同步了,这时如果使用 “unlock tables;”解除全局的表读锁,slave就会应用从master读取到的binlog日志,继续保证主从库数据库一致同步。

       为了保证主从同步可以一直进行,在slave库上要保证具有super权限的root等用户只能在本地登录,不会发生数据变化,其他远程连接的应用用户只按需分配为select,insert,update,delete等权限,保证没有super权限,则只需要将salve设定“read_only=1”模式,即可保证主从同步,又可以实现从库只读。


       相对的,设定“read_only=1”只读模式开启的解锁命令为设定“read_only=0”;设定全局锁“flush tables with read lock;”,对应的解锁模式命令为:“unlock tables;”.

      当然设定了read_only=1后,所有的select查询操作都是可以正常进行的。

https://blog.csdn.net/sunlihuo/article/details/54018843

https://blog.csdn.net/weixin_39800144/article/details/79231002

https://www.cnblogs.com/itrena/p/9024182.html

https://www.jianshu.com/p/12c34395e76e

发布了20 篇原创文章 · 获赞 7 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/xiaolinzi176/article/details/81197383