文章目录
- 一、场景引入
- 前提背景
- 实现原理
- 一、安装mysql
- 二、配置同步
- 1、配置主机用户
- 2、修改配置文件
- 三、测试
- 四、注意
一、场景引入
前提背景
在某些场景下,例如淘宝京东这样海量的数据,高访问量的场景,无疑对数据库造成了相当大的负载,同时对于系统的稳定性和扩展性提出很高的要求。
而单个服务器所能够提供的服务以及负载都是有限的。
所以,为了系统的问题,以及较快的响应速度或处理能力,在数据库方面就有了集中解决方案,分库分表,读写分离,这些都能在一定程度上有效地减小单台数据库的压力。
而本文就是从读写分离角度来一探究竟。
实现原理
主要理解以下三个点就差不多了:
1、主机负责写操作
2、从机负责读操作
3、从机自动从主机中同步数据
然而,我们对于一个新的东西,我们就要提出我们的哲学三问:我是谁?我在那?我要干嘛?
是什么?为什么?怎么做?
1、什么是读写分离
读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。
2、为什么要读写分离呢?
因为数据库的“写”(写10000条数据到oracle可能要3分钟)操作是比较耗时的。
但是数据库的“读”(从oracle读10000条数据可能只要5秒钟)。
所以读写分离,解决的是,数据库的写入,影响了查询的效率。
3、什么时候要读写分离?
数据库不一定要读写分离,如果程序使用数据库较多时,而更新少,查询多的情况下会考虑使用,利用数据库 主从同步 。可以减少数据库压力,提高性能。当然,数据库也有其它优化方案。memcache 或是 表折分,或是搜索引擎。都是解决方法。
4.主从复制、读写分离的基本设计
在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。
这里使用docker进行数据库的安装,docker的优势以及就怎么安装docker就不多做赘述了,感兴趣的可以去翻一下我以前的文章。
一、安装mysql
这里只安装了一个主机(master),一个从机(slave)
docker run --name mysql-master -p 33061:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
docker run --name mysql-salve -p 33062:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
二、配置同步
为什么?
如果不进行同步的配置,那么从机无法获取主机的数据,最终就会导致同步失败。
1、配置主机用户
grant replication slave on *.* to 'lomtom'@'%' identified by '123456'
2、修改配置文件
在从机中的配置文件加入以下参数。
- 主机
log-bin = /var/lib/mysql/binlog
server-id =1
binlog-do-db =lomtomdb
- 从机
server-id =2
1、修改配置文件(以master为例)
# Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License, version 2.0,
# as published by the Free Software Foundation.
#
# This program is also distributed with certain software (including
# but not limited to OpenSSL) that is licensed under separate terms,
# as designated in a particular file or component or in included license
# documentation. The authors of MySQL hereby grant you an additional
# permission to link the program and your derivative works with the
# separately licensed software that they have included with MySQL.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License, version 2.0, for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
# The MySQL Server configuration file.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html
[mysqld]
log-bin = /var/lib/mysql/binlog
server-id =1
binlog-do-db =lomtomdb
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
#log-error = /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
2、拷贝(主从都需要拷贝,以master为例)
如果服务器有vi编辑器,直接使用vi编辑器即可。
docker cp mysql.cnf mysql-master:/etc/mysql/mysql.conf.d/
3、重启mysql
docker restart mysql-master
4、查看是否配置成功
show master status;
如果出现以下数据即为成功。
5、在从机(slave)中配置主机(master)
1、配置主机信息
change master to master_host='192.168.43.236',master_port=33061,master_user='lomtom',master_password='123456',master_log_file='binlog.000001',master_log_pos=154;
2、启动从机
start slave;
3、查看从机状态
show slave status;
SLAVE_IO_RUNNING ,SLAVE_MYSQL_RUNNING两个值为YES即为正确启动,否则自己根据下方的错误提示修改配置
三、测试
在第一个数据库(master)创建我们配置的数据库,然后随意修改该数据库的数据,刷新slave,数据同步成功。
四、注意
1、因为在配置当中指定了数据库(lomtomdb),也就是binlog-do-db
参数,所以从机只会同步主机中的lomtomdb数据库,其他数据库不同步。
2、修改配置文件时,log-bin
参数所指定的目录一定是要mysql能够操作的文件,也就是说,如果你指定了其他目录,请给予mysql操作权限。