docker的使用、mysql主从复制与django的配合使用
下载与安装
- yum update -- 全局更新yum (可能花费时间久)
-
- yum remove docker \
- docker-client \
- docker-client-latest \
- docker-common \
- docker-latest \
- docker-latest-logrotate \
- docker-logrotate \
- docker-engine -- 移除可能存在的docker版本
-
-
- yum install -y yum-utils \
- device-mapper-persistent-data \
- lvm2 -- 安装yum工具包和依赖项
-
-
-
-
- yum-config-manager \
- --add-repo \
- https://download.docker.com/linux/centos/docker-ce.repo --通过yum添加yum源
-
-
- yum install docker-ce docker-ce-cli containerd.io -- 安装docker-ce
-
-
- systemctl start docker -- 启动docker-ce
- systemctl enable docker --开机启动
- docker version -- 查看docker 版本
-
-
- #如果期间出现下载源错误的话,可尝试以下方法来解决
- 解决方法: cd /etc/yum.repos.d -- 进入这个目录
- ll --查询所有带docker repo包
- rm-rf --删除所有关于docker的re包
- 然后在测试 如果还不行 在执行
- yum clean all yum makecache 这两句就没问题了
-
sh:
- yum update
- yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
- yum install -y yum-utils device-mapper-persistent-data lvm2
- yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
- systemctl start docker
- systemctl enable docker
-
注意:使用默认的repo文件安装后,Docker-ce的版本是最新19.03版本
- 查看repo文件支持的Docker-ce版本
- yum list docker-ce --showduplicates | sort -r #从高到低列出Docker-ce的版本
-
- yum list docker-ce-cli --showduplicates | sort -r #从高到低列出Docker-ce-cli的版本
-
-
- 指定版本进行安装
- 该软件包名称是软件包名称(docker-ce)加上版本字符串(第二列),从第一个冒号(:)一直到第一个连字符,并用连字符(-)分隔。例如,docker-ce-18.09.1
- yum -y install docker-ce-18.09.9 docker-ce-cli docker-ce-cli-18.09.9 containerd.io
-
启动docker
- systemctl start docker -- 启动docker服务
-
- systemctl stop docker -- 停止docker服务
-
- systemctl status docker --查看 docker状态
-
- systemctl restart docker --重启docker服务
-
- docker images -- 查看下载的所有软件
-
修改下载镜像地址
- vim /etc/docker/daemon.json -- 可以修改下载镜像网站(不改的话默认用的阿里云镜像)
- #添加如下代码:
- {
- "registry-mirrors":[
- "http://hub-mirror.c.163.com"
- ]
- }
-
清空容器
- docker container prune -- 清空所有容器(慎重使用)
-
docker基础命令
- 打开云服务器,虚拟化的容器技术、相当于是让你带着操作系统环境去装软件
-
- yum update 更新你所的有底层依赖库
- yum install 表示安装
- yum remore 表示删除
- yum info 查看安装包的信息
- yum search 表示搜索有什么包可以安装
-
- yum search docker 找到下面的安装软件
- docker.x86_64 : Automates deployment of containerized applications
-
- yum install -y docker 安装
- systemctl start docker 启动 docker
- systemctl stop docker 停止 dockdr
- systemctl status docker 查看状态
-
- docker pull mysql : 5.7.29 下载mysql 5.7.29版本
- docker images 查看下载的镜像
- docker pull redis:latest 下载最新的 redis
-
- vim /etc/docker/daemon.json 修改镜像
-
- docker container ls -a` 查看容器列表
-
- docker rm -f redis 删除缓存容器
- docker rm mysql157 或者
- docker rm -f mysql57 删除容器
-
- netstat -ntlp 查看进程端口的状态(net网络 ,stat 表求状态,-n表示数值,t表示起ttp协义的端口,L 表示时监听状态,p 表示显示进程的信息)
-
用docker创建Mysql(主从复制结构)
- #创建主从复制结构的文件夹
- mkdir docker --创建docker文件夹
- cd docker --进入docker文件夹
- mkdir -p mysql/{master,slave-1,slave-2,slave-3} --创建子文件夹
- cd mysql --进入mysql文件夹
-
- mkdir -p master/{conf,data,log} --创建master分支的配置以及日志
- mkdir -p slave-1/{conf,data,log} --创建slave-1分支的配置以及日志
- mkdir -p slave-2/{conf,data,log} --创建slave-2分支的配置以及日志
- mkdir -p slave-3/{conf,data,log} --创建slave-3分支的配置以及日志
-
- 查看文件夹的树状图 yum install -y tree
- tree --树状图文件夹结构
-
-
- #配置主从复制结构
- cd docker/mysql/master/conf --进入文件夹
-
- touch my.cnf --创建配置文件
-
- vim my.cnf --编辑配置文件
-
- 写入以下内容:(主容器)
- [mysqld]
- pid-file=/var/run/mysqld/mysqld.pid --进程文件
- socket=/var/run/mysqld/mysqld.sock --套接字文件
- datadir=/var/lib/mysql --数据存放的文件夹
- log-error=/var/log/mysql/error.log --错误日志存放文件
- server-id=1 --命名上的区分(配置主从结构时,这个id不同)
- log-bin=/var/log/mysql/mysql-bin.log --运行日志(=后面可以不写,存放为默认路径)
- expire_logs_days=30 --日志过期时间(日)
- max_binlog_size=256M --日志大小(102400自由给大小)
- symbolic-links=0 --符号连接(可以不写)
-
- #slow_query_log=ON --开启慢查询 (调试阶段打开,正式生产环境关掉)
- #slow_query_log_file=/var/log/mysql/slow.log --慢查询日志的存放位置
- #long_query_time=1 --慢查询的时间设置(秒)
-
-
- #创建(主)容器并启动容器
- docker run -d -p 3306:3306 --name mysql-master \
- -v /root/docker/mysql/master/conf:/etc/mysql/mysql.conf.d \
- -v /root/docker/mysql/master/data:/var/lib/mysql \
- -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7.29
-
-
- docker exec -it mysql-master /bin/bash 进入容器交互式环境
-
- 输入mysql -u root -p123456 --刚才配置的密码
-
- grant replication slave on *.* to 'slave'@'%' identified by
- 'iamslave'; --创建一个账号(可以复制数据的账号)
-
-
- flush privileges; --刷新权限
-
-
- show master status; -- 查询日志(名字,位置) 这句可能查不到二进制日志文件
-
- #找不到文件的的解决方法
- 暂停docker容器,删掉所有容器,用下载的mysql来启动
- show variables like 'log_bin'; -- 查看二进制日志是否启动
- show variables like 'datadir'; -- 查看二进制日志存放路径
-
- 添加如下配置:
- [mysqld]
- datadir=/var/lib/mysql
- socket=/var/lib/mysql/mysql.sock
- symbolic-links=0
- log-error=/var/log/mysqld.log
- pid-file=/var/run/mysqld/mysqld.pid
- server-id=1
- log-bin=mysql-bin
- 重启,即可找到二进制日志
-
-
- exit --退出环境
-
-
- docker restart mysql-master --重启mysql-master容器
-
-
- #备份数据
- flush table with read lock; --锁数据库,只能读数据
-
-
- mysqldump -u root -p 123456 -A -B > /root/backup/mysql/mybak$(date
- +"%Y%m%d%H%M%S").sql -- 输出重定向(文件名是时间)
-
-
- mysqldump -u root -p 123456 -A -B | gzip> /root/backup/mysql/mybak$(date
- +"%Y%m%d%H%M%S").sql --压缩备份(数据量大的话可以用zip)
-
-
-
- unlock table; --解锁
-
-
-
- docker inspect --format'{{ .NetworkSettings.IPAddress }}' mysql-master --查看容器的ip地址
-
-
- #配置从机
-
- cd salve-1/conf/ -- 进入文件夹
- vim my.cnf -- 编辑配置
-
-
- 写入配置:
- [mysqld]
- pid-file=/var/run/mysqld/mysqld.pid
- socket=/var/run/mysqld/mysqld.sock
- datadir=/var/lib/mysql
- log-error=/var/log/mysql/error.log
- server-id=41 -- id不能相同
- log-bin=/var/log/mysql/mysql-bin.log
- expire_logs_days=30
- max_binlog_size=256M
- symbolic-links=0
- slow_query_log=ON --启动从机慢查询日志(主(写)从(读))
- slow_query_log_file=/var/log/mysql/slow.log
- long_query_time=1
-
-
- #创建容器并启动容器
- docker run -d -p 3308:3306 --name mysql-slave-1 \
- -v /root/docker/mysql/slave-1/conf:/etc/mysql/mysql.conf.d \
- -v /root/docker/mysql/slave-1/data:/var/lib/mysql \
- -e MYSQL_ROOT_PASSWORD=123456 \
- --link mysql-master:mysql-master mysql:5.7.29 --给master做别名,注意端口的使用(方便连接)
-
-
- docker exec -it mysql-slave-1 /bin/bash -- 进入交互式环境
-
- mysql -u root -p123456 --输入账号密码
-
- reset slave; -- 重置奴隶
-
-
- change master to master_host='mysql-master', master_user='slave',
- master_password='iamslave', master_log_file='mysql-bin.000003',
- master_log_pos=590;
- -- 连接master 别名 账号 密码 日志文件 日志位置(里面参数记得修改)
-
-
- start slave; --启动从机
-
-
- show slave status\G -- 查看从机配置
-
-
- 如果有下面的配置,代表生效:
- ...
- Slave_IO_Running: Yes
- Slave_SQL_Running: Yes
- ...
-
-
- 至此一个从机已经配置好了,同样的方法配置其他从机(注意如果读不到日志,那就是配置日志路径有问题)
-
不用docker配置mysql(主从复制结构)
- 下载安装mysql(配置文件默认放在 /etc/my.cnf中)
- vim /etc/my.cnf
-
- [mysqld1]
- datadir=/var/lib/mysql
- socket=/var/lib/mysql/mysql.sock
- symbolic-links=0
- log-error=/var/log/mysqld.log
- pid-file=/var/run/mysqld/mysqld.pid
- port=3306 #添加这句
-
-
- [mysqld2]
- datadir=/var/lib/mysql
- socket=/var/lib/mysql/mysql.sock
- symbolic-links=0
- log-error=/var/log/mysqld.log
- pid-file=/var/run/mysqld/mysqld.pid
- port=3307 #添加这句
-
-
-
- 启动它 逻辑和上面相似
-
Django配合主从复制结构(每个数据库创建用户保证可以连接成功)
#settings.py中配置数据库连接
- DATABASES = {
- 'default':{
- ...,
- }
- 'slave1':{ #第二组数据库 (有几个配几个)
- ...,
- }
- }
-
-
- #在主项目common下,新建模块db_routers
-
- class MasterSlaveRouter(object):
- """主从复制路由"""
-
- @staticmethod #读
- def db_for_read(model, **hints):
- return random.choice(('slave1', 'slave2', 'slave3')) #如果大概率要使用slave1,那就在写一个
-
-
- @staticmethod #写
- def db_for_write(model, **hints):
- return 'default'
-
- @staticmethod
- def allow_relation(obj1, obj2, **hints):
- return None
-
- @staticmethod #是否允许数据迁移(正反向工程)
- def allow_migrate(db, app_label, model_name=None, **hints):
- return True
-
-
- #settings.py中配置路由
- DATABASE_ROUTERS = [
- 'common.db_routers.MasterSlaveRouter',
- ]
-
-
- #配置成功后,就可以做读写分离了
-
-
-
- #如果项目中用到分库的数据库,需要注意,在非默认数据库的models.py中添加标签,
-
- 实例:
- class ...():
- class Meta:
- managed = False
- app_label = 'hrs' #随便命名
- db_table = 'tb_dept'
-
-
- class MasterSlaveRouter(object):
- """主从复制路由"""
-
- @staticmethod #读
- def db_for_read(model, **hints):
- if model._meta.app_label == 'hrs':
- return 'backend' #如果用户操作模型,先找这个模型中的标签熟悉,来决定使用那个数据库
- return random.choice(('slave1', 'slave2', 'slave3'))
-
-
- @staticmethod #写
- def db_for_write(model, **hints):
- if model._meta.app_label == 'hrs':
- return 'backend
- return 'default'
-
启动mysql容器; (主从模式)
- cd ~
- mkdir -p /etc/mysql/conf/master
- mkdir -p /etc/mysql/conf/slave
-
- vim /etc/mysql/conf/master/master.cnf
-
写入内容如下:
- [mysqld]
- log-bin=mysql-bin
- server_id=100
-
- vim /etc/mysql/conf/slave/master.cnf
-
写入内容如下:
- [mysqld]
- log-bin=mysql-bin
- server_id=200
-
- docker run
- --name mysql-master
- -v /etc/mysql/conf/slave:/etc/mysql/conf.d
- -e MYSQL_ROOT_PASSWORD=Admin123.
- -p 8000:3306
- -d mysql:5.5
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
-
- docker run
- --name mysql-slave1
- -v /etc/mysql/conf/slave:/etc/mysql/conf.d
- -e MYSQL_ROOT_PASSWORD=Admin123.
- -p 3307:3306
- -d mysql:5.5
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
-
-
- docker exec -it mysql-master bash 进入主库
- mysql -u root -pAdmin123.
- CREATE USER 'rep'@'%' IDENTIFIED BY 'Admin123.'; 创建账号
- GRANT REPLICATION SLAVE ON *.* TO 'rep'@'%'; 给账号授权
-
- show master status; # 获取日志文件名
- quit;
- exit
-
保存这两个信息
从机配置:
- docker exec -it mysql-salve1 bash
- mysql -u root -pAdmin123.
-
- CHANGE MASTER TO MASTER_HOST='主机ip',MASTER_PORT=3306,MASTER_USER='rep',MASTER_PASSWORD='Admin123.',MASTER_LOG_FILE='mysql-bin.000004',MASTER_LOG_POS=331;
-
- start slave;
- show slave status\G;
-
如上图代表配置成功