主从备份就是在主服务器上修改,数据会同步到从服务器,从服务器只能提供读取数据,不能写入,实现备份的同时也实现了数据库性能的优化,以及提升了服务器安全。
Django网站访问量比较大,对数据库的读写操作十分频繁,分析access_log,发现有的数据表查询居多,有的表写入居多,比如session,这样单个数据库执行两种业务操作负担较大,所以使用主从备份的逻辑。
1.开始前,应该保证两台服务器能够互相通信
master:192.168.29.201
minion:192.168.29.129
2.关闭两台服务器的防火墙和selinux
systemctl stop firewalld #关闭防火墙 setenforce 0 #关闭selinux
3.给两台服务器安装mariadb数据库,并进入 生产模式
yum install mariadb mariadb-server -y #yum安装 systemctl start mariadb #开启服务 systemctl enable mariadb #设置开机启动mariadb mysql_secure_installation #初始化 注意:在执行初始化数据库命令操作的时候,该选项要为n Disallow root login remotely? [Y/n] n
4. master创建需要主从备份的数据库
MariaDB [(none)]> create database masterdb charset=utf8;
5. master授权所有用户可以操作表
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123' WITH GRANT OPTION; #授权root用户使用123密码从任意地址段的ip进行登录数据库,并有对所有库中的表操作的权限,且允许该用户给其他用户授权
6.刷新授权表
MariaDB [(none)]> flush privileges;
7.在master中创建一张测试表
MariaDB [masterdb]> create table master_table(id int primary key auto_increment,username char(32)); Query OK, 0 rows affected (0.01 sec)
8.导出数据库
[root@bogon opt]# mysqldump -h localhost -u root -p123456 masterdb > masterdb.sql
9.将数据库导出文件传递给minion
[root@bogon opt]# scp ./masterdb.sql root@192.168.29.129:/opt
10.minion创建同名数据库
MariaDB [(none)]> create database masterdb charset=utf8; Query OK, 1 row affected (0.00 sec)
11.minion导入数据表
[root@bogon opt]# mysql -h localhost -u root -p123456 masterdb < masterdb.sql
12.master启动主从备份的配置
[root@bogon opt]# vim /etc/my.cnf
在[mysqld]中配置以下内容:
server-id=1 log_bin=mysql-bin? binlog-do-db=masterdb #配置数据库的名字 binlog-ignore-db=mysql
13.重启master的mariadb并查看其状态
[root@bogon opt]# systemctl restart mariadb #重启数据库 MariaDB [(none)]> show master status; #先进入数据库,在查看master备份状态
14.配置minion主从备份
[root@bogon opt]# vim /etc/my.cnf
在[mysqld]中配置以下内容:
server-id=2 log_bin=mysql-bin? binlog-do-db=masterdb # 配置数据库的名字 binlog-ignore-db=mysql
15.重启服务器
[root@bogon ~]# systemctl restart mariadb
16.客户端上指定要进行主从备份的主服务器
MariaDB [masterdb]> change master to MASTER_HOST='192.168.29.201',MASTER_USER='root',MASTER_PASSWORD='123',MASTER_LOG_FILE='mysql-bin?.000002',MASTER_LOG_POS=245; Query OK, 0 rows affected (0.01 sec)
17.minion上启动主从备份
MariaDB [masterdb]> slave start; Query OK, 0 rows affected, 1 warning (0.00 sec)
18.查看slave状态
MariaDB [masterdb]> show slave status\G #不能出现分号
19.出现以下,则说明配置成功!
20.测试,在master插入一条数据
而在minion可以查到
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'masterdb', 'HOST': "192.168.29.201", "USER": "root", "PASSWORD": "123456" }, 'db2': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'masterdb', 'HOST': "192.168.29.129", "USER": "root", "PASSWORD": "123456" } }
1、同步数据库表:
python manage.py makemigrations
python manage.py migrate --database default
python manage.py migrate --database db2
2、通过配置数据库路由,来自动实现,这样就不需要每次读写都手动指定数据库了。数据库路由中提供了四个方法。这里这里主要用其中的两个:def db_for_read()
决定读操作的数据库,def db_for_write()
决定写操作的数据库。
新建router.py
脚本,定义Router类:
class Router: def db_for_read(self, model, **hints): return 'db2' def db_for_write(self, model, **hints): return 'default'
配置Router ,在settings.py
中指定DATABASE_ROUTERS
DATABASE_ROUTERS = ['router.Router',]
在使用数据库时,通过.using(db_name)
来手动指定要使用的数据库
models.Products.objects.using('default').create() # 写 models.Products.objects.using('db2').all() #读