zoukankan      html  css  js  c++  java
  • mysql主从

    主从简介

    在现代企业中,数据显得尤为重要,而存储数据的数据库选择又五花八门,但无论是何种数据库,均存在着一种隐患。

    想几个问题:

    • 用一台数据库存放数据,若此数据库服务器宕机了导致数据丢失怎么办?
    • 业务量大了,数据多了,访问的人多了,一台数据库无法保证服务质量了怎么办?

    1.1 主从作用

    • 实时灾备,用于故障切换
    • 读写分离,提供查询服务
    • 备份,避免影响业务

    1.2 主从形式

    • 一主一从
    • 主主复制
    • 一主多从---扩展系统读取的性能,因为读是在从库读取的
    • 多主一从---5.7开始支持
    • 联级复制

    2. 主从复制原理

    主从复制步骤:

     1.主库将所有的写操作记录到binlog日志中并生成一个log dump线程,将binlog日志传给从库的I/O线程。

     2.从库生成两个线程,一个I/O线程,一个SQL线程。

        2.1  I/O线程去请求主库的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中

        2.2SQL线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,达到最终数据一致的目的

    主从复制配置步骤:

    1. 确保从数据库与主数据库里的数据一样
    2. 在主数据库里创建一个同步账号授权给从数据库使用
    3. 配置主数据库(修改配置文件)
    4. 配置从数据库(修改配置文件)

    需求:
    搭建两台MySQL服务器,一台作为主服务器,一台作为从服务器,主服务器进行写操作,从服务器进行读操作

    数据库角色IP有无数据
    主数据库 192.168.44.128 无数据
    从数据库 192.168.44.131 无数据

    1.准备两台虚拟机,一台主机名为master,一台主机名为slave,都使用yum装上mariadb服务,安全初始化数据库。在master上创建一个同步账号。

    //mysql_secure_installation 安全初始化数据库
    [root@master ~]# mysql -uroot -p123
    MariaDB [(none)]> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    +--------------------+
    [root@slave ~]# mysql -uroot -p123
    MariaDB [(none)]> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    +--------------------+
    [root@master ~]# systemctl stop firewalld
    [root@master ~]# setenforce 0
    [root@master ~]# mysql -uroot -p123
    //在主数据库里创建一个同步账号csl授权给从数据库使用
    MariaDB [(none)]> grant replication slave on *.* to 'csl'@'192.168.44.131' identified by 'csl123';
    MariaDB [(none)]> flush privileges;
    
    [root@slave ~]# systemctl stop firewalld
    [root@slave ~]# setenforce 0
    //在从数据库里使用csl账号登陆
    [root@slave ~]# mysql -ucsl -pcsl123 -h192.168.44.128

    2.配置主数据库

    [root@master ~]# vi /etc/my.cnf
    #
    # This group is read both both by the client and the server
    # use it for options that affect everything
    #
    [client-server]
    
    [mysqld]            #加入三行数据
    log-bin=mysql_bin
    server-id=10
    #
    # include all files from the config directory
    #
    !includedir /etc/my.cnf.d
    
    [root@master ~]# systemctl restart mariadb
    [root@master ~]# mysql -uroot -p123
    MariaDB [(none)]> show master status;
    +------------------+----------+--------------+------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +------------------+----------+--------------+------------------+
    | mysql_bin.000001 |      328 |              |                  |
    +------------------+----------+--------------+------------------+

    3.配置从数据库

    [root@slave ~]# vi /etc/my.cnf
    
    #
    # This group is read both both by the client and the server
    # use it for options that affect everything
    #
    [client-server]
    
    [mysqld]           #加入三行数据
    server-id=20       #从库的server-id必须要比主库的大
    relay-log=myrelay
    #
    # include all files from the config directory
    #
    !includedir /etc/my.cnf.d
    [root@slave ~]# systemctl restart mariadb
    [root@slave ~]# mysql -uroot -p123
    //配置并启动主从复制
    MariaDB [(none)]> change master to master_host='192.168.44.128',master_user='csl',master_password='csl123',master_log_file='mysql_bin.000001',master_log_pos=328;
    MariaDB [(none)]> start slave;
    MariaDB [(none)]> show slave statusG
    Slave_IO_Running: Yes         #这两行是yes就代表成功
    Slave_SQL_Running: Yes

    4.验证测试,在主数据库上写入数据看从数据库上数据是否同步。

    MariaDB [(none)]> create database school;
    MariaDB [(none)]> use school;
    MariaDB [school]> create table student(id int not null primary key auto_increment,name varchar(20) not null,age tinyint);
    MariaDB [school]> insert student(name,age) values('tom',15),('tim',12),('jack',18);
    
    [root@slave ~]# mysql -uroot -p123
    MariaDB [(none)]> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | school             |
    +--------------------+
    MariaDB [(none)]> use school;
    MariaDB [school]> select * from student;
    +----+------+------+
    | id | name | age  |
    +----+------+------+
    |  1 | tom  |   15 |
    |  2 | tim  |   12 |
    |  3 | jack |   18 |
    +----+------+------+
    数据库角色IP有无数据
    主数据库 192.168.44.128 有数据
    从数据库 192.168.44.131 无数据

    5.准备两台虚拟机,一台主机名为master,一台主机名为slave,都使用yum装上mariadb服务,安全初始化数据库。在master上创建一个同步账号,在master写入数据。

    [root@master ~]# systemctl stop firewalld
    [root@master ~]# setenforce 0
    [root@slave ~]# systemctl stop firewalld
    [root@slave ~]# setenforce 0
    [root@master ~]# mysql -uroot -p123
    MariaDB [(none)]> create database info;
    MariaDB [(none)]> use info;d
    MariaDB [info]> create table basic(id int not null primary key auto_increment,name varchar(50),job varchar(50));
    MariaDB [info]> insert basic(name,job) values('tom','engineer'),('jerry','office');
    MariaDB [info]> create table salary(name varchar(50),salary float);
    MariaDB [info]> insert salary(name,salary) values('tom',8000),('jerry',8500),('zhangshan',9000),('lisi',7500);

    6.全备主数据库,确保从数据库与主数据库里的数据一样

    //全备主库时需要另开一个终端,给数据库加上读锁,避免在备份期间有其他人在写入导致数据不一致
    MariaDB [(none)]> flush tables with read lock;
    //此锁表的终端必须在备份完成以后才能退出
    
    //备份主库并将备份文件传送到从库
    [root@master ~]# mysqldump -uroot -p123 --all-databases >all.sql
    [root@master ~]# scp all.sql 192.168.44.131:/root
    
    //解除主库的锁表状态,直接退出交互式界面即可
    mysql> quit
    Bye
    
    //在从库上恢复主库的备份并查看从库有哪些库,确保与主库一致
    [root@slave ~]# mysql -uroot -p123 < all.sql
    [root@slave ~]# mysql -uroot -p123 -e 'show databases;'
    +--------------------+
    | Database           |
    +--------------------+
    | info               |
    | information_schema |
    | mysql              |
    | performance_schema |
    +--------------------+

    7.在主数据库里创建一个同步账号csl授权给从数据库使用,再配置主数据库

    [root@master ~]# mysql -uroot -p123
    MariaDB [(none)]> grant replication slave on *.* to 'csl'@'192.168.44.131' identified by 'csl123';
    MariaDB [(none)]> quit
    [root@master ~]# vi /etc/my.cnf
    
    #
    # This group is read both both by the client and the server
    # use it for options that affect everything
    #
    [client-server]
    
    [mysqld]         #加入三行数据
    server-id=10
    log-bin=mysql_bin
    #
    # include all files from the config directory
    #
    !includedir /etc/my.cnf.d
    
    [root@master ~]# systemctl restart mariadb
    [root@master ~]# mysql -uroot -p123
    MariaDB [(none)]> show master status;
    +------------------+----------+--------------+------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +------------------+----------+--------------+------------------+
    | mysql_bin.000001 |      328 |              |                  |
    +------------------+----------+--------------+------------------+

    8.配置从数据库

    [root@slave ~]# vi /etc/my.cnf
    
    #
    # This group is read both both by the client and the server
    # use it for options that affect everything
    #
    [client-server]
    
    [mysqld]           #加入三行数据
    server-id=20       #从库的server-id必须要比主库的大
    relay-log=myrelay
    #
    # include all files from the config directory
    #
    !includedir /etc/my.cnf.d
    
    [root@slave ~]# systemctl restart mariadb
    [root@slave ~]# mysql -uroot -p123
    MariaDB [(none)]> change master to master_host='192.168.44.128',master_user='csl',master_password='csl123',master_log_file='mysql_bin.000001',master_log_pos=328;
    MariaDB [(none)]> start slave;
    MariaDB [(none)]> show slave statusG
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes

    9.查看从数据库数据是否和主数据库一致,再在数据库上插入数据,看从数据库上是否同步数据。

    MariaDB [(none)]> use info;
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    MariaDB [info]> show tables;
    +----------------+
    | Tables_in_info |
    +----------------+
    | basic          |
    | salary         |
    +----------------+
    2 rows in set (0.000 sec)
    
    MariaDB [info]> select * from basic;
    +----+-------+----------+
    | id | name  | job      |
    +----+-------+----------+
    |  1 | tom   | engineer |
    |  2 | jerry | office   |
    +----+-------+----------+
    
    //在主数据库插入数据
    [root@master ~]# mysql -uroot -p123
    MariaDB [(none)]> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | info               |
    | information_schema |
    | mysql              |
    | performance_schema |
    +--------------------+
    MariaDB [(none)]> use info;
    MariaDB [info]> insert basic(name,job) values('zhangshan','cleanner');
    
    //在从数据库中查看数据是否同步
    MariaDB [info]> select * from basic;
    +----+-----------+----------+
    | id | name      | job      |
    +----+-----------+----------+
    |  1 | tom       | engineer |
    |  2 | jerry     | office   |
    |  3 | zhangshan | cleanner |
    +----+-----------+----------+
  • 相关阅读:
    pyhon3 mysql的下载和配置
    python3 进程池和线程池
    python3 udp socketserver
    python3 多进程实现socket通讯
    python3 在一个进程内开启多个线程实现socket通讯
    python3 单线程(gevent)实现并发的socket通讯
    python3 协程gevent模块(遇到IO自动切换)
    python3 greenlet模块
    python3 协程函数yeild
    python3 线程队列queue
  • 原文地址:https://www.cnblogs.com/chensongling/p/14213244.html
Copyright © 2011-2022 走看看