MySQL主从复制与读写分离

Posted

tags:

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

技术分享图片

主机 操作系统 IP地址 主要软件
master centos7.3x64 192.168.200.132 mysql 5.5.24
slave1 centos7.3x64 192.168.200.130 mysql 5.5.24
slave2 centos7.3x64 192.168.200.128 mysql 5.5.24
Amoeba centos7.3x64 192.168.200.133 amoeba,jdk
客户端 centos7.3x64 192.168.200.129 mysql 5.5.24

前言:

  • MySQL支持的复制类型
  • 基于语句复制。在从服务器上执行同样的语句。MySQL默认采用。
  • 基于行的复制。把改变的内容复制过去,而不是在服务器在执行一便。
  • 混合类型复制。默认采用基于语句复制,一旦发现基于语句无法精准的复制就会采用基于行的复制

读写分离:

  1. 简单来说,读写分离,就是在主服务器上写,只在从服务器上读。基本原理是让主数据库处理事务性查询,而从数据库处理select查询。数据一块复制被用来把事物性查询导致的改变同步到就集群中的从数据库
    Amoeba是什么

    Amoeba(变形虫)项目,该开源框架于2008年 开始发布一款 Amoeba for Mysql软件。这个软件致力于MySQL的分布式数据库前端代理层,它主要在应用层访问MySQL的时候充当SQL路由功能,专注于分布式数据库代理层(Database Proxy)开发,它位于与Client、DBServer(s)之间,对客户端透明。具有 负载均衡、高可用性、SQL过滤、读写分离、可路由相关的到目标数据库、可并发请求多台数据库合并结果。

    实验开始唯一的共同点都要关闭防火墙在最开始的时候就关闭别导致什么都配置好了就因为防火没关而导致报错

systemctl stop firewalld.service
setenforce 0

主服务MySQL配置同步时间

yum install ntp -y  // 时间同步 在centos7.3 中默认是安装好的(不是最小化安装)
vim /etc/ntp.conf  //修改其主配置文件  因为我的网段全是200 段的
server 127.127.200.0                    //本地是时钟源// 
fudge 127.127.200.0 stratum 8          //设置时间层级为8(限制在15内)//
启动服务
systemctl start ntpdate.service

从服务器同样操作可以两台同时进行

systemctl start ntpd.service //开启服务
/usr/sbin/ntpdate 192.168.200.132  //同步主服务器的时间
当提示the NTP socket is in use, exiting  //说明同步好了可以使用

Master、Slave1、Slave2 分别安装mysql数据库安装MySQL5.5.24 若条件允许则可三台同时运行

yum install gcc gcc-c++ make cmake ncurses-devel bisonlibaio-devel -y  //安装所需要的环境
tar zxvf mysql-5.5.24.tar.gz -C /opt/  //.mysql软件包解压至/opt目录下
useradd  -s /sbin/nologin mysql  //创建管理用户
mkdir /usr/local/mysql  //创建存放目录
转到MySQL解压后目录
#配置mysql
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql 
-DMYSQL_UNIX_ADDR=/home/mysql/mysql.sock 
-DDEFAULT_CHARSET=utf8 
-DDEFAULT_COLLATION=utf8_general_ci 
-DWITH_EXTRA_CHARSETS=all 
-DWITH_MYISAM_STORAGE_ENGINE=1 
-DWITH_INNOBASE_STORAGE_ENGINE=1 
-DWITH_MEMORY_STORAGE_ENGINE=1 
-DWITH_READLINE=1 
-DENABLED_LOCAL_INFILE=1 
-DMYSQL_DATADIR=/home/mysql 
-DMYSQL_USER=mysql 
-DMYSQL_TCP_PORT=3306
make & make install  //执行安装
chown -R mysql.mysql /usr/local/mysql  //修改MySQL目录属主属组
export PATH=$PATH:/usr/local/mysql/bin/   //刷新环境变量
cp support-files/my-medium.cnf /etc/my.cnf                  //复制mysql默认配置文件及启动脚本  
cp support-files/mysql.server /etc/init.d/mysqld     //复制mysql默认配置文件及启动脚本 
/usr/local/mysql/scripts/mysql_install_db    /切换到MySQL解压目录//初始化数据库
--user=mysql --ldata=/var/lib/mysql --basedir=/usr/local/mysql --datadir=/home/mysql
ln -s /var/lib/mysql/mysql.sock /home/mysql/mysql.sock           /*直接建立软连接*/
vim /etc/init.d/mysqld      //mysqld中的mysql安装路径及数据目录路径
basedir=/usr/local/mysql
datadir=/home/mysql
service mysqld start   
mysqladmin -u root password ‘abc123‘  //设置MySQL登陆密码
mysq -u root -p //就可以登陆

开始配置主从MySQL

主MySQL 主配置文件
vim /etc/my.cnf
server-id       = 11                        //主个从的区别总得有一个做老大吧
log-bin=master-bin                         //主服务器日志文件//
log-slave-updates=true                     //从服务器更新二进制日志//
service mysqld restart
从MySQL 主配文件  两个从MySQL一样的配置
vim /etc/my.cnf  注意这是在从服务器上配置
server-id       = 22                    //id这个两个从的服务器都一样
relay-log=relay-log-bin                         //从主服务器上同步日志文件记录到本地//
relay-log-index=slave-relay-bin.index           //定义relay-log的位置和名称//
到此主从同步读写分离配置文件就到此接数

为Slaves从服务器同步创建用户

GRANT REPLICATION SLAVE ON *.* TO ‘myslave‘@‘192.168.200.%‘ IDENTIFIED BY ‘123456‘;
给与从服务器权限 对方的名字为myslave 访问的网段200端 密码 123456
FLUSH PRIVILEGES;  //立即生效
show master status;  //查看状态
以上就是主服务器的同步配置
下面是从服务器同步配置当然实在MySQL模式下
change master to master_host=‘192.168.200.132‘,master_user=‘myslave‘,master_password=‘123456‘,master_log_file=‘master-bin.000004‘,master_log_pos=339; //添加向主服务器同步数据命令
start slave;  //开启slave从服务器
show slave statusG;  //查看状态

验证主从同步

在主MySQL上面添加新表 看看两个从服务是否能同步 

技术分享图片
技术分享图片
技术分享图片
技术分享图片
技术分享图片

开始配置amoeba服务器也叫变形虫

复制jdk包及安装
cp jdk-6u14-linux-x64.bin /usr/local/
cd /usr/local/    //别忘切换目录····
./jdk-6u14-linux-x64.bin          #  yes     按enter
修改jdk目录名称
mv jdk1.6.0_14/ /usr/local/jdk1.6
添加jdk、jre、amoeba环境变量
vim /etc/profile  //末尾添加
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
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$AMOEBA_HOME/bin
source /etc/profile  //刷新环境变
mkdir /usr/local/amoeba // 创建amoeba目录
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/ //解压amoeba软件包至/usr/local/amoeba目录下
chmod -R 755 /usr/local/amoeba/  //修改amoebab目录权限
/usr/local/amoeba/bin/amoeba  //验证amoeba是否安装成功
显示amoeba start|stop说明安装成功
+--------在三台mysql上添加权限开放给amoeba访问-----------------------+ 
|grant all on *.* to [email protected]‘192.168.200.%‘ identified by ‘123.com‘; |
+------------------------------------------------------------------+
vim conf/amoeba.xml  //配置文件
---30行--
<property name="user">amoeba</property> #访问amoeba的用户名
----32行---------
<property name="password">123456</property> #密码
---117-去掉注释-
<property name="defaultPool">master</property> #默认为主服务器
<property name="writePool">master</property> #写入为主服务器
<property name="readPool">slaves</property> #读取为slaves池,现有slave1、slave2服务器

修改dbServers.xml配置文件还是在变形虫上做动作

vim conf/dbServers.xml
3 <dbServer name="master" parent="abstractServer"> #name为master
44 <factoryConfig>
45 <!-- mysql ip -->
46 <property name="ipAddress">192.168.200.132</property> #主服务器IP地址
47 </factoryConfig>
48 </dbServer>
49
50 <dbServer name="slave1" parent="abstractServer"> #name为slave1
51 <factoryConfig>
52 <!-- mysql ip -->
53 <property name="ipAddress">192.168.200.128</property> #从服务器1 IP地址
54 </factoryConfig>
55 </dbServer>
56
57 <dbServer name="slave2" parent="abstractServer"> #name为slave2
58 <factoryConfig>
59 <!-- mysql ip -->
60 <property name="ipAddress">192.168.200.130</property> #从服务器2 IP地址
61 </factoryConfig>
62 </dbServer>
63
64 <dbServer name="slaves" virtual="true"> #name为slaves
65 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
66 <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
67 <property name="loadbalance">1</property> #默认为轮询方式
68
69 <!-- Separated by commas,such as: server1,server2,server1 -->
70 <property name="poolNames">slave1,slave2</property> #轮询顺序为:slave1、slave2
71 </poolConfig>
72 </dbServer>
/usr/local/amoeba/bin/amoeba start&  //启动服务
netstat -anpt | grep java    //查看Java端口

客户端

这个就简单了
yum install mysql -y    //直接用yum 装
mysql -u amoeba -p123456 -h 192.168.200.133 -P8066   //访问的IP是变形虫的IP地址的

验证读写分离

stop slave;   //关闭同步 
在主服务器上创建一个表格
create table zhang (id int(10),name varchar(10),address varchar(20));
则在客户端可以查看的到在Slave1,Slave2服务器上则看不到
反之当在从服务器本身上写入数据则客户端显示出来,主服务器显示不出来

技术分享图片
技术分享图片
技术分享图片技术分享图片
技术分享图片

技术分享图片

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

MySQL主从复制与读写分离配置及实操

MySQL主从复制及读写分离实际部署与验证

MySQL主从复制及读写分离实际部署与验证

MySQL主从复制与读写分离

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

MySQL主从复制与读写分离