zoukankan      html  css  js  c++  java
  • 基于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() #读
  • 相关阅读:
    [Luogu P3626] [APIO2009] 会议中心
    杭电 1869 六度分离 (求每两个节点间的距离)
    杭电 1874 畅通工程续 (求某节点到某节点的最短路径)
    最短路径模板
    杭电 2544 最短路径
    POJ 1287 Networking (最小生成树模板题)
    NYOJ 1875 畅通工程再续 (无节点间距离求最小生成树)
    POJ 2485 Highways (求最小生成树中最大的边)
    杭电 1233 还是畅通工程 (最小生成树)
    杭电 1863 畅通工程 (最小生成树)
  • 原文地址:https://www.cnblogs.com/Liu928011/p/14882114.html
Copyright © 2011-2022 走看看