基于CentOS7的MySQL数据库主从备份

Mysql主从备份介绍

   主从备份就是在主服务器上修改,数据会同步到从服务器,从服务器只能提供读取数据,不能写入,实现备份的同时也实现了数据库性能的优化,以及提升了服务器安全。

使用主从备份的原因

     Django网站访问量比较大,对数据库的读写操作十分频繁,分析access_log,发现有的数据表查询居多,有的表写入居多,比如session,这样单个数据库执行两种业务操作负担较大,所以使用主从备份的逻辑。

 

 

 主从备份的步骤

 

配置详情演示

 1.开始前,应该保证两台服务器能够互相通信

master:192.168.29.201  

 

 

 

 

minion:192.168.29.129

 

 

 

 

 

2.关闭两台服务器的防火墙和selinux

systemctl stop firewalld #关闭防火墙

setenforce 0  #关闭selinux

PS:这里为了演示方便,直接关掉防火墙,实际上在部署过程中,关闭防火墙是不可取的,因为不安全,所以只需要让防火墙把指定端口,或者服务开启即可。

1、开放端口

firewall-cmd --zone=public --add-port=3306/tcp --permanent   # 开放3306端口

firewall-cmd --zone=public --remove-port=3306/tcp --permanent  #关闭3306端口

firewall-cmd --reload   # 配置立即生效


2、开放服务:需要将 MySQL 服务加入防火墙,然后重启防火墙:
firewall
-cmd --zone=public --permanent --add-service=mysql #将 MySQL 服务加入防火墙 firewall-cmd --zone=public --permanent --remove-service=mysql #从防火墙中移除mysql服务 firewall-cmd --reload #重载防火墙配置 3、查看防火墙所有开放的端口或服务 firewall-cmd --zone=public --list-ports #端口 firewall-cmd --zone=public --list-service #服务 4、查看防火墙状态 firewall-cmd --state

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可以查到

 Django读写分离配置

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() #读

 

posted @ 2021-06-14 14:29  千叶千影  阅读(160)  评论(0编辑  收藏  举报