MySQL主从同步、django读写分离

1、MySQL 主从同步介绍

1.1、主从同步机制

  • 在多台数据服务器中,分为主服务器和从服务器。一台主服务器对应多台从服务器
  • 主服务器只负责写入数据,从服务器只负责同步主服务器的数据,并让外部程序读取数据
  • 主服务器写入数据后,即刻将写入数据的命令发送给从服务器,从而使主从数据同步
  • 当从服务器不能工作时,整个系统将不受影响;当主服务器不能工作时,可以方便的从从服务器选举一台来当做主服务器

在这里插入图片描述

1.2、优点

  • 提高读写性能
    • 因为主从同步后,数据写入和读取是在不同的服务器上进行的,而且可以通过增加服务器来提高数据库的读取性能
  • 提高数据安全
    • 因为数据已经复制到从服务器,可以在从服务器上备份而不破坏主服务器相应的数据

2、配置 MySQL 主从同步

2.1、运行从服务器

  • 使用搭建了 mysql 服务的 docker 镜像来搭建 mysql 从服务器
# 导入镜像
docker image load -i 镜像包
  • 在宿主机中准备文件夹
sudo mkdir ~/mysql_slave/
sudo mkdir ~/mysql_slave/data/
sudo cp -r /etc/mysql/mysql.conf.d/ ~/mysql_slave/
  • 修改从服务器配置文件
# 从机端口号
port = 8306
# 关闭日志
general_log = 0
# 从机唯一编号
server-id = 2
  • 把 mysql 镜像运行成容器(使用从服务器的配置文件)
sudo docker run --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 -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 -p123456 -h127.0.0.1 --port=8306

2.2、配置主从同步

  • 修改主服务器配置文件(开启同步功能)
vim /etc/mysql/mysql.conf.d/mysql.cnf

# 开启日志: 把下面的代码注释去掉
general_log_file = /var/log/mysql/mysql.log
general_log = 1
# 主机唯一编号
server-id = 1
# 二进制日志文件
log_bin = /var/log/mysql/mysql-bin.log
  • 重启 mysql 主服务器
sudo /etc/init.d/mysql restart
  • 手动把主服务器现有的数据导出,在从服务器中恢复
# 导出主服务器数据
mysqldump -uroot -pmysql --all-databases --lock-all-tables > ~/master_db.sql

# 导入到从服务器中
mysql -uroot -p123456 -h127.0.0.1 --port=8306 < ~/master_db.sql
  • 新建主服务器的一个账号(该账号是主服务器账号,给从服务器使用)
# 登录主服务器
mysql -uroot -pmysql

# 新建 slave 账号赋予可复制权限
grant replication slave on *.* to "slave"@"%" identified by "slave";

# 刷新权限
flush privileges;


# 在主服务器中查看二进制文件内容
show master status;
  • 在从服务器中指定同步的主服务器(使用主服务器提供的同步账号)
# 登录从服务器
mysql -uroot -p123456 -h127.0.0.1 --port=8306

// 连接主服务器
change master to master_host='127.0.0.1', master_user='slave', master_password='slave',master_log_file='mysql-bin.000003', master_log_pos=730;

// 开启从机服务
start slave;

// 查看从机状态
show slave status \G;

3、配置 Django 读写分离

  • 修改工程配置文件,配置从服务器
DATABASES = {
	"slave": {
		"ENGINE": "django.db.backends.mysql",
		"NAME":   XXX,
		"USER": "root",
		"PASSWORD": "123456",
		"HOST": "127.0.0.1",
		"PORT": 8306
	}
}

# 指定 django 数据库读写路由
DATABASES_ROUTERS = [
	"..."
]
View Code
  • 自定义 django 数据库路由
class MasterSlaveDBRouter(object):
	def db_for_read(self, model, **hints):
		"""返回slave配置"""
		return "slave"

	def db_for_write(self, model, **hints):
		"""返回default配置"""
		return "default"

	def allow_relation(self, obj1, obj2, **hints):
		"""是否运行关联操作"""
		return True

View Code

posted on 2020-09-18 16:58  yycnblog  阅读(222)  评论(0)    收藏  举报

导航