一、案例前置知识点
■ MySQL读写分离原理
- 读写分离就是只在主服务器上写,只在从服务器上读
- 主数据库处理事务性查询,而从数据库处理select查询
- 数据库复制被用来事务性查询导致的变更同步到集群中的从数据库
二、案例概述
■ 在企业应用中,在大量的数据请求下,单台数据库将无法承担所有的读写操作
- 配置多台数据库服务器以实现读写分离
- 本案例在主从复制的基础上实现读写分离
■ 案例拓补图
三、案例实施
########案例环境#####
主机 操作系统 IP地址 主要软件
amoeba centos-7.6-X86_64 20.0.0.20 amoeba-mysql-3.0.5-RC-distribution.zip
jdk-8u144-linux-x64.tar.gz
Master centos-7.6-X86_64 20.0.0.6 mysql-boost-5.7.20.tar.gz
Slave1 centos-7.6-X86_64 20.0.0.5 mysql-boost-5.7.20.tar.gz
Slave2 centos-7.6-X86_64 20.0.0.3 mysql-boost-5.7.20.tar.gz
客户机 centos-7.6-X86_64 20.0.0.21 mysql-boost-5.7.20.tar.gz
###master、slave1、slave2####
关闭防火墙、关闭核心防护 ###都是必须的操作,不然不能下面的操作
###建立时间同步环境####
1、在主机Master 搭建时间同步服务器NTP(20.0.0.6)
[root@localhost ~]# yum -y install ntp
[root@localhost ~]# vi /etc/ntp.conf ####最后面添加这二行
server 127.127.1.0
fudge 127.127.1.0 stratum 8
[root@localhost ~]# service ntpd restart
[root@localhost ~]# systemctl restart ntpd
[root@localhost ~]# systemctl enable ntpd
2、在从服务器上配置NTP同步
登录到20.0.0.5
[root@localhost ~]# yum -y install ntpdate
[root@localhost ~]# ntpdate 20.0.0.6
[root@localhost ~]# crontab -e
*/2 * * * * /usr/sbin/ntpdate 20.0.0.6 >>/var/log/ntpdate.log
[root@localhost ~]# systemctl restart crond
[root@localhost ~]# systemctl enable crond
[root@localhost ~]# touch /var/log/ntpdate.log
[root@localhost ~]# tail -f /var/log/ntpdate.log ###动态查看更新日志文件
登录到20.0.0.3
[root@localhost ~]# yum -y install ntpdate
[root@localhost ~]# ntpdate 20.0.0.6
[root@localhost ~]# crontab -e
*/2 * * * * /usr/sbin/ntpdate 20.0.0.6 >>/var/log/ntpdate.log
[root@localhost ~]# systemctl restart crond
[root@localhost ~]# systemctl enable crond
[root@localhost ~]# touch /var/log/ntpdate.log
[root@localhost ~]# tail -f /var/log/ntpdate.log ###动态查看更新日志文件
###这个时候在master建一张表,slave1和slave2都会同步###
##### Master、slave1、slave2 安装MySQL数据库###
####上传软件包###
mysql-boost-5.7.20.tar.gz上传至 20.0.0.6-20.0.0.3 Linux系统中的opt目录下
####同步操作####
使用CRT登录3台主机,登录以后检查,登录是否正常,确认下主机的IP地址是否正确,各个主机通信是否正常。
登录20.0.0.6此终端,在终端页面最下面,右击打开---send conmands to all sessions ###此功能是敲一条命令,其他终端全部同步执行
####编译安装MySQL数据库####
【安装 MySQL 服务】
1、安装Mysql环境依赖包
[root@localhost ~]#
yum -y install \
gcc-c++ \
gcc \
make \
ncurses \
ncurses-devel \
bison \
cmake
2、创建运行用户
[root@localhost ~] useradd -s /sbin/nologin mysql
3、编译安装
###上传mysql-boost-5.7.20.tar.gz到opt目录下###
[root@localhost ~]cd /opt
[root@localhost opt]# tar xzvf mysql-boost-5.7.20.tar.gz
[root@localhost opt]# cd /opt/mysql-5.7.20/
[root@localhost mysql-5.7.20]#
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DSYSCONFDIR=/etc \
-DSYSTEMD_PID_DIR=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DWITH_BOOST=boost \
-DWITH_SYSTEMD=1
[root@localhost mysql-5.7.20]# make && make install
[root@localhost mysql-5.7.20]#
##################################################################################################
用make -j2 安装开始时间:10:38 安装11:58 接下来是make install 时间开始13:37
------注意:如果在CMAKE的过程中有报错---
当报错解决后,需要把源码目录中的CMakeCache.txt文件删除,然后再重新CMAKE,否则错误依旧
------注意:make: *** No targets specified and no makefile found. Stop.解决方法
1、wget http://ftp.gnu.org/pub/gnu/ncurses/ncurses-5.6.tar.gz
2.、tar zxvf ncurses-5.6.tar.gz
3、 ./configure -prefix=/usr/local -with-shared-without-debug
4、make
5、make install
###################################################################################################
4、数据库目录进行权限调整
[root@localhost mysql-5.7.20]#chown -R mysql:mysql /usr/local/mysql/
5、调整配置文件
[root@localhost mysql-5.7.20]#vi /etc/my.cnf
[client]
port = 3306
default-character-set=utf8
socket = /usr/local/mysql/mysql.sock
[mysql]
port = 3306
default-character-set=utf8
socket = /usr/local/mysql/mysql.sock
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES
chown mysql:mysql /etc/my.cnf
6、设置环境变量
echo 'PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH' >> /etc/profile
echo 'export PATH' >> /etc/profile
source /etc/profile
7、初始化数据库
cd /usr/local/mysql/
bin/mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data
cp usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
8、数据库开启自启、 关闭、状态
systemctl enable mysqld
systemctl start mysqld
systemctl stop mysqld
systemctl status mysqld
netstat -anpt | grep 3306
9、设置Mysql密码
mysqladmin -u root -p password //刚开始没密码是空的直接回车,然后输入密码abc123,在此确认abc123,这是在root账户下运行的
10、登录数据库
mysql -u root -p ##这个命令敲下,提示要输入密码,这个就是刚才设置的密码abc123
【备注】如果是在虚拟机上安装的。初始化安装后,一定要快照!
#######登录Master主服务器配置 20.0.0.6 ####
[root@localhost mysql]# vi /etc/my.cnf ###在原来server-id = 1的地方修改成11 后面新增log_bin = master-bin log-slave-updates = true
server-id = 11
log_bin = master-bin
log-slave-updates = true
[root@localhost mysql]# systemctl restart mysqld ###重启数据库
登录Master数据库 给从服务器授权
[root@localhost mysql]# mysql -uroot -p
mysql>grant replication slave on *.* to 'myslave'@'20.0.0.%' identified by 'abc123';
mysql>flush privileges;
mysql>show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 | 603 | | | |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
#######登录salve1 从服务器配置 20.0.0.5 ####
[root@localhost mysql]# vi /etc/my.cnf ###在原来server-id = 1的地方修改成22 后面新增relay-log = relay-log-bin relay-log-index = slave-relay-bin.index
server-id = 22
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
[root@localhost mysql]# systemctl restart mysqld ###重启数据库
登录Slave数据库 配置同步 ####注意下这边的master_log_file='master-bin.000001',master_log_pos=604; 要和Master 数据库信息一致,不一致的话要更改先stop slave; 然后更改同步信息
[root@localhost mysql]# mysql -uroot -p
mysql> change master to master_host='20.0.0.6',master_user='myslave',master_password='abc123',master_log_file='master-bin.000001',master_log_pos=604;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.32.11
Master_User: myslave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000001
Read_Master_Log_Pos: 604
Relay_Log_File: relay-log-bin.000002
Relay_Log_Pos: 321
Relay_Master_Log_File: master-bin.000001
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: 604
Relay_Log_Space: 526
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: 11
Master_UUID: 9c05c45e-c7fd-11e8-a4be-000c299ba7cc
Master_Info_File: /usr/local/mysql/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
#######登录salve2 从服务器配置 20.0.0.3 ####
[root@localhost mysql]# vi /etc/my.cnf ###在原来server-id = 1的地方修改成33 后面新增relay-log = relay-log-bin relay-log-index = slave-relay-bin.index
server-id = 33
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
[root@localhost mysql]# systemctl restart mysqld ###重启数据库
登录Slave数据库 配置同步 ####注意下这边的master_log_file='master-bin.000001',master_log_pos=604; 要和Master 数据库信息一致,不一致的话要更改先stop slave; 然后更改同步信息
[root@localhost mysql]# mysql -uroot -p
mysql> change master to master_host='20.0.0.6',master_user='myslave',master_password='abc123',master_log_file='master-bin.000001',master_log_pos=604;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.32.11
Master_User: myslave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000001
Read_Master_Log_Pos: 604
Relay_Log_File: relay-log-bin.000002
Relay_Log_Pos: 321
Relay_Master_Log_File: master-bin.000001
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: 604
Relay_Log_Space: 526
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: 11
Master_UUID: 9c05c45e-c7fd-11e8-a4be-000c299ba7cc
Master_Info_File: /usr/local/mysql/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
####验证主从复制效果####
登录20.0.0.6
[root@localhost mysql]# mysql -uroot -p
mysql> create database bdqn;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| bdqn |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
登录20.0.0.5
[root@localhost mysql]# mysql -uroot -p
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| bdqn |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
登录20.0.0.3
[root@localhost mysql]# mysql -uroot -p
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| bdqn |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
####上述说明新建的bdqn数据库同步成功#####
########案例环境#####
主机 操作系统 IP地址 主要软件
amoeba centos-7.6-X86_64 20.0.0.20 amoeba-mysql-3.0.5-RC-distribution.zip
jdk-8u144-linux-x64.tar.gz
Master centos-7.6-X86_64 20.0.0.6 mysql-boost-5.7.20.tar.gz
Slave1 centos-7.6-X86_64 20.0.0.5 mysql-boost-5.7.20.tar.gz
Slave2 centos-7.6-X86_64 20.0.0.3 mysql-boost-5.7.20.tar.gz
客户机 centos-7.6-X86_64 20.0.0.21 mysql-boost-5.7.20.tar.gz
#####配置MySQL读写分离. 20.0.0.20 #####
###如果命令补不全的、ifconfig命令不能用的、解决方案如下###
yum -y install bash-completion ###tab补全功能
yum -y install net-tools ###ifconfig 命令
###卸载原有的java环境###
[root@localhost ~]# java -version ##确定java版本 1.8.0_181的 有点高
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
[root@localhost ~]# rpm -qa |grep java
java-1.8.0-openjdk-headless-1.8.0.181-7.b13.el7.x86_64 ####卸载
tzdata-java-2018e-3.el7.noarch
python-javapackages-3.4.1-11.el7.noarch
java-1.8.0-openjdk-1.8.0.181-7.b13.el7.x86_64 ####卸载
javapackages-tools-3.4.1-11.el7.noarch
java-1.7.0-openjdk-1.7.0.191-2.6.15.5.el7.x86_64 ####卸载
java-1.7.0-openjdk-headless-1.7.0.191-2.6.15.5.el7.x86_6 ####卸载
##查出openjdk相关的文件并且删除它###
[root@localhost ~]# rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.181-7.b13.el7.x86_64
[root@localhost ~]# rpm -e --nodeps java-1.8.0-openjdk-1.8.0.181-7.b13.el7.x86_64
[root@localhost ~]# rpm -e --nodeps java-1.7.0-openjdk-1.7.0.191-2.6.15.5.el7.x86_64
[root@localhost ~]# rpm -e --nodeps java-1.7.0-openjdk-headless-1.7.0.191-2.6.15.5.el7.x86_64
##安装JDK##
上传JDK到opt目录
[root@localhost ~]# cd /opt
[root@localhost opt]# tar xzvf jdk-8u144-linux-x64.tar.gz
[root@localhost opt]# cp -rv jdk1.8.0_144/ /usr/local/java
[root@localhost opt]# vi /etc/profile
export JAVA_HOME=/usr/local/java
export JRE_HOME=/usr/local/java/jre
export PATH=$PATH:/usr/local/java/bin
export CLASSPATH=./:/usr/local/java/lib:/usr/local/java/jre/lib
[root@localhost opt]# source /etc/profile
[root@localhost opt]# java -version ###java环境变成1.8.0_144的##
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)
#####安装amoeba------https://sourceforge.net/projects/amoeba/files/#####
[root@localhost opt]# yum -y install unzip ###如果unzip命令没有,必须装下,如果装了,此步骤跳过##
[root@localhost opt]# unzip amoeba-mysql-3.0.5-RC-distribution.zip -d /usr/local/
[root@localhost opt]# mv /usr/local/amoeba-mysql-3.0.5-RC/ /usr/local/amoeba
[root@localhost opt]# chmod -R 755 /usr/local/amoeba/
[root@localhost opt]#vi /usr/local/amoeba/jvm.properties
JVM_OPTIONS="-server -Xms256m -Xmx1024m -Xss196k -XX:PermSize=16m -XX:MaxPermSize=96m" //32行修改成如下
JVM_OPTIONS="-server -Xms1024m -Xmx1024m -Xss256k"
######制作amoeba管理脚本####
[root@localhost opt]# vi /etc/init.d/amoeba
#!/bin/bash
#chkconfig: 35 62 62
#
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
NAME=Amoeba
AMOEBA_BIN=/usr/local/amoeba/bin/launcher
SHUTDOWN_BIN=/usr/local/amoeba/bin/shutdown
PIDFILE=/usr/local/amoeba/Amoeba-MySQL.pid
SCRIPTNAME=/etc/init.d/amoeba
case "$1" in
start)
echo -n "Starting $NAME... "
$AMOEBA_BIN
echo " done"
;;
stop)
echo -n "Stoping $NAME... "
$SHUTDOWN_BIN
echo " done"
;;
restart)
$SHUTDOWN_BIN
sleep 1
$AMOEBA_BIN
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|restart}"
exit 1
;;
esac
[root@localhost opt]# chmod +x /etc/init.d/amoeba
[root@localhost opt]# chkconfig --add amoeba ###添加服务,才能让下面的amoeba启动
service amoeba start
ctrl + c
netstat -anpt | grep 8066 //默认监听在8066端口
####在三台mysql数据库中为amoeba授权####
##登录20.0.0.6终端###
[root@localhost ~]# mysql -u root -p ####输入密码abc123
mysql> create database test;
Query OK, 1 row affected (0.01 sec)
mysql> GRANT ALL ON *.* TO test@'192.168.100.%' IDENTIFIED BY 'abc123';
mysql> FLUSH PRIVILEGES;
mysql> quit
##登录20.0.0.5终端###
[root@localhost ~]# mysql -u root -p ####输入密码abc123
mysql> GRANT ALL ON *.* TO test@'192.168.100.%' IDENTIFIED BY 'abc123';
mysql> FLUSH PRIVILEGES;
mysql> quit
##登录20.0.0.3终端###
[root@localhost ~]# mysql -u root -p ####输入密码abc123
mysql> GRANT ALL ON *.* TO test@'192.168.100.%' IDENTIFIED BY 'abc123';
mysql> FLUSH PRIVILEGES;
mysql> quit
#######在前端服务器上 20.0.0.20 你可以把它理解成调度器 ######
[root@localhost opt]# cd /usr/local/amoeba
[root@localhost amoeba]# vi conf/amoeba.xml
---28行-----设置客户端连接amoeba前端服务器时使用的用户名和密码----
<property name="user">amoeba</property>
----30行---------
<property name="password">123456</property>
------------------------------------以上配置用于客户端连接用户名密码-------------
---83-去掉注释-同时把默认的server1改成master,把默认的servers改成 slaves
<property name="defaultPool">master</property>
<property name="writePool">master</property>
<property name="readPool">slaves</property>
######上面修改后如下#### <!-- --> 这种注释一定要去掉
82 <property name="LRUMapSize">1500</property>
83 <property name="defaultPool">master</property>
84 <property name="writePool">master</property>
85 <property name="readPool">slaves</property>
86 <property name="needParse">true</property>
[root@localhost amoeba]# vi conf/dbServers.xml
--26-29--去掉注释--
<property name="user">test</property>
<property name="password">abc123</property>
------主服务器地址---
43 <dbServer name="master" parent="abstractServer">
46 <property name="ipAddress">20.0.0.6</property>
--50-从服务器主机名-
<dbServer name="slave1" parent="abstractServer">
--53-从服务器地址-
<property name="ipAddress">20.0.0.5</property>
-----------------省略------------------------
<!-- mysql port -->
<property name="port">3306</property>
<!-- mysql schema -->
<property name="schema">test</property>
<!-- mysql user -->
<property name="user">test</property> #####user 后面改成test 这边是mysql数据库授权账户
<property name="password">abc123</property> #####password 后面改成abc123 这是mysql数据库授权密码
</factoryConfig>
--------------省略-------------------------
<!-- mysql schema -->
<property name="schema">test</property> #####数据库中要有此处定义的数据库,否则客户端连接后会报错,默认我用test数据库,创建是test数据库不要弄错了
<dbServer name="master" parent="abstractServer"> #####name后面改成 master
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">20.0.0.6</property> ####ipAddress加上主mysql的IP地址
</factoryConfig>
</dbServer>
<dbServer name="slave1" parent="abstractServer"> #####name后面改成 slave1
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">20.0.0.5</property> ###ipAddress加上从1mysql的IP地址
</factoryConfig>
</dbServer>
<dbServer name="slave2" parent="abstractServer"> #####name后面改成 slave2
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">20.0.0.5</property> ###ipAddress加上从1mysql的IP地址
</factoryConfig>
</dbServer>
###注意啦!在脚本中slave2是没有的,需要复制下#####
<dbServer name="slave2" parent="abstractServer"> #####name后面改成 slave2
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">20.0.0.3</property> ###ipAddress加上从2mysql的IP地址
</factoryConfig>
</dbServer>
<dbServer name="slaves" virtual="true"> #####name后面改成 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> #####poolNames后面改成 slave1,slave2
</poolConfig>
</dbServer>
---------------------以上脚本做参考---注意----------------------
<!-- mysql schema -->
<property name="schema">test</property> //数据库中要有此处定义的数据库,否则客户端连接后会报如下错误:
ERROR 1044 (42000): Could not create a validated object, cause: ValidateObject failed
#######
[root@localhost amoeba]# service amoeba restart
[root@localhost amoeba]# netstat -anpt | grep java
#######测试用客户端 192.168.32.15#######
service firewalld stop
setenforce 0
yum install -y mysql
mysql -u amoeba -p123456 -h 20.0.0.20 -P8066 ##### 登录20.0.0.21 amoeba服务端
###在主mysql上创建数据库 20.0.0.6 ###
[root@localhost ~]# mysql -u root -p ###输入mysql密码 abc123
mysql> use test;
Database changed
mysql> create table zhang1 (id int(10),name varchar(10),address varchar(20));
Query OK, 0 rows affected (0.05 sec)
###在从1 mysql关闭同步 20.0.0.5###
[root@localhost ~]# mysql -u root -p ###输入mysql密码 abc123
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)
mysql> use test;
Database changed
mysql> insert into zhang1 values('2','zhang','this_is_slave1');
Query OK, 1 row affected (0.00 sec)
###在从2 mysql关闭同步 192.168.32.13###
[root@localhost ~]# mysql -u root -p ###输入mysql密码 abc123
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)
mysql> use test;
Database changed
mysql> insert into zhang1 values('3','zhang','this_is_slave2');
Query OK, 1 row affected (0.00 sec)
###在主mysql上插入数据 20.0.0.6 ###
[root@localhost ~]# mysql -u root -p ###输入mysql密码 abc123
mysql> use test;
Database changed
mysql> insert into zhang1 values('1','zhang','this_is_master');
Query OK, 0 rows affected (0.05 sec)
######登录客户端 192.168.32.15#####
[root@localhost ~]# mysql -u amoeba -p123456 -h 192.168.32.14 -P8066
MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| bdqn |
| db_test |
| mysql |
| performance_schema |
| sys |
| test | #####发现数据库test
+--------------------+
7 rows in set (0.01 sec)
MySQL [(none)]> use test; ####进入数据库test
Database changed
MySQL [test]> select * from zhang1; ###查看zhang信息 发现进入slave1 数据中的数据
| id | name | address |
+------+-------+----------------+
| 2 | zhang | this_is_slave1 |
+------+-------+----------------+
1 row in set (0.00 sec)
MySQL [test]> select * from zhang; ###查看zhang信息 发现进入slave2 数据中的数据
+------+-------+----------------+
| id | name | address |
+------+-------+----------------+
| 3 | zhang | this_is_slave2 |
+------+-------+----------------+
1 row in set (0.01 sec)
#########上述实验,实现数据读取负载均衡#######
###在客户机上 20.0.0.21 继续写输数据,按照正常的规则应该是slave1 和slave2是看不见的
MySQL [(none)]> use test;
Database changed
MySQL [test]> insert into zhang1 values('4','zhang','write_test');
Query OK, 1 row affected (0.01 sec)
######登录mastar 20.0.0.6 ###
[root@localhost ~]# mysql -u root -p
mysql> use test;
Database changed
mysql> select * from zhang1;
+------+-------+----------------+
| id | name | address |
+------+-------+----------------+
| 1 | zhang | this_is_master |
| 4 | zhang | write_test |
+------+-------+----------------+
2 rows in set (0.00 sec)
######登录slave1 20.0.0.5###
[root@localhost ~]# mysql -u root -p
mysql> use test;
Database changed
mysql> select * from zhang1;
+------+-------+----------------+
| id | name | address |
+------+-------+----------------+
| 2 | zhang | this_is_slave1 |
+------+-------+----------------+
1 row in set (0.00 sec)
######登录slave2 20.0.0.3 ###
[root@localhost ~]# mysql -u root -p
mysql> use test;
Database changed
mysql> select * from zhang1;
+------+-------+----------------+
| id | name | address |
+------+-------+----------------+
| 3 | zhang | this_is_slave2 |
+------+-------+----------------+
1 row in set (0.00 sec)
#######上述验证结果如下###
在客户端(20.0.0.21)上操作写入数据,数据是往master上写的,在salve1和slave2上看不到写的数据