理论+实验:MySQL读写分离

一、案例前置知识点

■ 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上看不到写的数据

猜你喜欢

转载自blog.csdn.net/weixin_44733021/article/details/108598075