阿里云ECS+Django+MySQL读写分离与主从同步

环境

操作系统:阿里云ECS服务器Ubuntu 18.04
MySQL:5.7

一、Django读写分离

(一)添加数据库

在settings.py文件中默认只有default数据库,添加一个新的slave数据库:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': '主机1的域名或IP地址',
        'NAME': 'db1',
        'USER': 'test',
        'PASSWORD': '000000',
    },
    'slave': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': '主机2的域名或IP地址',
        'NAME': 'db1',
        'USER': 'test2',
        'PASSWORD': '000000',
    }
}

(二)配置数据库路由

  1. 在settings.py同级目录下新建routers.py文件,定义Router类
class Router:
    def db_for_read(self, model, **hints):
        return 'slave'

    def db_for_write(self, model, **hints):
        return 'default'
  1. settings.py中指定DATABASE_ROUTERS
DATABASE_ROUTERS = ['yourapp.routers.Router']

二、MySQL远程访问

(一)关闭3306端口的防火墙

项目中使用的是阿里云ECS服务器,操作系统是Ubuntu 18.04。要允许外界通过3306端口,只需将3306端口加入到安全组中。

(二)修改MySQL监听地址

默认情况下,MySQL的监听地址是127.0.0.1,只允许本机连接。要想允许其他机器连接,就需要将监听地址修改为0.0.0.0。

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

在这里插入图片描述
注意:需要将所有主从节点的监听地址都修改

(三)创建远程用户

如果已经有test用户,则

USE DATABASES mysql;
UPDATE user SET host='%' WHERE name='test';

否则创建新的用户。

CREATE USER 'test'@'%' IDENTIFIED BY '000000';

授予test用户在db1数据库的权限。

GRANT ALL ON db1.* TO 'test'@'%';

注:在主机2上对test2用户的配置同理。

三、MySQL主从同步

MySQL同步的流程大致如下:

  1. 主服务器(master)将变更事件(更新、删除、表结构改变等等)写入二进制日志(master log)。
  2. 从服务器(slave)的IO线程从主服务器(binlog dump线程)获取二进制日志,并在本地保存一份自己的二进制日志(relay log) 。
  3. 从服务器的SQL线程读取本地日志(relay log),并重演变更事件。

(一)Master主服务器(主机1)配置

  1. 编辑my.cnf
vim /etc/mysql/my.cnf

[mysqld]中添加:

server-id = 1
log_bin = master-bin
log_bin_index = master-bin.index
binlog_do_db = db1
binlog_ignore_db = mysql

备注:server-id 服务器唯一标识,log_bin 启动MySQL二进制日志,binlog_do_db 指定记录二进制日志的数据库,binlog_ignore_db 指定不记录二进制日志的数据库。

  1. 创建从服务器用到的账户和权限
CREATE USER 'backup'@ '%' IDENTIFIED BY '000000';
GRANT REPLICATION SLAVE ON *.* TO 'backup'@ '%';
  1. 重启MySQL,终端运行service mysql restart
  2. 导出数据,终端运行
mysqldump -utest -p000000 db1 > data.sql
  1. 查看主服务器状态:
    show master status;
    在这里插入图片描述

(二)Slave从服务器(主机2)配置

  1. 编辑my.cnf
vim /etc/mysql/my.cnf

[mysqld]中添加:

server-id = 2
relay-log = slave-relay-bin
relay-log-index = slave-relay-bin.index
  1. 重启Slave从服务器MySQL,命令:service mysql restart
  2. 导入数据
    将主机1上的data.sql文件传输到主机2根目录下,然后在mysql终端运行:
CREATE DATABASE db1;
USE db1;
SOURCE /data.sql;
  1. 连接Master主服务器
CHANGE MASTER TO 
	master_host='主机1的IP地址',
	master_port=3306,
	master_user='backup',
	master_password='000000',
	master_log_file='master-bin.000012',
	master_log_pos=93743;

备注:master_log_file对应show master status显示的File列:master-bin.000012;master_log_pos对应Position列:93743,否则有可能出现同步失败。

  1. 启动Slave数据同步
START SLAVE;
  1. 查看Slave信息:
SHOW SLAVE STATUS\G;

在这里插入图片描述
备注:Slave_IO_Running和Slave_SQL_Running都为yes才表示同步成功

到这里,所有都配置好了,在主服务器上数据库db1的修改都会被同步到从服务器。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值