部署MySQL主从同步 <M-S>或<MSS>
环境准备:
主机名 IP 系统/MySQL版本 角色
Andu101 192.168.10.101 CentOS7.4/ 5.5.64 Amoeba
Andu102 192.168.10.102 CentOS7.4/ 5.5.64 Master
Andu103 192.168.10.103 CentOS7.4/ 5.5.64 slave
Andu104 192.168.10.104 CentOS7.4/ 5.5.64 Slave
Andu105 192.168.10.105 CentOS7.4/ 5.5.64 Client
Amoeba 需要安装JDK 1.5/1.6/1.7/1.8 或者以上版本 #高版本不建议使用
下载jdk-8u131-linux-x64.tar.gz文件
https://www.oracle.com/technetwork/java/javase/archive-139210.html
[root@Andu101 ~]# chmod +x jdk-6u14-linux-x64.bin
[root@Andu101 ~]# ./jdk-6u14-linux-x64.bin
[root@Andu101 ~]# mv jdk1.6.0_14 /usr/local/jdk1.6
配置环境变量 在/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
[root@Andu102 java]# source /etc/profile #使环境变量生效
[root@Andu101 ~]# java –version #查看系统JAVA版本
java version "1.6.0_14"
Java(TM) SE Runtime Environment (build 1.6.0_14-b08)
Java HotSpot(TM) 64-Bit Server VM (build 14.0-b16, mixed mode)
Amoeba服务启动与启动设置
[root@Andu101 ~]# mkdir /usr/local/amoeba
[root@Andu101 ~]# tar zxf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba
[root@Andu101 ~]# chmod -R 755 /usr/local/amoeba
[root@Andu101 ~]# /usr/local/amoeba/bin/amoeba
amoeba start|stop #看到这里说明我们的Amoeba安装成功
配置主从
配置Mysql主服务器:
配置my.cnf:
vim /etc/my.cnf
log-bin=master-bin #启用二进制日志
server-id=1 #本机数据库ID标识
重启mysql ( 如果重启卡死现象,kill掉再启动)
[root@Andu102 ~]# systemctl restart mariadb
授权从服务器:
MariaDB [(none)]> grant replication slave on *.* to slave@’192.168.10.%’identified by "123456";
查看状态信息:
MariaDB [(none)]> show master status;
File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
---|---|---|---|
master-bin.000003 | 396 |
1 row in set (0.00 sec)
配置从数据库服务器
192.168.10.102/192.168.10.103/192.168.10.104 #服务器版本要一致
show variables like '%version%'; #查看版本信息
测试连接到主服务器是否成功
mysql -uslave -p123456 -h 192.168.10.102
修改从服务器配置文件:
从服务器没必要开启bin-log日志
Systemctl stop mariadb
vim /etc/my.cnf
server-id = 2 #从服务器ID号,不要和主ID相同 ,如果设置多个从服务器,每个从服务器必须有一个唯一的server-id值,必须与主服务器的以及其它从服务器的不相同。可以认为server-id值类似于IP地址:这些ID值能唯一识别复制服务器群集中的每个服务器实例。
下面是mysql 5.1的配置
master-host=192.168.10.103 #指定主服务器IP地址
master-user=slave #指定定在主服务器上可以进行同步的用户名
master-password=123456 #密码
#master-port=3306
master-connect-retry=60 #断点重新连接时间
MariaDB [(none)]> stop slave;
MariaDB [(none)]> CHANGE MASTER TO
MASTER_HOST='192.168.10.102',
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_PORT=3306,
MASTER_LOG_FILE='master-bin.000003',
MASTER_LOG_POS=396,
MASTER_CONNECT_RETRY=10;
MariaDB [(none)]> start slave;
注意:写配置文件的时候尽量不要把参数放在mysql_safe下!!! 如果更改从不生效首先查看主从的ID :show variables
like 'server_id'; 我们可以尝试在mysql里执行语句SET GLOBAL server_id=2;从而修改id
然后start slave;就可以发现成功了!!!!!!!!
192.168.10.103配置同上,但是server-id不可相同。
MariaDB [(none)]> show slave status \G; 查看状态
Slave_IO_Running :一个负责与主机的io通信
Slave_SQL_Running:负责自己的slave mysql进程
两个为YES 就成功了!
插入数据测试同步:
MariaDB [(none)]> create database qqq;
从数据库上查看:
MariaDB [(none)]> show databases; |
---|
Database |
information_schema |
mysql |
performance_schema |
qqq |
test |
5 rows in set (0.00 sec)
排错:
如果遇到主从不同步,看一下主从bin-log的位置,然后再同步。
在主服务器上看二进制日志事件列表
mysql> show binlog events \G
从服务器执行MySQL命令下:
mysql> stop slave; #先停止slave服务
mysql> change master to master_log_file='mysql-bin-master.000001',master_log_pos=1164;
#根据上面主服务器的show master status的结果,进行从服务器的二进制数据库记录回归,达到同步的效果
mysql>slave start; #启动从服务器同步服务
mysql> show slave status\G; #用show slave status\G;看一下从服务器的同步情况
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果都是yes,那代表已经在同步
重启从服务器,再查看状态:
停止从服务器slave stop;
开启从服务器slave start;
排错思路:
1、二进制日志没有开启
2、IPTABLES 没有放开端口
3、对应的主机 IP地址写错了
SQL线程出错
1、主从服务器数据库结构不统一
出错后,数据少,可以手动解决创建插入,再更新slave状态。
注:如果主上误删除了。那么从上也就误删除了。 #因此主上要定期做mysqldump备份。
读写分离
①Master 开放权限给Amoeba访问!
MariaDB [(none)]> grant all on *.* to 'amoeba'@'%' identified by '123456';
②编辑amoeba.xml配置文件
[root@Andu101 ~]# cd /usr/local/amoeba/conf/
[root@Andu101 conf]# vim amoeba.xml
<property name="authenticato r">
<bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">
<property name="user">andu</property> #客户机需要连接的amoeba用户名
<property name="password">123</property> #密码
<property name="filter">
<bean class="com.meidusa.amoeba.server.IPAccessController">
<property name="ipFile">${amoeba.home}/conf/access_list.conf</property>
</bean>
</property>
</bean>
</property>
<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> #默认
<!-- -->
<property name="writePool">master</property> #写操作
<property name="readPool">slaves</property> #读操作
<property name="needParse">true</property>
</queryRouter>
</amoeba:configuration>
③编辑dbServers.xml配置文件
[root@Andu101 conf]# vim dbServers.xml
<!-- mysql user --> #切记取消掉注释 <!—mysql user-->
<property name="user">amoeba</property>
# Amoeba用来连接mysql服务器的已授权用户
<!-- mysql password -->
<property name="password">123456</property>
# 密码
</factoryConfig>
</dbServer>
<dbServer name="master" parent="abstractServer"> #主Mysql
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.10.102</property>
</factoryConfig> #主mysql IP地址
</dbServer>
<dbServer name="slave1" parent="abstractServer"> #定义名字 需要对照amoeba.xml文件设置
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.10.103</property>
</factoryConfig> #从库地址
</dbServer>
<dbServer name="slave2" parent="abstractServer"> #定义名字 需要对照amoeba.xml文件设置
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.10.104</property>
</factoryConfig> #从库地址
</dbServer>
<dbServer name="slaves" 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">slave1,slave2</property>
</poolConfig> #上面是啥这里就得是啥没有原因
④配置无误后,可以启动Amoeba软件,其默认端口为tcp8066.
[root@Andu101 conf]# amoeba start&
[root@Andu101 conf]# netstat -aupnt | grep java
tcp6 0 0 :::8066 :::* LISTEN 8800/java
tcp6 0 0 127.0.0.1:64837 :::* LISTEN 8800/java
tcp6 0 0 192.168.10.101:42822 192.168.10.104:3306 ESTABLISHED 10575/java
tcp6 0 0 192.168.10.101:33916 192.168.10.102:3306 ESTABLISHED 10575/java
tcp6 0 0 192.168.10.101:37044 192.168.10.103:3306 ESTABLISHED 10575/java
测试读写分离
①在Client主机上安装mysql客户端
[root@Andu105 ~]# yum -y install msyql
可以通过代理访问Mysql(访问Amoeba)
[root@Andu105 ~]# mysql -uamoeba -p123456 -h192.168.10.101 -p8066
②停掉两台从服务器的功能
MariaDB [(none)]> stop slave;
在主服务器上插入数据
从服务器同步表之后,手动插入其他内容
③测试读操作
省略
④测试写操作
省略
原创:转载请注明出处