MySQL的主从实战
1、Mysql主从的必要性
访问量不断增减,Mysql服务器的压力增大;就需要对Mysql进行优化与改造;
- 实现Mysql的高可用
- MySQL的主从复制搭建
- 主从搭建的目的就是实现数据库冗余备份
- 同步主服务器和Slave服务器,一旦Master服务器宕机也有Slave服务器的数据支撑
- MySQL 的读写分离,
- MySQL的拆分库、表进行优化
2、MySQL的主从搭建
- 至少需要两台服务器:Master服务器和Slave服务器;
- 主从数据同步是一个异步复制的过程
- 两台服务器都需要开启bin-log日志功能;
- bin-log日志用于记录在Master库中执行的增、删、修改、更新操作的sql语句;
- IO线程、SQL线程开启
3、MySQL主从的原理:
- salve执行start ,slave IO线程通过在Master创建的授权用户链接上至Master,并且请求master
- Master接收到来自slave IO线程的请求后,master IO线程根据slave发送的指定bin-log日志position点之后的内容,然后返回给slave的IO线程;
- 返回的信息中除了bin-log日志内容外,还有master最新的binlog文件名以及在binlog中的下一个指定更新position点;
- 然后Slave服务器收到日志内容并且添加到relay-log文件;更新position记录到Master.info文件中;
- 最后master与slave两台服务器保持一致;
4、搭建Mysq主从的实验:
- master :192.168.75.131
- slave:192.168.75.132
- 实验中使用的是mariadb服务
#两台服务器都直接安装mariadb
[root@Node1 ~]# yum -y install mariadb-server
- 主服务器master配置如下:
- 编辑/etc/my.cnf文件
- 添加server-id
- 启用log-bin的日志格式
- 授权一个用户,用于同步mariadb的数据
- 编辑/etc/my.cnf文件
#修改配置文件
[root@Node1 ~]# vim /etc/my.cnf
..........在[mysqld]的模块下添加
server-id = 131
log-bin = mysql-bin
#添加完成之后启动MySQL服务
[root@Node1 ~]# systemctl start mariadb
#登入mysql-->创建用户
#这里直接用匿名用户登录,因为只是做实验;
[root@Node1 ~]# mysql
............
MariaDB [(none)]>
#创建一个数据库
MariaDB [(none)]> create database LJW;
Query OK, 1 row affected (0.00 sec)
#授权用户、创建同步用户
MariaDB [(none)]> grant replication slave on *.* to 'tongbu'@'%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
#查看主服务器的状态
#这里要记录起来file的bin-log日志和position的编号-->从服务器需要用到
MariaDB [(none)]> SHOW MASTER status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 470 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
- 接下来就是slave服务器的配置
- 编辑/etc/my.cnf文件
- 添加server-id–>注意这个server-id是不能与主服务器相同的
- 在从服务器上指定主服务器的信息
- 编辑/etc/my.cnf文件
#修改配置文件
[root@Node2 ~]# vim /etc/my.cnf
#在[mysqld]的位置下添加
.....#这里只需要添加server-id即可-->注意不要和主服务器的id相同
server-id=132
#然后启动mysql
[root@Node2 ~]# systemctl start mariadb
#登入服务器
[root@Node2 ~]# mysql
#指定主服务器信息
MariaDB [(none)]> change master to
-> master_host='192.168.75.131', #指定master的ip
-> master_user='tongbu', #指定master的用户
-> master_password='123456', #用户的密码
-> master_log_file='mysql-bin.000003', #就是主服务器的bin-log号
-> master_log_pos=470; #主服务器的position
#启动从服务器,
MariaDB [(none)]> slave start;
Query OK, 0 rows affected (0.00 sec)
#查看同步情况
MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.75.131
Master_User: tongbu
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 470
Relay_Log_File: mariadb-relay-bin.000002
Relay_Log_Pos: 529
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes #主要查看这两个yes代表搭建成功
Slave_SQL_Running: Yes #主要查看这两个yes代表搭建成功
.....................
- 到这里搭建已经完成–>进入测试阶段
- 主服务器创建库和表格
- 然后从服务器查看
#主服务器创建
MariaDB [(none)]> create database HZM;
Query OK, 1 row affected (0.00 sec)
MariaDB [HZM]> create table t1 (id varchar(20),name varchar(20));
Query OK, 0 rows affected (0.00 sec)
#从服务器查看
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| HZM | #这个就是刚创建的HZM的库
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.00 sec)
#主服务器插入数据
MariaDB [HZM]> insert into t1 values ('1',"liangjiawei");
Query OK, 1 row affected (0.00 sec)
#从服务器查看数据
MariaDB [(none)]> use HZM;
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 [HZM]> select * from t1;
+------+-------------+
| id | name |
+------+-------------+
| 1 | liangjiawei |
+------+-------------+
1 row in set (0.00 sec)
- 到这里实验结束;