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;
如上图代表配置成功