MySQL的读写分离

一、MySQL读写分离原理
读写分离就是只在主服务器上写,只在从服务器上读主数据库处理事务性查询,而从数据库处理select查询
数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库
二、产生背景
在企业应用中,在大量的数据请求下,单台数据库将无法承担所有的读写操作
配置多台数据库服务器以实现读写分离
在主从复制的基础上实现读写分离
三、实验
关闭防火墙和核心防护
在主从复制的基础上配置读写分离
安装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

2、修改变量环境

[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)

3、安装amoeba

[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"

4、制作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
[root@localhost opt]# service amoeba start
[root@localhost opt]# netstat -anpt | grep 8066 		//默认监听在8066端口

5、在三台mysql数据库中为amoeba授权
(1)登录20.0.0.41终端

[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@'20.0.0.%' IDENTIFIED BY 'abc123';
mysql> FLUSH PRIVILEGES;
mysql> quit

(2)登录20.0.0.42终端

[root@localhost ~]# mysql -u root -p              ####输入密码abc123
mysql> GRANT ALL  ON *.* TO test@'20.0.0.%' IDENTIFIED BY 'abc123';
mysql> FLUSH PRIVILEGES;
mysql> quit

(3)登录20.0.0.43终端

[root@localhost ~]# mysql -u root -p              ####输入密码abc123
mysql> GRANT ALL  ON *.* TO test@'20.0.0.%' IDENTIFIED BY 'abc123';
mysql> FLUSH PRIVILEGES;
mysql> quit

在前端服务器上 20.0.0.40 你可以把它理解成调度器

[root@localhost opt]# cd /usr/local/amoeba
[root@localhost amoeba]# vi conf/amoeba.xml
—28行-----设置客户端连接amoeba前端服务器时使用的用户名和密码----
amoeba
----30行---------
123456
------------------------------------以上配置用于客户端连接用户名密码-------------

—83-去掉注释-同时把默认的server1改成master,把默认的servers改成 slaves
master
master
slaves
######上面修改后如下#### 这种注释一定要去掉
82 1500
83 master
84 master
85 slaves
86 true

[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.41</property>

–50-从服务器主机名-

–53-从服务器地址-
20.0.0.42
-----------------省略------------------------

3306

test

test #####user 后面改成test 这边是mysql数据库授权账户

abc123 #####password 后面改成abc123 这是mysql数据库授权密码

--------------省略-------------------------

test #####数据库中要有此处定义的数据库,否则客户端连接后会报错,默认我用test数据库,创建是test数据库不要弄错了

    <dbServer name="master"  parent="abstractServer">        #####name后面改成 master
            <factoryConfig>
                    <!-- mysql ip -->
                    <property name="ipAddress">20.0.0.41</property>    ####ipAddress加上主mysql的IP地址
            </factoryConfig>
    </dbServer>

    <dbServer name="slave1"  parent="abstractServer">        #####name后面改成 slave1
            <factoryConfig>
                    <!-- mysql ip -->
                    <property name="ipAddress">20.0.0.42</property>    ###ipAddress加上从1mysql的IP地址
            </factoryConfig>
    </dbServer>

###在脚本中slave2是没有的,需要复制下#####
#####name后面改成 slave2


20.0.0.43 ###ipAddress加上从2mysql的IP地址

    <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> 

[root@localhost amoeba]# service amoeba restart
[root@localhost amoeba]# netstat -anpt | grep java

#######测试用客户端 20.0.0.45#######

service firewalld stop
setenforce 0

yum install -y mysql
mysql -u amoeba -p123456 -h 20.0.0.40 -P8066 ##### 登录20.0.0.40 amoeba服务端

###在主mysql上创建数据库 20.0.0.41 ###
[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.42###
[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关闭同步 20.0.0.43###
[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…41 ###
[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)

######登录客户端 20.0.0.45#####
[root@localhost ~]# mysql -u amoeba -p123456 -h 20.0.0.45 -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.45 继续写输数据,按照正常的规则应该是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.41 ###
[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.42###
[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.43 ###
[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.45)上操作写入数据,数据是往master上写的,在salve1和slave2上看不到写的数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值