MySQL5.7安装、主从复制、读写分离原理解析以及详细配置
一、Linux下mysql彻底卸载
1、查看mysql的安装情况
rpm -qa | grep -i mysql
2、删除上图安装的软件
rpm -ev mysql-community-libs-5.7.-.el6.x86_64 --nodeps
3、都删除成功之后,查找相关的mysql的文件
find / -name mysql
4、删除全部相关文件
rm -rf /var/lib/mysql
rm -rf /var/lib/mysql/mysql
rm -rf /etc/logrotate.d/mysql
rm -rf /usr/share/mysql
rm -rf /usr/bin/mysql
rm -rf /usr/lib64/mysql
5、再次执行命令
rpm -qa | grep -i mysql
如果没有显式则表示卸载完成。
二、MySQL5.7安装步骤
1、查看系统中是否自带安装mysql
yum list installed | grep mysql
2、删除系统自带的mysql及其依赖(防止冲突)
yum -y remove mysql-libs.x86_64
3、安装wget命令
yum install wget -y
4、给CentOS添加rpm源,并且选择较新的源
wget dev.mysql.com/get/mysql-community-release-el6-.noarch.rpm
5、安装下载好的rpm文件
yum install mysql-community-release-el6-.noarch.rpm -y
6、安装成功之后,会在/etc/yum.repos.d/文件夹下增加两个文件
这两个文件是帮助mysql安装的。
7、修改mysql-community.repo文件
原文件:
修改之后:
8、使用yum安装mysql
yum install mysql-community-server -y
9、启动mysql服务并设置开机启动
#启动mysql服务
service mysqld start
#设置mysql开机启动
chkconfig mysqld on
10、获取mysql的临时密码
grep "password" /var/log/mysqld.log
11、使用临时密码登录
mysql -uroot -p
#输入密码
12、修改密码
-- 修改密码复杂度
set global validate_password_policy=0;
set global validate_password_length=1;
-- 修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '';
13、修改远程访问权限
grant all privileges on *.* to 'root'@'%' identified by '' with grant option;
flush privileges;
14、设置字符集为utf-8
#在[mysqld]部分添加:
character-set-server=utf8
#在文件末尾新增[client]段,并在[client]段添加:
default-character-set=utf8
如果安装过程中有任何错误,可以查看日志:/var/log/mysqld.log。
三、mysql主从复制原理
0、为什么需要主从复制?
- 在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作。
- 做数据的热备
- 架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。
1、什么是mysql的主从复制?
MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。
2、mysql复制原理
- master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中;
- slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread请求master二进制事件
- 同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后I/OThread和SQLThread将进入睡眠状态,等待下一次被唤醒。
也就是说:
- 从库会生成两个线程,一个I/O线程,一个SQL线程;
- I/O线程会去请求主库的binlog,并将得到的binlog写到本地的relay-log(中继日志)文件中;
- 主库会生成一个log dump线程,用来给从库I/O线程传binlog;
- SQL线程,会读取relay log文件中的日志,并解析成sql语句逐一执行;
注意:
- master将操作语句记录到binlog日志中,然后授予slave远程连接的权限(master一定要开启binlog二进制日志功能;通常为了数据安全考虑,slave也开启binlog功能)。
- slave开启两个线程:IO线程和SQL线程。其中:IO线程负责读取master的binlog内容到中继日志relay log里;SQL线程负责从relay log日志里读出binlog内容,并更新到slave的数据库里,这样就能保证slave数据和master数据保持一致了。
- Mysql复制至少需要两个Mysql的服务,当然Mysql服务可以分布在不同的服务器上,也可以在一台服务器上启动多个服务。
- Mysql复制最好确保master和slave服务器上的Mysql版本相同(如果不能满足版本一致,那么要保证master主节点的版本低于slave从节点的版本)。
- master和slave两节点间时间需同步(可以配置ntp访问同一个时钟源)。
具体步骤:
- 从库通过手工执行change master to 语句连接主库,提供了连接的用户一切条件(user 、password、port、ip),并且让从库知道,二进制日志的起点位置(file名 position 号); start slave。
- 从库的IO线程和主库的dump线程建立连接。
- 从库根据change master to 语句提供的file名和position号,IO线程向主库发起binlog的请求。
- 主库dump线程根据从库的请求,将本地binlog以events的方式发给从库IO线程。
- 从库IO线程接收binlog events,并存放到本地relay-log中,传送过来的信息,会记录到master.info中。
- 从库SQL线程应用relay-log,并且把应用过的记录到relay-log.info中,默认情况下,已经应用过的relay 会自动被清理purge。
3、mysql主从形式
一主一从
主主复制
一主多从
多主一从
联级复制
四、mysql主从复制安装配置
1、在两台数据库中分别创建数据库
--注意两台必须全部执行,数据库名根据需要自行定义。
create database msb;
2、在主服务器进行如下配置:
# 修改配置文件,执行以下命令打开mysql配置文件
vi /etc/my.cnf # 在mysqld模块中添加如下配置信息
# 二进制文件名称
log-bin=master-bin
# 二进制日志格式,有row、statement、mixed三种格式。
# row 指的是把改变的内容复制过去,而不是把命令在从服务器上执行一遍。
# statement 指的是在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。
# mixed 指的是默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。
binlog-format=ROW
#要求各个服务器的id必须不一样
server-id=
#同步的数据库名称
binlog-do-db=msb
3、配置从服务器登录主服务器的账号授权
--授权操作
set global validate_password_policy=0;
set global validate_password_length=1;
grant replication slave on *.* to 'root'@'%' identified by '';
--刷新权限
flush privileges;
4、从服务器的配置
# 修改配置文件,执行以下命令打开mysql配置文件
vi /etc/my.cnf
# 在mysqld模块中添加如下配置信息
log-bin=master-bin #二进制文件的名称
binlog-format=ROW #二进制文件的格式
server-id=2 #服务器的id
5、重启主服务器的mysqld服务
-- 重启mysql服务
service mysqld restart
-- 登录mysql数据库
mysql -uroot -p
-- 查看master的状态
show master status;
6、重启从服务器并进行相关配置
-- 重启mysql服务
service mysqld restart
-- 登录mysql
mysql -uroot -p
-- 连接主服务器
change master to master_host='IP地址',master_user='root',master_password='',master_port=3306,master_log_file='master-bin.000001',master_log_pos=154;
-- 启动slave
start slave
-- 查看slave的状态
show slave status \G
只要字段Slave_IO_Running、Slave_SQL_Running两个值都是Yes,那么就表示从数据库的IO线程、SQL线程从主数据库同步数据成功。
9、此时可以在主服务器进行相关的数据添加、修改、删除工作,再从服务器看相关的数据内容是否同步增加、修改或删除。
五、Mysql读写分离介绍
1、读写分离的介绍
MySQL读写分离基本原理是让master数据库处理写操作,slave数据库处理读操作。master将写操作的变更同步到各个slave节点。
MySQL读写分离能提高系统性能的原因在于:
- 物理服务器增加,机器处理能力提升。拿硬件换性能。
- 主从只负责各自的读和写,极大程度缓解X锁和S锁争用。
- slave可以配置myiasm引擎,提升查询性能以及节约系统开销。
- master直接写是并发的,slave通过主库发送来的binlog恢复数据是异步。
- slave可以单独设置一些参数来提升其读的性能。
- 增加冗余,提高可用性。
2、读写分离的配置
2.1、硬件配置
首先需要准备三台机器:主数据库、从数据库、proxy服务器。
master 192.168.85.11
slave 192.168.85.12
proxy 192,168.85.14
2.2、首先在master和slave上配置主从复制
读写分离配置有多种方式,本文介绍两种方式:mysql-proxy方式(暂不是稳定版本)、Amoeba方式。
六、MySQL-Proxy实现MySQL读写分离
1、下载mysql-proxy
https://downloads.mysql.com/archives/proxy/#downloads
2、上传软件到proxy的机器
直接通过xftp进行上传。
3、解压安装包
tar -zxvf mysql-proxy-0.8.-linux-glibc2.-x86-64bit.tar.gz
4、修改解压后的目录
mv mysql-proxy-0.8.-linux-glibc2.-x86-64bit mysql-proxy
5、进入mysql-proxy的目录
cd mysql-proxy
6、创建目录
mkdir conf
mkdir logs
7、添加环境变量
# 打开/etc/profile文件
vi /etc/profile
# 在文件的最后面添加一下命令
export PATH=$PATH:/root/mysql-proxy/bin
8、执行命令让环境变量生效
source /etc/profile
9、进入conf目录,创建文件并添加一下内容
vi mysql-proxy.conf
添加内容
[mysql-proxy]
user=root
proxy-address=192.168.85.14:
proxy-backend-addresses=192.168.85.11:
proxy-read-only-backend-addresses=192.168.85.12:
proxy-lua-script=/root/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
log-file=/root/mysql-proxy/logs/mysql-proxy.log
log-level=debug
daemon=true
10、开启mysql-proxy
mysql-proxy --defaults-file=/root/mysql-proxy/conf/mysql-proxy.conf
11、查看是否安装成功,打开日志文件
cd /root/mysql-proxy/logs
tail - mysql-proxy.log
# 内容如下:表示安装成功
-- ::: (debug) max open file-descriptors =
-- ::: (message) proxy listening on port 192.168.85.14:
-- ::: (message) added read/write backend: 192.168.85.11:
-- ::: (message) added read-only backend: 192.168.85.12:
-- ::: (debug) now running as user: root (/)
12、进行连接
# mysql的命令行会出现无法连接的情况,所以建议使用客户端
mysql -uroot -p123456 -h192.168.85. -P
七、Amoeba实现MySQL读写分离
1、什么是amoeba
Amoeba(变形虫)项目,专注 分布式数据库 proxy 开发。座落与Client、DB Server(s)之间。对客户端透明。具有负载均衡、高可用性、sql过滤、读写分离、可路由相关的query到目标数据库、可并发请求多台数据库合并结果。
主要解决:
- 降低数据切分带来的复杂多数据库结构。
- 提供切分规则并降低数据切分规则给应用带来的影响。
- 降低 db 与客户端的连接数。
- 读写分离。
2、为什么要用Amoeba
目前要实现mysql的主从读写分离,主要有以下几种方案:
- 通过程序实现:网上很多现成的代码,比较复杂,如果添加从服务器要更改多台服务器的代码。
- 通过mysql-proxy实现:由于mysql-proxy的主从读写分离是通过lua脚本来实现,目前lua的脚本的开发跟不上节奏,而写没有完美的现成的脚本,因此导致用于生产环境的话风险比较大,据网上很多人说mysql-proxy的性能不高。
- 开发接口实现:这种方案门槛高,开发成本高,不是一般的小公司能承担得起。
- 利用Amoeba实现:Amoeba是阿里巴巴的国产开源项目,具有负载均衡、高可用性、sql过滤、读写分离、可路由相关的query到目标数据库,并且安装配置非常简单。
3、amoeba安装
3.1、首先安装jdk,直接使用rpm包安装即可。
3.2、下载amoeba对应的版本https://sourceforge.net/projects/amoeba/,直接解压即可。
3.3、配置amoeba的配置文件。
dbServers.xml:
<?xml version="1.0" encoding="gbk"?>
<!DOCTYPE amoeba:dbServers SYSTEM "dbserver.dtd">
<amoeba:dbServers xmlns:amoeba="http://amoeba.meidusa.com/"> <dbServer name="abstractServer" abstractive="true">
<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
<property name="connectionManager">${defaultManager}</property>
<property name="sendBufferSize">64</property>
<property name="receiveBufferSize">128</property> <!-- mysql port -->
<property name="port">3306</property> <!-- mysql schema -->
<property name="schema">msb</property> <!-- mysql user -->
<property name="user">root</property> <property name="password">123456</property>
</factoryConfig> <poolConfig class="com.meidusa.toolkit.common.poolable.PoolableObjectPool">
<property name="maxActive">500</property>
<property name="maxIdle">500</property>
<property name="minIdle">1</property>
<property name="minEvictableIdleTimeMillis">600000</property>
<property name="timeBetweenEvictionRunsMillis">600000</property>
<property name="testOnBorrow">true</property>
<property name="testOnReturn">true</property>
<property name="testWhileIdle">true</property>
</poolConfig>
</dbServer> <dbServer name="writedb" parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.85.11</property>
</factoryConfig>
</dbServer> <dbServer name="slave" parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.85.12</property>
</factoryConfig>
</dbServer>
<dbServer name="myslave" virtual="true">
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<!-- Load balancing strategy: 1=ROUNDROBIN轮询 , 2=WEIGHTBASED权重 , 3=HA负载均衡-->
<property name="loadbalance">1</property> <!-- Separated by commas,such as: server1,server2,server1 -->
<property name="poolNames">slave</property>
</poolConfig>
</dbServer>
</amoeba:dbServers>
amoeba.xml:
<?xml version="1.0" encoding="gbk"?> <!DOCTYPE amoeba:configuration SYSTEM "amoeba.dtd">
<amoeba:configuration xmlns:amoeba="http://amoeba.meidusa.com/"> <proxy> <!-- service class must implements com.meidusa.amoeba.service.Service -->
<service name="Amoeba for Mysql" class="com.meidusa.amoeba.mysql.server.MySQLService">
<!-- port -->
<property name="port">8066</property> <!-- bind ipAddress -->
<!--
<property name="ipAddress">127.0.0.1</property>
--> <property name="connectionFactory">
<bean class="com.meidusa.amoeba.mysql.net.MysqlClientConnectionFactory">
<property name="sendBufferSize">128</property>
<property name="receiveBufferSize">64</property>
</bean>
</property> <property name="authenticateProvider">
<bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator"> <property name="user">root</property>
<property name="password">123456</property> <property name="filter">
<bean class="com.meidusa.toolkit.net.authenticate.server.IPAccessController">
<property name="ipFile">${amoeba.home}/conf/access_list.conf</property>
</bean>
</property>
</bean>
</property> </service> <runtime class="com.meidusa.amoeba.mysql.context.MysqlRuntimeContext"> <!-- proxy server client process thread size -->
<property name="executeThreadSize">128</property> <!-- per connection cache prepared statement size -->
<property name="statementCacheSize">500</property> <!-- default charset -->
<property name="serverCharset">utf8</property> <!-- query timeout( default: 60 second , TimeUnit:second) -->
<property name="queryTimeout">60</property>
</runtime> </proxy> <!--
Each ConnectionManager will start as thread
manager responsible for the Connection IO read , Death Detection
-->
<connectionManagerList>
<connectionManager name="defaultManager" class="com.meidusa.toolkit.net.MultiConnectionManagerWrapper">
<property name="subManagerClassName">com.meidusa.toolkit.net.AuthingableConnectionManager</property>
</connectionManager>
</connectionManagerList> <!-- default using file loader -->
<dbServerLoader class="com.meidusa.amoeba.context.DBServerConfigFileLoader">
<property name="configFile">${amoeba.home}/conf/dbServers.xml</property>
</dbServerLoader> <queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
<property name="ruleLoader">
<bean class="com.meidusa.amoeba.route.TableRuleFileLoader">
<property name="ruleFile">${amoeba.home}/conf/rule.xml</property>
<property name="functionFile">${amoeba.home}/conf/ruleFunctionMap.xml</property>
</bean>
</property>
<property name="sqlFunctionFile">${amoeba.home}/conf/functionMap.xml</property>
<property name="LRUMapSize">1500</property>
<property name="defaultPool">master</property>
<!-- 此处定义的写池取自dbServer.xml配置中的master -->
<property name="writePool">master</property>
<!-- 此处定义的读池配置取自dbServers.xml配置中的myslave -->
<property name="readPool">myslave</property>
<property name="needParse">true</property>
</queryRouter>
</amoeba:configuration>
4、启动amoeba
/root/amoeba-mysql-3.0.-RC/bin/launcher
如果启动过程中报以下错误:
则是因为栈空间太小了,因此可以修改配置jvm.properties。
vim /root/amoeba-mysql-3.0.-RC/jvm.properties
找到JVM_OPTIONS配置项修改成如下配置 (可以根据自身机器性能调节):
然后重新启动Amoeba
5、测试Amoeba
--测试的sql
--在安装amoeba的服务器上登录mysql
mysql -h192.168.85.13 -uroot -p123 -P8066
--分别在master、slave、amoeba上登录mysql
use msb
select * from user;
--在amoeba上插入数据
insert into user values(2,2);
--在master和slave上分别查看表中的数据
select * from user;
--将master上的mysql服务停止,继续插入数据会发现插入不成功,但是能够查询
--将master上的msyql服务开启,停止slave上的mysql,发现插入成功,但是不能够查询
MySQL5.7安装、主从复制、读写分离原理解析以及详细配置的更多相关文章
- Mysql多实例安装+主从复制+读写分离 -学习笔记
Mysql多实例安装+主从复制+读写分离 -学习笔记 .embody{ padding:10px 10px 10px; margin:0 -20px; border-bottom:solid 1px ...
- mysql-5.7.14-winx64免安装版在win10下的详细配置过程
1.配置文件 如果使用mysql的默认配置,在使用的过程中会出现很多问题,如汉字是乱码等. 在mysql的根目录(如:D:\mysql\mysql-5.7.14-winx64\)下,新建配置文件my. ...
- 关于安装Apache之后,解析PHP的配置
需要配置四个地方 LoadModule php5_module modules/libphp5.soServerName localhost:80DirectoryIndex index.phpAdd ...
- redis的主从复制(读写分离)/哨兵(主从切换)配置
准备两个redis服务,两台机器,依次命名文件夹子master,slave1 10.10.10.7 10.10.10.8 1.master修改配置文件 [root@db2 conf]# cat 637 ...
- centos7中安装mysql5.6版本 + 主从复制
centos安装5.6版本:CentOS7下使用YUM安装MySQL5.6 主从复制:Mysql主从复制与读写分离原理及配置教程 主从复制问题及配置 卸载和安装5.7版本:CentOS 7 安装与卸载 ...
- MySQL5.6 Replication主从复制(读写分离) 配置完整版
MySQL5.6 Replication主从复制(读写分离) 配置完整版 MySQL5.6主从复制(读写分离)教程 1.MySQL5.6开始主从复制有两种方式: 基于日志(binlog): 基于GTI ...
- MySQL5.6 实现主从复制,读写分离,分散单台服务器压力
闲来无事,在本地搭建几台虚拟机,准备配一个mysql读写分离的主从配置,版本选用最新版的,mysql.5.6.28 版本,本处使用源码安装(鄙人一向喜欢源码安装,因为centos中鄙人不知道yum安装 ...
- MySQL - 主从复制及读写分离原理
1.MySQL主从复制与读写分离原理 首先,我们看一个图: 影响MySQL-A数据库的操作,在数据库执行后,都会写入本地的日志系统A中. 假设,实时的将变化了的日志系统中的数据库事件操作,在MYSQL ...
- Mysql主从复制读写分离
一.前言:为什么MySQL要做主从复制(读写分离)?通俗来讲,如果对数据库的读和写都在同一个数据库服务器中操作,业务系统性能会降低.为了提升业务系统性能,优化用户体验,可以通过做主从复制(读写分离)来 ...
随机推荐
- Flutter 图片、圆形头像、圆角图片....各种形状
图片 1. 本地图片 Image.asset 加载项目资源包的图片 //先将图片拷贝到项目 images 目录中,然后在 pubspec.yaml文件配置文件相对路径到 assets Image.as ...
- 【DataBase】H2 DateBase的拓展使用
连接模式 支持以下连接模式: 嵌入模式(使用JDBC的本地连接) 服务器模式(使用JDBC或ODBC over TCP / IP进行远程连接) 混合模式(同时本地和远程连接) 嵌入模式 在嵌入模式下, ...
- 谷歌Chrome浏览器 截取网页长图方法
Chrome浏览器: 1.按F12打开调试页面 2.按下ctrl + shift + p 3.输入命令 Capture full size screenshot 并回车 4.浏览器会自动截取整个网页内 ...
- Laya的屏幕适配,UI组件适配
参考: 屏幕适配API概述 版本2.1.1.1 目录 一 适配模式 二 UI组件适配 一 适配模式 基本和白鹭的适配模式一样. Laya官方也推荐了竖屏使用fiexedwidth,横屏使用fixedh ...
- java 时间的原生操作和工具类操作
package com.xc.test.dateoperation; import org.apache.commons.lang3.time.DateFormatUtils; import org. ...
- Python - Django - 添加首页尾页上一页下一页
添加首页和尾页: views.py: from django.shortcuts import render from app01 import models def book_list(reques ...
- Linux脚本检测当前用户是否为root用户
#/bin/bash if [ $UID -ne 0 ]; then echo Non root user. Please run as root. else echo Root user fi
- 静态站点生成器-html-markdown-jekyll
推荐指数:
- Linux查看CPU和内存使用情况总结
Linux查看CPU和内存使用情况:http://www.cnblogs.com/xd502djj/archive/2011/03/01/1968041.html 在做Linux系统优化的时候,物理内 ...
- 网络I/O模型
事件驱动模型 与传统编程模式不同,事件驱动程序在启动之后,就在那等待,等待什么呢?等待被事件触发.传统编程下也有“等待”的时候,比如在代码块D中,你定义了一个input(),需要用户输入数据.但这与下 ...