mariadb主从复制
1. 实验环境
真实生成环境不需要配置外网IP
主从需要时间同步
2. 数据库主从复制简述
什么是主从复制
主从复制是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;主数据库一般是准实时的 业务数据库。
主从复制的作用
- 做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据 丢失。
- 有利于架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降 低磁盘I/O访问的频率,提高单个机器的I/O性能。
- 读写分离,使数据库能支撑更大的并发。在报表中尤其重要。由于部分报表sql语句非常的慢,导 致锁表,影响前台服务。如果前台使用master,报表使用slave,那么报表sql将不会造成前台锁, 保证了前台速度。
主从复制的原理
原理:
(1)master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中;
(2)slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread请求master二进制事件
(3)同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后I/OThread和SQLThread将进入睡眠状态,等待下一次被唤醒。
也就是说:
从库会生成两个线程,一个I/O线程,一个SQL线程;
I/O线程会去请求主库的binlog,并将得到的binlog写到本地的relay-log(中继日志)文件中;
主库会生成一个log dump线程,用来给从库I/O线程传binlog;
SQL线程,会读取relay log文件中的日志,并解析成sql语句逐一执行;
简言之可分为下面几个步骤:
1. 主库的更新事件会被写到bin log日志中。
2. 从库启用slave服务,发起连接,连接到主库。
3. 从库创建一个I/O线程,从主库读取bin log日志的内容并写入到relay log日志中。
4. 从库创建一个SQL线程,从relay log里面读取内容,将更新内容写入到从库。
3. 手动实现数据库主从复制
主服务器
第一步:修改my.conf文件 在 /etc/my.cnf文件中的[mysqld]下面添加
#启用二进制日志
log-bin=mysql-bin
#服务器唯一ID,一般取IP最后一段
server-id=51
第二步:重启MySQL服务
[root@db01 ~]# systemctl restart mariadb
第三步:建立账号并授权slave
#授权
MariaDB [(none)]> grant file on *.* to 'root'@'%' identified by '123';
Query OK, 0 rows affected (0.01 sec)
#添加主从复制的用户
MariaDB [(none)]> grant replication slave,replication client on *.* to 'root'@'%' identified by '123';
Query OK, 0 rows affected (0.00 sec)
#更新数据库
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
注:一般不用root帐号,“%”表示所有客户端都可能连,只要帐号,密码正确,此处可用具体客户端IP 代替,如172.16.1.52,加强安全。
第四步:查询master的状态
从服务器配置
第一步:修改my.conf文件 在 /etc/my.cnf文件中的[mysqld]下面添加:
server-id=52
第二步:删除UUID文件 删除/var/lib/mysql/auto.cnf文件,重新启动服务。
第三步:配置从服务器
MariaDB [(none)]> change master to master_host='172.16.1.51',master_port=3306,master_user='root',master_password='123',master_log_file='mysql-bin.000002',master_log_pos=117712;
注:master_port为mysql服务器端口号(无引号)。
master_user为执行同步操作的数据库账户。
“611”无单引号,此处的117712就是show master status 中看到的position的值, mysql-bin.000002就是file对应的值。
第四步:启动从服务器的复制功能
MariaDB [(none)]> start slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)
第五步:检查从服务器复制功能状态
show slave status\G