mysql主从复制和读写分离

Posted jialinux

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql主从复制和读写分离相关的知识,希望对你有一定的参考价值。

 1.mysql主从复制的原理:

MySQL主服务器更新数据,执行命令,将会记录到自己的二进制日志里面,然后从服务器开始一个I/O线程,用于读取主服务器的已更新或以变化的二进制文件,前提是主服务器要给从服务器这个权限,读取以后,将数据放入中继日志里面,然后从服务器开启sql线程,负责读取中继日志里面的已更新或已更改的日志,然后再执行以更新的命令(这个命令是主服务器上操作的命令)。

技术图片

在企业中,普遍用的都是mysql主主复制架构,不是mysql主从复制架构.主主复制其实也是基于主从架构来做的,中间加上keepalived。

  如上图所示,其实在主服务器上执行的命令太多,到从服务器因为要经过几个步骤,所以会有延迟,有一些公司会故意让它延迟,但有的公司就不需要,1.6以前的版本就是有这个延迟问题,如果被问到这些问题,请记得一定要跳过去,说我们公司用的是1.6以后的版本,1.6以后的版本没有延迟。已经解决了这个问题。

 

                                                          MySQL主从复制和读写分离

mysql主从复制:

要求环境:三台centos虚拟机(也可以更多),配置好yum

  1. 将一切的准备工作做好。比如三台网络要互通。
  2. 配置主服务器:

[[email protected] ~]# yum -y install mariadb mariadb-devel mariadb-server

[[email protected] ~]# yum -y install ntp

:搭建时间同步服务器,时间需要同步,不然很容易出错。主从复制就会丢失数据。

[[email protected] ~]# vim /etc/ntp.conf

在文件末尾添加

server 127.127.1.0

fudge 127.127.1.0 stratum 8

[[email protected] ~]# systemctl start ntpd

[[email protected] ~]# systemctl enable ntpd

  1. 配置从服务器:两台从服务器操作同步

[[email protected] ~]# yum -y install mariadb mariadb-devel mariadb-server

[[email protected] ~]# yum -y install ntpdate

[[email protected] ~]#ntpdate 192.168.253.6

:同步主服务器的时间

  1. 再次配置主服务器:

[[email protected] ~]# vim /etc/my.cnf

[mysqld]

server_id = 1

log_bin = master-bin

log-slave-updates = true

   [[email protected] ~]# systemctl restart mariadb

   [[email protected] ~]# mysql

   :默认就是用管理员登录的,所以直接这样操作就行。

   MariaDB [(none)]> grant replication slave on *.* to ‘myslave‘@‘192.168.253.%‘ identified by ‘123456‘;

   MariaDB [(none)]> flush privileges;

   MariaDB [(none)]> show master status;

   :查看我的二进制日志文件时间跟位置。

  1. 再次配置从服务器:两台从服务器操作同步

[[email protected] ~]# vim /etc/my.cnf

[mysqld]

server_id = 2  注:三台服务器的sever_id 不能一样

relay-log=relay-log-bin

relay-log-index=slave-relay-bin.index

[[email protected] ~]# systemctl restart mariadb

[[email protected] ~]# mysql

MariaDB [(none)]> stop slave;

 

MariaDB[(none)]>change master to master_host=‘192.168.253.6‘,master_user=‘myslave‘,master_password=‘123456‘,master_log_file=‘master-bin.000003‘,master_log_pos=477;

:master_host:主服务器的IP地址

master_user:主服务器刚刚创建的用户

master_password:主服务器刚刚创建的用户密码

master_log_file:主服务器的二进制日志文件,通过show master status;可以查看。

Master_log_pos=477:刚才查看到的二进制日志位置。

MariaDB [(none)]> slave start;

MariaDB [(none)]> show slave status\\G;

注:用\\G查看是因为一个屏放不下,分屏放.

Slave_IO_State: Waiting for master to send event

                  Master_Host: 192.168.253.6

                  Master_User: myslave

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: master-bin.000003

          Read_Master_Log_Pos: 477

               Relay_Log_File: relay-log-bin.000002

                Relay_Log_Pos: 530

        Relay_Master_Log_File: master-bin.000003

             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: 477

              Relay_Log_Space: 822

              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

查看IO跟SQL是不是yes,如果其中一个不是,就看Last_IO_Error:、Last_SQL_Error:这两段的错误日志,然后复制到百度上去查。

验证:

 在主服务器上创建一个数据库,看看两个从服务器是不是已经同步数据库。

--------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------------

                                         Mysql读写分离

实验环境:

  准备五台centos用于测试:          

有三台是跟上面操作一样。

第四台操作:

1.  读写分离有两种方法可以做,一种是开发人员自己做,一种是开发人员不会做,需要我们运维人员做。准备好两个包。一个是amoeba做读写分离用的,一个是jdk二进制文件,因为我们本身自带的是1.8版本的,太高反而不支持运行amoeba这个软件,所以我们这里找了一个1.6版本的,刚好支持。

2.  [[email protected] ~]#chmod +x jdk-6u31-linux-x64.bin

[[email protected] ~]#./ jdk-6u31-linux-x64.bin

[[email protected] ~]# mv jdk1.6.0_31/ /usr/local/jdk1.6

[[email protected] ~]# mkdir /usr/local/amoeba

[[email protected] ~]# chmod 755 /usr/local/amoeba

[[email protected] ~]# tar zxf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/

[[email protected] amoeba]# /usr/local/amoeba/bin/amoeba

注:通过这一条命令就可以看见下面内容,证明aomeba没有错。

  amoeba start|stop

[[email protected] ~]# vim /etc/profile

下面三行是设置jdk的变量

export JAVA_HOME=/usr/local/jdk1.6

export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin:$PATH:$HOME/bin

    下面两行是设置amoeba的变量

export AMOEBA_HOME=/usr/local/amoeba/

export PATH=$PATH:$AMOEBA_HOME/bin

[[email protected] ~]# source /etc/profile

[[email protected] ~]# java –version  当我们再次查看版本时,会发现,已经重1.8变成了1.6的版本

java version "1.6.0_31"

Java(TM) SE Runtime Environment (build 1.6.0_31-b04)

Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01, mixed mode)

3.  配置读写分离,给主服务器“写”、两台从服务器“读”

   首先要在三台主从服务器上给amoeba权限。

   MariaDB [(none)]> grant all on *.* to ‘test‘@‘192.168.253.%‘ identified by ‘123.com‘;

[[email protected] ~]# cd /usr/local/amoeba/

[[email protected] amoeba]# cp conf/amoeba.xml conf/amoeba.xml.bak

在更改文件之前,都要先复制一份原有的文件,防止修改完以后不能使用,还不能返回原有数据

[[email protected] amoeba]# vim conf/amoeba.xml

下方的红字都是在文件里需要改的,找到这几个地方,然后更改成红色的字

<property name="authenticator">

<bean class="com.meidusa.amoeba.mysql.server.MysqlClientA    uthenticator">

<property name="user">amoeba</property>                       

<property name="password">123456</property>

 

<property name="defaultPool">master</property>

<property name="writePool">master</property>

<property name="readPool">slaves</property>

[[email protected] amoeba]# cp conf/dbServers.xml conf/dbServers.xml.bak

[[email protected] amoeba]# vim conf/dbServers.xml

找到下面的内容并修改。

<property name="user">test</property>

<property name="password">123.com</property>

<dbServer name="master"  parent="abstractServer">

                <factoryConfig>

                        <!-- mysql ip -->

                        <property name="ipAddress">192.168.253.6</property>

                </factoryConfig>

 </dbServer>

<dbServer name="slave1"  parent="abstractServer">

                <factoryConfig>

                        <!-- mysql ip -->

                        <property name="ipAddress">192.168.253.7</property>

                </factoryConfig>

 </dbServer>

<dbServer name="slave2"  parent="abstractServer">

                <factoryConfig>

                        <!-- mysql ip -->

                        <property name="ipAddress">192.168.253.8</property>

                </factoryConfig>

</dbServer>

<dbServer name="slaves" virtual="true"> “slaves”是一个组,刚才在上面定义的。

                <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">slave1,slave2</property>

                </poolConfig>

        </dbServer>

 

                                                    组内成员

  [[email protected] amoeba]# bin/amoeba start& 放到后台运行。

[[email protected] amoeba]# netstat -anpt |grep java

  [[email protected] amoeba]# netstat -anpt |grep 8066

  通过上面两条命令可以查看8066、3306端口是否已经开启.

 

最后就是找一台client用于测试。

以上是关于mysql主从复制和读写分离的主要内容,如果未能解决你的问题,请参考以下文章

主从复制和读写分离

Mysql主从复制和读写分离

MySQL主从复制和读写分离

MySQL主从复制和读写分离

运维必懂的MySQL主从复制与读写分离解析和图文详细步骤!

MySQL 主从复制与读写分离 部署