Python开发之:Django基于Docker实现Mysql数据库读写分离、集群、主从同步详解 | 原力计划...

作者 | Pythonicc

责编 | 王晓曼

出品 | CSDN博客

简介

1、什么是数据库读写分离

读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。

2、为什么要搞数据库读写分离

在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。

3、配置主从同步的基本步骤

有很多种配置主从同步的方法,可以总结为如下的步骤:

  • 在主服务器上,必须开启二进制日志机制和配置一个独立的ID

  • 在每一个从服务器上,配置一个唯一的ID,创建一个用来专门复制主服务器数据的账号

  • 在开始复制进程前,在主服务器上记录二进制文件的位置信息

  • 如果在开始复制之前,数据库中已经有数据,就必须先创建一个数据快照(可以使用mysqldump 导出数据库,或者直接复制数据文件)

  • 配置从服务器要连接的主服务器的IP地址和登陆授权,二进制日志文件名和位置

实践阶段

1、测试环境

Mysql5.7.29主服务器:ubuntu16

Mysql5.7.29从服务器:ubuntu16上的docker容器

WEB框架:Django1.8

2、docker容器安装(若在不同服务器搭建数据库,此步可省略)

docker三个核心概念: Repository(仓库) -> Image(镜像) -> Container(容器)

卸载可能存在的旧版本

sudo apt-get remove docker docker-engine docker-ce docker.io

更新apt包

sudo apt-get update

安装以下包以使apt可以通过HTTPS使用存储库(repository):

sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common

添加GPG密钥

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

设置stable存储库

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

再次更新apt包

sudo apt-get update

安装最新版本的Docker CE(社区免费版)

sudo apt-get install -y docker-ce

验证docker: sudo docker version 或 sudo dockerinfo

查看docker服务是否启动

systemctl status docker

经典的Hello world

运行 docker 命令时需要 root 权限或者加 sudo

sudodocker pull hello-world拉取dockerHub上的hello-world镜像

sudodocker images查看镜像信息

可以看到已存在hello-world镜像

**字段解释**REPOSITORY: 来自于哪个仓库;TAG: 镜像的标签信息,比如 5.7、latest 表示不同的版本信息;IMAGE ID: 镜像的 ID, 如果您看到两个 ID 完全相同,那么实际上,它们指向的是同一个镜像,只是标签名称不同罢了;CREATED: 镜像最后的更新时间;SIZE: 镜像的大小,优秀的镜像一般体积都比较小

生成该镜像的实例容器(镜像与容器的关系就像类和实例类对象)

sudo docker run hello-world

有以上输出,表示docker安装成功。

Docker服务相关命令

1、开启Docker服务

systemctlstart docker

2、停止Docker服务

systemctlstop docker

3、重启Docker服务

systemctlrestart docker

4、开机自启Docker服务

systemctlenable docker

创建Mysql容器

1、家目录下创建mysql_slave目录作为容器挂载数据卷。

mkdirmysql_slave

2、进入mysql_slave目录

cdmysql_slave

3、创建data目录

mkdirdata

4、将宿主机的mysql配置文件目录拷到当前数据卷目录下

cp-a /etc/mysql/mysql.conf.d ./

5、将配置文件拷贝过来后,编辑mysql.conf.d目录下的mysqld.cnf 文件

6、宿主机中的mysql做为主服务器,其server-id设为1,从服务器只要不是1都行,这边取2

server-id= 2

7、创建容器(如果没有该镜像,则自动从dockerHub拉取该镜像并创建容器)

dockerrun -id

-p3308:3306

–name=mysql-slave

-eMYSQL_ROOT_PASSWORD=mysql

-v/root/mysql_slave/data:/var/lib/mysql

-v/root/mysql_slave/mysql.conf.d:/etc/mysql/mysql.conf.d

mysql:5.7.29

8、参数解释:

-p 指定映射的端口,左边为宿主机端口,右边为容器端口,这样就可以通过映射的3308端口在宿主机以外的外部机器访问该容器中的mysql

-id表示该容器作为守护进程在后台运行,创建后马上运行,但是不会进入shell终端,退出后也不会真正退出

–name 指定实例容器的名称

-e 指定数据库密码

-v 指定要挂载的目录或文件,必须写绝对路径,左边为宿主机路径,右边为容器路径

mysql:5.7.29指定要创建的容器的镜像及其版本,由于宿主机中mysql是5.7.29版本,所以我们这里创建mysql5.7.29的容器

查看运行中的容器

docker ps

Mysql主从同步配置

宿主机中导出mysql主服务器sql文件

mysqldump-uroot -pmysql --all-databases --lock-all-tables > ~/master_db.sql

参数解释:

-u :用户名

-p :示密码

–all-databases :导出所有数据库

–lock-all-tables :执行操作时锁住所有表,防止操作时有数据修改

~/master_db.sql:导出的备份数据(sql文件)位置,可自己指定

在宿主机中根据映射的端口将sql文件导入容器数据库中

mysql -uroot -pmysql -h127.0.0.1 --port=3308 < ~/master_db.sql

编辑设置mysqld的配置文件,设置log_bin和server-id

sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

重启mysql服务

sudo service mysql restart

登入mysql,创建用于从服务器同步数据使用的帐号并刷新缓存

mysql –uroot –pmysqlGRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' identified by 'slave';FLUSH PRIVILEGES;

获取主服务器的二进制日志信息(File为使用的日志文件名字,Position为使用的文件位置,这两个参数须记下,配置从服务器时会用到)

SHOW MASTER STATUS;

进入docker容器配置mysql从服务器

执行以下命令进入指定名称的容器的shell终端

docker exec -it mysql-slave bash

进入容器中的mysql数据库并设置连接到master主服务器

mysql -uroot -pmysql
change master to master_host='192.168.254.137', master_user='slave', master_password='slave',master_log_file='mysql-bin.000001', master_log_pos=590;

参数解释:

master_host:主服务器宿主机Ubuntu的ip地址

master_log_file:前面查询到的主服务器日志文件名

master_log_pos:前面查询到的主服务器日志文件位置

开启同步,查看同步状态

Django项目搭建

1、项目创建

django-admin startproject test2

2、应用创建

python manage.py startapp booktest

3、模板定义

为应用booktest下的视图index创建模板index.html,目录结构如下图:

打开templtes/booktest/index.html文件,定义代码如下:

<html>
<head><title>案例</title>
</head>
<body>
<a href="/create/">创建</a>
<ul>
{%for book in list%}<li>{{book.btitle}}--<a href="/delete{{book.id}}/">删除</a></li>
{%endfor%}
</ul>
</body>
</html>

4、编辑设置文件

添加应用名称

定义模板文件路径

注释原有的sqlite连接配置,写入如下代码:

DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'test2',  # 数据库名字,'USER': 'root',  # 数据库登录用户名'PASSWORD': 'mysql',  # 数据库登录密码'HOST': '192.168.254.137',  # 数据库所在主机'PORT': '3306',  # 数据库端口},'slave': {'ENGINE': 'django.db.backends.mysql','NAME': 'test2',  # 数据库名字,'USER': 'root',  # 数据库登录用户名'PASSWORD': 'mysql',  # 数据库登录密码'HOST': '192.168.254.137',  # 数据库所在主机'PORT': '3308',  # 数据库端口},
}

5、模型类编写

打开booktest/models.py文件,定义模型类源码如下

from django.db import models# 定义图书模型类BookInfo
class BookInfo(models.Model):btitle = models.CharField(max_length=20)  # 图书名称bpub_date = models.DateField()  # 发布日期bread = models.IntegerField(default=0)  # 阅读量bcomment = models.IntegerField(default=0)  # 评论量isDelete = models.BooleanField(default=False)  # 逻辑删除# 定义英雄模型类HeroInfo
class HeroInfo(models.Model):hname = models.CharField(max_length=20)  # 英雄姓名hgender = models.BooleanField(default=True)  # 英雄性别isDelete = models.BooleanField(default=False)  # 逻辑删除hcomment = models.CharField(max_length=200)  # 英雄描述信息hbook = models.ForeignKey('BookInfo')  # 英雄与图书表的关系为一对多,所以属性定义在英雄模型类中

6、迁移

安装pymysql
pip install pymysql安装成功之后,在test2/_init_.py文件中加上如下代码:
import pymysql
pymysql.install_as_MySQLdb()生成迁移文件
python manage.py makemigrations执行迁移文件在数据库生成表
python manage.py migrate

打开数据库的命令行,查看当前所有表如下图:

7、测试数据

在数据库命令行中,复制如下语句执行,向booktest_bookinfo表中插入测试数据:

insert into booktest_bookinfo(btitle,bpub_date,bread,bcomment,isDelete) values
('射雕英雄传','1980-5-1',12,34,0),
('天龙八部','1986-7-24',36,40,0),
('笑傲江湖','1995-12-24',20,80,0),
('雪山飞狐','1987-11-11',58,24,0);

再复制如下语句执行,向booktest_heroinfo表中插入测试数据:

insert into booktest_heroinfo(hname,hgender,hbook_id,hcomment,isDelete) values
('郭靖',1,1,'降龙十八掌',0),
('黄蓉',0,1,'打狗棍法',0),
('黄药师',1,1,'弹指神通',0),
('欧阳锋',1,1,'蛤蟆功',0),
('梅超风',0,1,'九阴白骨爪',0),
('乔峰',1,2,'降龙十八掌',0),
('段誉',1,2,'六脉神剑',0),
('虚竹',1,2,'天山六阳掌',0),
('王语嫣',0,2,'神仙姐姐',0),
('令狐冲',1,3,'独孤九剑',0),
('任盈盈',0,3,'弹琴',0),
('岳不群',1,3,'华山剑法',0),
('东方不败',0,3,'葵花宝典',0),
('胡斐',1,4,'胡家刀法',0),
('苗若兰',0,4,'黄衣',0),
('程灵素',0,4,'医术',0),
('袁紫衣',0,4,'六合拳',0);

8、视图编写

打开booktest/views.py文件,定义视图代码如下:

from django.shortcuts import render,redirect
from booktest.models import *
from datetime import date#查询所有图书并显示
def index(request):#使用从服务器进行读操作list=BookInfo.objects.using('slave').all()return render(request,'booktest/index.html',{'list':list})#默认使用主服务器进行写操作
#创建新图书
def create(request):book=BookInfo()book.btitle = '流星蝴蝶剑'book.bpub_date = date(1995,12,30)book.save()#转向到首页return redirect('/')#逻辑删除指定编号的图书
def delete(request,id):book=BookInfo.objects.get(id=int(id))book.delete()#转向到首页return redirect('/')

9、url路由配置

打开test2/urls.py文件,配置url如下:

from django.conf.urls import include, url
from django.contrib import adminurlpatterns = [url(r'^admin/', include(admin.site.urls)),#引入booktest的url配置url(r'^',include('booktest.urls')),
]

在booktest应用下创建urls.py文件,代码如下:

from django.conf.urls import url
from booktest import viewsurlpatterns=[url(r'^$',views.index),url(r'^delete(\d+)/$',views.delete),url(r'^create/$',views.create),
]

10、运行

python manage.py runserver 127.0.0.1

html界面中点击创建或删除后,由主服务器执行写操作,由从服务器同步主服务器数据执行读操作,可以看到渲染的数据在增加或减少

版权声明:本文为CSDN博主「Pythonicc」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/Pythonicc/article/details/105072170

 

推荐阅读
  • 实操来了!一文告诉你如何用 Streamlit 和 Heroku 开发 Web

  • 避坑!使用 Kubernetes 最易犯的 10 个错误

  • 雷军:4G 手机已清仓,全力转 5G;QQ音乐播放中途插语音广告引热议;Wine 5.9 发布 | 极客头条

  • 15 岁黑进系统,发挑衅邮件意外获 Offer,不惑之年捐出全部财产,Twitter CEO 太牛了!

  • 必读!53个Python经典面试题详解

  • 赠书 | 1月以来 Tether 增发47亿 USDT,美元都去哪儿了?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/517784.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Flink和规则引擎的实时风控解决方案

对一个互联网产品来说&#xff0c;典型的风控场景包括&#xff1a;注册风控、登陆风控、交易风控、活动风控等&#xff0c;而风控的最佳效果是防患于未然&#xff0c;所以事前事中和事后三种实现方案中&#xff0c;又以事前预警和事中控制最好。 这要求风控系统一定要有实时性…

分辨垃圾材质自动分类 支付宝升级垃圾分类AI回收箱

塑料罐、易拉罐、玻璃瓶分别怎么丢&#xff1f;在今天召开的云栖大会现场&#xff0c;支付宝推出了智能垃圾箱&#xff0c;可对各类不同材质的饮料瓶自动识别、分类丢弃&#xff0c;为行业领先。智能垃圾箱是蚂蚁金服首次在业内推出SKU粒度的垃圾识别技术&#xff0c;借助机器视…

结构化大数据分析平台设计

前言 任何线上系统都离不开数据&#xff0c;有些数据是业务系统自身需要的&#xff0c;例如系统的账号&#xff0c;密码&#xff0c;页面展示的内容等。有些数据是业务系统或者用户实时产生的&#xff0c;例如业务系统的日志&#xff0c;用户浏览访问的记录&#xff0c;系统的…

没错,你离分布式搜索只差一个Elasticsearch入门!

来源 | 沉默王二责编 | Carol封图 | CSDN 付费下载自视觉中国学习真的是一件令人开心的事情&#xff0c;上次分享了Redis 入门的文章后&#xff0c;收到了很多小伙伴的鼓励&#xff0c;比如说&#xff1a;“哎呀&#xff0c;不错呀&#xff0c;通俗易懂&#xff0c;十分钟真的入…

蚂蚁金服总裁胡晓明:科技如何驱动金融从离线走向在线

今天&#xff0c;2019阿里云栖大会在杭州云栖小镇开幕。蚂蚁金服的展区吸引到不少关注金融创新的“同道中人”。 除了亲身体验蚂蚁金服在金融科技领域的创新技术&#xff0c;蚂蚁金服集团总裁胡晓明特别在主论坛发表题为《数字经济时代的金融科技》的主题演讲&#xff0c;分享数…

1万亿次、10亿人、10亿张,科技给生活带来多少改变?

云栖大会精彩进行中&#xff0c;今天&#xff0c;是 Day-2。 一早&#xff0c;阿里技术明星团闪亮登场&#xff01; 贾扬清&#xff1a;阿里巴巴副总裁、阿里云智能计算平台事业部总经理、高级研究员 李飞飞&#xff1a;阿里巴巴副总裁、阿里云智能数据库产品事业部总经理、高级…

“编程能力差,90%输在了数学上!”CTO:其实你们都是瞎努力!

01从未得到过重视的问题一流程序员学数学&#xff0c;二流程序员学算法&#xff0c;低端看高端就是黑魔法。可能有人以为这就是个段子&#xff0c;但有过工作经验的都知道&#xff0c;这其实就是程序员的真实写照&#xff01;想一想&#xff0c;我们学习、求职、工作的场景中&a…

云原生时代|分布式系统设计知识图谱(内含22个知识点)

我们身处于一个充斥着分布式系统解决方案的计算机时代&#xff0c;无论是支付宝、微信这样顶级流量产品、还是区块链、IOT等热门概念、抑或如火如荼的容器生态技术如Kubernetes&#xff0c;其背后的技术架构核心都离不开分布式系统。 为什么要懂分布式架构 系统学习分布式架构…

mysq启动失败

文章目录一、一站式解决1. 问题分析定位二、特殊场景2.1. 问题分析定位2.2. 解决方案2.3. 解决方案2一、一站式解决 1. 问题分析定位 # 找到MySQL的配置文件&#xff0c;复制mysql的数据目录 vim /etc/my.cnf# 进入msyql的数据目录 cd /data/mysql# 查看日志文件 vim mysql.e…

藏不住了,这就是阿里 AI 的真正实力!

不好意思&#xff0c;我要放大招了&#xff01; 在今天的杭州云栖大会上&#xff0c;阿里巴巴首次公布人工智能调用规模&#xff1a; 每天调用超 1万亿 次 服务全球 10亿 人 日处理图像 10亿 张 视频 120万 小时 语音 55万 小时 自然语言 5千亿 句 在AI芯片、AI云服务、AI算…

Error和Exception(异常)

Error和Exception&#xff08;异常&#xff09; 掌握以下三种类型的异常&#xff1a;检查性异常&#xff1a;最具代表的检查性异常是用户错误或问题引起的异常&#xff0c;这是程序员无法预见的。例如打开一个不存在文件时&#xff0c;一个异常就发生了&#xff0c;这些异常在…

Kubernetes 是如何调度的?

作者 | 阿文&#xff0c;责编 | 郭芮头图 | CSDN 下载自东方IC出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;自互联网出现以来 &#xff0c;云计算的概念已经提出了有 50 年。从1957 年&#xff0c;John McCarthy 将计算机中的分时共享概念设计成了一种工具。从此…

# Schedulerx正式登陆Ali-k8s应用目录

简介 分布式任务调度 SchedulerX 是阿里巴巴基于 Akka 架构自研的的分布式任务调度平台&#xff0c;今天正式登陆阿里云容器服务Kubernetes应用目录&#xff0c;支持用户以云原生的方式获取定时、工作流任务编排、分布式批量调度等功能&#xff0c;同时具有高可靠、海量任务、…

刚刚,阿里巴巴小程序生态联盟重磅启动

9月27日下午&#xff0c;阿里巴巴小程序繁星计划峰会作为杭州云栖大会的压轴好戏&#xff0c;在云栖小镇国际会展中心迎来千余位商家、合作伙伴、个人开发者和行业专家。峰会以“小程序、大生态”为题&#xff0c;发布了阿里巴巴小程序繁星计划补贴的更多细节方案&#xff0c;并…

因为一个跨域请求,我差点丢了饭碗

来源 | 编程技术宇宙责编 | 王晓曼封图 | CSDN下载自视觉中国浏览器基本原理我叫小风&#xff0c;是Windows帝国一个普通的上班族。今天&#xff0c;我入职了一家浏览器公司&#xff0c;公司的主营业务是为人类提供Internet上网服务&#xff0c;我的岗位是负责执行JavaScript代…

MongoDB BI Connector 实战指南

MongoDB 使用 BI Connector 来支持 BI 组件直接使用 SQL 或 ODBC 数据源方式直接访问 MongoDB&#xff0c;在早期 MongoDB 直接使用 Postgresql FDW 来实现 SQL 到 MQL 的转换&#xff0c;后来实现更加轻量级的 mongosqld 来支持 BI 工具的连接。 安装 BI Connector 参考 Inst…

基于Topic消息路由的M2M设备间通信Node JS SDK 示例

概述 M2M&#xff08;即Machine-to-Machine&#xff09;是一种端对端通信技术。本章节以Node JS SDK为例&#xff0c;使用基于Topic消息路由的M2M设备间通信&#xff0c;主要介绍如何基于物联网平台构建一个M2M设备间通信架构。 实验步骤 第一部分&#xff1a;配置相关 1、产品…

8 种架构设计模式优缺点大曝光 | 原力计划

作者 | 程序员Tony责编 | 王晓曼出品 | CSDN博客什么是架构我想这个问题&#xff0c;十个人回答得有十一个答案&#xff0c;因为另外的那一个是大家妥协的结果&#xff0c;哈哈&#xff0c;我理解&#xff0c;架构就是骨架。人类的身体的支撑是主要由骨架来承担的&#xff0c;然…

企业实战_06_MyCat 常用的分片算法

接上一篇&#xff1a;企业实战_05_MyCat用户密码加密 https://gblfy.blog.csdn.net/article/details/100056536 下一篇&#xff1a;企业实战_07_MyCat 搭建Mysql 一主一从复制环境 https://gblfy.blog.csdn.net/article/details/118640210

数据库OceanBase创始人阳振坤:通关TPC-C到底有多难?

自从蚂蚁金服自研数据库OceanBase获得TPC-C测试第一名后&#xff0c;引起了行业内外大量关注&#xff0c;我们衷心的感谢大家对OceanBase的支持与厚爱&#xff0c;也虚心听取外界的意见和建议。为了让大家更好的了解测试的技术细节&#xff0c;我们特意邀请了OceanBase的核心研…