MySQL5.7安装、主从复制、读写分离原理解析以及详细配置

1、Linux下mysql完全卸载

  一、查看mysql的安装状况node

rpm -qa | grep -i mysql

   

  二、删除上图安装的软件mysql

rpm -ev mysql-community-libs-5.7.27-1.el6.x86_64 --nodeps

  三、都删除成功以后,查找相关的mysql的文件linux

find / -name mysql

   

  四、删除所有相关文件sql

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

  五、再次执行命令数据库

rpm -qa | grep -i mysql

  若是没有显式则表示卸载完成。vim

2、MySQL5.7安装步骤

  一、查看系统中是否自带安装mysql安全

yum list installed | grep mysql

    

  二、删除系统自带的mysql及其依赖(防止冲突)服务器

yum -y remove mysql-libs.x86_64

   

  三、安装wget命令架构

yum install wget -y

     

  四、给CentOS添加rpm源,而且选择较新的源并发

wget dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm

     

  五、安装下载好的rpm文件

yum install mysql-community-release-el6-5.noarch.rpm -y

   

  六、安装成功以后,会在/etc/yum.repos.d/文件夹下增长两个文件

   

  这两个文件是帮助mysql安装的。
  七、修改mysql-community.repo文件

  原文件:

   

   修改以后:

     

  八、使用yum安装mysql

yum install mysql-community-server -y

     

  九、启动mysql服务并设置开机启动

#启动mysql服务 service mysqld start #设置mysql开机启动 chkconfig mysqld on

    

  十、获取mysql的临时密码

grep "password" /var/log/mysqld.log

   

  十一、使用临时密码登陆

mysql -uroot -p #输入密码

  十二、修改密码

-- 修改密码复杂度
set global validate_password_policy=0; set global validate_password_length=1; -- 修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

     

  1三、修改远程访问权限

grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option; flush privileges;

     

   

  1四、设置字符集为utf-8

#在[mysqld]部分添加: character-set-server=utf8 #在文件末尾新增[client]段,并在[client]段添加: default-character-set=utf8

  若是安装过程当中有任何错误,能够查看日志:/var/log/mysqld.log。

3、mysql主从复制原理

  0、为何须要主从复制?

  • 在业务复杂的系统中,有这么一个情景,有一句sql语句须要锁表,致使暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即便主库出现了锁表的情景,经过读从库也能够保证业务的正常运做。
  • 作数据的热备
  • 架构的扩展。业务量愈来愈大,I/O访问频率太高,单机没法知足,此时作多库的存储,下降磁盘I/O访问的频率,提升单个机器的I/O性能。

  一、什么是mysql的主从复制?

  MySQL 主从复制是指数据能够从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新本身的数据,数据的更新能够在远程链接上进行,从节点能够复制主数据库中的全部数据库或者特定的数据库,或者特定的表。

  二、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。

  三、mysql主从形式

  一主一从

           

  主主复制

          

  一主多从

          

  多主一从

          

  联级复制

          

 4、mysql主从复制安装配置

  一、在两台数据库中分别建立数据库

--注意两台必须所有执行,数据库名根据须要自行定义。
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=1 #同步的数据库名称 binlog-do-db=msb

  三、配置从服务器登陆主服务器的帐号受权

--受权操做
set global validate_password_policy=0; set global validate_password_length=1; grant replication slave on *.* to 'root'@'%' identified by '123456'; --刷新权限
flush privileges;

  四、从服务器的配置

# 修改配置文件,执行如下命令打开mysql配置文件 vi /etc/my.cnf
# 在mysqld模块中添加以下配置信息
log-bin=master-bin #二进制文件的名称 binlog-format=ROW #二进制文件的格式 server-id=2 #服务器的id

     

  五、重启主服务器的mysqld服务

-- 重启mysql服务
service mysqld restart -- 登陆mysql数据库
mysql -uroot -p -- 查看master的状态
show master status;

     

  六、重启从服务器并进行相关配置

-- 重启mysql服务
service mysqld restart -- 登陆mysql
mysql -uroot -p -- 链接主服务器
change master to master_host='IP地址',master_user='root',master_password='123456',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线程从主数据库同步数据成功。

  九、此时能够在主服务器进行相关的数据添加、修改、删除工做,再从服务器看相关的数据内容是否同步增长、修改或删除。

5、Mysql读写分离介绍

  一、读写分离的介绍

         

​   MySQL读写分离基本原理是让master数据库处理写操做,slave数据库处理读操做。master将写操做的变动同步到各个slave节点。

​   MySQL读写分离能提升系统性能的缘由在于:

  • 物理服务器增长,机器处理能力提高。拿硬件换性能。
  • 主从只负责各自的读和写,极大程度缓解X锁和S锁争用。
  • slave能够配置myiasm引擎,提高查询性能以及节约系统开销。
  • master直接写是并发的,slave经过主库发送来的binlog恢复数据是异步。
  • slave能够单独设置一些参数来提高其读的性能。
  • 增长冗余,提升可用性。

  二、读写分离的配置

  2.一、硬件配置

  首先须要准备三台机器:主数据库、从数据库、proxy服务器。

master 192.168.85.11 slave 192.168.85.12 proxy 192168.85.14

  2.二、首先在master和slave上配置主从复制

  读写分离配置有多种方式,本文介绍两种方式:mysql-proxy方式(暂不是稳定版本)、Amoeba方式。

6、MySQL-Proxy实现MySQL读写分离

  一、下载mysql-proxy

https://downloads.mysql.com/archives/proxy/#downloads

  二、上传软件到proxy的机器

  直接经过xftp进行上传。

  三、解压安装包

tar -zxvf mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz

  四、修改解压后的目录

mv mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit mysql-proxy

  五、进入mysql-proxy的目录

cd mysql-proxy

  六、建立目录

mkdir conf mkdir logs

  七、添加环境变量

# 打开/etc/profile文件 vi /etc/profile # 在文件的最后面添加一下命令 export PATH=$PATH:/root/mysql-proxy/bin

  八、执行命令让环境变量生效

source /etc/profile

  九、进入conf目录,建立文件并添加一下内容

vi mysql-proxy.conf

  添加内容

[mysql-proxy] user=root proxy-address=192.168.85.14:4040 proxy-backend-addresses=192.168.85.11:3306 proxy-read-only-backend-addresses=192.168.85.12:3306 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

  十、开启mysql-proxy

mysql-proxy --defaults-file=/root/mysql-proxy/conf/mysql-proxy.conf

  十一、查看是否安装成功,打开日志文件

cd /root/mysql-proxy/logs tail -100 mysql-proxy.log
# 内容以下:表示安装成功
2019-10-11 21:49:41: (debug) max open file-descriptors = 1024 2019-10-11 21:49:41: (message) proxy listening on port 192.168.85.14:4040 2019-10-11 21:49:41: (message) added read/write backend: 192.168.85.11:3306 2019-10-11 21:49:41: (message) added read-only backend: 192.168.85.12:3306 2019-10-11 21:49:41: (debug) now running as user: root (0/0)

  十二、进行链接

# mysql的命令行会出现没法链接的状况,因此建议使用客户端 mysql -uroot -p123456 -h192.168.85.14 -P 4040

7、Amoeba实现MySQL读写分离

  一、什么是amoeba

  Amoeba(变形虫)项目,专一 分布式数据库 proxy 开发。座落与Client、DB Server(s)之间。对客户端透明。具备负载均衡、高可用性、sql过滤、读写分离、可路由相关的query到目标数据库、可并发请求多台数据库合并结果。

  主要解决:

  • 下降数据切分带来的复杂多数据库结构。
  • 提供切分规则并下降数据切分规则给应用带来的影响。
  • 下降 db 与客户端的链接数。
  • 读写分离。

  二、为何要用Amoeba

  目前要实现mysql的主从读写分离,主要有如下几种方案:

  • 经过程序实现:网上不少现成的代码,比较复杂,若是添加从服务器要更改多台服务器的代码。
  • 经过mysql-proxy实现:因为mysql-proxy的主从读写分离是经过lua脚原本实现,目前lua的脚本的开发跟不上节奏,而写没有完美的现成的脚本,所以致使用于生产环境的话风险比较大,据网上不少人说mysql-proxy的性能不高。
  • 开发接口实现:这种方案门槛高,开发成本高,不是通常的小公司能承担得起。
  • 利用Amoeba实现:Amoeba是阿里巴巴的国产开源项目,具备负载均衡、高可用性、sql过滤、读写分离、可路由相关的query到目标数据库,而且安装配置很是简单。

  三、amoeba安装

  3.一、首先安装jdk,直接使用rpm包安装便可。

  3.二、下载amoeba对应的版本https://sourceforge.net/projects/amoeba/,直接解压便可。

  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>

  四、启动amoeba

/root/amoeba-mysql-3.0.5-RC/bin/launcher

  若是启动过程当中报如下错误:

   

 

   则是由于栈空间过小了,所以能够修改配置jvm.properties。

vim /root/amoeba-mysql-3.0.5-RC/jvm.properties

  找到JVM_OPTIONS配置项修改为以下配置 (能够根据自身机器性能调节):

    

  而后从新启动Amoeba

  五、测试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,发现插入成功,可是不可以查询
相关文章
相关标签/搜索