【Django】MySQL读写分离(主从分离)

1.主从分离

为了提高MySQL的性能,一般会选择使用多个MySQL同时工作,分为主服务器和从服务器,一台主服务器对应多台从服务器

主从同步是基于二进制日志机制的,主服务器将数据变动的情况写进二进制日志,从服务器读取该日志并且执行该日志文件使数据保持一致
在这里插入图片描述
优点

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

2.配置步骤

2.1 下载MySQL的docker镜像
# 使用docker加载MySQL镜像
docker image load -i mysql_docker_5722.tar
# 删除以前配置的文件夹
sudo rm -r ~/mysql_slave/

# 复制已有服务器的配置
sudo mkdir ~/mysql_slave/
sudo mkdir ~/mysql_slave/data/
sudo cp -r /etc/mysql/mysql.conf.d ~/mysql_slave/
2.2 修改从服务器的配置
cd ~/mysql_slave
sudo vim mysql.conf.d/mysqld.cnf
  • 34行port改成8306,从服务器端口号与主服务器不同即可
  • 70行general_log改成0,关闭日志,从服务器不记录日志信息
  • 84行serverce-id改成2,从机唯一编号与服务器不同即可
2.3 把MySQL镜像运行成容器
# 移除已存在的容器(如果有的话)
sudo docker container rm -f mysql-slave

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

注意:上面的代码从服务器的root使用的密码是123456

2.4 配置主从同步

打开MySQL服务的配置文件,

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

取消注释69、70行,开启日志

 69 general_log_file        = /var/log/mysql/mysql.log
 70 general_log             = 1

保存退出后重启服务器

sudo /etc/init.d/mysql restart 
2.5 同步数据

导出主服务器已存在的数据并且导入到从服务器

# 从主服务器导出数据
mysqldump -uroot -pmysql --all-databases --lock-all-tables >~/master_db.sql

# 导入到从服务器
mysql -uroot -p123456 -h127.0.0.1 --port=8306 < ~/master_db.sql
2.6 新建账号

在主服务器新建一个账号,给从服务器用

# 登录主服务器
mysql -uroot -pmysql

# 新建账号
grant replication slave on *.* to 'slave'@'%'identified by 'slave';

# 刷新权限
flush privileges;

# 查看二进制日志文件的信息
 show master status;

可以看到主服务器的File和Position两个字段的值,下面会用到
在这里插入图片描述

2.6 指定从服务器同步主服务器
# 打开一个新终端,登录从服务器
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.000245', master_log_pos=730;

# 开启从服务器
start slave;

# 查看状态
show slave status \G;

注意:master_log_file和master_log_pos这两个值是上面查看主服务器status显示的

在这里插入图片描述

3.配置Django的读写分离

3.1 修改settings配置文件
DATABASES = {
    
    
	# 默认服务器(主服务器)
    'default': {
    
    
        'ENGINE': 'django.db.backends.mysql', # 数据库引擎
        'HOST': '192.168.203.153', # 数据库主机
        'PORT': 3306, # 数据库端口
        'USER': 'root', # 数据库用户名
        'PASSWORD': 'mysql', # 数据库用户密码
        'NAME': 'ihome' # 数据库名字
    },
    # 从服务器
    'slave': {
    
    
            'ENGINE': 'django.db.backends.mysql',
            'HOST': '192.168.203.153', 
            'PORT': 8306, # 数据库端口
            'USER': 'root', 
            'PASSWORD': '123456', # 密码
            'NAME': 'ihome'
        }
}

# 指定Django数据库读写路由
DATABASE_ROUTERS = [
 'ihome.utils.db_router.MasterSlaveDBRouter'
]
3.2 新建一个py文件控制读写路由

ihome/utils/db_router.py

class MasterSlaveDBRouter(object):
    def db_for_read(self, model, **hints):
        # 返回slave配置 --> 指向从mysql
        print('从服务器读取')
        return 'slave'

    def db_for_write(self, model, **hints):
        # 返回default配置 --> 指向主mysql
        print('主服务器写入')
        return 'default'

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

4.测试读写分离

1.打开Django的shell
python manage.py shell
2.验证读写数据
from users.models import User
User.objects.get(pk =1)

猜你喜欢

转载自blog.csdn.net/qq_39147299/article/details/108676294