在高并发流量下,数据库往往是服务端的瓶颈,由于数据库数据需要确保落地,同时保证数据同步,数据即时性,有效性的问题,导致数据库不能像平常后端程序一样负载均衡.

那么在大并发下,该如何缓解数据库的压力呢?

mysql读写分离

我们可以分析,程序对于mysql的操作无非就2种,写入数据/更新数据(数据变更),读取数据.
数据变更,因为要保证数据可靠以及数据同步问题,无法直接通过开多台服务器解决.

但是读取数据库,因为不涉及数据库变更,所以我们可以在程序中,将程序中涉及数据库数据变更的,和数据库查询的数据库区分,实现读写分离

数据变更时操作A服务器,A服务器数据变更后,立即传输给B服务器,使得B服务器进行更新数据.同时由于读数据库完全不涉及数据变更,可以开启多台读数据库,进行分散数据库压力

读写分离需要程序代码进行实现,而非数据库的功能,通过读写分离,能够极大的缓解数据库的压力.(虽然还是需要数据更新,并且还需要数据同步,但是写服务器只需要负责写入数据,读取的压力将分散到了读服务器上).

mysql集群

mysql集群除了为了解决数据库压力分散问题坏,同时为了实现数据库的高可用性,在一台数据库宕机的情况下,尽可能的降低业务的影响.

mysql集群有着以下几种方式:

1:mysql一主一从,mysql读写分离,使数据库压力分散,提高服务器性能

2:mysql一主多从,当主服务器出问题后,可以选择一台从服务器变更为主服务器,继续提供服务

3:mysql多主多从,一台主服务器出问题了,可立即切换另一台主服务器提供服务.

同时,mysql集群将带来相关的一些问题,例如:

1:主从同步数据延迟问题

2:一主多从虽然可以提高可用性,但在主服务器宕机的时候,可能会出现一些数据同步未完成,数据丢失的问题,需要在主服务器恢复后增量恢复

3:多主多从需要考虑主服务器都在使用时,id自增,主键冲突的问题,以及其中一台主服务器宕机时间至恢复时间内的数据丢失,增量同步的问题.

mysql一主一从搭建

当我们了解了mysql集群的实现原理,应用场景之后,就可以开始搭建主从集群环境了,我们需要准备:

1:2台服务器(虚拟机)

2:2台都需要安装mysql环境

目前我使用的是宝塔安装的mysql 5.6,可以自行安装mysql用于测试.

主服务器:192.168.192.131

从服务器:192.168.192.130

配置项

主服务器主要配置项:

1
2
log-bin = mysql-bin  ##binlog文件存储路径,相对路径=datadir+log-bin.xxxxx  例如宝塔的binlog路径为;/www/server/data/mysql-bin.000001
server-id = 1  服务器标识id,通常主服务器id比从服务器小.

从服务器配置项:

1
2
log-bin = mysql-bin  
server-id = 2

检查配置项命令:

1
2
3
4
5
6
7
8
[root@localhost www]# egrep  "log-bin|server-id"  /etc/my.cnf
log-bin=mysql-bin
server-id = 1
###上面是主服务器
[root@localhost ~]# egrep  "log-bin|server-id"  /etc/my.cnf
log-bin=mysql-bin
server-id = 2
###这里是从服务器

查看binlog开启情况:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.00 sec)
### 上面是主服务器
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.00 sec)
### 这里是从服务器

主库新建从库访问账号,并给予相关的权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
## 新增主库访问账号rep,密码为123456,只允许通过192.168.*.* ip连接
mysql>  grant replication slave on *.* to 'rep'@'192.168.%.%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
## 刷新系统用户权限
mysql>  flush privileges;
Query OK, 0 rows affected (0.00 sec)
## 查询当前数据库账号
mysql> select user,host from mysql.user;
+------+-----------------------+
| user | host                  |
+------+-----------------------+
| root | 127.0.0.1             |
| rep  | 192.168.%.%           |
| root | ::1                   |
|      | localhost             |
| root | localhost             |
|      | localhost.localdomain |
| root | localhost.localdomain |
+------+-----------------------+
7 rows in set (0.00 sec)

服务器数据同步,保证2台服务器数据一致

主服务器加只读锁,防止在数据同步时,主服务器新增数据

1
2
3
4
5
6
7
## 数据库加锁,只允许读取数据
mysql> flush table with read lock;
Query OK, 0 rows affected (0.01 sec)
 
## 这个时候新建数据库,或者数据更新都会报错
mysql> create database test;
ERROR 1223 (HY000): Can't execute the query because you have a conflicting read lock

备份数据

1
2
3
4
5
6
7
8
9
## 记录当前binlog位置,
 
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000013 |      120 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

使用mysqldump命令进行备份数据库

1
2
3
4
5
 mysqldump -uroot -p -A -F --master-data=2|gzip /root/rep.sql.gz  
 -A 备份全部数据库
 -F 刷新二进制日志 
 --master-data=2 追加二进制位置和文件输出到sql中
 gzip  将mysqldump的数据压缩,节省存储空间

将压缩文件上传到从服务器.并导入到从库中

1
gunzip < /root/rep.sql.gz |mysql -uroot -p

配置从库与服务器通信参数:

1
2
3
4
5
6
7
8
mysql> CHANGE MASTER TO 
    -> MASTER_HOST='192.168.192.131',
    -> MASTER_PORT=3306,
    -> MASTER_USER='rep',
    -> MASTER_PASSWORD='123456',
    -> MASTER_LOG_FILE='mysql-bin.000013',
    -> MASTER_LOG_POS=120;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

验证修改的参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@localhost ~]# cd /www/server/data/
[root@localhost data]# cat master.info 
23
mysql-bin.000012
120
192.168.192.131
rep
123456
3306
60
0
 
 
 
 
 
0
1800.000
 
0
 
86400
 
 
0
[root@localhost data]#

启动从服务器节点,正式开始同步主服务器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
## 启动从服务器
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
## 查看从服务器运行状态
 
mysql>  show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.192.131
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000013
          Read_Master_Log_Pos: 120
               Relay_Log_File: localhost-relay-bin.000003
                Relay_Log_Pos: 283
        Relay_Master_Log_File: mysql-bin.000013
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 120
              Relay_Log_Space: 460
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
                  Master_UUID: f730887e-1e5c-11ea-ae2e-000c29fc65d1
             Master_Info_File: /www/server/data/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
1 row in set (0.00 sec)

注意,只有当 slave_io_running和slave_sql_running 都为yes时,才算是启动成功.

如果你的mysql服务器是直接克隆的,需要注意删除mysql数据目录下的auto.cnf文件,并重启一次服务器,改文件记录了数据库的uuid,如果重复则会出错.

主服务器恢复可写:

1
2
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)

这步可以直接放到备份数据,并记录binlog文件名和位置时去做.

测试

主服务器当前数据库:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> show databases;
+--------------------+
Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
rows in set (0.00 sec)
 
mysql>

从服务器当前数据库:

1
2
3
4
5
6
7
8
9
10
11
12
mysql> show databases;
+--------------------+
Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
rows in set (0.00 sec)
 
mysql>

主服务器新增数据库:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> create database test666;
Query OK, 1 row affected (0.00 sec)
 
mysql> show databases;
+--------------------+
Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| test666            |
+--------------------+
rows in set (0.00 sec)
 
mysql>

从服务器查看:

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> show databases;
+--------------------+
Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| test666            |
+--------------------+
rows in set (0.00 sec)
 
mysql>

主从服务器搭建成功!

本文为仙士可原创文章,转载无需和我联系,但请注明来自仙士可博客www.php20.cn

关于mysql集群主从服务器搭建的更多相关文章

  1. LINUX学习-Mysql集群-主从服务器备份

    一.Mysql主从集群备份. 1.准备两台主机 主服务器:192.168.88.20和从服务器:192.168.88.30 2.分别安装mysql yum -y -install mysql mysq ...

  2. MySQL集群PXC的搭建

    MySQL集群PXC的搭建 最近公司某客户要求我们的数据库搭建PXC集群以保证他们的系统高性能和搞稳定性 以后花费了一些时间去搭建和测试,也踩过一些坑,准备分享出来 系统:centos6.6PXC:5 ...

  3. mysql 集群+主从同步

    SQL节点: 给上层应用层提供sql访问. 管理节点(MGM):  管理整个集群. 启动,关闭集群. 通过ndb_mgmd命令启动集群 存储/数据节点: 保存cluster中的数据.  数据节点,可以 ...

  4. MySQL集群---②Windows平台搭建MySQL CLUSTER集群

    原文:http://blog.csdn.net/mazhaojuan/article/details/42211857 本文将通过两台电脑来简单介绍一下Windows平台如何搭建MySQL集群. My ...

  5. 搭建MySQL集群-注意版本

    系统环境采样(来自其他机器,直接copy过来的,在安装的机器上,按照步骤查看即可,当然这些还不够实际,后续补充) 检查系统内是否有其他mysql rpm -qa | grep mysql 是否存在my ...

  6. centos下mysql集群初尝试

    原文:http://www.lvtao.net/database/mysql-cluster.html 五台服务器篇 安装要求 安装环境:CentOS-6.3安装方式:源码编译安装软件名称:mysql ...

  7. mysql集群安装配置

    看网上很多人说mysql集群不是很稳定,因此这2天做了下mysql的集群,打算配置没有什么问题了,过2天做下相关的性能测试,我的配置环境如下:   操作系统:      Centos5.2    软件 ...

  8. Linux环境MySQL集群配置

    一.介绍 ======== 这篇文档旨在介绍如何安装配置基于2台服务器的MySQL集群.并且实现任意一台服务器出现问题或宕机时MySQL依然能够继续运行. 注意! 虽 然这是基于2台服务器的MySQL ...

  9. Mysql集群搭建(多实例、主从)

    1 MySQL多实例 一 .MySQL多实例介绍 1.什么是MySQL多实例 MySQL多实例就是在一台机器上开启多个不同的服务端口(如:3306,3307,3308),运行多个MySQL服务进程,通 ...

随机推荐

  1. hive的排序 order by和sort by

    在算法中,各个排序算法的复杂度都比较高,正常情况下为O (nlogn) ,所以当数据量特别大的时候,对数组进行排序消耗都很大. 因为hive的计算引擎MapReduce是分布式系统, 利用分布式的特点 ...

  2. Docker删除某个容器时失败解决方案

    删除某个容器时,报错 ocker rm 容器id   image is being used by stopped container e11efb30362a   该报错的原因是要删除的该镜像,被某 ...

  3. node.js学习(3)模块

    1.创建文件 count.js 2 调用 3 改造 4 调用 5 再改造 6 在再改造

  4. GO语言面向对象01---封装属性与创建对象的方法与工厂模式

    package main import "fmt" /* 面向过程编程:调度大量的变量.函数 ---------- 面向对象编程(OOP=Object Oriented Progr ...

  5. (转)修改python默认排序方式

    在Java中,自定义类可以通过继承comparable接口,重写compareTo方法来使用内置sort()函数来对自定义对象排序,我就在想Python中有没有类似的操作. 首先随便写个自定义类,比如 ...

  6. 72 个网络应用安全实操要点,全方位保护 Web 应用的安全

    原文地址:Web Application Security Checklist 原文作者:Teo Selenius(已授权) 译者 & 校正:HelloGitHub-小熊熊 & 卤蛋 ...

  7. 番外篇:搭建Windows环境下的RabbitMQ环境

    搭建Windows环境下的Rabbitmq环境 下载erlang语言包OTP.官网地址: https://www.erlang.org/downloads 如果下载不了,可以选择百度网盘下载,里面的版 ...

  8. IDA反汇编EXE添加一个启动时的消息框

    IDA反汇编EXE添加一个启动时的消息框 上一篇文章介绍了用OD反汇编EXE添加一个启动时的消息框,这篇文章也是实现同样的效果,这边主要的思路还是将其反汇编得到汇编代码后,然后手动修改他的逻辑首先跳转 ...

  9. 工作流引擎Activiti使用进阶!详细解析工作流框架中高级功能的使用示例

    Activiti高级功能简介 Activit的高级用例,会超越BPMN 2.0流程的范畴,使用Activiti高级功能需要有Activiti开发的明确目标和足够的Activiti开发经验 监听流程解析 ...

  10. 【VBA】列号与字母(列名)的相互转换 (自定义函数)

    1. '列号转字母(列名) Function Num2Name(ByVal ColumnNum As Long) As String On Error Resume Next Num2Name = & ...