mysql5.5-读写分离介绍与配置

一、读写分离介绍

1.什么是读写分离?

  • 读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。
  • 为什么要读写分离?
  • 因为数据库的“写”(写10000条数据到oracle可能要3分钟)操作是比较耗时的。 但是数据库的“读”(从mysql读10000条数据可能只要5秒钟)。
    所以读写分离,解决的是,数据库的写入,影响了查询的效率。

2.读写分离方案

  • 2.1方案一
    主库:liang01(用户) 000000(密码) 10.0.0.13(ip) 3306(端口) 权限(select,insert,delete,update)。
    从库:主库的liang用户同步到从,设置read-only。
  • 2.2方案二
    主库:liang01(用户) 000000(密码) 10.0.0.13(ip) 3306(端口) 权限(select,insert,delete,update)。
    从库:liang02(用户) 000000(密码) 10.0.0.13(ip) 3306(端口),设置read-only。
  • 2.3方案三
    mysql的库不同步
    主库:liang01(用户) 000000(密码) 10.0.0.13(ip) 3306(端口) 权限(select,insert,delete,update)。
    从库:主库的liang用户同步到从,设置read-only。(需要准备一台服务器专门接替主服务器)

二、读写分离配置(方案三)

1.主库与从库配置忽略授权

vi /data/3306/my.conf
[mysqld]
replicate-ignore-db=mysql
binlog-ignore-db = mysql
binlog-ignore-db = performance_schema
binlog-ignore-db = information_schema
vi /data/3306/my.conf
[mysqld]
replicate-ignore-db=mysql
====================>
只有在[主从]库上分别设置replicate-ignore-db=mysql才可以做到从库不同步mysql库。
在主库上设置binlog-ignore-db=mysql不记录有关mysql库更新的binlog来达到从库不同步mysql库。

2.重启数据库

[root@mysql ~]# /data/3306/mysqld restart
mysql 3306 stop......                                      [确定]
mysql 3306 start......                                     [确定]

3.测试

主库创建用户
mysql> create user test@localhost identified by '000000';
Query OK, 0 rows affected (0.06 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
从库查看
[root@mysql ~]# mysql -uroot -p000000 -S /data/3307/mysql.sock -e "show slave status\G;"|grep Running
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
mysql> select user,host from mysql.user;
+---------+-------------+
| user    | host        |
+---------+-------------+
| rep     | 10.0.0.%    |
| liang01 | 10.0.0.0/24 |
| root    | 127.0.0.1   |
| liang01 | localhost   |
| root    | localhost   |
+---------+-------------+
5 rows in set (0.01 sec)
没有test用户,则成功。

4.通过read-only参数防止数据库写从库的方案

  • 在slave服务器启动选项增加参数或者在my.cnf配置文件中加read-only参数来确保从库只读,使用授权用户和read-only参数二者同时操作。
    注意read-only参数可以让slave服务器只允许来自slave服务器线程或具有SUPER权限的用户的更新。可以确保slave服务器不接受来自普通用户的更新

4.1编辑配置文件

vi /data/3307/my.conf
[mysqld]
read-only
重启

4.2创建用户

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> grant select,drop on *.* to "test01"@"localhost" identified by "000000";
Query OK, 0 rows affected (0.00 sec)
==============》
虽然设置了只读,但对拥有SUPER权限的用户无效

4.3切换用户测试

mysql> select user();
+------------------+
| user()           |
+------------------+
| test01@localhost |
+------------------+
1 row in set (0.00 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| liang              |
| liang_gbk          |
| liang_utf8         |
| mysql              |
| performance_schema |
| test               |
+--------------------+
7 rows in set (0.00 sec)
mysql> drop database test;
ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement

5.主库创建数据测试

mysql> use liang;
Database changed
mysql> desc student;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(4)   | NO   | PRI | NULL    |       |
| name  | char(10) | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.03 sec)

mysql> insert into student (name) values ("test");
Query OK, 1 row affected, 1 warning (0.00 sec)
从库查看
mysql> select user();
+------------------+
| user()           |
+------------------+
| test01@localhost |
+------------------+
mysql> select * from student;
+----+------+
| id | name |
+----+------+
|  0 | test |
+----+------+
1 row in set (0.00 sec)
mysql> drop table student;
ERROR 1290 (HY000): The MySQL server is running with the --read-only option so it cannot execute this statement


猜你喜欢

转载自blog.csdn.net/liang_operations/article/details/82838375