重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
本篇文章为大家展示了使用Django怎么实现MySQL读写分离,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
创新互联成都企业网站建设服务,提供成都做网站、网站设计、外贸营销网站建设网站开发,网站定制,建网站,网站搭建,网站设计,成都响应式网站建设,网页设计师打造企业风格网站,提供周到的售前咨询和贴心的售后服务。欢迎咨询做网站需要多少钱:18980820575
主从同步介绍和优点
在多台数据服务器中,分为主服务器和从服务器。一台主服务器对应多台从服务器。
主服务器只负责写入数据,从服务器只负责同步主服务器的数据,并让外部程序读取数据。
主服务器写入数据后,即刻将写入数据的命令发送给从服务器,从而使得主从数据同步。
应用程序可以随机读取某一台从服务器的数据,这样就可以分摊读取数据的压力。
当从服务器不能工作时,整个系统将不受影响;当主服务器不能工作时,可以方便地从从服务器选举一台来当主服务器
使用主从同步的优点:
提高读写性能
因为主从同步之后,数据写入和读取是在不同的服务器上进行的,而且可以通过增加从服务器来提高数据库的读取性能。
提高数据安全
因为数据已复制到从服务器,可以在从服务器上备份而不破坏主服务器相应数据。
主从同步机制
注意:MySQL服务器之间的主从同步是基于二进制日志机制,主服务器使用二进制日志来记录数据库的变动情况,从服务器通过读取和执行该日志文件来保持和主服务器的数据一致。Docker安装运行MySQL从机
本项目中我们搭建一主一从的主从同步。主服务器:ubuntu操作系统中的MySQL。从服务器:Docker容器中的MySQL获取MySQL镜像# 主从同步尽量保证多台MySQL的版本相同或相近
sudo docker image pull mysql:5.7.22 # 5.7.22版本
sudo docker load -i 文件路径/mysql_docker_5722.tar
指定MySQL从机配置文件在使用Docker安装运行MySQL从机之前,需要准备好从机的配置文件。
为了快速准备从机的配置文件,我们直接把主机的配置文件拷贝到从机中。
# 创建MySQL从机配置文件夹
mkdir mysql_slave
# 创建装数据库数据文件夹
mkdir datacp -r /etc/mysql/mysql.conf.d ./
修改MySQL从机配置文件编辑 ~/mysql_slave/mysql.conf.d/mysqld.cnf文件。
由于主从机都在同一个电脑中,所以我们选择使用不同的端口号区分主从机,从机端口号是8306。
# 从机端口号
port = 8306
# 关闭日志
general_log = 0
# 从机唯一编号
server-id = 2
Docker安装运行MySQL从机创建 root 用户的密码为 mysql sudo docker run --name mysql-slave -e MYSQL_ROOT_PASSWORD=mysql -d --network=host -v /home/python/mysql_slave/data:/var/lib/mysql -v /home/python/mysql_slave/mysql.conf.d:/etc/mysql/mysql.conf.d mysql:5.7.22
测试从机是否创建成功mysql -uroot -pmysql -h 127.0.0.1 --port=8306
主从同步实现
配置主机(ubuntu中MySQL)配置文件如有修改,需要重启主机。sudo service mysql restart
# 开启日志
general_log_file = /var/log/mysql/mysql.log
general_log = 1
# 主机唯一编号
server-id = 1
# 二进制日志文件
log_bin = /var/log/mysql/mysql-bin.log
从机备份主机原有数据# 在做主从同步时,如果从机需要主机上原有数据,就要先复制一份到从机
# 1. 收集主机原有数据
mysqldump -uroot -pmysql --all-databases --lock-all-tables > ~/master_db.sql# 2. 从机复制主机原有数据
mysql -uroot -pmysql -h227.0.0.1 --port=8306 < ~/master_db.sql
主从同步实现# 登录到主机
$ mysql –uroot –pmysql
# 创建从机账号
$ GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' identified by 'slave';
# 刷新权限
$ FLUSH PRIVILEGES;
# 展示ubuntu中MySQL主机的二进制日志信息
$ SHOW MASTER STATUS;
# 可以看到master_log_file和master_log_pos=Position
# 登录到从机
$ mysql -uroot -pmysql -h 127.0.0.1 --port=8306
# 从机连接到主机
$ change master to master_host='127.0.0.1', master_user='slave', master_password='slave',master_log_file=XXX, master_log_pos=XXX;
# 开启从机服务
$ start slave;
# 展示从机服务状态
$ show slave status \G
Django实现MySQL读写分离
增加slave数据库的配置
DATABASES = {
'default': { # 写(主机)
'ENGINE': 'django.db.backends.mysql', # 数据库引擎
'HOST': 'XXXX', # 数据库主机
'PORT': 3306, # 数据库端口
'USER': 'XX', # 数据库用户名
'PASSWORD': 'XXX', # 数据库用户密码
'NAME': 'XXX' # 数据库名字
},
'slave': { # 读(从机)
'ENGINE': 'django.db.backends.mysql',
'HOST': 'XXXX',
'PORT': 8306,
'USER': 'XXX',
'PASSWORD': 'XXX',
'NAME': 'XXX'
}
}
创建和配置数据库读写路由
创建数据库读写路由# 在meiduo_mall.utils.db_router.py中实现读写路由
class MasterSlaveDBRouter(object):
"""数据库读写路由""" def db_for_read(self, model, **hints):
"""读"""
return "slave" def db_for_write(self, model, **hints):
"""写"""
return "default" def allow_relation(self, obj1, obj2, **hints):
"""是否运行关联操作"""
return True
配置数据库读写路由# 配置数据库读写分离路由
DATABASE_ROUTERS = ['meiduo_mall.utils.db_router.MasterSlaveDBRouter']
冷备份
冷备份发生在数据库已经正常关闭的情况下,当正常关闭时会提供给我们一个完整的数据库。冷备份是将关键性文件拷贝到另外位置的一种说法。对于备份数据库信息而言,冷备份是最快和最安全的方法。简单说法就是:离线(没有新的数据来)复制一份保存,有事就直接用这备份来恢复。
冷备份的优点:
是非常快速的备份方法(只需拷贝文件)
容易归档(简单拷贝即可)
容易恢复到某个时间点上(只需将文件再拷贝回去)
能与归档方法相结合,作数据库“最新状态”的恢复。
低度维护,高度安全。
冷备份的缺点:
单独使用时,只能提供到“某一时间点上”的恢复。
在实施备份的全过程中,数据库必须要作备份而不能作其它工作。也就是说,在冷备份过程中,数据库必须是关闭状态。
若磁盘空间有限,只能拷贝到磁带等其它外部存储设备上,速度会很慢。
不能按表或按用户恢复。
值得注意的是冷备份必须在数据库关闭的情况下进行,当数据库处于打开状态时,执行数据库文件系统备份是无效的 。而且在恢复后一定要把数据库文件的属组和属主改为mysql。热备份
热备份是在数据库运行的情况下,备份数据库操作的sql语句,当数据库发生问题时,可以重新执行一遍备份的sql语句。简单说就是:在线的保存对数据库操作的sql语句,有事就再跑一遍这些sql语句。# 在做主从同步时,如果从机需要主机上原有数据,就要先复制一份到从机
# 1. 收集主机原有数据
mysqldump -uroot -pmysql --all-databases --lock-all-tables > ~/master_db.sql# 2. 从机复制主机原有数据(在配置文件所在目录下,数据会写入data文件中)
mysql -uroot -pmysql -h227.0.0.1 --port=8306 < ~/master_db.sql
热备份的优点:
可在表空间或数据文件级备份,备份时间短。
备份时数据库仍可使用。
可达到秒级恢复(恢复到某一时间点上)。
可对几乎所有数据库实体作恢复。
恢复是快速的,在大多数情况下在数据库仍工作时恢复。
热备份的缺点:
不能出错,否则后果严重。
若热备份不成功,所得结果不可用于时间点的恢复。
因难于维护,所以要特别仔细小心,不允许“以失败而告终”
上述内容就是使用Django怎么实现MySQL读写分离,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注创新互联-成都网站建设公司行业资讯频道。