阿里云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',
}
}
(二)配置数据库路由
- 在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'
- 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同步的流程大致如下:
- 主服务器(master)将变更事件(更新、删除、表结构改变等等)写入二进制日志(master log)。
- 从服务器(slave)的IO线程从主服务器(binlog dump线程)获取二进制日志,并在本地保存一份自己的二进制日志(relay log) 。
- 从服务器的SQL线程读取本地日志(relay log),并重演变更事件。
(一)Master主服务器(主机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 指定不记录二进制日志的数据库。
- 创建从服务器用到的账户和权限
CREATE USER 'backup'@ '%' IDENTIFIED BY '000000';
GRANT REPLICATION SLAVE ON *.* TO 'backup'@ '%';
- 重启MySQL,终端运行service mysql restart
- 导出数据,终端运行
mysqldump -utest -p000000 db1 > data.sql
- 查看主服务器状态:
show master status;
(二)Slave从服务器(主机2)配置
- 编辑my.cnf
vim /etc/mysql/my.cnf
在[mysqld]
中添加:
server-id = 2
relay-log = slave-relay-bin
relay-log-index = slave-relay-bin.index
- 重启Slave从服务器MySQL,命令:service mysql restart
- 导入数据
将主机1上的data.sql文件传输到主机2根目录下,然后在mysql终端运行:
CREATE DATABASE db1;
USE db1;
SOURCE /data.sql;
- 连接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,否则有可能出现同步失败。
- 启动Slave数据同步
START SLAVE;
- 查看Slave信息:
SHOW SLAVE STATUS\G;
备注:Slave_IO_Running和Slave_SQL_Running都为yes才表示同步成功
到这里,所有都配置好了,在主服务器上数据库db1的修改都会被同步到从服务器。