关于mysql集群主从服务器搭建
在高并发流量下,数据库往往是服务端的瓶颈,由于数据库数据需要确保落地,同时保证数据同步,数据即时性,有效性的问题,导致数据库不能像平常后端程序一样负载均衡.
那么在大并发下,该如何缓解数据库的压力呢?
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.000001server-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.cnflog-bin=mysql-binserver-id = 1###上面是主服务器[root@localhost ~]# egrep "log-bin|server-id" /etc/my.cnflog-bin=mysql-binserver-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 23mysql-bin.000012120192.168.192.131rep123456330660001800.0000864000[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: 0Master_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: 01 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 |+--------------------+4 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 |+--------------------+4 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 |+--------------------+5 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 |+--------------------+5 rows in set (0.00 sec)mysql> |
主从服务器搭建成功!
本文为仙士可原创文章,转载无需和我联系,但请注明来自仙士可博客www.php20.cn
关于mysql集群主从服务器搭建的更多相关文章
- LINUX学习-Mysql集群-主从服务器备份
一.Mysql主从集群备份. 1.准备两台主机 主服务器:192.168.88.20和从服务器:192.168.88.30 2.分别安装mysql yum -y -install mysql mysq ...
- MySQL集群PXC的搭建
MySQL集群PXC的搭建 最近公司某客户要求我们的数据库搭建PXC集群以保证他们的系统高性能和搞稳定性 以后花费了一些时间去搭建和测试,也踩过一些坑,准备分享出来 系统:centos6.6PXC:5 ...
- mysql 集群+主从同步
SQL节点: 给上层应用层提供sql访问. 管理节点(MGM): 管理整个集群. 启动,关闭集群. 通过ndb_mgmd命令启动集群 存储/数据节点: 保存cluster中的数据. 数据节点,可以 ...
- MySQL集群---②Windows平台搭建MySQL CLUSTER集群
原文:http://blog.csdn.net/mazhaojuan/article/details/42211857 本文将通过两台电脑来简单介绍一下Windows平台如何搭建MySQL集群. My ...
- 搭建MySQL集群-注意版本
系统环境采样(来自其他机器,直接copy过来的,在安装的机器上,按照步骤查看即可,当然这些还不够实际,后续补充) 检查系统内是否有其他mysql rpm -qa | grep mysql 是否存在my ...
- centos下mysql集群初尝试
原文:http://www.lvtao.net/database/mysql-cluster.html 五台服务器篇 安装要求 安装环境:CentOS-6.3安装方式:源码编译安装软件名称:mysql ...
- mysql集群安装配置
看网上很多人说mysql集群不是很稳定,因此这2天做了下mysql的集群,打算配置没有什么问题了,过2天做下相关的性能测试,我的配置环境如下: 操作系统: Centos5.2 软件 ...
- Linux环境MySQL集群配置
一.介绍 ======== 这篇文档旨在介绍如何安装配置基于2台服务器的MySQL集群.并且实现任意一台服务器出现问题或宕机时MySQL依然能够继续运行. 注意! 虽 然这是基于2台服务器的MySQL ...
- Mysql集群搭建(多实例、主从)
1 MySQL多实例 一 .MySQL多实例介绍 1.什么是MySQL多实例 MySQL多实例就是在一台机器上开启多个不同的服务端口(如:3306,3307,3308),运行多个MySQL服务进程,通 ...
随机推荐
- SpringMVC 环境搭建
SpringMVC 框架环境搭建操作步骤如下: 创建动态 Web 项目 配置 Tomcat 服务器 配置 SpringMVC 前端控制器 <?xml version="1.0" ...
- MyBatis 开启 Log4j 日志调试信息开关
Log4j 是什么 Log4j 是由 Apache 提供的开源日志框架,用于帮助用户处理日志信息. Log4j 能将日志信息分级打印和存储,而且提供了日志不同的存储方式,我们可以将日志发送到控制台,或 ...
- SSH工作过程简介和SSH协议算法集简介
SSH简介 SSH是Secure Shell(安全外壳)的简称,是一种在不安全的网络环境中,通过加密机制和认证机制,实现安全的远程访问以及文件传输等业务的网络安全协议. SSH协议采用了典型的客户端/ ...
- jQuery的链式编程风格
jQuery的链式编程风格 首先本人通过一个案例来展示jQuery的链式编程风格.先写一个页面,展示一个列表,代码如下: <body> <div> <ul class=& ...
- python实现布隆过滤器及原理解析
python实现布隆过滤器及原理解析 布隆过滤器( BloomFilter )是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地 ...
- Bringing up interface eth0: Error: No suitable device found: no device found for connection 'System eth0'.
在VMware的虚拟机中克隆CentOS,在重启网卡的时候报错: Shutting down loopback interface: [ OK ] Bringing up loopback int ...
- GPU编程和流式多处理器(六)
GPU编程和流式多处理器(六) 5. 纹理和表面 读取和写入纹理和表面的指令,所引用的隐式状态,比其他指令要多得多.header中包含诸如基地址,尺寸,格式和纹理内容的解释之类的参数,该header是 ...
- 适用于CUDA GPU的Numba例子
适用于CUDA GPU的Numba例子 矩阵乘法 这是使用CUDA内核的矩阵乘法的简单实现: @cuda.jit def matmul(A, B, C): """Perf ...
- 英特尔内存革新助平安云 Redis 云服务降本增效
英特尔内存革新助平安云 Redis 云服务降本增效 英特尔 傲腾 数据中心级持久内存的引入,为平安云的降本增效开启了一条新的道路.通过对平安云 Redis 数据库产品的支持,用户能享受到性能优异且价格 ...
- python之读取excel实例演示
1.基础知识点击这里 import openpyxl def read_excel(workbook,sheetname=None): wd=openpyxl.load_workbook(workbo ...