• 基于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() #读
  • 相关阅读:
    avaweb学习总结(八)——HttpServletResponse对象(二)
    javaweb学习总结(七)——HttpServletResponse对象(一)
    javaweb学习总结(六)——Servlet开发(二)
    javaweb学习总结(五)——Servlet开发(一)
    javaweb学习总结(四)——Http协议
    JAVAWeb学习总结(3)
    JAVAWeb学习总结(二)
    eclipse配置tomcat,访问http://localhost:8080出现404错误
    shader学习路线
    Unity3D WebCamTexture 调用外部摄像头
  • 原文地址:https://www.cnblogs.com/Liu928011/p/14882114.html
Copyright © 2020-2023  润新知