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;

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6391d5515a8e47089a8064657e1ba305.png

如上图代表配置成功;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

像风一样的男人@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值