案例:MySQL 主从复制与读写分离

1.案例环境

一、准备五台主机

  • Master:操作系统CentOS 7.3x86_74、IP地址192.168.17.10。
  • Slave1:操作系统CentOS 7.3x86_74、IP地址192.168.17.20。
  • Slave2:操作系统CentOS 7.3x86_74、IP地址192.168.17.30。
  • Amoeba:操作系统CentOS 7.3x86_74、IP地址192.168.17.40。
  • Client:操作系统CentOS 7.3x86_74、IP地址192.168.17.50。

2.案例实现思路

(1)安装MySQL数据库。

(2)配置MySQL主从复制。

(3)安装并配置Amoeba。

(4)客户端测试读写分离。

3.案例实施

3.1 搭建MySQL主从复制

1.建立时间同步环境

在主节点上搭建时间同步服务器。

(1)安装NTP。

[root@master ~]# yum -y install ntp

 (2)配置NTP。

[root@master ~]# vim /etc/ntp.conf    ##添加如下两行
server 127.127.1.0
fudge 127.127.1.0 stratum 8

(3)重启服务并设置为开机启动。

[root@master ~]# systemctl restart ntpd
[root@master ~]# systemctl enable ntpd
Created symlink from /etc/systemd/system/multi-user.target.wants/ntpd.service to /usr/lib/systemd/system/ntpd.service.
[root@master ~]#

2.配置防火墙和SELinux。

在每台服务器上关闭firewalld或者在防火墙上开放指定的端口和服务。

[root@master ~]# systemctl stop firewallld
[root@master ~]# systemctl disable firewallld
[root@master ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config 
[root@master ~]# setenforce 0

3.在从节点上进行时间同步

slvae1:
[root@slave1 ~]# yum -y install ntpdate
[root@slave1 ~]# ntpdate 192.168.17.10
15 Mar 10:43:44 ntpdate[18914]: adjust time server 192.168.17.10 offset 0.025335 sec
[root@slave1 ~]#
slave2:
[root@slave2 ~]# yum -y install ntpdate
[root@slave2 ~]# ntpdate 192.168.17.10
15 Mar 10:43:57 ntpdate[77169]: adjust time server 192.168.17.10 offset 0.026557 sec
[root@slave2 ~]#

4.安装MySQL数据库

在Master、Slave1、Slave2服务器上安装MySQL数据库。这里我提前安装过所以不做演示了,大家可以参考我之前的文章二进制安装MySQL数据库。

5.配置Master主服务器

(1)在/etc/my.cnf中修改或者增加下面内容。

[root@master ~]# vim /etc/my.cnf    ##增加如下内容
server-id=11
log-bin=master-bin
log-slave-updates=true

(2)重启MySQL服务

[root@master ~]# systemctl restart mysqld

(3)登录MySQL程序,给从服务器授权。

[root@master ~]# mysql -u root -p'123.123'
mysql> grant replication slave on *.* to 'myslave'@'%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 |      592 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql>

        其中File列显示日志名,Position列显示偏移量,这两个值在后面配置从服务器的时候需要。Slave应从该节点上进行新的更新。

6.配置Slave从服务器

在Slave1、Slave2服务器上面分别执行下面步骤。

(1)在/etc/my.cnf中修改或者增加下面内容,这里要注意server-id不能相同。

slave1:
[root@slave1 ~]# vim /etc/my.cnf
server-id=22
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
slave2:
[root@slave2 ~]# vim /etc/my.cnf
server-id=33
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index

(2)两台从节点服务器分别重启MySQL服务。

slave1:
[root@slave1 ~]# systemctl restart mysqld
slave2:
[root@slave2 ~]# systemctl restart mysqld

(3)登录MySQL,两台从节点服务器都要配置同步。(这里演示一台)

[root@slave1 ~]# mysql -u root -p'123.123'
mysql> change master to master_host='192.168.17.10',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',maaster_log_pos=592;
Query OK, 0 rows affected, 2 warnings (0.01 sec) 

(4)启动同步。

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

(5)查看Slave状态,确保以下两个值为YES。

 mysql> show slave status\G;
 Slave_IO_Running: Yes
  Slave_SQL_Running: Yes

7.验证主从复制结果

(1)在主、从服务器上登录MySQL。

[root@master ~]# mysql -u root -p'123.123'
mysql> show databases;

两台数据库执行结果应该相同。

(2)在主服务器上新建数据库db_test。

mysql> create database db_test;
Query OK, 1 row affected (0.00 sec)

(3)在两台从服务器上分别查看数据库,显示数据库相同,则主从复制成功。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db_test            |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql>
3.2 搭建MySQL读写分离

1.在主机Amoeba上安装Java环境

因为Amoeba基于是jdk1.5开发的,所以官方推荐使用jdk1.5或1.6版本,高版本不建议使用。

[root@amoeba ~]# chmod +x jdk-6u14-linux-x64.bin    ##这里我已经提前上传了文件
[root@amoeba ~]# ./jdk-6u14-linux-x64.bin 
[root@amoeba ~]# mv jdk1.6.0_14/ /usr/local/jdk1.6
[root@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
[root@amoeba ~]# source /etc/profile
[root@amoeba ~]# java -version
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)
[root@amoeba ~]#

Java环境已配置成功。

2.安装并配置Amoeba软件

[root@amoeba ~]# mkdir /usr/local/amoeba
[root@amoeba ~]# tar zxf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/    ##我已经提前将压缩包上传了,所以直接解压
[root@amoeba ~]# chmod -R 755 /usr/local/amoeba/
[root@amoeba ~]# /usr/local/amoeba/bin/amoeba
amoeba start|stop    ##显示此内容说明Amoeba安装成功
[root@amoeba ~]#

3.配置Amoeba读写分离,两个Slave读负载均衡

(1)Master、Slave1、Slave2中开放权限给Amoeba访问。

mysql> grant all on *.* to test@'%' identified by '123.com';
Query OK, 0 rows affected, 1 warning (0.01 sec)

(2)编辑amoeba.xml配置文件。

 [root@amoeba amoeba]# vim conf/amoeba.xml    ##修改第30行、32行以及115行、118行119行内容
 30       <property name="user">amoeba</property>    

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

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

118       <property name="writePool">master</property>
119       <property name="readPool">slaves</property>

(3)编辑dbServers.xml配置文件

[root@amoeba amoeba]# vim conf/dbServers.xml    ##找到如下行数内容并进行更改

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

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

 45         <dbServer name="master"  parent="abstractServer">
 46                 <factoryConfig>
 47                         <!-- mysql ip -->
 48                         <property name="ipAddress">192.168.17.10</property>
 49                 </factoryConfig>
 50         </dbServer>
 51 
 52         <dbServer name="slave1"  parent="abstractServer">
 53                 <factoryConfig>
 54                         <!-- mysql ip -->
 55                         <property name="ipAddress">192.168.17.20</property>
 56                 </factoryConfig>
 57         </dbServer>
 58 
 59         <dbServer name="slave2"  parent="abstractServer">
 60                  <factoryConfig>
 61                           <!-- mysql ip -->
 62                          <property name="ipAddress">192.168.17.30</property>
 63                  </factoryConfig>
 64          </dbServer>

 72                         <property name="poolNames">slave1,slave2</property>

(4)配置无误后,可以启动Amoeba软件,其默认端口为tcp 8066。

[root@amoeba amoeba]# bin/amoeba start&
[root@amoeba amoeba]# netstat -anpt | grep java
tcp6       0      0 :::8066                 :::*                    LISTEN      78725/java          
tcp6       0      0 127.0.0.1:8707          :::*                    LISTEN      78725/java          
[root@amoeba amoeba]#

4.测试

(1)在Client主机上。

[root@client ~]# yum -y install mariadb

然后可以通过代理访问MySQL

[root@client ~]# mysql -u amoeba -p123456 -h 192.168.17.50 -P8066
Welcome to the MariaDB monitor.  Commands end with ; or \g.
java.util.NoSuchElementException: Could not create a validated object, cause: ValidateObject failedYour MySQL connection id is 1651716188
Server version: 5.1.45-mysql-amoeba-proxy-2.2.0


Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

	at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1191)
	at com.meidusa.amoeba.net.poolable.GenericObjectPool.borrowObject(GenericObjectPool.java:381)
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

	at com.meidusa.amoeba.mysql.handler.CommandMessageHandler.startSession(CommandMessageHandler.java:633)
	at com.meidusa.amoeba.mysql.handler.MySqlCommandDispatcher.handleMessage(MySqlCommandDispatcher.java:123)
	at com.meidusa.amoeba.mysql.net.MysqlClientConnection$2.run(MysqlClientConnection.java:291)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:619)
MySQL [(none)]>

  • 19
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值