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: YesSlave_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.0Copyright (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)]>