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
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
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